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
  • Initialization
  • initialize()
  • Configuration
  • setSymmioAddress()
  • setRestrictedSelector()
  • setMulticastWhitelist()
  • Token Approvals
  • _approve()
  • Execution Functions
  • _executeCall()
  • _call()
  • _multicastCall()
  • Token Withdrawal
  • withdrawERC20()
  • Pausable Functions
  • pause() / unpause()
  1. Protocol Architecture
  2. Technical Documentation
  3. Contract Docs
  4. Contracts Documentation 0.8.4
  5. MultiAccount (0.8.4)

SymmioPartyB

The SymmioPartyB contract acts as a management contract for solvers or "Party B" . This contract allows for controlled interaction with the Symmio platform and external addresses for managing roles and permissions.

Key Changes in 0.8.4:

  • Reentrancy Protection: The _executeCall method now uses a custom nonReentrant modifier to prevent reentrancy attacks without altering the storage layout.

  • Access Control & Multicast Whitelisting: The contract restricts calls based on roles (e.g., MANAGER_ROLE, TRUSTED_ROLE) and maintains a whitelist for destinations allowed in multicast operations


Initialization

The SymmioPartyB contract uses upgradeable libraries for pausing and access control. During initialization, it sets the admin roles and the address of the Symmio contract.

initialize()

Function Signature:

function initialize(address admin, address symmioAddress_) public initializer;

Parameters:

  • admin: The address to receive the DEFAULT_ADMIN_ROLE, TRUSTED_ROLE, and MANAGER_ROLE.

  • symmioAddress_: The address of the Symmio contract with which this contract will interact.

Example:

symmioPartyB.initialize(adminAddress, symmioAddress);

Configuration

setSymmioAddress()

Description: Updates the address of the Symmio contract. Only callable by users with the DEFAULT_ADMIN_ROLE.

Function Signature:

function setSymmioAddress(address addr) external onlyRole(DEFAULT_ADMIN_ROLE);

Parameters:

  • addr: The new Symmio contract address.

Example:

symmioPartyB.setSymmioAddress(newSymmioAddress);

Events Emitted:

  • SetSymmioAddress(address oldSymmioAddress, address newSymmioAddress)


setRestrictedSelector()

Description: Restricts or lifts restrictions on specific function selectors. If a selector is restricted, only callers with the MANAGER_ROLE may invoke the function on the Symmio contract.

Function Signature:

function setRestrictedSelector(bytes4 selector, bool state) external onlyRole(DEFAULT_ADMIN_ROLE);

Parameters:

  • selector: The function selector to restrict/unrestrict.

  • state: true to restrict, false to unrestrict.

Example:

bytes4 selector = bytes4(keccak256("someFunction()"));
symmioPartyB.setRestrictedSelector(selector, true);

Events Emitted:

  • SetRestrictedSelector(bytes4 selector, bool state)


setMulticastWhitelist()

Description: Allows a manager to add or remove an address from the multicast whitelist. Only addresses on the whitelist can be called via the multicasting functionality.

Function Signature:

function setMulticastWhitelist(address addr, bool state) external onlyRole(MANAGER_ROLE);

Parameters:

  • addr: The address to update.

  • state: true to whitelist, false to remove.

Example:

symmioPartyB.setMulticastWhitelist(targetAddress, true);

Events Emitted:

  • SetMulticastWhitelist(address addr, bool state)


Token Approvals

_approve()

Description: Approves a specified ERC20 token amount for spending by the Symmio contract. Only callable by users with the TRUSTED_ROLE and when the contract is not paused.

Function Signature:

function _approve(address token, uint256 amount) external onlyRole(TRUSTED_ROLE) whenNotPaused;

Parameters:

  • token: The ERC20 token address.

  • amount: The amount to approve.

Example:

symmioPartyB._approve(tokenAddress, 1000);

Execution Functions

_executeCall()

Description: Executes a low-level call to a destination address using the provided call data. This function now includes a custom nonReentrant modifier to prevent reentrancy attacks. It enforces role-based access control depending on the destination and function selector.

Function Signature:

function _executeCall(address destAddress, bytes memory callData) internal nonReentrant;

Parameters:

  • destAddress: The destination address for the call.

  • callData: The call data (must be at least 4 bytes).

Key Logic:

  • Validates that destAddress is not zero.

  • Checks the length of callData.

  • If calling the Symmio contract (destAddress == symmioAddress), extracts the function selector and enforces:

    • If restricted, the caller must have MANAGER_ROLE.

    • Otherwise, the caller must have either MANAGER_ROLE or TRUSTED_ROLE.

  • If calling another contract, verifies that the destination is whitelisted.

  • Executes the call and reverts if it fails.


_call()

Executes multiple calls to the Symmio contract by iterating over an array of call data, using _executeCall for each entry.

Function Signature:

function _call(bytes[] calldata _callDatas) external whenNotPaused;

Parameters:

  • _callDatas: An array of call data bytes.

Example Usage:

bytes[] memory calls = new bytes[](2);
// Populate calls with call data...
symmioPartyB._call(calls);

_multicastCall()

Description: Allows the caller to execute multiple calls to various destination addresses in a single transaction. Each destination address must correspond to a call data element, and reentrancy protection is enforced on each call.

Function Signature:

function _multicastCall(address[] calldata destAddresses, bytes[] calldata _callDatas) external whenNotPaused;

Parameters:

  • destAddresses: An array of destination addresses.

  • _callDatas: An array of call data bytes.

Example Usage:

address[] memory targets = new address[](2);
targets[0] = targetAddress1;
targets[1] = targetAddress2;
bytes[] memory callsData = new bytes[](2);
// Populate callsData...
symmioPartyB._multicastCall(targets, callsData);

Token Withdrawal

withdrawERC20()

Allows an authorized manager to withdraw ERC20 tokens from the contract to the caller's address.

Function Signature:

function withdrawERC20(address token, uint256 amount) external onlyRole(MANAGER_ROLE);

Parameters:

  • token: The ERC20 token address.

  • amount: The amount to withdraw.

Example Usage:

symmioPartyB.withdrawERC20(tokenAddress, 100);

Pausable Functions

pause() / unpause()

Description: Allows users with the PAUSER_ROLE to pause the contract and users with the UNPAUSER_ROLE to unpause it, thereby controlling the execution of functions.

Function Signatures:

function pause() external onlyRole(PAUSER_ROLE);
function unpause() external onlyRole(UNPAUSER_ROLE);

Example Usage:

symmioPartyB.pause();
symmioPartyB.unpause();
PreviousSymmioPartyANextSYMM App (Muon)

Last updated 3 months ago