Skip to main content
Per-hardfork, per-feature migration notes for the B20 token standard. Each Cobalt and Denim entry is a focused, code-forward changelog for one scoped feature change that crosses a hardfork boundary. Newest first.
B20 method and event signatures are part of the chain’s consensus surface. Existing selectors do not change, and new functionality ships by addition. Behavior can change at a hardfork boundary: two Denim entries below are breaking for some integrations.

Hardfork Ordinals

Denim (Upcoming), Ordinal 03

Cobalt, Ordinal 02

Beryl: Initial Release

Shipped with the Beryl upgrade. Added
  • The B20 standard as a native precompile: a superset of ERC-20 with full selector and behavior parity for transfer, transferFrom, approve, allowance, balanceOf, totalSupply, name, symbol, decimals, Transfer, and Approval
  • Role-based access control with built-in roles, user-defined roles in the role graph, and renounceLastAdmin for permanent admin-less operation
  • PolicyRegistry singleton precompile with BLOCKLIST, ALLOWLIST, UNION, and INTERSECT policy types, two-step admin transfer, and the ALWAYS_ALLOW and ALWAYS_BLOCK built-ins
  • Four policy scopes on every token, covering transfer sender, receiver, and executor, and mint receiver
  • Memo variants of transfer, transferFrom, mint, and burn, emitting Memo immediately after the primary event
  • Granular pausing by PausableFeature: TRANSFER, MINT, and BURN
  • burnBlocked and BURN_BLOCKED_ROLE for administrative removal of a blocked holder’s balance
  • Optional supply caps, with type(uint128).max as the uncapped sentinel and maximum supply
  • ERC-2612 permit with an EIP-712 domain at version "1"
  • ERC-7572 contractURI and METADATA_ROLE-gated name, symbol, and URI updates
  • B20Factory singleton precompile with deterministic, variant-encoding addresses and initCalls bootstrap semantics
  • ActivationRegistry gating for state-changing PolicyRegistry calls
  • The ASSET variant: OPERATOR_ROLE, WAD-precision UI multipliers with scheduled and instant updates, announcements, batchMint, and issuer-defined extra metadata
  • The STABLECOIN variant: fixed 6 decimals and a currency() code set once at creation
seizeWithMemo, the SEIZE pause feature, the two seize policy scopes, and the deprecation of burnBlocked shipped later with Cobalt. See the seize changelog entry.