PPP: Deterministic Resolution of Assets on Account Reaping
-
PPP Number: TBD
-
Author(s): Alison Pereira
-
Status: Draft
-
Type: Protocol
-
Target: Polkadot‑SDK / Substrate Runtime
-
Created: 2026‑04‑07
Summary
Substrate-based runtimes support account reaping via existential deposits while also allowing permissionless receipt of arbitrary assets.
This proposal defines protocol‑level semantics for resolving assets owned by an account when that account is reaped.
The goal is to ensure deterministic, infallible, and auditable handling of all asset holdings without requiring user interaction, while preventing grieving and eliminating undefined behavior across asset‑holding pallets.
Background
Substrate defines clear semantics for:
-
When an account exists
-
When it is reaped
-
Which balances participate in existential deposit (ED) checks
However, the protocol does not define what happens to:
-
Non‑native or foreign assets
-
Assets received without recipient consent
-
Assets without a valid transfer or burn path
As a result, account lifecycle semantics are currently incomplete and pallet‑specific.
At the same time, Substrate allows:
-
Permissionless inbound transfers
-
Arbitrary asset types
-
Account reaping based solely on native balances
This creates an unresolved interaction between reaping and multi‑asset ownership.
Motivation
Account lifecycle is already a protocol concern
Account creation and destruction are core protocol responsibilities.
Leaving asset resolution undefined makes account death:
-
Ambiguous
-
Implicit
-
Difficult to reason about or audit
Unwanted assets are unavoidable
In a permissionless system:
-
Any account can receive assets
-
Recipients may be unwilling or unable to interact with them
-
Assets may be malicious, spammy, or non‑transferable
This problem arises from protocol properties and cannot reliably be solved at the application or wallet layer.
Reaping + multi‑asset = undefined behavior
When an account is reaped:
-
Native balance falls below ED → account is destroyed
-
Yet foreign assets may still reference that account
The protocol does not clearly define whether:
-
Reaping must consider all assets
-
Foreign assets block reaping
-
Assets are burned, preserved, transferred, or orphaned
Different pallets implicitly answer this differently today.
Tooling and security implications
Undefined semantics lead to:
-
Asset‑based griefing vectors
-
Dead accounts accumulating state
-
Divergent indexer and wallet heuristics
-
Difficulty reasoning about issuance, accounting, and state growth
Goals
This proposal aims to:
-
Define deterministic behavior for assets on account reaping
-
Avoid requiring user interaction with unwanted assets
-
Preserve permissionless asset transfers
-
Prevent foreign assets from blocking reaping
-
Provide a common abstraction usable across asset pallets
-
Keep reaping cheap, safe, and infallible
Non‑Goals
This proposal does not aim to:
-
Prevent inbound transfers
-
Introduce opt‑in receive semantics
-
Define wallet or UI behavior
-
Enforce a single economic policy across all assets
Design Overview
Core Principle
Account reaping is a system‑level decision and must fully resolve all dependent state.
When an account is reaped, all asset holdings associated with that account must be resolved internally by the runtime, without user involvement.
Specification
Asset Resolution on Account Reap
Introduce a standardized runtime hook invoked exactly once when an account is reaped.
Conceptual flow:
-
Runtime determines account is below existential deposit
-
Account is scheduled for reaping
-
All registered asset providers are invoked to resolve holdings for that account
-
Account storage is removed
Resolution Requirements
Resolution logic must:
-
Be deterministic
-
Be infallible
-
Not dispatch extrinsics
-
Not depend on signatures or user input
-
Not depend on ordering between pallets
Asset Resolution Strategies
Each asset‑holding pallet must define one resolution strategy from a small, explicitly enumerated set.
This proposal does not mandate a single default, but enumerates protocol‑compatible options.
1. Burn on Reap
Remove the asset balance and reduce issuance (or mark as destroyed).
Properties
-
Strong anti‑griefing guarantees
-
No state accumulation
-
Mirrors “inert asset” semantics
Recommended default for non‑consensual assets.
2. Return to Issuer / Admin
Transfer assets to a deterministic issuer or admin account.
Properties
-
Suitable for permissioned or regulated assets
-
Requires stable issuer resolution
3. Transfer to System Sink
Move assets to a predefined runtime account (e.g. treasury, dust sink).
Properties
-
Preserves total supply
-
Centralized cleanup point
-
Potential governance policy surface
4. Remove Without Supply Change (Ignore)
Delete the balance entry without modifying issuance.
Properties
-
Simplest fallback
-
Assets become effectively lost
-
Avoids dependency on asset internals
Consensual vs Non‑Consensual Assets (Optional Extension)
Asset pallets may optionally classify assets as:
-
Consensual: User explicitly opted‑in (e.g. asset creation, local mint)
-
Non‑consensual: Transferable by arbitrary third parties
Suggested defaults:
-
Non‑consensual → Burn or Ignore on reap
-
Consensual → Pallet‑defined policy
This classification is advisory and does not affect transfer semantics.
Interaction with Existential Deposit
-
Native balance alone determines account existence
-
Foreign assets must never block reaping
-
Asset resolution occurs after the reaping decision
This ensures:
-
No reaping deadlocks
-
Predictable account lifecycle
-
A clear mental model for developers and auditors
Implementation Sketch (Conceptual)
Introduce a common trait implemented by asset pallets:
trait OnAccountReaped {
fn on_account_reaped(account: &AccountId);
}
-
Invoked by
frame_systemonce per reaped account -
Failures are not permitted
-
No external dispatch allowed
Backwards Compatibility
-
Existing pallets default to a conservative strategy (
Ignore) -
Behavior remains unchanged until pallets explicitly opt in
-
Migration can be introduced gradually via governance
Security Considerations
This design:
-
Eliminates asset‑based account griefing
-
Prevents unbounded state growth from dead accounts
-
Reduces wallet and indexer attack surface
-
Makes account death semantics explicit and auditable
Comparisons
-
Ethereum avoids the issue by never reaping accounts
-
Substrate does reap accounts and therefore must define corresponding asset semantics
This proposal formalizes behavior that is currently implicit or pallet‑specific.
Open Questions
-
Should there be a global default strategy?
-
Should burning reduce issuance or mark assets as lost?
-
Do NFTs require special handling?
-
Should governance override per‑asset policies?
-
Does this hook belong in
frame_systemor a shared asset abstraction?
Conclusion
Substrate defines when an account ceases to exist but does not define how dependent assets are resolved.
This proposal completes the account lifecycle by making asset resolution on reaping:
-
Explicit
-
Deterministic
-
Protocol‑enforced
This removes ambiguity, prevents griefing, and improves correctness across the ecosystem.