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

B20 Asset — Schedule Multiplier Updates (ERC-8056)

Authors: Rayyan Alam and Markus Adds a scheduled multiplier setter for B20 Asset issuers running corporate actions such as stock splits and reverse stock splits. The updateUIMultiplier function lets an operator schedule a multiplier change for a specific future timestamp instead of applying it immediately. The existing updateMultiplier function is retained as an emergency instant setter. All three write functions (updateUIMultiplier, cancelUIMultiplierUpdate, updateMultiplier) require OPERATOR_ROLE. New functions New events New errors Changed errors
InvalidMultiplier() (selector 0x6f12f3dc) now also rejects multipliers above type(uint128).max. Before Cobalt, updateMultiplier rejected only zero. The error symbol and selector are unchanged. This ceiling matches the scheduled setter and keeps balance * multiplier within uint256. The bound is unreachable for realistic corporate actions.
Deprecated

PolicyRegistry — Composite Policies (UNION / INTERSECT)

Adds UNION (OR) and INTERSECT (AND) composite policy types. A UNION policy authorizes an account if any child policy authorizes it. An INTERSECT policy authorizes an account only if every child policy authorizes it. Each composite references two to four existing simple policies (ALLOWLIST or BLOCKLIST). Composite policies cannot reference other composites. New PolicyType enum values New functions New events New errors

B20 Asset, B20 Stablecoin — Seize Surface + burnBlocked Deprecation

Author: Stephan See the full entry: Seize surface.

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.