transience
transience copied to clipboard
A Solidity library for transient storage management ✨
✨ Transience
A Solidity library for transient storage
Transience is a Solidity library for safely managing transient storage in smart contracts. It stores values by call depth, allowing reentrancy-aware functions that ensure isolated storage across reentrant calls.
Features
-
Transient Storage: Transience offers methods for writing and reading transient storage without having to use assembly/Yul.
-
Reentrancy Awareness: Transience keeps track of the current call depth, preventing a reentrant function call from overwriting its parent's transient storage location.
How It Works
Transience uses a unique slot identifier and the current call depth to determine a distinct storage location. The library provides two main functions:
get(bytes32 _slot): Retrieves the value in transient storage corresponding to_slotat the current call depth.set(bytes32 _slot, uint256 _value): Sets_valueas the value in transient storage corresponding to_slotat the current call depth.
The TransientReentrancyAware contract offers a reentrantAware modifier that automatically increments and decrements the call depth when entering and exiting a function, ensuring isolation from calls at other call depths (i.e., from a reentrant call).
Getting Started
- Install the library in your Solidity project
forge install ethereum-optimism/transience
- Import the library's contracts in your smart contract
import {TransientContext, TransientReentrancyAware} from "transience/src/TransientContext.sol";
- Inherit from
TransientReentrancyAwareto access thereentrantAwaremodifier - Use
get(bytes32 _slot)andset(bytes32 _slot, uint256 _value)to retrieve and set values in transient storage
Contribute & Feedback
Feel free to raise an issue, suggest a feature, or even fork the repository for personal tweaks. If you'd like to contribute, please fork the repository and make changes as you'd like. Pull requests are warmly welcome.