Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
LABS
Glossary

Diamond Standard (EIP-2535)

An Ethereum Improvement Proposal (EIP-2535) defining a modular smart contract architecture where a single proxy contract delegates calls to multiple, independent logic contracts called facets, enabling unlimited upgradeability and reduced gas costs.
Chainscore © 2026
definition
SMART CONTRACT ARCHITECTURE

What is the Diamond Standard (EIP-2535)?

A comprehensive guide to the Diamond Standard, an Ethereum Improvement Proposal that enables modular, upgradeable smart contracts.

The Diamond Standard, formalized as EIP-2535, is a smart contract design pattern and standard that enables a single, on-chain contract—called a diamond—to be composed of multiple, independent logic contracts known as facets, which can be added, replaced, or removed after deployment without requiring a full contract migration. This architecture solves the contract size limit of 24KB by distributing code across facets and provides a structured, transparent mechanism for upgradeability. The diamond's core, or diamond proxy, maintains a central lookup table that maps function selectors to their corresponding facet addresses, delegating calls accordingly.

At the heart of this system is the diamondCut function, the standard interface for performing upgrades. An authorized party can execute a diamondCut to add, replace, or remove any number of functions from the diamond in a single transaction, with each change logged in an on-chain event for full auditability. This modularity allows developers to treat facets like plugins—common functionalities such as ownership (Ownable), access control (Roles), or ERC-20 logic can be written as reusable, audited libraries. The standard also defines diamond loupe functions, which are read-only methods that return the diamond's current facet addresses and the functions they implement, ensuring operational transparency.

The primary advantage of the Diamond Standard is the elimination of monolithic, hard-to-upgrade contracts, enabling incremental development and long-term maintenance. It is particularly valuable for complex DeFi protocols, DAOs, and enterprise applications where business logic must evolve. Unlike proxy patterns that upgrade a single implementation address, a diamond can upgrade individual functions, reducing risk and gas costs. However, this power requires rigorous access control and governance, as the diamondCut function is a central point of control. The standard has been adopted by major projects like Aavegotchi and is a foundational technology for building scalable, future-proof decentralized applications on Ethereum and EVM-compatible chains.

how-it-works
EIP-2535

How the Diamond Standard Works

An in-depth look at the modular smart contract architecture that enables upgradeable, scalable dApps.

The Diamond Standard is a modular smart contract architecture defined by Ethereum Improvement Proposal 2535 (EIP-2535) that allows a single contract, called a diamond, to execute logic from multiple independent, pluggable contracts known as facets. This design solves the contract size limit and upgradeability challenges of traditional monolithic contracts by separating functionality into discrete, reusable libraries. The diamond's core, or diamond proxy, uses a delegatecall to forward function calls to the appropriate facet based on a lookup table, enabling a single, persistent contract address to host virtually unlimited logic.

At the heart of the system is the diamond storage pattern, a method for facets to share and access a structured data layout within the diamond's storage without collisions. Each facet defines its own namespace within storage, allowing for safe, compartmentalized state management. This is managed by a central diamondCut function, which is the only upgrade mechanism, allowing a diamond's owner to add, replace, or remove facets and their functions. This creates a clear and auditable upgrade path, contrasting with unstructured proxy patterns.

Key components include the Loupe, a standard set of functions that publicly lists all a diamond's facets and their exposed functions, ensuring transparency. The architecture supports immutable diamonds by simply renouncing upgrade permissions. This modularity enables developers to build complex applications like decentralized exchanges or gaming platforms where features like liquidity pools, governance, and NFT mechanics can be developed and upgraded as separate, interoperable modules, all accessible through a single contract interface.

key-components
EIP-2535 ARCHITECTURE

Key Components of a Diamond

A Diamond is a modular smart contract system defined by EIP-2535, composed of a core proxy and a set of pluggable logic contracts. This structure enables unlimited, organized, and secure upgrades.

01

Diamond Proxy

The core, immutable contract that holds the contract's state and acts as a single entry point for all function calls. It uses a lookup table to route calls to the correct logic contract based on the function selector. Users and external contracts interact only with the Diamond address.

02

Facets

Independent, stateless logic contracts that contain the executable code. Each Facet implements a specific set of related functions (e.g., an ERC20 Facet, a staking Facet). The Diamond can have multiple Facets attached, and their functions are made available through the proxy's lookup table.

03

DiamondCut

The standardized function (defined in the DiamondLoupe Facet) used to upgrade the Diamond. It allows the addition, replacement, or removal of Facets and their functions. This function is protected by access control, typically requiring a multi-signature or DAO vote.

04

DiamondLoupe

A set of view functions that provide introspection into the Diamond's structure. It answers critical questions:

  • What Facets are attached?
  • What function selectors does the Diamond support?
  • Which Facet implements a given function? This transparency is essential for verification and tooling.
05

Storage Layout

A critical design pattern for managing state in an upgradeable system. Diamond Standard recommends using Diamond Storage or AppStorage, which decouples data structures from specific Facets. This prevents storage collisions during upgrades, where new logic might inadvertently overwrite existing state variables.

06

Fallback & Receive Functions

The Diamond's fallback function is its core engine. It uses the delegatecall opcode to execute function logic from a Facet while preserving the Diamond's storage context. The receive function handles plain Ether transfers. All external calls are processed through this mechanism.

key-features
EIP-2535

Key Features & Benefits

The Diamond Standard (EIP-2535) is a proxy pattern for creating modular, upgradeable smart contracts by enabling a single contract to delegate calls to multiple, independent logic libraries called facets.

01

Modular Architecture with Facets

A Diamond is a proxy contract that maps function selectors to the addresses of logic contracts called facets. This allows a single deployed contract address to be composed of multiple, independent libraries of code, each responsible for a specific set of functions (e.g., a TransferFacet, an AdminFacet).

  • Enables separation of concerns and cleaner code organization.
  • Different teams can work on different facets independently.
  • Reduces the risk of hitting the Ethereum 24KB contract size limit.
02

Gas-Efficient Upgrades

Upgrading a Diamond does not require migrating state or deploying a new proxy. A DiamondCut operation adds, replaces, or removes function pointers in the proxy's lookup table.

  • No storage migration: User data and balances remain at the same address.
  • Atomic upgrades: Multiple facet changes can be executed in a single transaction.
  • Selective upgrades: Only the specific logic that needs changing is updated, minimizing risk and gas costs compared to monolithic upgrades.
03

Unlimited Contract Size & Functionality

By delegating logic to external facets, a Diamond can effectively have an unlimited code size, circumventing the Ethereum bytecode size limit. This is critical for complex DeFi protocols, gaming platforms, or enterprise applications that require extensive logic.

  • Enables the development of feature-rich applications in a single contract interface.
  • Prevents the need for awkward workarounds like multi-contract systems or logic sharding for users.
05

Shared State via AppStorage

Facets within a Diamond share a single storage layout. The AppStorage pattern is a common method to manage this, using a single struct that holds all state variables. This prevents storage collisions that can occur in unstructured proxy patterns.

  • Provides a clean, declarative way to define the contract's entire state.
  • Ensures that different facets can safely read and write to the same data.
  • Simplifies reasoning about storage for developers and auditors.
06

Real-World Adoption

The Diamond Standard is used by major protocols that require complex, upgradeable systems.

  • Aave: Uses a Diamond for its V3 configuration engine.
  • Uniswap: The V4 hook architecture is inspired by and compatible with the Diamond pattern.
  • Various NFT Marketplaces & Gaming Projects: Utilize it for extensible minting, staking, and marketplace logic. This adoption validates the pattern's utility for large-scale, evolving applications.
visual-explainer
EIP-2535

Visualizing the Diamond Architecture

The Diamond Standard, defined by EIP-2535, introduces a modular smart contract system designed to overcome the code size limit of the Ethereum Virtual Machine (EVM) and enable upgradeable, gas-efficient applications.

At its core, a Diamond is a proxy contract that delegates function calls to a set of external, modular contracts called facets. The Diamond does not contain its own logic; instead, it maintains a central mapping—the diamondCut—that routes incoming function selectors to the correct facet address. This separation of storage and logic is the architecture's defining feature, allowing a single deployed Diamond to have an effectively unlimited contract size by aggregating code from many facets.

The architecture introduces several key components. The Diamond Loupe is a standard set of functions that allows anyone to inspect a Diamond, listing its attached facets and the functions each one provides. The diamondCut function is the authorized upgrade mechanism, allowing facets to be added, replaced, or removed in a single transaction. Crucially, a Diamond's storage is structured using AppStorage patterns or libraries like LibDiamond, which keeps state separate from logic and prevents storage collisions during upgrades.

This design enables powerful development patterns. Teams can deploy a stable, verified Diamond proxy once and then iteratively develop and upgrade individual facets—such as a swap facet, a staking facet, or an admin facet—without migrating user state or addresses. It facilitates a multi-faceted approach where different teams or community proposals can contribute discrete pieces of functionality, all accessible through the single Diamond contract address.

For users and integrators, a Diamond appears as a single, persistent contract. All interactions, from token transfers to complex DeFi operations, are sent to the Diamond's address. The proxy seamlessly routes the call, making the modular backend invisible. This provides the upgradeability benefits of a proxy pattern while solving the 24KB contract size limit, a critical constraint for complex dApps like decentralized exchanges or gaming platforms.

Visualizing the flow: a user's transaction calls functionX() at the Diamond address. The Diamond's fallback function consults its internal lookup table, finds that the selector for functionX() points to FacetA at address 0x123..., and uses delegatecall to execute the code from FacetA in the context of the Diamond's own storage. The result is returned as if the Diamond itself contained the logic, enabling a seamless and gas-efficient experience.

ecosystem-usage
DIAMOND STANDARD (EIP-2535)

Ecosystem Usage & Examples

The Diamond Standard (EIP-2535) enables modular smart contract systems by allowing a single contract address to host multiple, upgradeable logic contracts (facets). This section details its practical applications and notable implementations.

02

NFT Marketplaces & Gaming

NFT platforms leverage the Diamond Standard for extensible market logic and game mechanics.

  • LooksRare: Originally implemented a diamond for its marketplace core, allowing iterative feature rollouts.
  • ERC-6551 (Token Bound Accounts): Reference implementations use diamonds to make accounts programmable and upgradeable.
  • On-chain Games: Complex games use facets for discrete systems like combat, inventory, and governance, which can be patched independently.

This enables granular control over contract capabilities and backward-compatible feature deployment.

05

Security & Audit Patterns

The Diamond Standard introduces specific security considerations and established best practices.

  • Selector Clashing: Prevented by the diamond's internal mapping, which ensures each function selector points to only one facet.
  • Storage Collision: Mitigated using structured diamond storage or library-driven storage patterns.
  • Upgrade Governance: Critical diamondCut function is typically guarded by a multi-sig or timelock.
  • Transparency: The facets() and facetFunctionSelectors() view functions allow public inspection of the diamond's composition.

Audits must verify the integrity of the upgrade path and the independence of facet logic.

06

Gas Optimization & Limitations

The pattern offers specific gas trade-offs compared to traditional proxy patterns.

  • Gas Savings: For users, delegatecall to facets avoids storage slot rewrites in the proxy, saving gas on repeated interactions.
  • Deployment Cost: Initial deployment is more expensive due to multiple contract creations and diamond initialization.
  • Call Overhead: Each external call into the diamond incurs a small lookup cost to find the correct facet address.
  • Size Limit Bypass: Effectively bypasses the 24KB contract size limit by distributing code across multiple facet contracts.

It is most gas-efficient for complex systems with many functions and frequent user interactions.

security-considerations
DIAMOND STANDARD (EIP-2535)

Security Considerations & Risks

While the Diamond Standard introduces powerful upgradeability patterns, its modular architecture creates distinct security vectors that developers and auditors must rigorously assess.

01

Facet Function Selector Clashes

A critical risk in Diamond proxies is function selector clashes, where two different functions from different facets share the same 4-byte identifier. This can lead to:

  • Unintended execution where a call targets the wrong contract logic.
  • Permanent locking of a selector if an upgrade removes a facet without proper cleanup.
  • Mitigation requires using tools like the DiamondLoupe facet to audit selectors and implementing strict governance for additions/removals.
02

Centralized Upgrade Authority

The diamondCut function is a single point of control for all upgrades, typically managed by a multi-sig or DAO. This creates centralization risks:

  • Admin key compromise can lead to malicious upgrades draining the entire Diamond.
  • Governance attacks (e.g., vote manipulation) can subvert the upgrade process.
  • Best practices involve timelocks, multi-sig thresholds, and eventually migrating to decentralized, permissionless upgrade mechanisms.
03

Storage Pointer Corruption

Diamonds use a structured storage layout (often following EIP-2535's AppStorage pattern). Key risks include:

  • Storage collisions if facets incorrectly declare storage variables, corrupting critical data.
  • Inheritance conflicts when facets inherit from contracts that define their own storage.
  • Upgrade incompatibility where new facet logic expects a different storage layout, causing silent failures. Meticulous use of structs and dedicated storage slots is essential.
04

Loupe & Interface Compliance

The DiamondLoupe interface is essential for transparency, providing views into a Diamond's facets and functions. Security risks arise from:

  • Incomplete implementation where missing loupe functions break explorers, wallets, and audit tools.
  • Out-of-sync state if the loupe facet is not updated during a diamondCut, hiding active functions.
  • This can obscure the true attack surface from auditors and users, violating the principle of verifiable transparency.
05

Fallback & Calldata Handling

The Diamond's fallback function delegates calls to facets. Improper implementation risks include:

  • Unhandled function calls reverting without clear error messages, complicating debugging.
  • Calldata validation gaps allowing malformed inputs to reach facet logic.
  • Reentrancy vectors if the delegatecall context is not properly secured across facets. Robust testing of the fallback mechanism is critical.
06

Audit & Testing Complexity

The modular nature of Diamonds significantly increases audit and testing overhead:

  • Combinatorial explosion of interactions between multiple facets must be tested.
  • Upgrade path validation requires simulating every possible diamondCut sequence.
  • Tooling limitations as many standard security scanners are not optimized for the Diamond proxy pattern. Comprehensive integration testing and fuzzing across all facet combinations are mandatory.
UPGRADE MECHANISM COMPARISON

Diamond Standard vs. Traditional Upgrade Patterns

A technical comparison of upgrade methodologies for smart contracts, contrasting the modular Diamond Standard (EIP-2535) with conventional approaches.

Feature / MetricDiamond Standard (EIP-2535)Monolithic ContractProxy Pattern

Upgrade Granularity

Function-level (Loupe)

Entire contract

Entire implementation contract

Storage Layout

Immutable, shared Diamond storage

Recreated on upgrade

Separate proxy & implementation storage

Code Size Limit

Effectively unlimited via facets

~24KB (EVM limit)

~24KB per implementation

Upgrade Gas Cost

Low (add/replace single functions)

Very High (full redeploy)

Medium (update proxy pointer)

Function Selector Clashes

Prevented by DiamondLoupe

N/A (single contract)

Risk in new implementation

Initialization Complexity

Can initialize facets independently

Single constructor

Separate initializer function risk

Verification & Audit Surface

Per-facet, incremental

Full contract per upgrade

Full implementation per upgrade

Backwards Compatibility

High (selective function preservation)

None (complete replacement)

Medium (dependent on new logic)

DIAMOND STANDARD (EIP-2535)

Common Misconceptions

The Diamond Standard (EIP-2535) is a powerful but often misunderstood pattern for creating modular smart contracts. This section clarifies frequent points of confusion about its architecture, security, and practical use.

No, a Diamond is a specific type of upgradeable proxy contract that uses a unique multi-facet architecture. While a standard proxy (like EIP-1967) delegates all calls to a single implementation contract, a Diamond delegates calls to multiple implementation contracts called facets. The Diamond's core, managed by a DiamondCut facet, maintains a lookup table (the diamondStorage mapping) that routes function selectors to specific facet addresses. This allows for modular upgrades where you can add, replace, or remove functions from specific facets without needing to redeploy the entire system, offering more granularity than a monolithic proxy upgrade.

DIAMOND STANDARD (EIP-2535)

Frequently Asked Questions (FAQ)

Common questions about the Diamond Standard (EIP-2535), a smart contract upgradeability pattern that enables modular, gas-efficient, and virtually unlimited contract logic.

The Diamond Standard, formalized as Ethereum Improvement Proposal 2535 (EIP-2535), is a smart contract design pattern that enables modular, upgradeable contracts by using a proxy pattern where a single "diamond" contract delegates function calls to multiple, discrete logic contracts called facets. The diamond maintains a central mapping of function selectors to facet addresses, allowing developers to add, replace, or remove functionality without migrating the contract's core state or address. This pattern solves the code size limit of the Ethereum Virtual Machine (EVM) and provides a structured, transparent approach to contract evolution, making it a foundational standard for complex, long-lived decentralized applications (dApps).

ENQUIRY

Get In Touch
today.

Our experts will offer a free quote and a 30min call to discuss your project.

NDA Protected
24h Response
Directly to Engineering Team
10+
Protocols Shipped
$20M+
TVL Overall
NDA Protected Directly to Engineering Team
Diamond Standard (EIP-2535): Modular Smart Contract System | ChainScore Glossary