Skip to main content

Base Self-Destruct Balance Tracker: Why Base Shows None, and What to Watch

The balance schema has three reason codes for selfdestruct: 13 for the contract whose balance empties, 12 for the address that receives it, and 14 for value sent to an account already destroyed in the same transaction. On Base none of them fire. Since the Cancun rules reached the OP Stack, SELFDESTRUCT only deletes a contract created in the same transaction; in every other case it just moves the balance, and Base's balance cube reports every native movement as reason code 0 or, for fees, code 5. On top of that, live Base data shows no SELFDESTRUCT calls at all in the Calls cube over a day. This page gives you the two queries that prove it, so an empty result is a fact rather than a bug, and the queries that catch the patterns people are usually looking for. Every example runs in the IDE on a free account.

Confirm it: the codes are empty

A count over the last day. Change the network to bsc and the same query returns a few hundred rows, which is the quickest way to see that the schema is shared and the behaviour is the chain's. Saved query here.

{
EVM(network: base) {
TransactionBalances(
where: {
TokenBalance: { BalanceChangeReasonCode: { in: [12, 13, 14] } }
Block: { Time: { since_relative: { hours_ago: 24 } } }
}
) {
count
}
}
}

Confirm it: no SELFDESTRUCT calls

The Calls cube keeps the opcode of every internal call, so it would show a destruction even for a contract that held nothing. Saved query here.

{
EVM(network: base) {
Calls(
where: {
Call: { Opcode: { Name: { is: "SELFDESTRUCT" } } }
Block: { Time: { since_relative: { hours_ago: 24 } } }
}
limit: { count: 20 }
orderBy: { descending: Block_Time }
) {
Block {
Time
}
Call {
From
To
Value
}
Transaction {
Hash
From
}
}
}
}

Leave this one running as a subscription if you want to be told the moment a destruction does happen: drop limit, orderBy and the time filter and change query to subscription.

What people are usually looking for on Base

  • Short-lived helper contracts. On BNB Chain and Ethereum, MEV bots destroy their helpers; on Base they simply leave them. Find them with the Calls cube: filter Call.Opcode.Name on CREATE or CREATE2 and group by Transaction.From to see who deploys contracts in bulk, then query the transaction balance tracker for the balances those contracts hold.
  • A contract being emptied. Filter TransactionBalances on the contract as TokenBalance.Address with Currency: { Native: true }; a code 0 row whose PostBalance is zero is the sweep.
  • Fees and sequencer income. Reason code 5 rows on the fee vaults, covered on the Base gas balance tracker.

The self-destruct queries, ready for other chains

Both blocks below run unchanged on bsc and eth, where the codes do fire. Code 13 rows are the contracts that emptied, code 12 rows the recipients. Saved stream here.

subscription {
EVM(network: bsc) {
TransactionBalances(
where: { TokenBalance: { BalanceChangeReasonCode: { in: [12, 13] } } }
) {
Block {
Time
Number
}
TokenBalance {
Address
BalanceChangeReasonCode
PreBalance
PostBalance
PostBalanceInUSD
}
Transaction {
Hash
From
To
}
}
}
}

The BSC self-destruct balance tracker walks through the full set on a chain where the pattern is live.

Frequently Asked Questions

Does Base have self-destruct balance data?

The codes exist in the schema but return no rows on Base, and the Calls cube shows no SELFDESTRUCT opcode in live data. Native balance movements on Base are reported as reason code 0, fees as code 5.

Why did selfdestruct stop showing up?

Under the Cancun rules the OP Stack adopted, SELFDESTRUCT only deletes a contract created in the same transaction and otherwise just transfers the balance. Contracts on Base do not use it in practice.

How do I check whether a contract on Base was destroyed?

Query Calls with Call.Opcode.Name SELFDESTRUCT and the contract as Call.From. No row means no destruction; a contract that still answers calls was never destroyed.

Where do the self-destruct examples work?

On BNB Chain and Ethereum. Run the queries on this page with network bsc or eth and reason codes 12 and 13 return rows within the realtime window.

Build with Bitquery

Ready to run this in production?

Get an API key and run these queries in minutes, or talk to us about plans and enterprise delivery.