Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
8fcf57a
test: use a custom Test contract for makeAddr (#18509)
smartcontracts Dec 18, 2025
b9dc580
test: update succinct tests to follow our conventions (#18452)
stevennevins Dec 18, 2025
1ddd67e
feat: revert opcm v1 & add opcmv2 op-deployer support (#18399)
0xniha Dec 18, 2025
8418c97
chore: improve comments accuracy (#741) (#18622)
0xDiscotech Dec 18, 2025
4315435
op-e2e: Fix super proposals in super DG tests (#18647)
Inphi Dec 18, 2025
e257647
op-deployer: Ignore max-code-size limits during deployment (#18642)
Inphi Dec 19, 2025
897fe64
op-sync-tester: Support engine_exchangeCapabilities (#18628)
pcw109550 Dec 19, 2025
3d8f47e
op-devstack: Support kona light CL (#18627)
pcw109550 Dec 19, 2025
44b87d9
op-service: blob priority fee (tip cap) tracking for op-batcher (#18386)
nonsense Dec 19, 2025
7036c32
chore(ai-test): skip test/periphery/drippie/dripchecks/CheckTrue.t.so…
devin-ai-integration[bot] Dec 19, 2025
2a7bcaf
feat: Add OPCM v2 Support for chain upgrades to op-deployer (#18593)
0xiamflux Dec 19, 2025
d197d30
op-supernode: Update superroot_atTimestamp response format (#18652)
ajsutton Dec 21, 2025
903584f
op-challenger: Implement supernode super root provider. (#18653)
ajsutton Dec 21, 2025
1c9d0fc
chore(ai-test): skip test/universal/StandardBridge.t.sol - already ha…
devin-ai-integration[bot] Dec 22, 2025
722b12f
op-acceptance-tests: fix port collisions (#18684)
bitwiseguy Dec 22, 2025
34726e8
op-node: clarify comment (#18512)
joshklop Dec 23, 2025
2842468
check-prestate: handle go module pseudo-versions and fix kona prestat…
pauldowman Jan 4, 2026
1294a28
op-challenger/op-dispute-mon: Remove asterisc support (#18670)
ajsutton Jan 4, 2026
a967dbd
batcher: remove isPectra and assume Pectra is always active (#18534)
Himess Jan 6, 2026
161140a
feat(dispute): add rootClaimByChainId(uint256) for L2 chain ID lookup…
stevennevins Jan 6, 2026
e42ff77
test: OPCMv2 upgrade (#18704)
0xiamflux Jan 6, 2026
5e595e0
feat(abip): improve skip message for tests skipped by features (#18661)
smartcontracts Jan 6, 2026
add8ac5
test(contracts): add revert tests for Preinstalls library functions (…
devin-ai-integration[bot] Jan 6, 2026
be272e9
ci: Remove last self-hosted runner (#18722)
mslipper Jan 6, 2026
60b1c96
op-challenger: Integrate super node trace provider (#18668)
ajsutton Jan 7, 2026
e5f61e5
fix nil pointer exception in op-batcher (#18701)
blockchaindevsh Jan 7, 2026
a7e0935
feat: support interop migration in OPCMv2 (#18649)
smartcontracts Jan 7, 2026
53ff76f
op-supernode: fix env var prefix wrangling (#18720)
geoknee Jan 7, 2026
8b94ed0
test(contracts): convert OptimismMintableERC20 tests to fuzz tests (#…
devin-ai-integration[bot] Jan 7, 2026
935ddd5
test(contracts): improve OptimismMintableERC20Factory test coverage (…
devin-ai-integration[bot] Jan 7, 2026
3549f71
asterisc: Remove asterisc contracts (#18689)
ajsutton Jan 8, 2026
542fa53
fix(op-batcher): fix loop in batcher with shadow compressor+brotli (#…
bearpebble Jan 8, 2026
3bd9f08
op-dispute-mon: Use supernode instead of supervisor. (#18711)
ajsutton Jan 8, 2026
198df93
Use https for git submodules (#18690)
pauldowman Jan 8, 2026
508c2d9
feat: Add `add-game-type-opcm-v2` command to op-deployer (#18660)
0xiamflux Jan 9, 2026
bac7db5
op-node: validate EIP-1559 params in derivation pipeline (#18638)
devin-ai-integration[bot] Jan 9, 2026
961e741
chore(ctb): move init bond value to CommonTest (#18648)
maurelian Jan 9, 2026
166dffb
fix(sysgo): allow OS to assign ports for opreth, rbuilder, rollup-boo…
bitwiseguy Jan 9, 2026
f335c57
all: upgrade op-geth (#18337)
joshklop Jan 9, 2026
b276130
op-challenger: Apply timeouts to HTTP requests (#18731)
ajsutton Jan 9, 2026
bfacc84
op-acceptance-tests: Add EL eth_simulate acceptance test (#18724)
geoknee Jan 10, 2026
a0c2509
Remove go 1.24 feature flag, leaving SysGetRandom syscall enabled (#1…
pauldowman Jan 11, 2026
8c3317f
Add timeout to vm-runner (#18594)
pauldowman Jan 11, 2026
2d9b8ac
fix: add compiler restriction for StorageSetter to align profiles (#1…
stevennevins Jan 12, 2026
6f81720
test(contracts): convert MintManager tests to fuzz tests for broader …
devin-ai-integration[bot] Jan 13, 2026
6aa85b1
fix: install solc for contracts tests (#18753)
smartcontracts Jan 13, 2026
d67b594
Add U18 audit report (#18758)
pauldowman Jan 13, 2026
cd92721
feat: have upgrade test blocks update every week (#18634)
smartcontracts Jan 13, 2026
3f4294b
all: upgrade op-geth (#18767)
joshklop Jan 13, 2026
3fb4e0b
sync upstream V1.16.5
Jan 14, 2026
fcf74c4
merge dev
Jan 14, 2026
22d1027
update op-geth to use dev branch
Jan 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
59 changes: 7 additions & 52 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,6 @@ parameters:
reproducibility_dispatch:
type: boolean
default: false
diff_asterisc_bytecode_dispatch:
type: boolean
default: false
kontrol_dispatch:
type: boolean
default: false
Expand Down Expand Up @@ -567,48 +564,6 @@ jobs:
- notify-failures-on-develop:
mentions: "@proofs-team"

diff-asterisc-bytecode:
docker:
- image: <<pipeline.parameters.default_docker_image>>
resource_class: xlarge
steps:
- utils/checkout-with-mise:
checkout-method: blobless
enable-mise-cache: true
- run:
name: Check `RISCV.sol` bytecode
working_directory: packages/contracts-bedrock
command: |
# Clone asterisc @ the pinned version to fetch remote `RISCV.sol`
ASTERISC_REV="v$(yq '.tools.asterisc' ../../mise.toml)"
REMOTE_ASTERISC_PATH="./src/vendor/asterisc/RISCV_Remote.sol"
git clone https://github.com/ethereum-optimism/asterisc \
-b $ASTERISC_REV && \
cp ./asterisc/rvsol/src/RISCV.sol $REMOTE_ASTERISC_PATH

# Replace import paths
sed -i -e 's/@optimism\///' $REMOTE_ASTERISC_PATH
# Replace legacy interface paths
sed -i -e 's/src\/cannon\/interfaces\//interfaces\/cannon\//g' $REMOTE_ASTERISC_PATH
sed -i -e 's/src\/dispute\/interfaces\//interfaces\/dispute\//g' $REMOTE_ASTERISC_PATH
# Replace contract name
sed -i -e 's/contract RISCV/contract RISCV_Remote/' $REMOTE_ASTERISC_PATH

# Install deps
forge install

# Diff bytecode, with both contracts compiled in the local environment.
REMOTE_ASTERISC_CODE="$(forge inspect RISCV_Remote bytecode | tr -d '\n')"
LOCAL_ASTERISC_CODE="$(forge inspect RISCV bytecode | tr -d '\n')"
if [ "$REMOTE_ASTERISC_CODE" != "$LOCAL_ASTERISC_CODE" ]; then
echo "Asterisc bytecode mismatch. Local version does not match remote. Diff:"
diff <(echo "$REMOTE_ASTERISC_CODE") <(echo "$LOCAL_ASTERISC_CODE")
else
echo "Asterisc version up to date."
fi
- notify-failures-on-develop:
mentions: "@clabby @proofs-team"

contracts-bedrock-build:
docker:
- image: <<pipeline.parameters.default_docker_image>>
Expand Down Expand Up @@ -960,6 +915,7 @@ jobs:
working_directory: packages/contracts-bedrock
- check-changed:
patterns: <<parameters.check_changed_patterns>>
- install-solc-compilers
- run:
name: Print dependencies
command: just dep-status
Expand Down Expand Up @@ -1147,6 +1103,8 @@ jobs:
command: |
just print-pinned-block-number > ./pinnedBlockNumber.txt
cat pinnedBlockNumber.txt
environment:
ETH_RPC_URL: https://ci-mainnet-l1-archive.optimism.io
working_directory: packages/contracts-bedrock
- restore_cache:
name: Restore forked state
Expand Down Expand Up @@ -1239,6 +1197,7 @@ jobs:
cat pinnedBlockNumber.txt
environment:
FORK_BASE_CHAIN: <<parameters.fork_base_chain>>
ETH_RPC_URL: <<parameters.fork_base_rpc>>
working_directory: packages/contracts-bedrock
- restore_cache:
name: Restore forked state
Expand Down Expand Up @@ -1296,7 +1255,7 @@ jobs:

contracts-bedrock-upload:
machine: true
resource_class: ethereum-optimism/latitude-1
resource_class: large
steps:
- utils/checkout-with-mise:
checkout-method: blobless
Expand Down Expand Up @@ -1373,7 +1332,7 @@ jobs:
command: forge --version
- run:
name: Pull cached artifacts
command: bash scripts/ops/pull-artifacts.sh --fallback-to-latest
command: bash scripts/ops/pull-artifacts.sh
working_directory: packages/contracts-bedrock
- run:
name: Run checks
Expand Down Expand Up @@ -2780,10 +2739,9 @@ workflows:
parameters:
features: &features_matrix
- main
- CUSTOM_GAS_TOKEN
- OPTIMISM_PORTAL_INTEROP
- CANNON_KONA,DEPLOY_V2_DISPUTE_GAMES
- OPCM_V2
- CUSTOM_GAS_TOKEN
- OPCM_V2,CUSTOM_GAS_TOKEN
- OPCM_V2,OPTIMISM_PORTAL_INTEROP
context:
Expand Down Expand Up @@ -2851,9 +2809,6 @@ workflows:
- op-deployer-forge-version:
context:
- circleci-repo-readonly-authenticated-github-token
- diff-asterisc-bytecode:
context:
- circleci-repo-readonly-authenticated-github-token
- semgrep-scan:
name: semgrep-scan-local
scan_command: semgrep scan --timeout=100 --config .semgrep/rules/ --error .
Expand Down
3 changes: 2 additions & 1 deletion .cursor/rules/solidity-styles.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ Applies to Solidity files.

- NatSpec documentation comments must use the triple-slash `///` style
- Use `//` for regular inline comments that are not NatSpec
- Always use `@notice` instead of `@dev`
- Use `@notice` for documenting what a function/contract does (external-facing documentation)
- Use `@dev` for internal developer notes, reminders, or invariants (e.g., "when updating this, also update X")
- Use a line-length of 100 characters
- Custom tags:
- `@custom:proxied`: Add to a contract whenever it's meant to live behind a proxy
Expand Down
6 changes: 3 additions & 3 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@
branch = dev
[submodule "op-rbuilder"]
path = op-rbuilder
url = git@github.com:flashbots/op-rbuilder.git
url = https://github.com/flashbots/op-rbuilder
[submodule "rollup-boost"]
path = rollup-boost
url = git@github.com:flashbots/rollup-boost.git
url = https://github.com/flashbots/rollup-boost
[submodule "kona"]
path = kona
url = git@github.com:op-rs/kona.git
url = https://github.com/op-rs/kona
12 changes: 12 additions & 0 deletions .semgrep/rules/sol-rules.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,7 @@ rules:
- packages/contracts-bedrock/src/L1/opcm/OPContractsManagerContainer.sol
- packages/contracts-bedrock/src/L1/opcm/OPContractsManagerUtils.sol
- packages/contracts-bedrock/src/L1/opcm/OPContractsManagerUtilsCaller.sol
- packages/contracts-bedrock/src/L1/opcm/OPContractsManagerMigrator.sol
- packages/contracts-bedrock/src/L1/OptimismPortal2.sol
- packages/contracts-bedrock/src/L1/OptimismPortalInterop.sol
- packages/contracts-bedrock/src/L2/FeeVault.sol
Expand Down Expand Up @@ -398,3 +399,14 @@ rules:
paths:
include:
- packages/contracts-bedrock/src/L1/opcm/OPContractsManagerV2.sol

- id: sol-style-ban-forge-std-test-import
languages: [solidity]
severity: ERROR
message: Import Test from test/setup/Test.sol, not forge-std/Test.sol. Import other forge-std components (stdStorage, StdStorage, stdError, StdUtils, Vm, console2, etc.) from their specific files (forge-std/StdStorage.sol, forge-std/StdError.sol, forge-std/StdUtils.sol, forge-std/Vm.sol, forge-std/console2.sol, etc.)
pattern-regex: import\s+(\{[^}]*\}\s+from\s+)?"forge-std/Test\.sol"\s*;
paths:
include:
- packages/contracts-bedrock/test
exclude:
- packages/contracts-bedrock/test/setup/Test.sol
20 changes: 20 additions & 0 deletions .semgrep/tests/sol-rules.sol-style-ban-forge-std-test-import.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// ruleid: sol-style-ban-forge-std-test-import
import { Test } from "forge-std/Test.sol";

// ruleid: sol-style-ban-forge-std-test-import
import { Test as ForgeTest } from "forge-std/Test.sol";

// ruleid: sol-style-ban-forge-std-test-import
import { Test, Vm } from "forge-std/Test.sol";

// ok: sol-style-ban-forge-std-test-import
import { Test } from "test/setup/Test.sol";

// ok: sol-style-ban-forge-std-test-import
import { Test as BaseTest } from "test/setup/Test.sol";

// ok: sol-style-ban-forge-std-test-import
import { Vm } from "forge-std/Vm.sol";

// ok: sol-style-ban-forge-std-test-import
import { StdUtils } from "forge-std/StdUtils.sol";
1 change: 0 additions & 1 deletion cannon/mipsevm/iface.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ type Metadata interface {
// Toggles here are temporary and should be removed once the newer state version is deployed widely. The older
// version can then be supported via multicannon pulling in a specific build and support for it dropped in latest code.
type FeatureToggles struct {
SupportWorkingSysGetRandom bool
}

type FPVM interface {
Expand Down
5 changes: 1 addition & 4 deletions cannon/mipsevm/multithreaded/mips.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,10 +159,7 @@ func (m *InstrumentedState) handleSyscall() error {
v0 = 0
v1 = 0
case arch.SysGetRandom:
if m.features.SupportWorkingSysGetRandom {
v0, v1 = m.syscallGetRandom(a0, a1)
}
// Otherwise, ignored (noop)
v0, v1 = m.syscallGetRandom(a0, a1)
case arch.SysMunmap:
case arch.SysMprotect:
case arch.SysGetAffinity:
Expand Down
32 changes: 3 additions & 29 deletions cannon/mipsevm/tests/evm_common_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import (
"github.com/ethereum-optimism/optimism/cannon/mipsevm/program"
"github.com/ethereum-optimism/optimism/cannon/mipsevm/register"
"github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil"
"github.com/ethereum-optimism/optimism/cannon/mipsevm/versions"
)

type insnCache interface {
Expand Down Expand Up @@ -632,21 +631,6 @@ func TestEVM_MMap(t *testing.T) {
Run(t, cases)
}

func TestEVM_SysGetRandom_isImplemented(t *testing.T) {
t.Parallel()
// Assert we have at least one vm with the working getrandom syscall
foundVmWithSyscallEnabled := false
for _, vers := range GetMipsVersionTestCases(t) {
features := versions.FeaturesForVersion(vers.Version)
foundVmWithSyscallEnabled = foundVmWithSyscallEnabled || features.SupportWorkingSysGetRandom
}
require.True(t, foundVmWithSyscallEnabled)

// Assert that latest version has a working getrandom ssycall
latestFeatures := versions.FeaturesForVersion(versions.GetExperimentalVersion())
require.True(t, latestFeatures.SupportWorkingSysGetRandom)
}

func TestEVM_SysGetRandom(t *testing.T) {
t.Parallel()

Expand Down Expand Up @@ -702,18 +686,12 @@ func TestEVM_SysGetRandom(t *testing.T) {
}

setExpectations := func(t require.TestingT, testCase testCase, expected *mtutil.ExpectedState, vm VersionedVMTestCase) ExpectedExecResult {
isNoop := !versions.FeaturesForVersion(vm.Version).SupportWorkingSysGetRandom
expectedMemory := testCase.expectedRandDataMask&randomData | ^testCase.expectedRandDataMask&startingMemory

expected.ExpectStep()
if isNoop {
expected.ActiveThread().Registers[register.RegSyscallRet1] = 0
expected.ActiveThread().Registers[register.RegSyscallErrno] = 0
} else {
expected.ActiveThread().Registers[register.RegSyscallRet1] = testCase.expectedReturnValue
expected.ActiveThread().Registers[register.RegSyscallErrno] = 0
expected.ExpectMemoryWrite(effAddr, expectedMemory)
}
expected.ActiveThread().Registers[register.RegSyscallRet1] = testCase.expectedReturnValue
expected.ActiveThread().Registers[register.RegSyscallErrno] = 0
expected.ExpectMemoryWrite(effAddr, expectedMemory)
return ExpectNormalExecution()
}

Expand Down Expand Up @@ -985,10 +963,6 @@ func TestEVM_RandomProgram(t *testing.T) {
t.Run(v.Name, func(t *testing.T) {
t.Parallel()

if !versions.FeaturesForVersion(v.Version).SupportWorkingSysGetRandom {
t.Skip("Skipping vm version that does not support working sys_getrandom")
}

validator := testutil.NewEvmValidator(t, v.StateHashFn, v.Contracts)

var stdOutBuf, stdErrBuf bytes.Buffer
Expand Down
63 changes: 29 additions & 34 deletions cannon/mipsevm/tests/evm_multithreaded64_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import (
"github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded"
mtutil "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded/testutil"
"github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil"
"github.com/ethereum-optimism/optimism/cannon/mipsevm/versions"
)

func TestEVM_MT64_LL(t *testing.T) {
Expand Down Expand Up @@ -608,7 +607,6 @@ var NoopSyscalls64 = map[string]uint32{
"SysPipe2": 5287,
"SysEpollCtl": 5208,
"SysEpollPwait": 5272,
"SysGetRandom": 5313,
"SysUname": 5061,
//"SysStat64": UndefinedSysNr,
"SysGetuid": 5100,
Expand All @@ -624,49 +622,46 @@ var NoopSyscalls64 = map[string]uint32{
"SysTimerDelete": 5220,
}

func getNoopSyscalls64(vmVersion versions.StateVersion) map[string]uint32 {
noOpCalls := maps.Clone(NoopSyscalls64)
features := versions.FeaturesForVersion(vmVersion)
if features.SupportWorkingSysGetRandom {
delete(noOpCalls, "SysGetRandom")
}
return noOpCalls
}

func getSupportedSyscalls(vmVersion versions.StateVersion) []uint32 {
supportedSyscalls := []uint32{arch.SysMmap, arch.SysBrk, arch.SysClone, arch.SysExitGroup, arch.SysRead, arch.SysWrite, arch.SysFcntl, arch.SysExit, arch.SysSchedYield, arch.SysGetTID, arch.SysFutex, arch.SysOpen, arch.SysNanosleep, arch.SysClockGetTime, arch.SysGetpid, arch.SysEventFd2}

features := versions.FeaturesForVersion(vmVersion)
if features.SupportWorkingSysGetRandom {
supportedSyscalls = append(supportedSyscalls, arch.SysGetRandom)
}
return supportedSyscalls
var SupportedSyscalls64 = []uint32{
arch.SysMmap,
arch.SysBrk,
arch.SysClone,
arch.SysExitGroup,
arch.SysRead,
arch.SysWrite,
arch.SysFcntl,
arch.SysExit,
arch.SysSchedYield,
arch.SysGetTID,
arch.SysFutex,
arch.SysOpen,
arch.SysNanosleep,
arch.SysClockGetTime,
arch.SysGetpid,
arch.SysEventFd2,
arch.SysGetRandom,
}

func TestEVM_NoopSyscall64(t *testing.T) {
t.Parallel()
for _, vmVersion := range GetMipsVersionTestCases(t) {
noOpCalls := getNoopSyscalls64(vmVersion.Version)
testNoopSyscall(t, vmVersion, noOpCalls)
testNoopSyscall(t, vmVersion, NoopSyscalls64)
}
}

func TestEVM_UnsupportedSyscall64(t *testing.T) {
t.Parallel()
for _, vmVersion := range GetMipsVersionTestCases(t) {
var noopSyscallNums = maps.Values(getNoopSyscalls64(vmVersion.Version))
var SupportedSyscalls = getSupportedSyscalls(vmVersion.Version)
unsupportedSyscalls := make([]uint32, 0, 400)
for i := 5000; i < 5400; i++ {
candidate := uint32(i)
if slices.Contains(SupportedSyscalls, candidate) || slices.Contains(noopSyscallNums, candidate) {
continue
}
unsupportedSyscalls = append(unsupportedSyscalls, candidate)
noopSyscallNums := maps.Values(NoopSyscalls64)
unsupportedSyscalls := make([]uint32, 0, 400)
for i := 5000; i < 5400; i++ {
candidate := uint32(i)
if slices.Contains(SupportedSyscalls64, candidate) || slices.Contains(noopSyscallNums, candidate) {
continue
}

unsupported := unsupportedSyscalls
testUnsupportedSyscall(t, vmVersion, unsupported)
unsupportedSyscalls = append(unsupportedSyscalls, candidate)
}
for _, vmVersion := range GetMipsVersionTestCases(t) {
testUnsupportedSyscall(t, vmVersion, unsupportedSyscalls)
}
}

Expand Down
7 changes: 1 addition & 6 deletions cannon/mipsevm/tests/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,7 @@ func GetMipsVersionTestCases(t require.TestingT) []VersionedVMTestCase {
var cases []VersionedVMTestCase
for _, version := range versions.StateVersionTypes {
if !arch.IsMips32 && versions.IsSupportedMultiThreaded64(version) {
goTarget := testutil.Go1_24
features := versions.FeaturesForVersion(version)
if features.SupportWorkingSysGetRandom {
goTarget = testutil.Go1_25
}
cases = append(cases, GetMultiThreadedTestCase(t, version, goTarget))
cases = append(cases, GetMultiThreadedTestCase(t, version, testutil.Go1_25))
}
}
return cases
Expand Down
Loading