Skip to main content
Per-hardfork, per-feature migration notes for the B20 token standard. Each Cobalt 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 and behavior do not change; the standard grows by addition.

Hardfork ordinals

Cobalt (upcoming) — 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
  • Six policy scopes on every token, covering transfer sender, receiver, and executor, mint receiver, and seize holder and receiver
  • seizeWithMemo for compliance-driven balance transfers
  • Memo variants of transfer, transferFrom, mint, burn, and seize, emitting Memo immediately after the primary event
  • Granular pausing by PausableFeature: TRANSFER, MINT, BURN, and SEIZE
  • 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
Deprecated
  • burnBlocked and BURN_BLOCKED_ROLE, retained for backwards compatibility. New seizure flows use seizeWithMemo.