123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- // SPDX-License-Identifier: MIT
- // OpenZeppelin Contracts (last updated v5.1.0) (utils/TransientSlot.sol)
- // This file was procedurally generated from scripts/generate/templates/TransientSlot.js.
- pragma solidity ^0.8.24;
- /**
- * @dev Library for reading and writing value-types to specific transient storage slots.
- *
- * Transient slots are often used to store temporary values that are removed after the current transaction.
- * This library helps with reading and writing to such slots without the need for inline assembly.
- *
- * * Example reading and writing values using transient storage:
- * ```solidity
- * contract Lock {
- * using TransientSlot for *;
- *
- * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.
- * bytes32 internal constant _LOCK_SLOT = 0xf4678858b2b588224636b8522b729e7722d32fc491da849ed75b3fdf3c84f542;
- *
- * modifier locked() {
- * require(!_LOCK_SLOT.asBoolean().tload());
- *
- * _LOCK_SLOT.asBoolean().tstore(true);
- * _;
- * _LOCK_SLOT.asBoolean().tstore(false);
- * }
- * }
- * ```
- *
- * TIP: Consider using this library along with {SlotDerivation}.
- */
- library TransientSlot {
- /**
- * @dev UDVT that represents a slot holding a address.
- */
- type AddressSlot is bytes32;
- /**
- * @dev Cast an arbitrary slot to a AddressSlot.
- */
- function asAddress(bytes32 slot) internal pure returns (AddressSlot) {
- return AddressSlot.wrap(slot);
- }
- /**
- * @dev UDVT that represents a slot holding a bool.
- */
- type BooleanSlot is bytes32;
- /**
- * @dev Cast an arbitrary slot to a BooleanSlot.
- */
- function asBoolean(bytes32 slot) internal pure returns (BooleanSlot) {
- return BooleanSlot.wrap(slot);
- }
- /**
- * @dev UDVT that represents a slot holding a bytes32.
- */
- type Bytes32Slot is bytes32;
- /**
- * @dev Cast an arbitrary slot to a Bytes32Slot.
- */
- function asBytes32(bytes32 slot) internal pure returns (Bytes32Slot) {
- return Bytes32Slot.wrap(slot);
- }
- /**
- * @dev UDVT that represents a slot holding a uint256.
- */
- type Uint256Slot is bytes32;
- /**
- * @dev Cast an arbitrary slot to a Uint256Slot.
- */
- function asUint256(bytes32 slot) internal pure returns (Uint256Slot) {
- return Uint256Slot.wrap(slot);
- }
- /**
- * @dev UDVT that represents a slot holding a int256.
- */
- type Int256Slot is bytes32;
- /**
- * @dev Cast an arbitrary slot to a Int256Slot.
- */
- function asInt256(bytes32 slot) internal pure returns (Int256Slot) {
- return Int256Slot.wrap(slot);
- }
- /**
- * @dev Load the value held at location `slot` in transient storage.
- */
- function tload(AddressSlot slot) internal view returns (address value) {
- assembly ("memory-safe") {
- value := tload(slot)
- }
- }
- /**
- * @dev Store `value` at location `slot` in transient storage.
- */
- function tstore(AddressSlot slot, address value) internal {
- assembly ("memory-safe") {
- tstore(slot, value)
- }
- }
- /**
- * @dev Load the value held at location `slot` in transient storage.
- */
- function tload(BooleanSlot slot) internal view returns (bool value) {
- assembly ("memory-safe") {
- value := tload(slot)
- }
- }
- /**
- * @dev Store `value` at location `slot` in transient storage.
- */
- function tstore(BooleanSlot slot, bool value) internal {
- assembly ("memory-safe") {
- tstore(slot, value)
- }
- }
- /**
- * @dev Load the value held at location `slot` in transient storage.
- */
- function tload(Bytes32Slot slot) internal view returns (bytes32 value) {
- assembly ("memory-safe") {
- value := tload(slot)
- }
- }
- /**
- * @dev Store `value` at location `slot` in transient storage.
- */
- function tstore(Bytes32Slot slot, bytes32 value) internal {
- assembly ("memory-safe") {
- tstore(slot, value)
- }
- }
- /**
- * @dev Load the value held at location `slot` in transient storage.
- */
- function tload(Uint256Slot slot) internal view returns (uint256 value) {
- assembly ("memory-safe") {
- value := tload(slot)
- }
- }
- /**
- * @dev Store `value` at location `slot` in transient storage.
- */
- function tstore(Uint256Slot slot, uint256 value) internal {
- assembly ("memory-safe") {
- tstore(slot, value)
- }
- }
- /**
- * @dev Load the value held at location `slot` in transient storage.
- */
- function tload(Int256Slot slot) internal view returns (int256 value) {
- assembly ("memory-safe") {
- value := tload(slot)
- }
- }
- /**
- * @dev Store `value` at location `slot` in transient storage.
- */
- function tstore(Int256Slot slot, int256 value) internal {
- assembly ("memory-safe") {
- tstore(slot, value)
- }
- }
- }
|