123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- // SPDX-License-Identifier: MIT
- // OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)
- // This file was procedurally generated from scripts/generate/templates/StorageSlot.js.
- pragma solidity ^0.8.20;
- /**
- * @dev Library for reading and writing primitive types to specific storage slots.
- *
- * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
- * This library helps with reading and writing to such slots without the need for inline assembly.
- *
- * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
- *
- * Example usage to set ERC1967 implementation slot:
- * ```solidity
- * contract ERC1967 {
- * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
- *
- * function _getImplementation() internal view returns (address) {
- * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
- * }
- *
- * function _setImplementation(address newImplementation) internal {
- * require(newImplementation.code.length > 0);
- * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
- * }
- * }
- * ```
- */
- library StorageSlot {
- struct AddressSlot {
- address value;
- }
- struct BooleanSlot {
- bool value;
- }
- struct Bytes32Slot {
- bytes32 value;
- }
- struct Uint256Slot {
- uint256 value;
- }
- struct StringSlot {
- string value;
- }
- struct BytesSlot {
- bytes value;
- }
- /**
- * @dev Returns an `AddressSlot` with member `value` located at `slot`.
- */
- function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
- /// @solidity memory-safe-assembly
- assembly {
- r.slot := slot
- }
- }
- /**
- * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
- */
- function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
- /// @solidity memory-safe-assembly
- assembly {
- r.slot := slot
- }
- }
- /**
- * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
- */
- function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
- /// @solidity memory-safe-assembly
- assembly {
- r.slot := slot
- }
- }
- /**
- * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
- */
- function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
- /// @solidity memory-safe-assembly
- assembly {
- r.slot := slot
- }
- }
- /**
- * @dev Returns an `StringSlot` with member `value` located at `slot`.
- */
- function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
- /// @solidity memory-safe-assembly
- assembly {
- r.slot := slot
- }
- }
- /**
- * @dev Returns an `StringSlot` representation of the string storage pointer `store`.
- */
- function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
- /// @solidity memory-safe-assembly
- assembly {
- r.slot := store.slot
- }
- }
- /**
- * @dev Returns an `BytesSlot` with member `value` located at `slot`.
- */
- function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
- /// @solidity memory-safe-assembly
- assembly {
- r.slot := slot
- }
- }
- /**
- * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
- */
- function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
- /// @solidity memory-safe-assembly
- assembly {
- r.slot := store.slot
- }
- }
- }
|