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.
-
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.
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_slot
at the current call depth.set(bytes32 _slot, uint256 _value)
: Sets_value
as the value in transient storage corresponding to_slot
at 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).
- 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
TransientReentrancyAware
to access thereentrantAware
modifier - Use
get(bytes32 _slot)
andset(bytes32 _slot, uint256 _value)
to retrieve and set values in transient storage
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.