Browse Source

Add `_initializableStorageSlot` (#5337)

Co-authored-by: Arr00 <13561405+arr00@users.noreply.github.com>
Ernesto García 7 months ago
parent
commit
2ed8956992
2 changed files with 16 additions and 1 deletions
  1. 5 0
      .changeset/fast-coats-try.md
  2. 11 1
      contracts/proxy/utils/Initializable.sol

+ 5 - 0
.changeset/fast-coats-try.md

@@ -0,0 +1,5 @@
+---
+'openzeppelin-solidity': minor
+---
+
+`Initializable`: Add `_initializableStorageSlot` function that returns a pointer to the storage struct. The function allows customizing with a custom storage slot with an `override`.

+ 11 - 1
contracts/proxy/utils/Initializable.sol

@@ -216,13 +216,23 @@ abstract contract Initializable {
         return _getInitializableStorage()._initializing;
     }
 
+    /**
+     * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.
+     *
+     * NOTE: Consider following the ERC-7201 formula to derive storage locations.
+     */
+    function _initializableStorageSlot() internal pure virtual returns (bytes32) {
+        return INITIALIZABLE_STORAGE;
+    }
+
     /**
      * @dev Returns a pointer to the storage namespace.
      */
     // solhint-disable-next-line var-name-mixedcase
     function _getInitializableStorage() private pure returns (InitializableStorage storage $) {
+        bytes32 slot = _initializableStorageSlot();
         assembly {
-            $.slot := INITIALIZABLE_STORAGE
+            $.slot := slot
         }
     }
 }