Learn how to manage custom deployments with OP Deployer.
While OP Deployer was designed primarily for use with chains that are governed by Optimism, it also supports managing
custom deployments. This is particularly common for RaaS providers, whose customers often request deployments with
custom L1s (or L2s, in the case of L3s) or governance. This guide will walk you through the process of managing these
chains using OP Deployer.
Chains deployed in this way are not subject to Optimism Governance. They may be running customized or unaudited
code. Use at your own risk.
Bootstrapping
The first step to deploying a custom OP Stack is to bootstrap it onto an L1. This process will:
Deploy shared management contracts like SuperchainConfig and SuperchainVersions.
Deploy contract implementations that will be shared among all OP Chains in this deployment.
Set up ownership so that you can control the deployment.
You will use the bootstrap family of commands on op-deployer to do this.
Bootstrap Shared Contracts
Every OP Chain belongs to a logical deployment group. This group consists of a set of shared contracts that control the behavior
of a group of OP Chains. This includes:
Pausing bridges
Signaling which protocol versions are required and recommended
You can deploy a new set of shared contracts for each OP Chain, or you can deploy them once and share across multiple OP Chains.
The choice is up to the deployer. Note that you cannot share a set of shared contracts across multiple L1s.To begin, bootstrap the shared contracts onto your chosen L1 with the following command:
This will output a JSON file containing the addresses of the relevant contracts. Keep track of this file, as you will
need it in subsequent steps.We recommend the following these best practices when bootstrapping:
Use Gnosis SAFEs for ownership roles like guardian and superchain-proxy-admin-owner. The owner must be a
smart contract to support future upgrades, so a SAFE is a sensible default.
Use a regular EOA as the deployer. It will not have any control over the deployment once the deployment completes.
Use the contracts that op-deployer embeds (embedded, the default). op-deployer runs only the contracts release
that it was built with, or a build of that release.
Bootstrapping Implementations
The smart contracts for an OP Chain are deployed using a factory that points to a set of predeployed implementations.
You must deploy the factory and the implementations every time you deploy to a new L1 and whenever new smart
contract versions are released. Implementations are deployed using CREATE2, so addresses may be reused if they
already exist on the L1.
You may need to use different versions of OP Deployer depending on which contracts version you are deploying. See the
releases guide for more information on picking the right release.
To deploy the implementations, use the following command:
op-deployer bootstrap implementations \ --artifacts-locator="<locator, should be the same as the one used in bootstrap superchain>" \ --l1-rpc-url="<rpc url>" \ --outfile="<path to outfile>" \ --mips-version="2" \ --private-key="<contract deployer private key>" \ --superchain-config-proxy="<address output from bootstrap superchain>" \ --upgrade-controller="<superchain-proxy-admin-owner used in bootstrap superchain>"
On L1s other than Ethereum mainnet and Sepolia, also pass --sp1-verifier-address with the raw SP1 verifier for the release’s SP1PlonkAdapter, or the command fails. On a development L1, --deploy-mock-sp1-verifier deploys an accept-all mock verifier instead. op-deployer apply takes the same input as globalDeployOverrides.sp1Verifier in the intent.Similar to the bootstrap superchain command, this will output a JSON file containing the addresses of the relevant
contracts. Again, keep track of this file.The most important address in the implementations file is the OPCM, or OP Contracts Manager. This contract is the
factory that will deploy all the OP Chains belonging to this deployment group. It is also responsible for upgrading between
different contracts versions. Please keep the following very important invariants in mind with the OPCM:
There is a one-to-one mapping between each OPCM, and contracts version.
Each OPCM is associated with exactly one deployment group. This means that you must deploy a new OPCM using the
bootstrap implementations command for each new deployment group you manage.
Deploying
After bootstrapping the contracts and implementations, you can deploy your L2 chains with the apply command. You
will need to specify a configType of standard-overrides and set the opcmAddress field in your intent to the
address of the OPCM above. Make sure you call the right OPCM. Failing to call the right OPCM might lead to
deploying incorrect contract versions, or associating your chain with the wrong deployment.
Make sure that you use the same l1ContractsLocator and l2ContractsLocator as the ones used in the bootstrap
commands. Otherwise, you may run into deployment errors.
See the following config for an example:
configType = "standard-overrides"l1ChainID = 11155420opcmAddress = "0x..."l1ContractsLocator = "embedded" # must match the one used in bootstrapl2ContractsLocator = "embedded"[[chains]]# Chain configs...
Once apply completes successfully, you can use the inspect family of commands to download your chain’s L2
genesis and rollup config files.
Upgrading
The op-deployer upgrade command supports upgrades up to op-contracts/v5.0.0 only. It does not support
upgrading from op-contracts/v5.0.0 to op-contracts/v6.0.0. For upgrades beyond v5.0.0, use
superchain-ops or interact with the
OPCM directly. See the notice for details.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Optimism Documentation","colors":{"primary":"#FF0420","light":"#FF0420","dark":"#FF0420"},"logo":{"light":"https://mintcdn.com/optimism-373f39ad/Vw5vY8zA-CRjBsUF/public/logos/Lockup_docs_dark.svg?fit=max\u0026auto=format\u0026n=Vw5vY8zA-CRjBsUF\u0026q=85\u0026s=a1ab18aecbec09fe5ad40222ce76f00c","dark":"https://mintcdn.com/optimism-373f39ad/Vw5vY8zA-CRjBsUF/public/logos/Lockup_docs_light.svg?fit=max\u0026auto=format\u0026n=Vw5vY8zA-CRjBsUF\u0026q=85\u0026s=edf965cc513f1a46b1897e2a6494b43b"},"favicon":"https://mintcdn.com/optimism-373f39ad/x8TXRvd2PF-Wx1yv/public/favicon.png?fit=max\u0026auto=format\u0026n=x8TXRvd2PF-Wx1yv\u0026q=85\u0026s=7b7a602bd267ee638c0167179f41737c","navbar":{"links":[{"href":"https://www.optimism.io/blog","label":"Blog"},{"href":"https://github.com/ethereum-optimism/optimism/tree/develop/docs/public-docs","label":"GitHub"}]},"footer":{"socials":{"twitter":"https://twitter.com/optimism","github":"https://github.com/ethereum-optimism"}},"seo":{"metatags":{"canonical":"https://docs.optimism.io/","og:title":"Optimism Documentation","og:type":"website","twitter:card":"summary_large_image"}},"integrations":{"mixpanel":{"projectToken":"807e42c62989ff12427a35baa12b6218"}},"contextual":{"options":["copy","chatgpt","claude","mcp"],"display":"header"},"thumbnails":{"preset":"classic","appearance":"dark","surface":"neutral","background":"https://mintcdn.com/optimism-373f39ad/ZyL9bbNrDzMQhMLM/public/img/thumbnail-bg.png?fit=max\u0026auto=format\u0026n=ZyL9bbNrDzMQhMLM\u0026q=85\u0026s=5baf50afc7e4f4e6288de49b3df19d52","fonts":{"family":"Riforma LL","source":"public/fonts/RiformaLL-Regular.woff","format":"woff"},"eyebrow":{"source":"none"}},"interaction":{"drilldown":false},"metadata":{"timestamp":false},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Status","icon":"signal-bars","href":"https://status.optimism.io"},{"anchor":"Faucet","icon":"gas-pump","href":"https://console.optimism.io/faucet"},{"anchor":"Bridge","icon":"bridge-water","href":"https://app.optimism.io/bridge/deposit"}]},"languages":[{"language":"en","href":""},{"language":"ko","href":"ko"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"optimism-373f39ad","hasAudioNarration":false,"actualSubdomain":"optimism-373f39ad","customDomains":["docs.optimism.io"],"gitSource":{"type":"github","owner":"ethereum-optimism","repo":"optimism","deployBranch":"develop","contentDirectory":"docs/public-docs","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true,"issues":false,"edits":false},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af64b9db373203ca78c312c","clientVersion":"0.0.4128","searchFilterCounts":[{"language":"en","tag":"Reference","count":136},{"language":"ko","tag":"참조","count":136},{"language":"en","tag":"Node Operators","count":119},{"language":"ko","tag":"노드 운영자","count":119},{"language":"en","tag":"Protocol","count":98},{"language":"ko","tag":"프로토콜","count":98},{"language":"en","tag":"Chain Operators","count":75},{"language":"ko","tag":"체인 운영자","count":75},{"language":"en","tag":"op-reth","count":74},{"language":"ko","tag":"op-reth","count":74},{"language":"en","tag":"op-reth CLI reference","count":73},{"language":"ko","tag":"op-reth CLI reference","count":73},{"language":"en","tag":"App Developers","count":68},{"language":"ko","tag":"앱 개발자","count":68},{"language":"en","tag":"Guides","count":52},{"language":"ko","tag":"가이드","count":52},{"language":"en","tag":"Tutorials","count":42},{"language":"ko","tag":"튜토리얼","count":42},{"language":"en","tag":"How the protocol works","count":41},{"language":"ko","tag":"프로토콜 작동 방식","count":41}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[],"googleFontsInlined":false},"customCss":[{"filePath":"styles/homepage.css","content":"@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-Regular.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-Italic.woff2') format('woff2');font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-Medium.woff2') format('woff2');font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-MediumItalic.woff2') format('woff2');font-weight:500;font-style:italic;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-Bold.woff2') format('woff2');font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-BoldItalic.woff2') format('woff2');font-weight:700;font-style:italic;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-Heavy.woff2') format('woff2');font-weight:900;font-style:normal;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-HeavyItalic.woff2') format('woff2');font-weight:900;font-style:italic;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-Light.woff2') format('woff2');font-weight:300;font-style:normal;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-LightItalic.woff2') format('woff2');font-weight:300;font-style:italic;font-display:swap}body,.nx-prose,.nx-prose p,.nx-prose h1,.nx-prose h2,.nx-prose h3,.nx-prose h4,.nx-prose h5,.nx-prose h6{font-family:'Riforma LL', -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif!important}[data-page-id=\"index\"]{max-width:1400px!important;margin-left:auto!important;margin-right:auto!important;padding-left:2rem!important;padding-right:2rem!important}[data-page-id=\"index\"] h1{font-family:'Riforma LL', -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif!important;font-size:3rem!important;font-weight:700!important;line-height:1.1!important;margin-bottom:1rem!important;margin-top:0!important;padding-top:0!important;color:#111827!important;letter-spacing:-0.02em!important;max-width:100%!important}html[class*=\"dark\"] [data-page-id=\"index\"] h1{color:#f9fafb!important}[data-page-id=\"index\"]>p:first-of-type,[data-page-id=\"index\"] h1+p{font-family:'Riforma LL', -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif!important;font-size:1.25rem!important;line-height:1.6!important;color:#6b7280!important;margin-bottom:2rem!important;margin-top:0!important;max-width:100%!important}html[class*=\"dark\"] [data-page-id=\"index\"]>p:first-of-type,html[class*=\"dark\"] [data-page-id=\"index\"] h1+p{color:#9ca3af!important}[data-page-id=\"index\"] .nx-prose{padding-top:0!important;padding-left:0!important;padding-right:0!important;max-width:100%!important}.nx-container{max-width:none!important;padding:0!important;background:transparent!important}[data-page-id=\"index\"] .nx-prose,[data-page-id=\"index\"]>div>div{max-width:100%!important}body{background:#ffffff!important}html[class*=\"dark\"] body{background:#0f172a!important}.nx-bg-gradient-to-r,.nx-bg-gradient-to-l,.nx-bg-gradient-to-t,.nx-bg-gradient-to-b,.nx-bg-gradient-to-br,.nx-bg-gradient-to-bl,.nx-bg-gradient-to-tr,.nx-bg-gradient-to-tl{background:transparent!important}.hero-section{display:flex;align-items:center;justify-content:space-between;min-height:auto;padding:0;margin-bottom:2.5rem;max-width:100%;margin-left:0;margin-right:0;background:transparent}.hero-content{flex:1;max-width:505px}.hero-content h1{font-family:'Riforma LL', -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;font-size:2.5rem;font-weight:600;line-height:1.2;margin-bottom:0.75rem;color:#111827;letter-spacing:-0.025em}html[class*=\"dark\"] .hero-content h1{color:#f9fafb}.hero-content p{font-family:'Riforma LL', -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;font-size:1.125rem;font-weight:400;line-height:1.6;margin-bottom:1rem;color:#6b7280}html[class*=\"dark\"] .hero-content p{color:#9ca3af}.hero-visual{flex:1;display:flex;justify-content:center;align-items:center}.hero-visual img{max-width:100%;height:auto}.hero-buttons{display:flex;gap:1rem}.btn-primary{font-family:'Riforma LL', -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;background-color:#ef4444;color:white;padding:0.75rem 1.5rem;border:none;border-radius:6px;font-weight:500;cursor:pointer;transition:background-color 0.2s;text-decoration:none;display:inline-flex;align-items:center;justify-content:center;text-align:center}.btn-primary:hover{background-color:#dc2626;color:white;text-decoration:none}.btn-secondary{font-family:'Riforma LL', -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;background-color:transparent;color:#1f2937;padding:0.75rem 1.5rem;border:1px solid #d1d5db;border-radius:6px;font-weight:500;cursor:pointer;transition:all 0.2s;text-decoration:none;display:inline-flex;align-items:center;justify-content:center;text-align:center}.btn-secondary:hover{background-color:#f9fafb;border-color:#9ca3af;color:#1f2937;text-decoration:none}html[class*=\"dark\"] .btn-secondary{color:#f9fafb;border-color:#4b5563}html[class*=\"dark\"] .btn-secondary:hover{background-color:#374151;border-color:#6b7280;color:#f9fafb}@media (max-width: 768px){.hero-section{flex-direction:column;text-align:center;min-height:auto;padding:2rem 0}.hero-content{padding-right:0;margin-bottom:2rem}.hero-content h1{font-size:1.75rem}.hero-buttons{justify-content:center}}.home-cards{width:100%;margin-bottom:2.5rem;margin-top:0;max-width:100%;margin-left:0;margin-right:0;padding:0}.home-card{display:flex;flex-direction:column;padding:1.75rem;background:transparent;border:1px solid #e2e8f0;border-radius:12px;transition:all 0.2s ease}html[class*=\"dark\"] .home-card{background:#1e293b;border-color:#334155}.home-card .home-card__title{font-family:'Riforma LL', -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif!important;font-size:1.5rem!important;font-weight:600!important;margin:0 0 1.5rem 0;color:#0f172a;letter-spacing:-0.01em}html[class*=\"dark\"] .home-card .home-card__title{color:#f1f5f9}.home-card__footer{margin-top:auto;padding-top:1.5rem}.home-card__footer-link{color:#64748b;text-decoration:none;font-size:0.875rem;font-weight:500;transition:color 0.2s ease}.home-card__footer-link:hover{color:#475569;text-decoration:none}html[class*=\"dark\"] .home-card__footer-link{color:#94a3b8}html[class*=\"dark\"] .home-card__footer-link:hover{color:#cbd5e1}.card-list{display:flex;flex-direction:column;gap:0}.card-list-item{display:flex;align-items:flex-start;gap:1rem;padding:0.875rem 0;border-radius:6px;text-decoration:none;color:inherit;transition:all 0.2s ease;border-bottom:1px solid #f1f5f9}.card-list-item:last-child{border-bottom:none}html[class*=\"dark\"] .card-list-item{border-bottom-color:#334155}.card-list-item:hover .card-list-item__title{color:#ef4444}.card-list-item:hover .card-list-item__description{color:#475569}html[class*=\"dark\"] .card-list-item:hover .card-list-item__description{color:#cbd5e1}.card-list-item__number{width:2rem;height:2rem;border-radius:50%;background:#f1f5f9;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:0.875rem;flex-shrink:0;color:#475569}html[class*=\"dark\"] .card-list-item__number{background:#334155;color:#cbd5e1}.card-list-item__content{flex:1}.card-list-item__header{display:flex;align-items:center;gap:0.75rem;margin-bottom:0.5rem}.card-list-item__title{font-family:'Riforma LL', -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;margin:0;font-size:1rem;font-weight:600;color:#0f172a;transition:color 0.2s ease;letter-spacing:-0.01em}html[class*=\"dark\"] .card-list-item__title{color:#f1f5f9}.card-list-item__description{font-family:'Riforma LL', -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;margin:0;font-size:0.875rem;color:#64748b;line-height:1.5;transition:color 0.2s ease}html[class*=\"dark\"] .card-list-item__description{color:#94a3b8}.card-list-item__badge{padding:0.25rem 0.75rem;border-radius:16px;font-size:0.75rem;font-weight:600;text-transform:capitalize}.card-list-item__badge--easy{background:#dcfce7;color:#166534}.card-list-item__badge--medium{background:#fef3c7;color:#92400e}.card-list-item__badge--hard{background:#fee2e2;color:#991b1b}html[class*=\"dark\"] .card-list-item__badge--easy{background:#14532d;color:#bbf7d0}html[class*=\"dark\"] .card-list-item__badge--medium{background:#92400e;color:#fef3c7}html[class*=\"dark\"] .card-list-item__badge--hard{background:#991b1b;color:#fecaca}.card-list-item__arrow{color:#cbd5e1;font-size:1.25rem;transition:all 0.2s ease;display:flex;align-items:center;justify-content:center;margin-top:0.25rem}.card-list-item:hover .card-list-item__arrow{transform:translateX(4px);color:#ef4444}html[class*=\"dark\"] .card-list-item__arrow{color:#64748b}html[class*=\"dark\"] .card-list-item:hover .card-list-item__arrow{color:#ef4444}.nx-prose:not([data-page-id=\"index\"] .nx-prose){max-width:1400px!important;margin-left:auto!important;margin-right:auto!important;padding-left:2rem!important;padding-right:2rem!important}@media (max-width: 768px){.hero-section{padding:4rem 2rem;flex-direction:column;text-align:center;min-height:auto}.hero-content{margin-bottom:2rem;max-width:none}.home-cards{grid-template-columns:1fr!important;padding:0 2rem}.nx-prose{padding-left:2rem!important;padding-right:2rem!important}.card-list-item__header{flex-direction:column;align-items:flex-start;gap:0.5rem}}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-Regular.woff2') format('woff2');font-weight:400;font-style:normal;font-display:block}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-Regular.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-Italic.woff2') format('woff2');font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-Medium.woff2') format('woff2');font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-MediumItalic.woff2') format('woff2');font-weight:500;font-style:italic;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-Bold.woff2') format('woff2');font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-BoldItalic.woff2') format('woff2');font-weight:700;font-style:italic;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-Heavy.woff2') format('woff2');font-weight:900;font-style:normal;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-HeavyItalic.woff2') format('woff2');font-weight:900;font-style:italic;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-Light.woff2') format('woff2');font-weight:300;font-style:normal;font-display:swap}@font-face{font-family:'Riforma LL';src:url('/fonts/RiformaLL-LightItalic.woff2') format('woff2');font-weight:300;font-style:italic;font-display:swap}img[alt*=\"logo\"],.nx-logo img,nav img,header img[src*=\"logo\"],a[href=\"/\"] img{max-height:13px!important;width:auto!important;height:13px!important}:root{--font-riforma: 'Riforma LL', -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;--font-mono: 'Roboto Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace}body{font-family:var(--font-riforma)!important}html,body,.nx-prose,.nx-prose p,.nx-prose h1,.nx-prose h2,.nx-prose h3,.nx-prose h4,.nx-prose h5,.nx-prose h6,.nx-prose li,.nx-prose td,.nx-prose th,.nx-prose blockquote,div:not([class*=\"language-\"]):not(pre):not(code),span:not([class*=\"language-\"]):not([class*=\"token\"]),a:not(pre a):not(code a),button{font-family:var(--font-riforma)!important}pre,code,.nx-font-mono,.nx-bg-primary-700\\/5,.language-javascript,.language-typescript,.language-python,.language-json,.language-bash,.language-shell,.language-solidity,.language-yml,.language-yaml,.language-sh,[class*=\"language-\"],.nx-code-block,div[data-language],div[data-theme*=\"dark\"],div[data-theme*=\"light\"],span[class*=\"token\"],.token,.comment,.prolog,.doctype,.cdata,.punctuation,.property,.tag,.boolean,.number,.constant,.symbol,.deleted,.function,.class-name,.regex,.important,.variable,.operator,.keyword{font-family:var(--font-mono)!important;font-feature-settings:normal!important}pre *,code *,.nx-code-block *,div[data-language] *,[class*=\"language-\"] *,pre span,code span,.nx-code-block span,div[data-language] span,[class*=\"language-\"] span{font-family:var(--font-mono)!important;font-feature-settings:normal!important}.nx-prose h1,h1{font-family:var(--font-riforma)!important;font-weight:400!important}.nx-prose h2,h2{font-family:var(--font-riforma)!important;font-weight:400!important}.nx-prose h3,h3{font-family:var(--font-riforma)!important;font-weight:400!important}[data-page-id=\"index\"]{max-width:1400px!important;margin-left:auto!important;margin-right:auto!important;padding-left:2rem!important;padding-right:2rem!important}[data-page-id=\"index\"] h1{font-family:var(--font-riforma)!important;font-size:3rem!important;font-weight:400!important;line-height:1.1!important;margin-bottom:1rem!important;margin-top:0!important;padding-top:0!important;color:#111827!important;letter-spacing:-0.02em!important;max-width:100%!important}html[class*=\"dark\"] [data-page-id=\"index\"] h1{color:#f9fafb!important}[data-page-id=\"index\"]>p:first-of-type,[data-page-id=\"index\"] h1+p{font-family:var(--font-riforma)!important;font-size:1.25rem!important;line-height:1.6!important;color:#6b7280!important;margin-bottom:2rem!important;margin-top:0!important;max-width:100%!important}html[class*=\"dark\"] [data-page-id=\"index\"]>p:first-of-type,html[class*=\"dark\"] [data-page-id=\"index\"] h1+p{color:#9ca3af!important}[data-page-id=\"index\"] .nx-prose{padding-top:0!important;padding-left:0!important;padding-right:0!important;max-width:100%!important}.nx-container{max-width:none!important;padding:0!important;background:transparent!important}[data-page-id=\"index\"] .nx-prose,[data-page-id=\"index\"]>div>div{max-width:100%!important}body{background:#ffffff!important}html[class*=\"dark\"] body{background:#0f172a!important}.nx-bg-gradient-to-r,.nx-bg-gradient-to-l,.nx-bg-gradient-to-t,.nx-bg-gradient-to-b,.nx-bg-gradient-to-br,.nx-bg-gradient-to-bl,.nx-bg-gradient-to-tr,.nx-bg-gradient-to-tl{background:transparent!important}.hero-section{display:flex;align-items:center;justify-content:space-between;min-height:auto;padding:0;margin-bottom:2.5rem;max-width:100%;margin-left:0;margin-right:0;background:transparent}.hero-content{flex:1;max-width:505px}.hero-content h1{font-family:var(--font-riforma)!important;font-size:2.5rem;font-weight:600;line-height:1.2;margin-bottom:0.75rem;color:#111827;letter-spacing:-0.025em}html[class*=\"dark\"] .hero-content h1{color:#f9fafb}.hero-content p{font-family:var(--font-riforma)!important;font-size:1.125rem;font-weight:400;line-height:1.6;margin-bottom:1rem;color:#6b7280}html[class*=\"dark\"] .hero-content p{color:#9ca3af}.hero-visual{flex:1;display:flex;justify-content:center;align-items:center}.hero-visual img{max-width:100%;height:auto}.hero-buttons{display:flex;gap:1rem}.btn-primary{font-family:var(--font-riforma)!important;background-color:#FF0420;color:white;padding:0.75rem 1.5rem;border:none;border-radius:0.75rem;font-weight:500;cursor:pointer;transition:background-color 0.2s;text-decoration:none;display:inline-flex;align-items:center;justify-content:center;text-align:center}.btn-primary:hover{background-color:#e00320;color:white;text-decoration:none}.btn-secondary{font-family:var(--font-riforma)!important;background-color:transparent;color:#1f2937;padding:0.75rem 1.5rem;border:1px solid #d1d5db;border-radius:0.75rem;font-weight:500;cursor:pointer;transition:all 0.2s;text-decoration:none;display:inline-flex;align-items:center;justify-content:center;text-align:center}.btn-secondary:hover{background-color:#f9fafb;border-color:#9ca3af;color:#1f2937;text-decoration:none}html[class*=\"dark\"] .btn-secondary{color:#f9fafb;border-color:#4b5563}html[class*=\"dark\"] .btn-secondary:hover{background-color:#374151;border-color:#6b7280;color:#f9fafb}@media (max-width: 768px){.hero-section{flex-direction:column;text-align:center;min-height:auto;padding:2rem 0}.hero-content{padding-right:0;margin-bottom:2rem}.hero-content h1{font-size:1.75rem}.hero-buttons{justify-content:center}}.home-cards{width:100%;margin-bottom:2.5rem;margin-top:0;max-width:100%;margin-left:0;margin-right:0;padding:0}.home-card{display:flex;flex-direction:column;padding:1.75rem;background:transparent;border:1px solid #e2e8f0;border-radius:12px;transition:all 0.2s ease}html[class*=\"dark\"] .home-card{background:#1e293b;border-color:#334155}.home-card .home-card__title{font-family:var(--font-riforma)!important;font-size:1.5rem!important;font-weight:400!important;margin:0 0 1.5rem 0;color:#0f172a;letter-spacing:-0.01em}html[class*=\"dark\"] .home-card .home-card__title{color:#f1f5f9}.home-card__footer{margin-top:auto;padding-top:1.5rem}.home-card__footer-link{color:#64748b;text-decoration:none;font-size:0.875rem;font-weight:500;transition:color 0.2s ease}.home-card__footer-link:hover{color:#475569;text-decoration:none}html[class*=\"dark\"] .home-card__footer-link{color:#94a3b8}html[class*=\"dark\"] .home-card__footer-link:hover{color:#cbd5e1}.card-list{display:flex;flex-direction:column;gap:0}.card-list-item{display:flex;align-items:flex-start;gap:1rem;padding:0.875rem 0;border-radius:6px;text-decoration:none;color:inherit;transition:all 0.2s ease;border-bottom:1px solid #f1f5f9}.card-list-item:last-child{border-bottom:none}html[class*=\"dark\"] .card-list-item{border-bottom-color:#334155}.card-list-item:hover .card-list-item__title{color:#ef4444}.card-list-item:hover .card-list-item__description{color:#475569}html[class*=\"dark\"] .card-list-item:hover .card-list-item__description{color:#cbd5e1}.card-list-item__number{width:2rem;height:2rem;border-radius:50%;background:#f1f5f9;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:0.875rem;flex-shrink:0;color:#475569}html[class*=\"dark\"] .card-list-item__number{background:#334155;color:#cbd5e1}.card-list-item__content{flex:1}.card-list-item__header{display:flex;align-items:center;gap:0.75rem;margin-bottom:0.5rem}.card-list-item__title{font-family:var(--font-riforma)!important;margin:0;font-size:1rem;font-weight:400;color:#0f172a;transition:color 0.2s ease;letter-spacing:-0.01em}html[class*=\"dark\"] .card-list-item__title{color:#f1f5f9}.card-list-item__description{font-family:var(--font-riforma)!important;margin:0;font-size:0.875rem;color:#64748b;line-height:1.5;transition:color 0.2s ease}html[class*=\"dark\"] .card-list-item__description{color:#94a3b8}.card-list-item__badge{padding:0.25rem 0.75rem;border-radius:16px;font-size:0.75rem;font-weight:600;text-transform:capitalize}.card-list-item__badge--easy{background:#dcfce7;color:#166534}.card-list-item__badge--medium{background:#fef3c7;color:#92400e}.card-list-item__badge--hard{background:#fee2e2;color:#991b1b}html[class*=\"dark\"] .card-list-item__badge--easy{background:#14532d;color:#bbf7d0}html[class*=\"dark\"] .card-list-item__badge--medium{background:#92400e;color:#fef3c7}html[class*=\"dark\"] .card-list-item__badge--hard{background:#991b1b;color:#fecaca}.card-list-item__arrow{color:#cbd5e1;font-size:1.25rem;transition:all 0.2s ease;display:flex;align-items:center;justify-content:center;margin-top:0.25rem}.card-list-item:hover .card-list-item__arrow{transform:translateX(4px);color:#ef4444}html[class*=\"dark\"] .card-list-item__arrow{color:#64748b}html[class*=\"dark\"] .card-list-item:hover .card-list-item__arrow{color:#ef4444}.nx-prose:not([data-page-id=\"index\"] .nx-prose){max-width:1400px!important;margin-left:auto!important;margin-right:auto!important;padding-left:2rem!important;padding-right:2rem!important}@media (max-width: 768px){.hero-section{padding:4rem 2rem;flex-direction:column;text-align:center;min-height:auto}.hero-content{margin-bottom:2rem;max-width:none}.home-cards{grid-template-columns:1fr!important;padding:0 2rem}.nx-prose{padding-left:2rem!important;padding-right:2rem!important}.card-list-item__header{flex-direction:column;align-items:flex-start;gap:0.5rem}}.nx-card img,[class*=\"card\"] img[src*=\"/public/img/\"]{background:transparent!important}"}],"page":{"pagePath":"chain-operators/tools/op-deployer/usage/custom-deployments","slug":"/chain-operators/tools/op-deployer/usage/custom-deployments","pageMetadata":{"title":"Custom Deployments","description":"Learn how to manage custom deployments with OP Deployer.","diataxis":"how-to","href":"/chain-operators/tools/op-deployer/usage/custom-deployments"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Learn how to manage custom deployments with OP Deployer.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];const Unreleased=({component,version})=>{const _components={a:`a`,..._provideComponents()},{Warning}=_components;if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(Warning,{children:[_jsx(`strong`,{children:`Unreleased:`}),` this describes behavior that is merged but not yet in a published `,_jsx(`code`,{children:component}),` release. It ships in`,` `,version?_jsx(_components.a,{href:`https://github.com/ethereum-optimism/optimism/releases?q=${component}%2F${version}\u0026expanded=true`,children:_jsxs(`code`,{children:[component,`/`,version]})}):_jsxs(`span`,{children:[`an upcoming `,_jsx(`code`,{children:component}),` release`]}),`. Until then, the current release behaves as documented in the rest of this page; see the `,_jsx(_components.a,{href:`/releases`,children:`release history`}),` for what has shipped.`]})};function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning,_MdxComponentBoundary}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);if(!_MdxComponentBoundary)_missingMdxReference(`_MdxComponentBoundary`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`While OP Deployer was designed primarily for use with chains that are governed by Optimism, it also supports managing\ncustom deployments. This is particularly common for RaaS providers, whose customers often request deployments with\ncustom L1s (or L2s, in the case of L3s) or governance. This guide will walk you through the process of managing these\nchains using OP Deployer.`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Chains deployed in this way are not subject to Optimism Governance. They may be running customized or unaudited\ncode. Use at your own risk.`})}),`\n`,_jsx(Heading,{level:`2`,id:`bootstrapping`,children:`Bootstrapping`}),`\n`,_jsx(_components.p,{children:`The first step to deploying a custom OP Stack is to bootstrap it onto an L1. This process will:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Deploy shared management contracts like `,_jsx(_components.code,{children:`SuperchainConfig`}),` and `,_jsx(_components.code,{children:`SuperchainVersions`}),`.`]}),`\n`,_jsx(_components.li,{children:`Deploy contract implementations that will be shared among all OP Chains in this deployment.`}),`\n`,_jsx(_components.li,{children:`Set up ownership so that you can control the deployment.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`You will use the `,_jsx(_components.a,{href:`/chain-operators/tools/op-deployer/usage/bootstrap`,children:_jsx(_components.code,{children:`bootstrap`})}),` family of commands on `,_jsx(_components.code,{children:`op-deployer`}),` to do this.`]}),`\n`,_jsx(Heading,{level:`3`,id:`bootstrap-shared-contracts`,children:`Bootstrap Shared Contracts`}),`\n`,_jsx(_components.p,{children:`Every OP Chain belongs to a logical deployment group. This group consists of a set of shared contracts that control the behavior\nof a group of OP Chains. This includes:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Pausing bridges`}),`\n`,_jsx(_components.li,{children:`Signaling which protocol versions are required and recommended`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`You can deploy a new set of shared contracts for each OP Chain, or you can deploy them once and share across multiple OP Chains.\nThe choice is up to the deployer. Note that you `,_jsx(_components.strong,{children:`cannot`}),` share a set of shared contracts across multiple L1s.`]}),`\n`,_jsx(_components.p,{children:`To begin, bootstrap the shared contracts onto your chosen L1 with the following command:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`op-deployer`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` bootstrap`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` superchain`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --l1-rpc-url=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003crpc url>\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --private-key=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003ccontract deployer private key>\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --artifacts-locator=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003clocator>\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --outfile=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003cpath to outfile>\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --superchain-proxy-admin-owner=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003crole address>\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --guardian=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003crole address>\"`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`This will output a JSON file containing the addresses of the relevant contracts. Keep track of this file, as you will\nneed it in subsequent steps.`}),`\n`,_jsx(_components.p,{children:`We recommend the following these best practices when bootstrapping:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Use Gnosis SAFEs for ownership roles like `,_jsx(_components.code,{children:`guardian`}),` and `,_jsx(_components.code,{children:`superchain-proxy-admin-owner`}),`. The owner `,_jsx(_components.strong,{children:`must`}),` be a\nsmart contract to support future upgrades, so a SAFE is a sensible default.`]}),`\n`,_jsx(_components.li,{children:`Use a regular EOA as the deployer. It will not have any control over the deployment once the deployment completes.`}),`\n`,_jsxs(_components.li,{children:[`Use the contracts that op-deployer embeds (`,_jsx(_components.code,{children:`embedded`}),`, the default). op-deployer runs only the contracts release\nthat it was built with, or a build of that release.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`bootstrapping-implementations`,children:`Bootstrapping Implementations`}),`\n`,_jsxs(_components.p,{children:[`The smart contracts for an OP Chain are deployed using a factory that points to a set of predeployed implementations.\nYou must deploy the factory and the implementations every time you deploy to a new L1 and whenever new smart\ncontract versions are released. Implementations are deployed using `,_jsx(_components.code,{children:`CREATE2`}),`, so addresses may be reused if they\nalready exist on the L1.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`You may need to use different versions of OP Deployer depending on which contracts version you are deploying. See the\n`,_jsx(_components.a,{href:`/chain-operators/tools/op-deployer/reference/releases`,children:`releases guide`}),` for more information on picking the right release.`]})}),`\n`,_jsx(_components.p,{children:`To deploy the implementations, use the following command:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`8`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`op-deployer`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` bootstrap`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` implementations`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --artifacts-locator=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003clocator, should be the same as the one used in bootstrap superchain>\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --l1-rpc-url=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003crpc url>\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --outfile=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003cpath to outfile>\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --mips-version=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --private-key=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003ccontract deployer private key>\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --superchain-config-proxy=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003caddress output from bootstrap superchain>\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --upgrade-controller=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003csuperchain-proxy-admin-owner used in bootstrap superchain>\"`})]}),`\n`]})})}),`\n`,_jsx(_MdxComponentBoundary,{name:`Unreleased`,children:_jsx(Unreleased,{component:`op-deployer`})}),`\n`,_jsxs(_components.p,{children:[`On L1s other than Ethereum mainnet and Sepolia, also pass `,_jsx(_components.code,{children:`--sp1-verifier-address`}),` with the raw SP1 verifier for the release’s `,_jsx(_components.code,{children:`SP1PlonkAdapter`}),`, or the command fails. On a development L1, `,_jsx(_components.code,{children:`--deploy-mock-sp1-verifier`}),` deploys an accept-all mock verifier instead. `,_jsx(_components.code,{children:`op-deployer apply`}),` takes the same input as `,_jsx(_components.code,{children:`globalDeployOverrides.sp1Verifier`}),` in the intent.`]}),`\n`,_jsxs(_components.p,{children:[`Similar to the `,_jsx(_components.code,{children:`bootstrap superchain`}),` command, this will output a JSON file containing the addresses of the relevant\ncontracts. Again, keep track of this file.`]}),`\n`,_jsxs(_components.p,{children:[`The most important address in the implementations file is the OPCM, or OP Contracts Manager. This contract is the\nfactory that will deploy all the OP Chains belonging to this deployment group. It is also responsible for upgrading between\ndifferent contracts versions. Please keep the following `,_jsx(_components.strong,{children:`very important`}),` invariants in mind with the OPCM:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`There is a one-to-one mapping between each OPCM, and contracts version.`}),`\n`,_jsxs(_components.li,{children:[`Each OPCM is associated with `,_jsx(_components.strong,{children:`exactly one`}),` deployment group. This means that you `,_jsx(_components.strong,{children:`must`}),` deploy a new OPCM using the\n`,_jsx(_components.code,{children:`bootstrap implementations`}),` command for each new deployment group you manage.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`deploying`,children:`Deploying`}),`\n`,_jsxs(_components.p,{children:[`After bootstrapping the contracts and implementations, you can deploy your L2 chains with the `,_jsx(_components.code,{children:`apply`}),` command. You\nwill need to specify a `,_jsx(_components.code,{children:`configType`}),` of `,_jsx(_components.code,{children:`standard-overrides`}),` and set the `,_jsx(_components.code,{children:`opcmAddress`}),` field in your intent to the\naddress of the OPCM above. `,_jsx(_components.strong,{children:`Make sure you call the right OPCM.`}),` Failing to call the right OPCM might lead to\ndeploying incorrect contract versions, or associating your chain with the wrong deployment.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Make sure that you use the same `,_jsx(_components.code,{children:`l1ContractsLocator`}),` and `,_jsx(_components.code,{children:`l2ContractsLocator`}),` as the ones used in the bootstrap\ncommands. Otherwise, you may run into deployment errors.`]})}),`\n`,_jsx(_components.p,{children:`See the following config for an example:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`toml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`toml`,children:_jsxs(_components.code,{language:`toml`,numberOfLines:`8`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`configType`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"standard-overrides\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`l1ChainID`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`11155420`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`opcmAddress`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"0x...\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`l1ContractsLocator`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"embedded\"`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # must match the one used in bootstrap`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`l2ContractsLocator`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"embedded\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[[`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`chains`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]]`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Chain configs...`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Once `,_jsx(_components.code,{children:`apply`}),` completes successfully, you can use the `,_jsx(_components.code,{children:`inspect`}),` family of commands to download your chain’s L2\ngenesis and rollup config files.`]}),`\n`,_jsx(Heading,{level:`2`,id:`upgrading`,children:`Upgrading`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`op-deployer upgrade`}),` command supports upgrades up to `,_jsx(_components.code,{children:`op-contracts/v5.0.0`}),` only. It does `,_jsx(_components.strong,{children:`not`}),` support\nupgrading from `,_jsx(_components.code,{children:`op-contracts/v5.0.0`}),` to `,_jsx(_components.code,{children:`op-contracts/v6.0.0`}),`. For upgrades beyond v5.0.0, use\n`,_jsx(_components.a,{href:`/chain-operators/tutorials/l1-contract-upgrades/superchain-ops-guide`,children:`superchain-ops`}),` or interact with the\nOPCM directly. See the `,_jsx(_components.a,{href:`/notices/archive/op-deployer-upgrade-deprecation`,children:`notice`}),` for details.`]})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{Unreleased,default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Custom Deployments","description":"Learn how to manage custom deployments with OP Deployer.","diataxis":"how-to","href":"/chain-operators/tools/op-deployer/usage/custom-deployments"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[146,973,")=>null;function _cr"]]},"mdxExtracts":{"tableOfContents":[{"title":"Bootstrapping","slug":"bootstrapping","depth":2,"children":[{"title":"Bootstrap Shared Contracts","slug":"bootstrap-shared-contracts","depth":3,"children":[]},{"title":"Bootstrapping Implementations","slug":"bootstrapping-implementations","depth":3,"children":[]}]},{"title":"Deploying","slug":"deploying","depth":2,"children":[]},{"title":"Upgrading","slug":"upgrading","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/optimism-373f39ad/6b11b6c32a46a09b/public/mixpanel-custom.js"],"subdomain":"optimism-373f39ad","siteName":"Optimism Documentation","title":"Optimism Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/chain-operators/tools/op-deployer/usage/custom-deployments","matchLevel":0},"ko":{"href":"/ko/chain-operators/tools/op-deployer/usage/custom-deployments","matchLevel":1}}},"lastModified":"2026-11-11T17:07:51.076Z","originalFileLocation":"chain-operators/tools/op-deployer/usage/custom-deployments.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Learn how to manage custom deployments with OP Deployer.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Optimism Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/optimism-373f39ad/v3BpzhmZ-un_k_ZG/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/optimism-373f39ad/v3BpzhmZ-un_k_ZG/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/optimism-373f39ad/v3BpzhmZ-un_k_ZG/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/optimism-373f39ad/v3BpzhmZ-un_k_ZG/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/optimism-373f39ad/v3BpzhmZ-un_k_ZG/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/optimism-373f39ad/v3BpzhmZ-un_k_ZG/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/optimism-373f39ad/v3BpzhmZ-un_k_ZG/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/optimism-373f39ad/v3BpzhmZ-un_k_ZG/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/optimism-373f39ad/v3BpzhmZ-un_k_ZG/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Optimism Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Learn how to manage custom deployments with OP Deployer.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Optimism Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.optimism.io//chain-operators/tools/op-deployer/usage/custom-deployments\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://optimism-373f39ad.mintlify.site/_mintlify/api/og/v2?title=Custom+Deployments\u0026amp;description=Learn+how+to+manage+custom+deployments+with+OP+Deployer.\u0026amp;theme=79e08bb9e92ccc1aa11b69ac\u0026amp;signature=dfbb4d7f709011677ce91843466cf068407444c9811286bcb105a022f713db71\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Optimism Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Learn how to manage custom deployments with OP Deployer.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://optimism-373f39ad.mintlify.site/_mintlify/api/og/v2?title=Custom+Deployments\u0026amp;description=Learn+how+to+manage+custom+deployments+with+OP+Deployer.\u0026amp;theme=79e08bb9e92ccc1aa11b69ac\u0026amp;signature=dfbb4d7f709011677ce91843466cf068407444c9811286bcb105a022f713db71\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/optimism-373f39ad/v3BpzhmZ-un_k_ZG/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Optimism Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#FF0420\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.optimism.io//chain-operators/tools/op-deployer/usage/custom-deployments\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/chain-operators/tools/op-deployer/usage/custom-deployments.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.optimism.io//chain-operators/tools/op-deployer/usage/custom-deployments\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://docs.optimism.io//ko/chain-operators/tools/op-deployer/usage/custom-deployments\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.optimism.io//chain-operators/tools/op-deployer/usage/custom-deployments\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.optimism.io/#organization\",\"name\":\"Optimism Documentation\",\"url\":\"https://docs.optimism.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/optimism-373f39ad/Vw5vY8zA-CRjBsUF/public/logos/Lockup_docs_dark.svg?fit=max\u0026auto=format\u0026n=Vw5vY8zA-CRjBsUF\u0026q=85\u0026s=a1ab18aecbec09fe5ad40222ce76f00c\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.optimism.io#website\",\"name\":\"Optimism Documentation\",\"url\":\"https://docs.optimism.io\",\"publisher\":{\"@id\":\"https://docs.optimism.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.optimism.io//chain-operators/tools/op-deployer/usage/custom-deployments#webpage\",\"url\":\"https://docs.optimism.io//chain-operators/tools/op-deployer/usage/custom-deployments\",\"name\":\"Custom Deployments\",\"description\":\"Learn how to manage custom deployments with OP Deployer.\",\"dateModified\":\"2026-11-11T17:07:51.076Z\",\"isPartOf\":{\"@id\":\"https://docs.optimism.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.optimism.io//chain-operators/tools/op-deployer/usage/custom-deployments#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.optimism.io//chain-operators/tools/op-deployer/usage/custom-deployments#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Tools\",\"item\":\"https://docs.optimism.io/chain-operators/tools/chain-monitoring\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"OP Deployer\",\"item\":\"https://docs.optimism.io/chain-operators/tools/op-deployer/overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Usage\",\"item\":\"https://docs.optimism.io/chain-operators/tools/op-deployer/usage/bootstrap\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Custom Deployments\",\"item\":\"https://docs.optimism.io//chain-operators/tools/op-deployer/usage/custom-deployments\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.optimism.io//chain-operators/tools/op-deployer/usage/custom-deployments#article\",\"headline\":\"Custom Deployments\",\"name\":\"Custom Deployments\",\"description\":\"Learn how to manage custom deployments with OP Deployer.\",\"url\":\"https://docs.optimism.io//chain-operators/tools/op-deployer/usage/custom-deployments\",\"mainEntityOfPage\":{\"@id\":\"https://docs.optimism.io//chain-operators/tools/op-deployer/usage/custom-deployments#webpage\"},\"dateModified\":\"2026-11-11T17:07:51.076Z\",\"publisher\":{\"@id\":\"https://docs.optimism.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.optimism.io#website\"}}]}\u003c/script>","agentPointerHref":"/chain-operators/tools/op-deployer/usage/custom-deployments.md","siteName":"Optimism Documentation","nav":{"global":{"anchors":[{"anchor":"Status","icon":"signal-bars","href":"https://status.optimism.io"},{"anchor":"Faucet","icon":"gas-pump","href":"https://console.optimism.io/faucet"},{"anchor":"Bridge","icon":"bridge-water","href":"https://app.optimism.io/bridge/deposit"}]},"languages":[{"language":"en","tabs":[{"tab":"Get Started","pages":[{"title":"Get Started","href":""}]},{"tab":"Chain Operators","groups":[{"group":"Launch a chain","pages":[{"title":"Chain operators","sidebarTitle":"Overview","href":"/chain-operators"}]},{"group":"Guides","pages":[{"group":"Configuration","pages":[{"title":"Chain Operator Configurations","href":"/chain-operators/guides/configuration/getting-started"},{"title":"Configure the batcher","href":"/chain-operators/guides/configuration/batcher"},{"title":"Proposer Configuration","href":"/chain-operators/guides/configuration/proposer"},{"title":"How to configure challenger for your chain","href":"/chain-operators/guides/configuration/op-challenger-config-guide"}]},{"group":"Features","pages":[{"title":"Deploy a Custom Gas Token chain","href":"/chain-operators/guides/features/custom-gas-token-guide"},{"title":"Switch to Kona Proofs","href":"/chain-operators/guides/features/switching-to-kona-proofs"},{"title":"Set the Minimum Base Fee","href":"/chain-operators/guides/features/setting-min-base-fee"},{"title":"Set the Operator Fee","href":"/chain-operators/guides/features/setting-operator-fee"},{"title":"Set the DA Footprint Gas Scalar","href":"/chain-operators/guides/features/setting-da-footprint"},{"title":"Enabling Subblocks","href":"/chain-operators/guides/features/subblocks-guide"},{"title":"Enabling Sequencer Defined Metering","href":"/chain-operators/guides/features/sequencer-defined-metering"},{"title":"How to run an Alt-DA mode chain","href":"/chain-operators/guides/features/alt-da-mode-guide"},{"title":"Post batch data as blobs","href":"/chain-operators/guides/features/blobs"},{"title":"Enable span batches","href":"/chain-operators/guides/features/enable-span-batches"},{"title":"Using snap sync for chain operators","href":"/chain-operators/guides/features/snap-sync"}]},{"group":"Management","pages":[{"title":"Chain operator best practices","href":"/chain-operators/guides/management/best-practices"},{"title":"Network Design Example","href":"/chain-operators/guides/management/network-architecture"},{"title":"Changing gas target/limit","href":"/chain-operators/guides/management/gas-target-limit"},{"title":"Key management","href":"/chain-operators/guides/management/key-management"},{"title":"Rollup operations","href":"/chain-operators/guides/management/operations"},{"title":"Transaction Fees 101","href":"/chain-operators/guides/management/transaction-fees-101"},{"title":"Fee vault operations","href":"/chain-operators/guides/management/fee-vaults"},{"title":"Troubleshooting chain operations","href":"/chain-operators/guides/management/troubleshooting"}]},{"title":"Join the Superchain Registry","href":"/chain-operators/guides/join-superchain-registry"}]},{"group":"Tutorials","pages":[{"group":"Create L2 Rollup","pages":[{"title":"Creating your own L2 rollup testnet","href":"/chain-operators/tutorials/create-l2-rollup/index"},{"title":"Deploy L1 contracts with op-deployer","href":"/chain-operators/tutorials/create-l2-rollup/op-deployer-setup"},{"title":"Spin up sequencer","href":"/chain-operators/tutorials/create-l2-rollup/op-reth-setup"},{"title":"Spin up batcher","href":"/chain-operators/tutorials/create-l2-rollup/op-batcher-setup"},{"title":"Spin up proposer","href":"/chain-operators/tutorials/create-l2-rollup/op-proposer-setup"},{"title":"Spin up challenger","href":"/chain-operators/tutorials/create-l2-rollup/op-challenger-setup"},{"title":"L2 Rollup Code Examples","href":"/chain-operators/tutorials/create-l2-rollup/code-setup"}]},{"group":"L1 contract upgrades","pages":[{"title":"Upgrade L1 contracts using op-deployer","href":"/chain-operators/tutorials/l1-contract-upgrades/op-deployer-upgrade"},{"title":"Upgrade using superchain-ops","href":"/chain-operators/tutorials/l1-contract-upgrades/superchain-ops-guide"},{"title":"Upgrading Smart Contracts from v1.3.0 to v1.8.0","href":"/chain-operators/tutorials/l1-contract-upgrades/upgrade-op-contracts-1-3-1-8"}]},{"group":"Customize your chain","pages":[{"title":"Adding a precompile","href":"/chain-operators/tutorials/adding-precompiles"},{"title":"Modifying predeployed contracts","href":"/chain-operators/tutorials/modifying-predeploys"},{"title":"Adding attributes to the derivation function","href":"/chain-operators/tutorials/adding-derivation-attributes"},{"title":"Integrating a new DA layer with Alt-DA","href":"/chain-operators/tutorials/integrating-da-layer"}]},{"group":"Proofs \u0026 disputes","pages":[{"title":"Generating absolute prestate and preimage files","href":"/chain-operators/tutorials/absolute-prestate"},{"title":"Generating a custom kona-client absolute prestate","href":"/chain-operators/tutorials/kona-custom-prestate"},{"title":"Deploying new dispute games with OPCM","href":"/chain-operators/tutorials/dispute-games"},{"title":"Migrating to permissionless fault proofs on OP Stack","href":"/chain-operators/tutorials/migrating-permissionless"},{"title":"Merging Two Chains Into a Shared Dispute Game","href":"/chain-operators/tutorials/merge-shared-dispute-game"}]},{"group":"Operations","pages":[{"title":"How to rewind op-geth","href":"/chain-operators/tutorials/rewind-op-geth"},{"title":"Upgrading a Chain From Output Roots to Super Roots","href":"/chain-operators/tutorials/upgrade-chain-to-super-roots"}]}]},{"group":"Tools","pages":[{"title":"Chain monitoring options","href":"/chain-operators/tools/chain-monitoring"},{"title":"Blockscout block explorer","href":"/chain-operators/tools/explorer"},{"group":"OP Conductor","pages":[{"title":"OP Conductor","href":"/chain-operators/tools/op-conductor"},{"title":"Setup","href":"/chain-operators/tools/op-conductor/setup"},{"title":"Configuration and RPCs","href":"/chain-operators/tools/op-conductor/reference"}]},{"group":"OP Deployer","pages":[{"title":"OP Deployer","href":"/chain-operators/tools/op-deployer/overview"},{"title":"Install op-deployer","href":"/chain-operators/tools/op-deployer/installation"},{"group":"Usage","pages":[{"title":"Bootstrap Commands","href":"/chain-operators/tools/op-deployer/usage/bootstrap"},{"title":"Init Command","href":"/chain-operators/tools/op-deployer/usage/init"},{"title":"Apply Command","href":"/chain-operators/tools/op-deployer/usage/apply"},{"title":"Verify Command","description":"Learn how to verify deployed contract source code on block explorers.","href":"/chain-operators/tools/op-deployer/usage/verify"},{"title":"Custom Deployments","href":"/chain-operators/tools/op-deployer/usage/custom-deployments"},{"title":"Release Workflows","description":"Learn how to backport fixes onto earlier OP Deployer versions and add support for new contract versions.","href":"/chain-operators/tools/op-deployer/usage/release-workflows"}]},{"title":"Known Limitations","href":"/chain-operators/tools/op-deployer/known-limitations"},{"group":"Reference","pages":[{"group":"Architecture","pages":[{"title":"Architecture","href":"/chain-operators/tools/op-deployer/reference/architecture/overview"},{"title":"Deployment Pipeline","href":"/chain-operators/tools/op-deployer/reference/architecture/pipeline"},{"title":"Scripting Engine","href":"/chain-operators/tools/op-deployer/reference/architecture/engine"}]},{"title":"Artifacts Locators","href":"/chain-operators/tools/op-deployer/reference/artifacts-locators"},{"title":"op-deployer versioning and releases","href":"/chain-operators/tools/op-deployer/reference/releases"}]}]},{"title":"OP Interop Filter","href":"/chain-operators/tools/op-interop-filter"},{"title":"OP Txproxy","href":"/chain-operators/tools/op-txproxy"},{"title":"Run proxyd","href":"/chain-operators/tools/proxyd"}]},{"group":"Reference","pages":[{"title":"Batcher configuration reference","href":"/chain-operators/reference/batcher-configuration"},{"title":"Challenger configuration reference","href":"/chain-operators/reference/challenger-configuration"},{"title":"OP Contracts Manager","href":"/chain-operators/reference/opcm"},{"title":"Rollup deployment configuration","href":"/chain-operators/reference/rollup-deployment-configuration"},{"title":"Fee parameters","href":"/chain-operators/reference/fee-parameters"},{"title":"How the DA footprint block limit works","href":"/chain-operators/reference/da-footprint"}]},{"group":"Archive","pages":[{"title":"Generating an op-program absolute prestate (archived)","href":"/chain-operators/tutorials/archive/op-program-prestate"}]}]},{"tab":"Node Operators","pages":[{"title":"Node Operators","href":"/node-operators/overview"}]},{"tab":"App Developers","pages":[{"title":"App Developers","href":"/app-developers"}]},{"tab":"Protocol","pages":[{"title":"Protocol","href":"/op-stack/introduction/op-stack"}]},{"tab":"OP Mainnet","pages":[{"title":"OP Mainnet","href":"/op-mainnet"}]},{"tab":"Governance","pages":[{"title":"Governance","href":"/governance/protocol-upgrades"}]},{"tab":"Notices","pages":[{"title":"Notices","href":"/notices"}]}]},{"language":"ko","pages":[{"title":"ko","href":"/ko/chain-operators/tools/op-deployer/usage/custom-deployments"}]}]},"basePath":"","title":"Optimism Documentation","buildId":"dpl_5tKr6cUUeuVJdEZ9JAEY3h4soMJ8","deploymentId":"dpl_5tKr6cUUeuVJdEZ9JAEY3h4soMJ8","dynamics":[],"chunks":[]}