LogoLogo
  • Overview
    • Introduction
    • Table of Contents
  • Token Information
    • Symmio Foundation
  • Protocol Architecture
    • Protocol Introduction
    • Technical Documentation
      • Building an Application with SYMM
        • Introduction and Diamond Explainer
        • Querying Info from the SYMM Diamond
        • MultiAccount
        • Creating an Account and Depositing Funds
        • Sending a Quote
        • Closing a Quote
        • Instant Trading
          • Instant Login (EOA)
          • Instant Login (Account Abstraction)
          • Sending a Quote (Instant Open)
          • Sending a Quote (Instant Close)
        • Frequently Used Queries
      • Solver Docs
        • Solver Docs (github)
        • Solver Implementation Guide (High Level Overview)
        • Building a Solver on SYMMIO
          • 1. Intent Creation
          • 2. Seeing the Intent
          • 3. Hedging Off-Chain
          • 4. Opening/Closing a Position On-Chain
          • Creating the APIs
            • GET Contract Symbols
            • GET Open Interest
            • GET Notional Cap
            • GET Price Range
            • GET Error Codes
            • GET Get Locked Params
            • GET Get Funding Info
            • POST Position State
          • Solver Flow Summary Example
          • Recommended Architecture for Solvers
          • Glossary
        • Conditional Orders Handler
        • Rasa Solver TP/SL Implementation
        • Instant Trading
          • Instant Trading (Solvers)
          • Rasa Instant Trading Implementation
          • Instant Trading Condition Checks
        • Fetching Gas Prices Script
        • How to Add a Market as a Solver
        • Verifying Account Abstracted Instant Actions (ERC-4337)
      • Frontend Docs
        • Setting up a Frontend with SYMMIO
        • Frontend SDK Setup Guide
        • MultiAccount Deployment Guide
        • Instant Trading (Frontends)
          • Account Abstracted Instant Actions (Frontends)
        • Implement a Trading Bot on Symmio (OLD)
          • Setup
          • Creating a Sub-Account
          • Minting Collateral Tokens (Optional)
          • Depositing and Allocating Tokens
          • Obtaining Muon Signatures
          • Sending a Quote
          • Monitoring Price for Execution
      • Contract Docs
        • SYMMIO CORE v0.82
        • Contracts Documentation 0.8.2
          • Main Flow
          • The SYMM Diamond
          • Facets
            • Account Facet
            • Control Facet
            • Funding Rate Facet
            • PartyA Facet
            • PartyB Facet
            • Liquidation Facet
            • View Facet
          • MultiAccount
            • PartyA
            • PartyB
          • SYMM App (Muon)
            • LibMuon
            • MuonStorage
        • Contracts Documentation 0.8.3
          • Facets
            • Control Facet
            • Account Facet
            • PartyA Facet
            • PartyB Facet
            • View Facet
            • Bridge Facet
            • Liquidation Facet (Implementation)
          • Modified Events
          • New Events
          • MuonStorage
        • Contracts Documentation 0.8.4
          • Main Flow (0.8.4)
          • The SYMM Diamond (0.8.4)
          • Facets
            • Account Facet (0.8.4)
            • Bridge Facet (0.8.4)
            • Control Facet (0.8.4)
            • Force Actions Facet (0.8.4)
            • Funding Rate Facet (0.8.4)
            • Liquidations Facet (0.8.4)
            • PartyA Facet (0.8.4)
            • PartyB Group Actions Facet (0.8.4)
            • PartyB Quote Actions Facet (0.8.4)
            • PartyB Position Actions Facet (0.8.4)
            • Settlement Facet (0.8.4)
            • View Facet (0.8.4)
          • MultiAccount (0.8.4)
            • SymmioPartyA
            • SymmioPartyB
          • SYMM App (Muon)
            • LibMuon (0.8.4)
            • MuonStorage (0.8.4)
      • Contract Addresses / Solver Endpoints
        • Mantle
        • Mode
        • IOTA
        • Base
        • BSC
        • Arbitrum
        • Polygon
        • Berachain
        • Solver Endpoints and Addresses
          • Perps Hub
          • Rasa Capital
          • Rasa Capital (Zero Spread)
          • Zenith
      • How to Query our Contracts
      • Muon API Queries
      • Solver Error Codes
      • Interacting with SYMMIO Contracts
    • Protocol higher level architecture
      • 12-Hour Fraud Proof Window
      • PartyB
      • Solver Settings
      • Max Leverage
      • Maintenance Margin (CVA) Calculations
    • Symmio Whitepaper
  • Building on Symmio
    • Builders introduction
    • Solving for Symmio
      • Solver documentation
      • Solver - Example Flow
    • Trading Fees
      • Perps - Settlement Costs
      • Pair Trading - Settlement costs
    • Exchanges (Frontends)
      • Frontend Introduction
      • SDK - SYMM client
      • Trade on Symmio
  • Legal & Brand & Security
    • Security (Audits / Bugbounty)
      • Bug bounty / Coverage
        • How to contact ?
      • Audits
        • SYMM - V0.8 - 0.81
          • Sherlock Audit - Jun 15, 2023
          • Smart State - Jul 2, 2023
        • SYMM - 0.82
          • Sherlock Audit -Aug 30, 2023
        • SYMM - 0.83
          • Sherlock Audit - Jun 17, 2024
        • SYMM - 0.84
          • Sherlock Audit - Oct 3, 2024
        • Vaults
          • Sherlock Audit - Jan 2, 2024
    • Terms of Service & Licensing
      • TRADEMARK & COPYRIGHT NOTICE
      • CONTACT US
      • TERMS OF SERVICE
      • FRONTEND LICENSE
        • Frontend Modifications
        • Frontend Use Grants
      • CONTRACT LICENSE
        • Contract Use Grants
        • Contract Modifications
    • Brand - Assets Logos
Powered by GitBook
LogoLogo

All rights to the people (c) 2023 Symmetry Labs A.G.

On this page
  • The SYMM Diamond
  • EIP-2535: Diamond Standard Overview
  • Symmio's Diamond Implementation
  • Storage Libraries
  • Facet Interaction with Diamond Storage
  • IDiamondCut Interface
  • Finding Facet Contracts
  1. Protocol Architecture
  2. Technical Documentation
  3. Contract Docs
  4. Contracts Documentation 0.8.4

The SYMM Diamond (0.8.4)

PreviousMain Flow (0.8.4)NextFacets

Last updated 4 months ago

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 .


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

official EIP-2535 documentation
louper.dev