PNC Stack
Protocol
Rollup
Smart Contracts

Smart Contract Overview

This guide provides an overview of the functionality of the smart contract components. You can also find contract addresses on PNC Mainnet.

L1 contracts

DelayedVetoable

This contract enables a delay before a call is forwarded to a target contract, and during the delay period the call can be vetoed by the authorized vetoer. This contract does not support value transfers, only data is forwarded. Additionally, this contract cannot be used to forward calls with data beginning with the function selector of the queuedAt(bytes32) function. This is because of input validation checks performed by Solidity at runtime on functions which take an argument.

L1CrossDomainMessenger

The L1CrossDomainMessenger is a message passing interface between L1 and L2 responsible for sending and receiving data on the L1 side. Users are encouraged to use this interface instead of interacting with lower-level contracts directly.

L1ERC721Bridge

The L1ERC721bridge is a contract which works together with the L2 ERC721 bridge to make it possible to transfer ERC721 tokens from Ethereum to Pinnacle Chain. This contract acts as an escrow for ERC721 tokens deposited into L2.

L1StandardBridge

⚠️

This contract is not intended to support all variations of ERC20 tokens. Examples of some token types that may not be properly supported by this contract include, but are not limited to: tokens with transfer fees, rebasing tokens, and tokens with blocklists.

The L1StandardBridge is responsible for transferring ETH and ERC20 tokens between L1 and L2. In the case that an ERC20 token is native to L1, it will be escrowed within this contract. If the ERC20 token is native to L2, it will be burnt. Before Bedrock, ETH was stored within this contract. After Bedrock, ETH is instead stored inside the PinnacleChain contract.

L2OutputOracle

The L2OutputOracle contains an array of L2 state outputs, where each output is a commitment to the state of the L2 chain. Other contracts like the PinnacleChain use these outputs to verify information about the state of L2.

PinnacleChain

The PinnacleChain is a low-level contract responsible for passing messages between L1 and L2. Messages sent directly to the PinnacleChain have no form of replayability. Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface.

ProtocolVersions

The ProtocolVersions contract is used to manage Superchain protocol version information.

ResourceMetering

ResourceMetering implements an EIP-1559 style resource metering system where pricing updates automatically based on current demand.

SuperchainConfig

The SuperchainConfig contract is used to manage configuration of global Superchain values.

SystemConfig

The SystemConfig contract is used to manage configuration of an PNC Stack network. All configuration is stored on L1 and picked up by L2 as part of the derivation of the L2 chain.

L2 contracts (predeploys)

BaseFeeVault

The BaseFeeVault accumulates the base fee that is paid by transactions.

GasPriceOracle

This contract maintains the variables responsible for computing the L1 portion of the total fee charged on L2. Before Bedrock, this contract held variables in state that were read during the state transition function to compute the L1 portion of the transaction fee. After Bedrock, this contract now simply proxies the L1Block contract, which has the values used to compute the L1 portion of the fee in its state.

The contract exposes an API that is useful for knowing how large the L1 portion of the transaction fee will be. The following events were deprecated with Bedrock:

  • event OverheadUpdated(uint256 overhead);
  • event ScalarUpdated(uint256 scalar);
  • event DecimalsUpdated(uint256 decimals);

L1Block

The L1Block predeploy gives users access to information about the last known L1 block. Values within this contract are updated once per epoch (every L1 block) and can only be set by the "depositor" account, a special system address. Depositor account transactions are created by the protocol whenever we move to a new epoch.

L1FeeVault

The L1FeeVault accumulates the L1 portion of the transaction fees.

L2CrossDomainMessenger

The L2CrossDomainMessenger is a high-level interface for message passing between L1 and L2 on the L2 side. Users are generally encouraged to use this contract instead of lower level message passing contracts.

L2ERC721Bridge

⚠️

Do not bridge an ERC721 that was originally deployed on Pinnacle Chain. This bridge ONLY supports ERC721s originally deployed on Ethereum. Users will need to wait for the one-week challenge period to elapse before their Pinnacle Chain-native NFT can be refunded on L2.

The L2ERC721Bridge is a contract which works together with the L1 ERC721 bridge to make it possible to transfer ERC721 tokens from Ethereum to Pinnacle Chain. This contract acts as a minter for new tokens when it hears about deposits into the L1 ERC721 bridge. This contract also acts as a burner for tokens being withdrawn.

L2StandardBridge

⚠️

This contract is not intended to support all variations of ERC20 tokens. Examples of some token types that may not be properly supported by this contract include, but are not limited to: tokens with transfer fees, rebasing tokens, and tokens with blocklists.

The L2StandardBridge is responsible for transferring ETH and ERC20 tokens between L1 and L2. In the case that an ERC20 token is native to L2, it will be escrowed within this contract. If the ERC20 token is native to L1, it will be burnt.

L2ToL1MessagePasser

💡

There is a legacy contract under this same name.

The L2ToL1MessagePasser is a dedicated contract where messages that are being sent from L2 to L1 can be stored. The storage root of this contract is pulled up to the top level of the L2 output to reduce the cost of proving the existence of sent messages.

SequencerFeeVault

The SequencerFeeVault is the contract that holds any fees paid to the Sequencer during transaction processing and block production.

Legacy Contracts

These are legacy contracts from the old version of the PNC Stack.

AddressManager

AddressManager is a legacy contract that was used in the old version of the Pinnacle Chain system to manage a registry of string names to addresses. We now use a more standard proxy system instead, but this contract is still necessary for backwards compatibility with several older contracts.

DeployerWhitelist

DeployerWhitelist is a legacy contract that was originally used to act as a whitelist of addresses allowed to the Pinnacle Chain network. The DeployerWhitelist has since been disabled, but the code is kept in state for the sake of full backwards compatibility. As of the Bedrock upgrade, the DeployerWhitelist is completely unused by the Pinnacle Chain system and could, in theory, be removed entirely.

L1BlockNumber

L1BlockNumber is a legacy contract that fills the roll of the OVM_L1BlockNumber contract in the old version of the Pinnacle Chain system. Only necessary for backwards compatibility. If you want to access the L1 block number going forward, you should use the L1Block contract instead.

L1ChugSplashProxy

Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added functions setCode and setStorage for changing the code or storage of the contract. Note for future developers: do NOT make anything in this contract 'public' unless you know what you're doing. Anything public can potentially have a function signature that conflicts with a signature attached to the implementation contract. Public functions SHOULD always have the proxyCallIfNotOwner modifier unless there's some really good reason not to have that modifier. And there almost certainly is not a good reason to not have that modifier. Beware!

LegacyERC20ETH

LegacyERC20ETH is a legacy contract that held ETH balances before the Bedrock upgrade. All ETH balances held within this contract were migrated to the state trie as part of the Bedrock upgrade. Functions within this contract that mutate state were already disabled as part of the EVM equivalence upgrade.

LegacyMessagePasser

The LegacyMessagePasser was the low-level mechanism used to send messages from L2 to L1 before the Bedrock upgrade. It is now deprecated in favor of the new MessagePasser.

LegacyMintableERC20

The legacy implementation of the OptimismMintableERC20. This contract is deprecated and should no longer be used.

ResolvedDelegateProxy

ResolvedDelegateProxy is a legacy proxy contract that makes use of the AddressManager to resolve the implementation address. We're maintaining this contract for backwards compatibility so we can manage all legacy proxies where necessary.

Releases

The full smart contract release process is documented in the monorepo All production releases are always tags, versioned as <component-name>/v<semver> and contract releases you'll see them tagged as op-contract/vX.X.X.

⚠️

For contract releases, refer to the GitHub release notes for a given release, which will list the specific contracts being released—not all contracts are considered production ready within a release, and many are under active development. These release pages are linked below.

Tags of the form v<semver>, such as v1.1.4, indicate releases of all Go code only, and DO NOT include smart contracts.

v1.0.0 - Bedrock

The Bedrock protocol upgrade was designed to minimize the amount of code in the PNC Stack, pushed it as close as possible to Ethereum-Equivalence, and most importantly making the stack modular.

  • Bedrock release notes ...
  • Governance post

v1.1.0 - ProtocolVersions

The Protocol Version documents the progression of the total set of canonical PNC Stack specifications. Components of the PNC Stack implement the subset of their respective protocol component domain, up to a given Protocol Version of the PNC Stack.

The Protocol Version is NOT a hardfork identifier, but rather indicates software-support for a well-defined set of features introduced in past and future hardforks, not the activation of said hardforks.

The Protocol Version only applies to the Protocol specifications with the Superchain Targets specified within. This versioning is independent of the Semver versioning used in PNC Stack smart contracts, and the Semver-versioned reference software of the PNC-Stack. This is an optional feature.

  • ProtocolVersions release notes

v1.2.0 - SuperchainConfig with Extended Pause Functionality

The SuperchainConfig contract is used to manage global configuration values for multiple PNC Chains within a single Superchain network.

  • SuperchainConfig and Extended Pause release notes
  • Governance post

v1.3.0 - Multi-Chain Prep (MCP)

This protocol upgrade strengthens the security and upgradeability of the Superchain by enabling L1 contracts to be upgraded atomically across multiple chains in a single transaction. This upgrade also extends the SystemConfig to contain the addresses of the contracts in the network, allowing users to discover the system's contract addresses programmatically.

  • MCP release notes
  • Governance post