The SYMM Diamond (0.8.4)
The SYMM Diamond
Symmio's core contracts are implemented using the EIP-2535 Diamond Standard—a modular and upgradeable approach to smart contract development. The 0.8.4 codebase introduces slight modifications; please refer to the updated graphic for the revised depiction of facets and libraries.
EIP-2535: Diamond Standard Overview
EIP-2535 introduces the Diamond Standard, a methodology for constructing modular and upgradeable contracts. Central to this standard is the concept of a "Diamond" contract that is composed of multiple "facets," each handling a different set of functionalities.
Key Benefits:
Modularity: Upgrade or modify individual facets independently without impacting the entire contract.
Function Selectors: Unique identifiers that route function calls efficiently to the appropriate facet, ensuring organized and conflict-free execution.
For further technical details, please refer to the official EIP-2535 documentation.
Symmio's Diamond Implementation
In the Symmio system, the Diamond acts as a facade contract that delegates function calls to its facets via delegatecall
. Each facet operates as an independent contract and may share internal functions, libraries, and state variables.
Highlights:
Centralized Data Storage: All data manipulated by facets is stored within the Diamond contract.
Utilization of Libraries: Libraries define the data structures and methods used to interact with shared state, ensuring consistency across facets.
Storage Libraries
The SYMM Diamond uses several storage libraries to manage its state. Each storage library defines:
A unique
bytes32
storage slot (derived from a keccak hash of a unique identifier string, e.g.,diamond.standard.storage.quote
).A Layout struct that organizes state variables for consistent access and modification.
A
layout()
function that employs inline assembly to calculate and return a reference to the designated storage slot.
List of Storage Libraries:
GlobalAppStorage.sol: Handles storage for Symmio emergency functions.
MAStorage.sol: Contains Master Agreement Storage with variables related to PartyB, such as cooldowns, liquidator shares, and liquidation statuses.
QuoteStorage.sol: Defines the Quote, OrderType, QuoteStatus, and PositionType. The Layout struct holds mappings related to quotes.
MuonStorage.sol: Specifies the structure for signatures used in verifying symbol prices, user uPnl, and liquidation state.
AccountStorage.sol: Manages locked and available balances.
SymbolStorage.sol: Defines a Symbol struct containing details about trading symbols, along with a mapping of symbols.
BridgeStorage.sol: Manages the bridge feature by storing designated bridge addresses, mapping bridge transactions and tracking transaction IDs.
Facet Interaction with Diamond Storage
The Diamond contract itself does not import these storage libraries directly. Instead, when a facet is invoked via delegatecall
:
It imports and uses the relevant storage library.
The library computes the slot address, allowing the facet to access or modify data in the Diamond’s storage transparently.
IDiamondCut Interface
The SYMM Diamond implements the IDiamondCut
interface to manage its function selectors. This interface provides:
Mapping of Function Selectors: A relationship between function selectors and their corresponding facet addresses.
Atomic Updates: The
diamondCut
function enables adding, replacing, or removing functions from multiple facets in a single transaction. This atomicity prevents data corruption during upgrades.
Finding Facet Contracts
The facets()
function provided by the DiamondLoupeFacet
is essential for inspecting the Diamond's structure. When invoked, it returns an array of facet structs that include:
The address of each facet.
The specific function selectors associated with each facet.
For a user-friendly interface to interact with all of the facets within a Diamond contract, consider using the louper.dev tool.
Last updated