# The SYMMIO Diamond

Symmio's core contracts are implemented using the EIP-2535 Diamond Standard—a modular and upgradeable approach to smart contract development. The options 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](https://eips.ethereum.org/EIPS/eip-2535).

***

### 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.

<figure><img src="https://1257875949-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYQhBmTCs9MwhhuPQrV5v%2Fuploads%2FSk2UXXBlcD5nBttH1vlI%2FOptions%20Diamond.png?alt=media&#x26;token=1b731530-ac6b-4f73-8005-8ccb5c9f0174" alt=""><figcaption><p>Facet Relationships</p></figcaption></figure>

***

### 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](https://louper.dev/) tool.
