ethereum-optimism / ethereum-optimism/optimism
Unable to deploy L2 contracts on devnet with op-deployer v0.5.0-rc.2 due to DeployImplementations ABI mismatch.
- Dominant language
- Go
- Stars
- 6.5k
- Forks
- 4k
- Avg merge
- 2d 18h
- Merged PRs (30d)
- 134
Description
Hello, I’m trying to run Ethereum + Optimism dev networks with Osaka/Fusaka-ready clients.
I run into an ABI mismatch with op-deployer v0.5.0-rc.2 and [officially published contract artifacts bundle](https://storage.googleapis.com/oplabs-contract-artifacts/artifacts-v1-fffcbb0ebf7f83311791534a41e65ef90df47797f9ca8f86941452f597f7128c.tar.gz).
As of now, https://console.cloud.google.com/artifacts/docker/oplabs-tools-artifacts/us/images/op-deployer/sha256:152cb9409d2d885f287bd2caa947a1ea2e9e921e124c3782c7fe297fa2614130 has tags: [77f31c359f9b3608bf48a8b0981e79b67bd95cb4](https://github.com/ethereum-optimism/optimism/commit/77f31c359f9b3608bf48a8b0981e79b67bd95cb4) and `v0.5.0-rc.2`.
op-deployer v0.5.0-rc2 supports op-contracts/v5.0.0-rc.2. So, there should be compatibility, but it does not appear so.
I’d appreciate guidance and can move this if it belongs in a different repo.
**Bug Description**
`op-deployer:v0.5.0-rc.2` assumes the `DeployImplementations` script exposes a `runWithBytes(bytes)` entry point and encodes deployment inputs as a single byte array. The Go caller (`opcm.DeployImplementationsInput`) was updated accordingly and attempts to invoke runWithBytes. However, the officially published contract artifacts bundle ([artifacts-v1-fffcbb0e…](https://storage.googleapis.com/oplabs-contract-artifacts/artifacts-v1-fffcbb0ebf7f83311791534a41e65ef90df47797f9ca8f86941452f597f7128c.tar.gz)) that ships with the devnet tooling still contains an ABI where `DeployImplementations.run(address _dii, address _dio)` is the only entry point; `runWithBytes` is absent. As a result, `op-deployer` fails to load the script at runtime with the error “ABI has 2 arguments, Go has 1”, making L2 contract deployment impossible when using the latest `op-deployer` image together with the published artifacts.
**Steps to Reproduce**
1. Save `network-config.yaml` attached below
2. Run the devnet bootstrap so that op-deployer apply is executed using the [latest optimism-package](https://github.com/ethpandaops/optimism-package/commit/7bef190d7c0b9f619438ed08b17bd5e5f51e72ff)
```
kurtosis run --enclave op-devnet github.com/ethpandaops/optimism-package@7bef190d7c0b9f619438ed08b17bd5e5f51e72ff --args-file network-config.yaml
```
3. Observe the failure during “Apply L2 contract deployments”; the stdout ends with:
```
Application failed: failed to load OPCM script: failed to load DeployImplementations script: script DeployImplementations does not have a method run that accepts an argument of type opcm.DeployImplementationsInput: ABI arguments don't match Go types: ABI has 2 arguments, Go has 1
```
**Expected behavior**
Optimism dev-net is launched successfully.
The published artifacts for `op-deployer v0.5.0-rc.2` should include a `DeployImplementations` ABI that exposes `runWithBytes(bytes)`, matching the Go caller introduced in this release. With a matching ABI, `op-deployer apply` should complete successfully.
**Environment Information:**
* Operating System: macOS 14.6 (Darwin 24.6.0)
* Package Version: op-deployer:v0.5.0-rc.2
* Optimism package: commit 7bef190d7c0b9f619438ed08b17bd5e5f51e72ff
* Published artifact bundle: artifacts-v1-fffcbb0ebf7f83311791534a41e65ef90df47797f9ca8f86941452f597f7128c.tar.gz (commit `d44bbea2407f4308f9fda20cf776bcb6dff7ff08` recorded inside the bundle)
**Configurations:**
network-config.yaml:
What matters most in this context is `op_contract_deployer_params`.
* image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-deployer:v0.5.0-rc.2
* l1_artifacts_locator / l2_artifacts_locator: https://storage.googleapis.com/oplabs-contract-artifacts/artifacts-v1-fffcbb0ebf7f83311791534a41e65ef90df47797f9ca8f86941452f597f7128c.tar.gz
* No custom flags beyond the defaults in optimism-package for the devnet.
```
# https://docs.optimism.io/chain/testing/dev-node#configure-your-network
optimism_package:
observability:
# Whether to configure observability (e.g. prometheus)
enabled: true
# Whether to enable features exclusive to the K8s backend (ie log collection)
enable_k8s_features: false
# Default prometheus configuration
prometheus_params:
storage_tsdb_retention_time: "1d"
storage_tsdb_retention_size: "512MB"
# Resource management for prometheus container
# CPU is milicores
# RAM is in MB
min_cpu: 10
max_cpu: 1000
min_mem: 128
max_mem: 2048
# Prometheus docker image to use
# Defaults to the latest image
image: "prom/prometheus:v3.1.0"
# AltDA Deploy Configuration, which is passed to op-deployer.
#
# For simplicity we currently enforce chains to all be altda or all rollups.
# Adding a single altda chain to a cluster essentially makes all chains have altda levels of security.
#
# To setup an altda cluster, make sure to
# 1. Set altda_deploy_config.use_altda to true (and da_commitment_type to KeccakCommitment)
# 2. For each chain,
# - Add "da_server" to the additional_services list if it should use alt-da
# - For altda chains, set da_server_params to use an image and cmd of your choice (one could use da-server, another eigenda-proxy, another celestia proxy, etc). If unset, op's default da-server image will be used.
altda_deploy_config:
use_altda: false
# DAChallengeContract, and hence is equivalent to setting use_altda to false.
# Furthermore, altda rollups using generic commitments might anyways need to support failing over
# to keccak commitments if the altda layer is down.
da_commitment_type: KeccakCommitment
da_challenge_window: 100
da_resolve_window: 100
da_bond_size: 0
da_resolver_refund_percentage: 0
# An array of L2 networks to run
chains:
op-rollup-l2:
participants:
sequencer-1:
el:
image: "us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:v1.101603.4"
cl:
image: "us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.16.1"
network_params:
network_id: 12345
holocene_time_offset: 0
batcher_params:
image: "us-docker.pkg.dev/oplabs-tools-artifacts/images/op-batcher:v1.16.2"
proposer_params:
image: "us-docker.pkg.dev/oplabs-tools-artifacts/images/op-proposer:v1.9.5"
# L2 contract deployer configuration - used for all L2 networks.
# The docker image that should be used for the L2 contract deployer.
# Locators can be http(s) URLs.
op_contract_deployer_params:
image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-deployer:v0.5.0-rc.2
l1_artifacts_locator: https://storage.googleapis.com/oplabs-contract-artifacts/artifacts-v1-fffcbb0ebf7f83311791534a41e65ef90df47797f9ca8f86941452f597f7128c.tar.gz
l2_artifacts_locator: https://storage.googleapis.com/oplabs-contract-artifacts/artifacts-v1-fffcbb0ebf7f83311791534a41e65ef90df47797f9ca8f86941452f597f7128c.tar.gz
# The global log level that all clients should log at
# Valid values are "error", "warn", "info", "debug", and "trace"
# This value will be overridden by participant-specific values
global_log_level: "info"
# Whether the environment should be persistent; this is WIP and is slowly being rolled out across services
# Defaults to false
persistent: false
ethereum_package:
participants:
- el_type: geth
el_image: ethereum/client-go:v1.16.7
cl_type: lighthouse
cl_image: sigp/lighthouse:v8.0.0
vc_type: lighthouse
vc_image: sigp/lighthouse:v8.0.0
network_params:
preset: minimal
genesis_delay: 5
additional_preloaded_contracts: '
{
"0x4e59b44847b379578588920cA78FbF26c0B4956C": {
"balance": "0ETH",
"code": "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3",
"storage": {},
"nonce": "1"
},
"0x5c18e203f0f39282e731e0115b83d341f9ec3e0a": {
"balance": "100000ETH",
"code": "0x",
"storage": {},
"nonce": "0"
}
}
'
port_publisher:
nat_exit_ip: KURTOSIS_IP_ADDR_PLACEHOLDER
el:
enabled: true
public_port_start: 40500
```
**Logs:**
```
t=2025-11-07T23:03:07+0000 lvl=info msg="Initialized path database" readonly=true triecache="0.00 B" statecache="0.00 B" buffer="0.00 B" history="entire chain"
Application failed: failed to load OPCM script: failed to load DeployImplementations script: script DeployImplementations does not have a method run that accepts an argument of type opcm.DeployImplementationsInput: ABI arguments don't match Go types: ABI has 2 arguments, Go has 1
```
**Additional context**
* The Go caller introduced in `op-deployer/pkg/deployer/opcm/implementations.go` now expects to call runWithBytes(bytes):
```
func NewDeployImplementationsForgeCaller(client *forge.Client) forge.ScriptCaller[DeployImplementationsInput, DeployImplementationsOutput] {
return forge.NewScriptCaller(
client,
"scripts/deploy/DeployImplementations.s.sol:DeployImplementations",
"runWithBytes(bytes)",
&forge.BytesScriptEncoder[DeployImplementationsInput]{TypeName: "DeployImplementationsInput"},
&forge.BytesScriptDecoder[DeployImplementationsOutput]{TypeName: "DeployImplementationsOutput"},
)
}
```
* The `forge-artifacts/DeployImplementations.s.sol/DeployImplementations.json` included in `artifacts-v1-fffcbb0e…` still exposes only:
```
{
"type": "function",
"name": "run",
"inputs": [
{ "name": "_dii", "type": "address" },
{ "name": "_dio", "type": "address" }
],
"outputs": [],
"stateMutability": "nonpayable"
}
```
while lacking any runWithBytes entry.
* The artifact bundle records commit `d44bbea2407f4308f9fda20cf776bcb6dff7ff08`, which predates the `runWithBytes` update. To unblock deployments, a new artifact bundle built from `op-contracts v5.0.0-rc.2` (where `runWithBytes` is implemented) needs to be published and referenced by the default URLs.
Contributor guide
Research direction
Start with pkg/deployer/opcm/implementations.go and compare its runWithBytes(bytes) caller with forge-artifacts/DeployImplementations.s.sol/DeployImplementations.json in the published bundle. Rebuild or verify the op-contracts v5.0.0-rc.2 artifacts, then check that op-deployer apply completes using the default artifact URLs. Done means the published ABI matches the caller and the devnet launches successfully.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- go, solidity
- Domain
- blockchain, devops, release
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 38/100