Repository navigation
Denim contains breaking changes. It doesn't remove or rename any Beryl or Cobalt selector, event topic, or error selector. However, two B20 changes make some calls that succeed today revert after Denim activates.
Changes
B20 (Asset and Stablecoin) — Reject sends to the token's own address (breaking)
A transfer, mint, or seize to the token's own address now reverts with InvalidReceiver. Before Denim, these tokens became stuck, and only the issuer could recover them. Issuers can still use seizeWithMemo to recover tokens that are already stuck. Details
B20 (Asset and Stablecoin) — Apply the transfer executor policy to every transfer (breaking)
TRANSFER_EXECUTOR_POLICY now checks the caller on transfer, transferFrom, and their memo versions, including when holders move their own tokens. Before Denim, it checked only transferFrom calls made by a different account. Tokens that never set this policy aren't affected. Details
PolicyRegistry — Inverted policies
Any policy can now be used as its opposite, so one address list can act as an allowlist or a blocklist. Get the inverted ID with invertedPolicyId(policyId). If the original policy doesn't exist, the inverted ID authorizes no accounts. Existing policies aren't affected. Details
Full migration guidance: CHANGELOG.md