Skip to content

Add initializable Diamond pattern#20

Merged
dadadave80 merged 5 commits intodevfrom
feat/initializable-diamond
Apr 3, 2026
Merged

Add initializable Diamond pattern#20
dadadave80 merged 5 commits intodevfrom
feat/initializable-diamond

Conversation

@dadadave80
Copy link
Copy Markdown
Owner

Summary

  • Add InitializableLib with versioned initialization guards (initializer, reinitializer, disableInitializers) adapted from Solady/OpenZeppelin
  • Migrate Diamond.sol from constructor-based to external initialize() function, enabling proxy-friendly deployment
  • Extract OwnableInit and ERC165Init from DiamondInit for granular, composable initialization via MultiInit
  • Fix postReinitializer bug where version was stored without left-shifting, breaking the packed slot layout and causing incorrect version tracking
  • Add 13 tests covering initialization, re-initialization prevention, version tracking, disableInitializers, and MultiInit composition
  • Refactor OwnableRolesLib: rename functions and simplify assembly

Remove underscore prefix from all internal library functions,
_guardInitializeOwner indirection, and use inline
`assembly("memory-safe")` annotations. Update DiamondCutFacet and
OwnableRolesFacet call sites.
Replace constructor-based initialization with an external `initialize()`
function guarded by InitializableLib. Simplify MultiInit to use inline
delegatecall with explicit error handling. Remove _beforeDelegate hook
and _diamondCut wrapper from Diamond base contract.
Split DiamondInit into standalone OwnableInit and ERC165Init initializers
for granular use via MultiInit. Update deploy script to use MultiInit
with the separate initializers.
postReinitializer was storing the raw version without shifting
left by 1, breaking the packed slot layout (bit 0 = initializing,
bits 1..64 = version). This caused getInitializedVersion() to
return incorrect values and the Initialized event to emit wrong
versions after reinitialization.
Test initialization, re-initialization prevention, version tracking,
sequential reinitializations, disableInitializers, and MultiInit
composition through the Diamond.initialize() entrypoint.
@dadadave80 dadadave80 merged commit df59407 into dev Apr 3, 2026
2 checks passed
@dadadave80 dadadave80 deleted the feat/initializable-diamond branch April 3, 2026 01:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant