Skip to main content

Ethereum Self-Destruct Balance Tracker

The Ethereum Self-Destruct Balance Tracker API provides real-time balance updates for contracts that self-destruct and addresses that receive funds from self-destructed contracts. This API helps you monitor contract destruction events, track ephemeral contracts (like MEV bots), and analyze security incidents.

What is Self-Destruct?

The selfdestruct opcode allows a smart contract to permanently remove its bytecode from the blockchain and send its remaining ETH balance to a specified recipient address. Once a contract self-destructs, it can no longer execute code or receive transactions.

Common Use Cases

  • MEV Builder Payments: Ephemeral contracts created to pay MEV builders/block builders (e.g., quasarbuilder.eth) as part of the Proposer-Builder Separation (PBS) infrastructure, then immediately self-destructed
  • Ephemeral MEV/Arbitrage Executors: Contracts created and destroyed within the same transaction to execute atomic profit extraction
  • Security Incidents: Malicious actors destroying contracts
  • Emergency Shutdowns: Contract owners destroying contracts to reclaim funds or retire functionality
  • Upgrade Patterns: Destroying old contract versions during upgrades
  • Paymasters/Relayers: Short-lived helper contracts that clean up after sponsoring gas

Balance Change Reason Codes

The API tracks self-destruct events using specific balance change reason codes:

  • Code 12: BalanceIncreaseSelfdestruct - Balance added to the recipient as indicated by a self-destructing account
  • Code 13: BalanceDecreaseSelfdestruct - Balance deducted from a contract due to self-destruct
  • Code 14: BalanceDecreaseSelfdestructBurn - ETH sent to an already self-destructed account within the same transaction

Track All Self-Destruct Event Balances

Monitor all contract self-destruct event balances in real-time using this GraphQL subscription. Run Stream

You can also run this as a query by replacing the word subscription with query

subscription {
EVM(network: eth) {
TransactionBalances(
where: { TokenBalance: { BalanceChangeReasonCode: { in: [12, 13, 14] } } }
) {
Block {
Time
Number
}
TokenBalance {
Currency {
Symbol
}
PreBalance
PostBalance
Address
BalanceChangeReasonCode
PostBalanceInUSD
}
Transaction {
Hash
}
}
}
}

Track Contract Self-Destruct Balance Decrease

Monitor contract balance decrease when contracts are self-destructing. Run Query

{
EVM(network: eth) {
TransactionBalances(
where: { TokenBalance: { BalanceChangeReasonCode: { eq: 13 } } }
limit: { count: 10 }
orderBy: { descending: Block_Time }
) {
Block {
Time
Number
}
TokenBalance {
Currency {
Symbol
SmartContract
}
PreBalance
PostBalance
Address
BalanceChangeReasonCode
PostBalanceInUSD
}
Transaction {
Hash
}
}
}
}

Track Recipients of Self-Destructed Fund Balances

Monitor contract balance increase when contracts are self-destructing. Run query

{
EVM(network: eth) {
TransactionBalances(
where: { TokenBalance: { BalanceChangeReasonCode: { eq: 12 } } }
limit: { count: 10 }
orderBy: { descending: Block_Time }
) {
Block {
Time
Number
}
TokenBalance {
Currency {
Symbol
SmartContract
}
PreBalance
PostBalance
Address
BalanceChangeReasonCode
PostBalanceInUSD
}
Transaction {
Hash
}
}
}
}

Track Self-Destruct Balance Changes for Specific Address

Monitor self-destruct balance changes for a specific contract address using this GraphQL query: Try the API here.

subscription {
EVM(network: eth) {
TransactionBalances(
where: {
TokenBalance: {
Address: { is: "0x863DF6BFa4469f3ead0bE8f9F2AAE51c91A907b4" }
BalanceChangeReasonCode: { in: [12, 13, 14] }
}
}
) {
Block {
Time
Number
}
TokenBalance {
Currency {
Symbol
SmartContract
}
PreBalance
PostBalance
Address
BalanceChangeReasonCode
PostBalanceInUSD
}
Transaction {
Hash
}
}
}
}

Track Large Self-Destruct Transaction Balances

Monitor significant self-destruct balance changes (e.g., > $1000 USD) using this subscription: Try the API here.

subscription {
EVM(network: eth) {
TransactionBalances(
where: {
TokenBalance: {
BalanceChangeReasonCode: { in: [12, 13] }
PostBalanceInUSD: { gt: "1000" }
}
}
) {
Block {
Time
Number
}
TokenBalance {
Currency {
Symbol
SmartContract
}
PreBalance
PostBalance
Address
BalanceChangeReasonCode
PostBalanceInUSD
}
Transaction {
Hash
}
}
}
}

Track Ephemeral MEV Contract Balance Changes

Monitor balance changes for short-lived contracts that are created and destroyed in the same transaction (typical pattern for MEV bots) using this subscription: Try the API here.

subscription {
EVM(network: eth) {
TransactionBalances(
where: { TokenBalance: { BalanceChangeReasonCode: { eq: 13 } } }
) {
Block {
Time
Number
}
TokenBalance {
Currency {
Symbol
SmartContract
}
PreBalance
PostBalance
Address
BalanceChangeReasonCode
PostBalanceInUSD
}
Transaction {
Hash
From
To
}
}
}
}

Aggregate Self-Destruct Statistics

Calculate total ETH destroyed or received from self-destructs using aggregation functions: Try the API here.

{
EVM(dataset: realtime, network: eth) {
TransactionBalances(
where: { TokenBalance: { BalanceChangeReasonCode: { in: [12, 13] } } }
) {
TokenBalance {
Currency {
Symbol
SmartContract
}
}
totalDestroyed: sum(of: TokenBalance_PostBalance)
destructCount: count
}
}
}

Self-Destruct Usecase Examples

1. MEV Builder Payment (Ephemeral Executor)

A common pattern in the MEV ecosystem involves ephemeral contracts that are created to pay MEV builders/block builders, then immediately self-destruct. This pattern is part of the Proposer-Builder Separation (PBS) infrastructure.

Contrack Flow: Deploy → Transfer to MEV builder → Self-destruct

What's happening:

  1. A searcher/bundler deploys a temporary helper contract
  2. The contract holds the exact ETH amount owed as a fee/bribe to the MEV builder
  3. The contract transfers ETH to the builder
  4. The contract immediately self-destructs, cleaning up and leaving minimal trace

Why this pattern:

  • Ephemeral by design - avoids leaving identifiable payment trails per bundle
  • Safety - one-use contract prevents reuse or exploitation
  • Gas efficiency - minimal runtime deployment is cheaper than maintaining reusable state
  • Privacy - prevents tracking of bundle logic across blocks

API Subscription: Track payments to known MEV builders: Try the API here.

subscription {
EVM(network: eth) {
TransactionBalances(
where: {
TokenBalance: {
BalanceChangeReasonCode: { eq: 12 }
Address: {
in: [
"0x396343362be2A4dA1cE0C1C210945346fb82Aa49"
# Add other known MEV builder addresses
]
}
}
}
) {
Block {
Time
Number
}
TokenBalance {
Currency {
Symbol
}
PreBalance
PostBalance
Address
BalanceChangeReasonCode
PostBalanceInUSD
}
Transaction {
Hash
From
To
}
}
}
}

3. Ephemeral MEV/Arbitrage Contracts

Many MEV bots and arbitrage executors create contracts that are destroyed within the same transaction. These short-lived contracts are used for:

  • Atomic multi-swap execution
  • Flash loan arbitrage
  • Obfuscation of execution patterns
  • Cleanup of bytecode footprint

API Query: Track recent ephemeral contract patterns: Try the API here.

{
EVM(dataset: realtime, network: eth) {
TransactionBalances(
where: { TokenBalance: { BalanceChangeReasonCode: { eq: 13 } } }
limit: { count: 100 }
orderBy: { descendingByField: "Block_Time" }
) {
Block {
Time
Number
}
TokenBalance {
Currency {
Symbol
}
PreBalance
PostBalance
Address
BalanceChangeReasonCode
PostBalanceInUSD
}
Transaction {
Hash
From
To
}
}
}
}

API Use Cases

Security Monitoring - Track Malicious Self-Destructs

Track self-destruct events to identify potential security incidents or malicious contract destruction: Try the API here.

subscription {
EVM(network: eth) {
TransactionBalances(
where: {
TokenBalance: {
BalanceChangeReasonCode: { eq: 13 }
PostBalanceInUSD: { gt: "10000" }
}
}
) {
Block {
Time
Number
}
TokenBalance {
Currency {
Symbol
}
PreBalance
PostBalance
Address
BalanceChangeReasonCode
PostBalanceInUSD
}
Transaction {
Hash
From
}
}
}
}

Notes

  • Balance Change Reason Codes 12, 13, and 14 are only available for native currency (ETH) transactions, not for fungible tokens or NFTs
  • Code 12 indicates funds received from a self-destructed contract
  • Code 13 indicates funds destroyed from a self-destructing contract
  • Code 14 indicates ETH sent to an already self-destructed account within the same transaction
  • Self-destructed contracts cannot be recovered or interacted with after destruction
  • The PreBalance field shows the balance before the self-destruct, and PostBalance shows the balance after (typically 0 for the destroyed contract)
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.