diff --git a/CHANGELOG.sf.md b/CHANGELOG.sf.md index 9a4eed3f11..1fc3070c5b 100644 --- a/CHANGELOG.sf.md +++ b/CHANGELOG.sf.md @@ -1,3 +1,12 @@ +## v1.0.1-fh + +* Bumped base to `v1.0.1` +* Fixes on flash blocks: fetch fresh state on every block to avoid mismatches that cause UNDOs + +## v1.0.0-fh + +* Bumped base to `v1.0.0` + ## v0.9.1-fh-1 * Fixed flash blocks to arrive in the right order and be 100% identical to the canonical blocks diff --git a/Cargo.lock b/Cargo.lock index 17d879f40d..1f156cda37 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2284,7 +2284,7 @@ dependencies = [ [[package]] name = "audit-archiver" -version = "1.0.0" +version = "1.0.1" dependencies = [ "anyhow", "audit-archiver-lib", @@ -2303,7 +2303,7 @@ dependencies = [ [[package]] name = "audit-archiver-lib" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-primitives", @@ -3109,7 +3109,7 @@ dependencies = [ [[package]] name = "base" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-chains", "base-cli-utils", @@ -3130,7 +3130,7 @@ dependencies = [ [[package]] name = "base-access-lists" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-contract 2.0.5", @@ -3148,7 +3148,7 @@ dependencies = [ [[package]] name = "base-action-harness" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -3212,7 +3212,7 @@ dependencies = [ [[package]] name = "base-balance-monitor" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-network 2.0.5", "alloy-node-bindings 2.0.5", @@ -3225,7 +3225,7 @@ dependencies = [ [[package]] name = "base-batcher-admin" -version = "1.0.0" +version = "1.0.1" dependencies = [ "base-batcher-core", "derive_more 2.1.1", @@ -3236,7 +3236,7 @@ dependencies = [ [[package]] name = "base-batcher-bin" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "alloy-signer-local 2.0.5", @@ -3255,7 +3255,7 @@ dependencies = [ [[package]] name = "base-batcher-core" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-primitives", @@ -3280,7 +3280,7 @@ dependencies = [ [[package]] name = "base-batcher-encoder" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -3300,7 +3300,7 @@ dependencies = [ [[package]] name = "base-batcher-service" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-eips 2.0.5", "alloy-primitives", @@ -3334,7 +3334,7 @@ dependencies = [ [[package]] name = "base-batcher-source" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-primitives", @@ -3351,7 +3351,7 @@ dependencies = [ [[package]] name = "base-blobs" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-eips 2.0.5", "alloy-primitives", @@ -3362,7 +3362,7 @@ dependencies = [ [[package]] name = "base-builder-bin" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "base-builder-core", @@ -3382,7 +3382,7 @@ dependencies = [ [[package]] name = "base-builder-core" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-contract 2.0.5", @@ -3512,7 +3512,7 @@ dependencies = [ [[package]] name = "base-builder-metering" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "base-builder-core", @@ -3525,7 +3525,7 @@ dependencies = [ [[package]] name = "base-builder-publish" -version = "1.0.0" +version = "1.0.1" dependencies = [ "base-metrics", "base-ring-buffer", @@ -3545,7 +3545,7 @@ dependencies = [ [[package]] name = "base-bundle-extension" -version = "1.0.0" +version = "1.0.1" dependencies = [ "base-execution-txpool", "base-node-runner", @@ -3558,7 +3558,7 @@ dependencies = [ [[package]] name = "base-bundles" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-primitives", @@ -3575,7 +3575,7 @@ dependencies = [ [[package]] name = "base-challenger" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-primitives", @@ -3619,7 +3619,7 @@ dependencies = [ [[package]] name = "base-challenger-bin" -version = "1.0.0" +version = "1.0.1" dependencies = [ "base-challenger", "base-cli-utils", @@ -3629,7 +3629,7 @@ dependencies = [ [[package]] name = "base-cli-utils" -version = "1.0.0" +version = "1.0.1" dependencies = [ "backtrace", "base-metrics", @@ -3652,7 +3652,7 @@ dependencies = [ [[package]] name = "base-common-chains" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-chains", "alloy-eips 2.0.5", @@ -3668,7 +3668,7 @@ dependencies = [ [[package]] name = "base-common-consensus" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -3699,7 +3699,7 @@ dependencies = [ [[package]] name = "base-common-evm" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -3723,7 +3723,7 @@ dependencies = [ [[package]] name = "base-common-flashblocks" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", @@ -3739,7 +3739,7 @@ dependencies = [ [[package]] name = "base-common-flz" -version = "1.0.0" +version = "1.0.1" dependencies = [ "hex-literal 1.1.0", "rstest", @@ -3747,7 +3747,7 @@ dependencies = [ [[package]] name = "base-common-genesis" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-chains", "alloy-consensus 2.0.5", @@ -3768,7 +3768,7 @@ dependencies = [ [[package]] name = "base-common-network" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-network 2.0.5", @@ -3786,7 +3786,7 @@ dependencies = [ [[package]] name = "base-common-precompiles" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-evm", "alloy-primitives", @@ -3802,7 +3802,7 @@ dependencies = [ [[package]] name = "base-common-rpc-types" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -3827,7 +3827,7 @@ dependencies = [ [[package]] name = "base-common-rpc-types-engine" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -3850,7 +3850,7 @@ dependencies = [ [[package]] name = "base-common-signer" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -3870,7 +3870,7 @@ dependencies = [ [[package]] name = "base-comp" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -3895,7 +3895,7 @@ dependencies = [ [[package]] name = "base-consensus" -version = "1.0.0" +version = "1.0.1" dependencies = [ "base-cli-utils", "base-consensus-cli", @@ -3904,7 +3904,7 @@ dependencies = [ [[package]] name = "base-consensus-cli" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-chains", "alloy-genesis 2.0.5", @@ -3947,7 +3947,7 @@ dependencies = [ [[package]] name = "base-consensus-derive" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -3977,7 +3977,7 @@ dependencies = [ [[package]] name = "base-consensus-disc" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-rlp", "backon", @@ -4000,7 +4000,7 @@ dependencies = [ [[package]] name = "base-consensus-engine" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -4043,7 +4043,7 @@ dependencies = [ [[package]] name = "base-consensus-gossip" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-chains", "alloy-consensus 2.0.5", @@ -4082,7 +4082,7 @@ dependencies = [ [[package]] name = "base-consensus-node" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-chains", "alloy-consensus 2.0.5", @@ -4152,7 +4152,7 @@ dependencies = [ [[package]] name = "base-consensus-peers" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -4178,7 +4178,7 @@ dependencies = [ [[package]] name = "base-consensus-providers" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -4215,7 +4215,7 @@ dependencies = [ [[package]] name = "base-consensus-rpc" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-eips 2.0.5", "alloy-primitives", @@ -4241,7 +4241,7 @@ dependencies = [ [[package]] name = "base-consensus-safedb" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-eips 2.0.5", "alloy-primitives", @@ -4257,7 +4257,7 @@ dependencies = [ [[package]] name = "base-consensus-sources" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "alloy-rpc-client 2.0.5", @@ -4279,7 +4279,7 @@ dependencies = [ [[package]] name = "base-consensus-upgrades" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-eips 2.0.5", "alloy-primitives", @@ -4291,7 +4291,7 @@ dependencies = [ [[package]] name = "base-engine-tree" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-chains", "alloy-consensus 2.0.5", @@ -4342,7 +4342,7 @@ dependencies = [ [[package]] name = "base-execution-chainspec" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-chains", "alloy-consensus 2.0.5", @@ -4364,7 +4364,7 @@ dependencies = [ [[package]] name = "base-execution-cli" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-eips 2.0.5", "backon", @@ -4420,7 +4420,7 @@ dependencies = [ [[package]] name = "base-execution-consensus" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-chains", "alloy-consensus 2.0.5", @@ -4450,7 +4450,7 @@ dependencies = [ [[package]] name = "base-execution-evm" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -4477,7 +4477,7 @@ dependencies = [ [[package]] name = "base-execution-exex" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -4503,7 +4503,7 @@ dependencies = [ [[package]] name = "base-execution-firehose" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-evm", @@ -4520,7 +4520,7 @@ dependencies = [ [[package]] name = "base-execution-payload-builder" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -4560,7 +4560,7 @@ dependencies = [ [[package]] name = "base-execution-rpc" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -4624,7 +4624,7 @@ dependencies = [ [[package]] name = "base-execution-trie" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -4670,7 +4670,7 @@ dependencies = [ [[package]] name = "base-execution-txpool" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -4712,7 +4712,7 @@ dependencies = [ [[package]] name = "base-firehose-flashblocks" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -4757,7 +4757,7 @@ dependencies = [ [[package]] name = "base-firehose-tests" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -4782,7 +4782,7 @@ dependencies = [ [[package]] name = "base-flashblocks" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -4838,7 +4838,7 @@ dependencies = [ [[package]] name = "base-flashblocks-node" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-contract 2.0.5", @@ -4894,7 +4894,7 @@ dependencies = [ [[package]] name = "base-health" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-transport-http 2.0.5", "async-trait", @@ -4916,7 +4916,7 @@ dependencies = [ [[package]] name = "base-jwt" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "alloy-provider 2.0.5", @@ -4932,7 +4932,7 @@ dependencies = [ [[package]] name = "base-load-tester-bin" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-network 2.0.5", "alloy-primitives", @@ -4954,7 +4954,7 @@ dependencies = [ [[package]] name = "base-load-tests" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -4992,7 +4992,7 @@ dependencies = [ [[package]] name = "base-metering" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -5046,7 +5046,7 @@ dependencies = [ [[package]] name = "base-metrics" -version = "1.0.0" +version = "1.0.1" dependencies = [ "ctor", "metrics", @@ -5056,7 +5056,7 @@ dependencies = [ [[package]] name = "base-node-core" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -5126,7 +5126,7 @@ dependencies = [ [[package]] name = "base-node-runner" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-eips 2.0.5", "alloy-genesis 2.0.5", @@ -5181,7 +5181,7 @@ dependencies = [ [[package]] name = "base-precompile-macros" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "proc-macro2", @@ -5191,7 +5191,7 @@ dependencies = [ [[package]] name = "base-precompile-storage" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-evm", "alloy-primitives", @@ -5205,7 +5205,7 @@ dependencies = [ [[package]] name = "base-proof" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -5243,7 +5243,7 @@ dependencies = [ [[package]] name = "base-proof-client" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-evm", @@ -5266,7 +5266,7 @@ dependencies = [ [[package]] name = "base-proof-contracts" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-contract 2.0.5", "alloy-primitives", @@ -5283,7 +5283,7 @@ dependencies = [ [[package]] name = "base-proof-driver" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-evm", @@ -5303,7 +5303,7 @@ dependencies = [ [[package]] name = "base-proof-executor" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -5337,7 +5337,7 @@ dependencies = [ [[package]] name = "base-proof-host" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -5378,7 +5378,7 @@ dependencies = [ [[package]] name = "base-proof-mpt" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-primitives", @@ -5399,7 +5399,7 @@ dependencies = [ [[package]] name = "base-proof-preimage" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "async-channel", @@ -5413,7 +5413,7 @@ dependencies = [ [[package]] name = "base-proof-primitives" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-chains", "alloy-eips 2.0.5", @@ -5431,7 +5431,7 @@ dependencies = [ [[package]] name = "base-proof-rpc" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-eips 2.0.5", "alloy-network 2.0.5", @@ -5458,7 +5458,7 @@ dependencies = [ [[package]] name = "base-proof-succinct-build-utils" -version = "1.0.0" +version = "1.0.1" dependencies = [ "cargo_metadata 0.18.1", "sp1-build", @@ -5466,7 +5466,7 @@ dependencies = [ [[package]] name = "base-proof-succinct-client-utils" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -5503,7 +5503,7 @@ dependencies = [ [[package]] name = "base-proof-succinct-elfs" -version = "1.0.0" +version = "1.0.1" dependencies = [ "serde", "sha2 0.10.9", @@ -5512,7 +5512,7 @@ dependencies = [ [[package]] name = "base-proof-succinct-ethereum-client-utils" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-genesis 2.0.5", "anyhow", @@ -5529,7 +5529,7 @@ dependencies = [ [[package]] name = "base-proof-succinct-ethereum-host-utils" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-eips 2.0.5", "alloy-primitives", @@ -5548,7 +5548,7 @@ dependencies = [ [[package]] name = "base-proof-succinct-host-utils" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-contract 2.0.5", @@ -5602,7 +5602,7 @@ dependencies = [ [[package]] name = "base-proof-succinct-proof-utils" -version = "1.0.0" +version = "1.0.1" dependencies = [ "anyhow", "base-proof-succinct-elfs", @@ -5622,7 +5622,7 @@ dependencies = [ [[package]] name = "base-proof-succinct-prove" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-contract 2.0.5", "alloy-eips 2.0.5", @@ -5657,7 +5657,7 @@ dependencies = [ [[package]] name = "base-proof-succinct-scripts" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-eips 2.0.5", "alloy-network 2.0.5", @@ -5689,7 +5689,7 @@ dependencies = [ [[package]] name = "base-proof-succinct-signer-utils" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -5710,7 +5710,7 @@ dependencies = [ [[package]] name = "base-proof-succinct-validity" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-eips 2.0.5", "alloy-primitives", @@ -5749,7 +5749,7 @@ dependencies = [ [[package]] name = "base-proof-tee-nitro-attestation-prover" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "anyhow", @@ -5767,7 +5767,7 @@ dependencies = [ [[package]] name = "base-proof-tee-nitro-enclave" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-chains", "alloy-eips 2.0.5", @@ -5800,7 +5800,7 @@ dependencies = [ [[package]] name = "base-proof-tee-nitro-host" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "alloy-signer 2.0.5", @@ -5824,7 +5824,7 @@ dependencies = [ [[package]] name = "base-proof-tee-nitro-verifier" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -5841,7 +5841,7 @@ dependencies = [ [[package]] name = "base-proof-tee-registrar" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-primitives", @@ -5878,7 +5878,7 @@ dependencies = [ [[package]] name = "base-proof-tee-registrar-bin" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "alloy-provider 2.0.5", @@ -5908,7 +5908,7 @@ dependencies = [ [[package]] name = "base-proofs-extension" -version = "1.0.0" +version = "1.0.1" dependencies = [ "base-common-consensus", "base-execution-exex", @@ -5927,7 +5927,7 @@ dependencies = [ [[package]] name = "base-proposer" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-primitives", @@ -5965,7 +5965,7 @@ dependencies = [ [[package]] name = "base-proposer-bin" -version = "1.0.0" +version = "1.0.1" dependencies = [ "base-cli-utils", "base-proposer", @@ -5976,7 +5976,7 @@ dependencies = [ [[package]] name = "base-protocol" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloc-no-stdlib", "alloy-consensus 2.0.5", @@ -6012,7 +6012,7 @@ dependencies = [ [[package]] name = "base-prover-nitro-enclave" -version = "1.0.0" +version = "1.0.1" dependencies = [ "base-proof-tee-nitro-enclave", "eyre", @@ -6021,7 +6021,7 @@ dependencies = [ [[package]] name = "base-prover-nitro-host" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "base-cli-utils", @@ -6038,7 +6038,7 @@ dependencies = [ [[package]] name = "base-prover-zk" -version = "1.0.0" +version = "1.0.1" dependencies = [ "base-cli-utils", "base-proof-succinct-host-utils", @@ -6066,14 +6066,14 @@ dependencies = [ [[package]] name = "base-reth-cli" -version = "1.0.0" +version = "1.0.1" dependencies = [ "reth-node-core", ] [[package]] name = "base-reth-node" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "base-cli-utils", @@ -6096,11 +6096,11 @@ dependencies = [ [[package]] name = "base-ring-buffer" -version = "1.0.0" +version = "1.0.1" [[package]] name = "base-runtime" -version = "1.0.0" +version = "1.0.1" dependencies = [ "futures", "rand 0.9.4", @@ -6112,7 +6112,7 @@ dependencies = [ [[package]] name = "base-snapshotter" -version = "1.0.0" +version = "1.0.1" dependencies = [ "anyhow", "async-trait", @@ -6137,7 +6137,7 @@ dependencies = [ [[package]] name = "base-snapshotter-bin" -version = "1.0.0" +version = "1.0.1" dependencies = [ "anyhow", "aws-config", @@ -6153,7 +6153,7 @@ dependencies = [ [[package]] name = "base-snark-e2e" -version = "1.0.0" +version = "1.0.1" dependencies = [ "base-zk-service", "tokio", @@ -6163,7 +6163,7 @@ dependencies = [ [[package]] name = "base-test-utils" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-contract 2.0.5", @@ -6181,7 +6181,7 @@ dependencies = [ [[package]] name = "base-tx-forwarding" -version = "1.0.0" +version = "1.0.1" dependencies = [ "base-execution-txpool", "base-node-runner", @@ -6191,7 +6191,7 @@ dependencies = [ [[package]] name = "base-tx-manager" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -6225,7 +6225,7 @@ dependencies = [ [[package]] name = "base-txpool-rpc" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "base-node-runner", @@ -6242,7 +6242,7 @@ dependencies = [ [[package]] name = "base-txpool-tracing" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -6273,7 +6273,7 @@ dependencies = [ [[package]] name = "base-witness-diff" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "alloy-provider 2.0.5", @@ -6299,7 +6299,7 @@ checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" [[package]] name = "base-zk-client" -version = "1.0.0" +version = "1.0.1" dependencies = [ "async-trait", "prost 0.14.3", @@ -6315,7 +6315,7 @@ dependencies = [ [[package]] name = "base-zk-db" -version = "1.0.0" +version = "1.0.1" dependencies = [ "anyhow", "chrono", @@ -6331,7 +6331,7 @@ dependencies = [ [[package]] name = "base-zk-outbox" -version = "1.0.0" +version = "1.0.1" dependencies = [ "anyhow", "async-trait", @@ -6344,7 +6344,7 @@ dependencies = [ [[package]] name = "base-zk-service" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-primitives", "alloy-provider 2.0.5", @@ -6430,7 +6430,7 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "basectl" -version = "1.0.0" +version = "1.0.1" dependencies = [ "anyhow", "basectl-cli", @@ -6442,7 +6442,7 @@ dependencies = [ [[package]] name = "basectl-cli" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-contract 2.0.5", @@ -6478,7 +6478,7 @@ dependencies = [ [[package]] name = "based" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-primitives", @@ -6494,7 +6494,7 @@ dependencies = [ [[package]] name = "based-bin" -version = "1.0.0" +version = "1.0.1" dependencies = [ "base-cli-utils", "based", @@ -8573,7 +8573,7 @@ dependencies = [ [[package]] name = "devnet" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -11246,7 +11246,7 @@ dependencies = [ [[package]] name = "ingress-rpc" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-provider 2.0.5", "anyhow", @@ -11265,7 +11265,7 @@ dependencies = [ [[package]] name = "ingress-rpc-lib" -version = "1.0.0" +version = "1.0.1" dependencies = [ "alloy-consensus 2.0.5", "alloy-eips 2.0.5", @@ -24631,7 +24631,7 @@ dependencies = [ [[package]] name = "websocket-proxy" -version = "1.0.0" +version = "1.0.1" dependencies = [ "axum 0.8.9", "backoff", @@ -24652,7 +24652,7 @@ dependencies = [ [[package]] name = "websocket-proxy-bin" -version = "1.0.0" +version = "1.0.1" dependencies = [ "axum 0.8.9", "base-cli-utils", diff --git a/Cargo.toml b/Cargo.toml index 6d3917a593..98095e19e4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.0.0" +version = "1.0.1" edition = "2024" rust-version = "1.93" license = "MIT" diff --git a/actions/harness/tests/sync_status.rs b/actions/harness/tests/sync_status.rs new file mode 100644 index 0000000000..7ca046045a --- /dev/null +++ b/actions/harness/tests/sync_status.rs @@ -0,0 +1,38 @@ +//! Action tests for consensus sync-status L1 reporting. + +use std::sync::Arc; + +use base_action_harness::{ActionL1BlockFetcher, ActionTestHarness, SharedL1Chain}; +use base_consensus_node::L1WatcherQueryExecutor; +use base_consensus_rpc::L1WatcherQueries; +use tokio::sync::{oneshot, watch}; + +#[tokio::test] +async fn sync_status_current_l1_tracks_verifier_depth_origin_not_l1_head() { + const L1_HEAD: u64 = 100; + const VERIFIER_L1_CONFS: u64 = 4; + + let mut harness = ActionTestHarness::default(); + harness.mine_l1_blocks(L1_HEAD); + + let l1_chain = SharedL1Chain::from_blocks(harness.l1.chain().to_vec()); + let derivation_origin = harness.l1.block_info_at(L1_HEAD - VERIFIER_L1_CONFS); + let live_head = harness.l1.tip_info(); + let (_derivation_origin_tx, derivation_origin_rx) = watch::channel(Some(derivation_origin)); + let executor = L1WatcherQueryExecutor::new( + Arc::new(harness.rollup_config.clone()), + Arc::new(ActionL1BlockFetcher::new(l1_chain)), + derivation_origin_rx, + ); + let (sender, receiver) = oneshot::channel(); + + executor.execute(L1WatcherQueries::L1State(sender)).await; + + let state = receiver.await.expect("state query should return a response"); + assert_eq!(state.current_l1, Some(derivation_origin)); + assert_eq!(state.head_l1, Some(live_head)); + assert_ne!( + state.current_l1, state.head_l1, + "verifier_l1_confs should make current_l1 report derivation origin, not live L1 head" + ); +} diff --git a/crates/consensus/service/README.md b/crates/consensus/service/README.md index 92bc3e1af7..94c09814d9 100644 --- a/crates/consensus/service/README.md +++ b/crates/consensus/service/README.md @@ -117,7 +117,7 @@ The `GossipTransport` trait abstracts the transport backend. The production impl The L1 watcher actor is the service's source of truth for L1 chain state. It runs two concurrent streams: `head_stream` polls `eth_getBlockByNumber("latest")` every four seconds and `finalized_stream` polls `eth_getBlockByNumber("finalized")` at the interval configured in `L1Config`. Both streams are deduplicated — they only emit when the block changes. -On each new head, the watcher computes the confirmation-delayed block number as `head.number - verifier_l1_confs`. If the delayed number is reachable it fetches that block by number via `AlloyL1BlockFetcher::get_block()` and sends it to the derivation actor as a `ProcessL1HeadUpdateRequest`. It also broadcasts the real head through the `watch::Sender>` and stores the real head number in the shared `Arc` so the `ConfDepthProvider` used by the derivation pipeline can gate its own L1 lookups. +On each new head, the watcher computes the confirmation-delayed block number as `head.number - verifier_l1_confs`. If the delayed number is reachable it fetches that block by number via `AlloyL1BlockFetcher::get_block()` and sends it to the derivation actor as a `ProcessL1HeadUpdateRequest`. It also broadcasts the real head through the `watch::Sender>` and stores the real head number in the shared `Arc` so the `ConfDepthProvider` used by the derivation pipeline can gate its own L1 lookups. The derivation actor publishes the pipeline's L1 origin separately, and `optimism_syncStatus.current_l1` is served from that derivation-origin signal rather than from the raw L1 head. Log fetching runs on the same head-update path. The watcher calls `AlloyL1BlockFetcher::get_logs()` with a filter for `SystemConfigLog` events from the rollup config's L1 system config address. If the logs contain a `SystemConfigUpdate::UnsafeBlockSigner` event it extracts the new signer address and sends it to the network actor via the `block_signer_sender` channel. The log fetch retries up to ten times with exponential backoff from 50 ms to 500 ms before the actor returns an error. diff --git a/crates/consensus/service/src/actors/derivation/actor.rs b/crates/consensus/service/src/actors/derivation/actor.rs index 06931ee9ea..2773907433 100644 --- a/crates/consensus/service/src/actors/derivation/actor.rs +++ b/crates/consensus/service/src/actors/derivation/actor.rs @@ -11,7 +11,10 @@ use base_consensus_derive::{ use base_consensus_safedb::SafeHeadListener; use base_protocol::{AttributesWithParent, BlockInfo}; use thiserror::Error; -use tokio::{select, sync::mpsc}; +use tokio::{ + select, + sync::{mpsc, watch}, +}; use tokio_util::sync::{CancellationToken, WaitForCancellationFuture}; use crate::{ @@ -40,6 +43,8 @@ where /// The derivation pipeline. pipeline: PipelineSignalReceiver, + /// Publishes the L1 origin the derivation pipeline has advanced to. + derivation_origin_tx: watch::Sender>, /// The state machine controlling when derivation can occur. derivation_state_machine: DerivationStateMachine, /// The [`L2Finalizer`] tracks derived L2 blocks awaiting finalization. @@ -81,10 +86,12 @@ where inbound_request_rx: mpsc::Receiver, pipeline: PipelineSignalReceiver, safe_head_listener: Arc, + derivation_origin_tx: watch::Sender>, ) -> Self { Self { cancellation_token, pipeline, + derivation_origin_tx, inbound_request_rx, engine_client, derivation_state_machine: DerivationStateMachine::default(), @@ -94,6 +101,10 @@ where } } + fn publish_derivation_origin(&self) { + self.derivation_origin_tx.send_replace(self.pipeline.origin()); + } + /// Handles a [`Signal`] received over the derivation signal receiver channel. async fn signal(&mut self, signal: Signal) { if let Signal::Reset(ResetSignal { l2_safe_head: _reset_safe_head }) = signal { @@ -123,7 +134,10 @@ where } match self.pipeline.signal(signal).await { - Ok(_) => info!(target: "derivation", ?signal, "[SIGNAL] Executed Successfully"), + Ok(_) => { + self.publish_derivation_origin(); + info!(target: "derivation", ?signal, "[SIGNAL] Executed Successfully"); + } Err(e) => { error!(target: "derivation", ?e, ?signal, "Failed to signal derivation pipeline") } @@ -147,10 +161,11 @@ where StepResult::PreparedAttributes => { /* continue; attributes will be sent off. */ } StepResult::AdvancedOrigin => { let origin = - self.pipeline.origin().ok_or(PipelineError::MissingOrigin.crit())?.number; + self.pipeline.origin().ok_or(PipelineError::MissingOrigin.crit())?; - Metrics::derivation_l1_origin().absolute(origin); - debug!(target: "derivation", l1_block = origin, "Advanced L1 origin"); + Metrics::derivation_l1_origin().absolute(origin.number); + self.derivation_origin_tx.send_replace(Some(origin)); + debug!(target: "derivation", l1_block = origin.number, "Advanced L1 origin"); } StepResult::OriginAdvanceErr(e) | StepResult::StepFailed(e) => { match e { diff --git a/crates/consensus/service/src/actors/derivation/delegated/actor.rs b/crates/consensus/service/src/actors/derivation/delegated/actor.rs index 5a14db0ec2..3f94174ba5 100644 --- a/crates/consensus/service/src/actors/derivation/delegated/actor.rs +++ b/crates/consensus/service/src/actors/derivation/delegated/actor.rs @@ -2,9 +2,13 @@ use alloy_primitives::BlockHash; use async_trait::async_trait; use base_consensus_derive::ChainProvider; use base_consensus_providers::AlloyChainProvider; -use base_protocol::{L2BlockInfo, SyncStatus}; +use base_protocol::{BlockInfo, L2BlockInfo, SyncStatus}; use thiserror::Error; -use tokio::{select, sync::mpsc, time}; +use tokio::{ + select, + sync::{mpsc, watch}, + time, +}; use tokio_util::sync::{CancellationToken, WaitForCancellationFuture}; use crate::{ @@ -37,6 +41,8 @@ where derivation_delegate_provider: DerivationDelegateClient, /// L1 provider for validating L1 info for derivation delegation. l1_provider: AlloyChainProvider, + /// Publishes the delegate-reported L1 derivation cursor. + derivation_origin_tx: watch::Sender>, /// The engine's L2 safe head, according to updates from the Engine. engine_l2_safe_head: L2BlockInfo, @@ -65,6 +71,7 @@ where inbound_request_rx: mpsc::Receiver, derivation_delegate_provider: DerivationDelegateClient, l1_provider: AlloyChainProvider, + derivation_origin_tx: watch::Sender>, ) -> Self { Self { cancellation_token, @@ -72,6 +79,7 @@ where engine_client, derivation_delegate_provider, l1_provider, + derivation_origin_tx, engine_l2_safe_head: L2BlockInfo::default(), has_engine_sync_completed: false, } @@ -167,6 +175,8 @@ where return Ok(()); } + self.derivation_origin_tx.send_replace(Some(sync_status.current_l1)); + self.engine_client .send_safe_l2_signal(sync_status.safe_l2.into()) .await diff --git a/crates/consensus/service/src/actors/l1_watcher/query_processor.rs b/crates/consensus/service/src/actors/l1_watcher/query_processor.rs index 1fd0b678d3..38671f2c3d 100644 --- a/crates/consensus/service/src/actors/l1_watcher/query_processor.rs +++ b/crates/consensus/service/src/actors/l1_watcher/query_processor.rs @@ -28,8 +28,8 @@ where rollup_config: Arc, /// The L1 provider used for live block lookups. l1_provider: Arc, - /// Receiver for the most recent L1 head observed by the watcher actor. - latest_head: watch::Receiver>, + /// Receiver for the most recent L1 origin reached by derivation. + derivation_origin: watch::Receiver>, } impl Clone for L1WatcherQueryExecutor @@ -40,7 +40,7 @@ where Self { rollup_config: Arc::clone(&self.rollup_config), l1_provider: Arc::clone(&self.l1_provider), - latest_head: self.latest_head.clone(), + derivation_origin: self.derivation_origin.clone(), } } } @@ -53,9 +53,9 @@ where pub const fn new( rollup_config: Arc, l1_provider: Arc, - latest_head: watch::Receiver>, + derivation_origin: watch::Receiver>, ) -> Self { - Self { rollup_config, l1_provider, latest_head } + Self { rollup_config, l1_provider, derivation_origin } } /// Executes a single query. @@ -102,7 +102,7 @@ where query_started_at: Instant, sender: oneshot::Sender, ) { - let current_l1 = *self.latest_head.borrow(); + let current_l1 = *self.derivation_origin.borrow(); let (head_l1, finalized_l1, safe_l1) = tokio::join!( self.query_block(BlockId::latest(), "latest"), self.query_block(BlockId::finalized(), "finalized"), @@ -182,14 +182,14 @@ where rollup_config: Arc, l1_provider: L1Provider, inbound_queries: mpsc::Receiver, - latest_head: watch::Receiver>, + derivation_origin: watch::Receiver>, cancellation: CancellationToken, ) -> Self { Self { executor: L1WatcherQueryExecutor::new( rollup_config, Arc::new(l1_provider), - latest_head, + derivation_origin, ), inbound_queries, cancellation, @@ -334,19 +334,19 @@ mod tests { fn executor( fetcher: MockFetcher, - current_l1: Option, + derivation_origin: Option, ) -> L1WatcherQueryExecutor { - let (_latest_head_tx, latest_head_rx) = watch::channel(current_l1); + let (_derivation_origin_tx, derivation_origin_rx) = watch::channel(derivation_origin); L1WatcherQueryExecutor::new( Arc::new(RollupConfig::default()), Arc::new(fetcher), - latest_head_rx, + derivation_origin_rx, ) } #[tokio::test] - async fn l1_state_query_returns_live_state() { - let current_l1 = Some(MockFetcher::block_info(11)); + async fn l1_state_query_uses_derivation_origin_for_current_l1() { + let current_l1 = Some(MockFetcher::block_info(7)); let executor = executor(MockFetcher::with_delay(Duration::ZERO), current_l1); let (sender, receiver) = oneshot::channel(); @@ -375,14 +375,14 @@ mod tests { #[tokio::test] async fn query_processor_handles_multiple_queries_concurrently() { let fetcher = MockFetcher::with_delay(Duration::from_millis(20)); - let (_latest_head_tx, latest_head_rx) = watch::channel(None); + let (_derivation_origin_tx, derivation_origin_rx) = watch::channel(None); let (query_tx, query_rx) = mpsc::channel(16); let cancellation = CancellationToken::new(); let processor = L1WatcherQueryProcessor::new( Arc::new(RollupConfig::default()), fetcher, query_rx, - latest_head_rx, + derivation_origin_rx, cancellation.clone(), ) .with_query_concurrency(2); diff --git a/crates/consensus/service/src/service/node.rs b/crates/consensus/service/src/service/node.rs index 58cf50dc17..62c89fa3fe 100644 --- a/crates/consensus/service/src/service/node.rs +++ b/crates/consensus/service/src/service/node.rs @@ -396,6 +396,7 @@ impl RollupNode { let (engine_actor_request_tx, engine_actor_request_rx) = mpsc::channel(1024); let (engine_rpc_request_tx, engine_rpc_request_rx) = mpsc::channel(1024); let (unsafe_head_tx, unsafe_head_rx) = watch::channel(L2BlockInfo::default()); + let (derivation_origin_tx, derivation_origin_rx) = watch::channel(None); let (checkpoint_request_tx, checkpoint_request_rx) = mpsc::channel(1024); let checkpoint_db = CheckpointDB::open(&self.checkpoint_path) .map_err(|e| format!("failed to open checkpoint database: {e}"))?; @@ -453,6 +454,7 @@ impl RollupNode { derivation_actor_request_rx, provider, l1_provider, + derivation_origin_tx, ))) } else { ConfiguredDerivationActor::Normal(Box::new(DerivationActor::<_, P>::new( @@ -463,6 +465,7 @@ impl RollupNode { derivation_actor_request_rx, pipeline, safe_head_listener, + derivation_origin_tx, ))) }; @@ -526,7 +529,7 @@ impl RollupNode { Arc::clone(&self.config), AlloyL1BlockFetcher(self.l1_config.engine_provider.clone()), l1_query_rx, - l1_head_updates_tx.subscribe(), + derivation_origin_rx, cancellation.clone(), ); diff --git a/crates/consensus/service/tests/actors/verifier_conf_depth.rs b/crates/consensus/service/tests/actors/verifier_conf_depth.rs index 1d7c28dda6..a04cc8711b 100644 --- a/crates/consensus/service/tests/actors/verifier_conf_depth.rs +++ b/crates/consensus/service/tests/actors/verifier_conf_depth.rs @@ -15,19 +15,22 @@ use std::{ }, }; +use alloy_consensus::Header; use alloy_eips::{BlockId, BlockNumberOrTag}; -use alloy_primitives::B256; -use alloy_rpc_types_eth::{Block, Filter, Log}; +use alloy_primitives::{B256, Bloom, U256}; +use alloy_rpc_types_eth::{Block, Filter, Header as RpcHeader, Log}; use async_trait::async_trait; use base_common_genesis::RollupConfig; use base_consensus_derive::{ChainProvider, PipelineErrorKind}; use base_consensus_node::{ - DerivationClientResult, L1BlockFetcher, L1WatcherActor, L1WatcherDerivationClient, NodeActor, + DerivationClientResult, L1BlockFetcher, L1WatcherActor, L1WatcherDerivationClient, + L1WatcherQueryExecutor, NodeActor, }; use base_consensus_providers::{AlloyChainProviderError, ConfDepthProvider, L1HeadNumber}; +use base_consensus_rpc::L1WatcherQueries; use base_protocol::BlockInfo; use futures::Stream; -use tokio::sync::watch; +use tokio::sync::{oneshot, watch}; use tokio_util::sync::CancellationToken; // --------------------------------------------------------------------------- @@ -45,6 +48,27 @@ impl MockL1Fetcher { fn with_blocks(blocks: impl IntoIterator) -> Self { Self { blocks: blocks.into_iter().map(|b| (b.number, b)).collect() } } + + fn block_info_for_id(&self, id: BlockId) -> Option { + match id { + BlockId::Number(BlockNumberOrTag::Number(number)) => self.blocks.get(&number).copied(), + BlockId::Number(BlockNumberOrTag::Latest) => { + self.blocks.values().max_by_key(|block| block.number).copied() + } + _ => None, + } + } + + fn block(block_info: BlockInfo) -> Block { + Block::empty(RpcHeader::new(Header { + parent_hash: block_info.parent_hash, + number: block_info.number, + timestamp: block_info.timestamp, + logs_bloom: Bloom::ZERO, + difficulty: U256::ZERO, + ..Default::default() + })) + } } #[async_trait] @@ -56,16 +80,7 @@ impl L1BlockFetcher for MockL1Fetcher { } async fn get_block(&self, id: BlockId) -> Result, Self::Error> { - match id { - BlockId::Number(BlockNumberOrTag::Number(number)) => { - if self.blocks.contains_key(&number) { - Ok(Some(Block::default())) - } else { - Ok(None) - } - } - _ => Ok(None), - } + Ok(self.block_info_for_id(id).map(Self::block)) } } @@ -240,6 +255,61 @@ async fn l1_head_atomic_holds_real_head_not_delayed() { // Meanwhile, derivation should have received delayed heads. let heads = derivation_client.heads.lock().unwrap().clone(); assert_eq!(heads.len(), 3, "all three heads should have been forwarded to derivation"); - // Each head is fetched as Block::default() which maps to block number 0. - // The important thing is that derivation received delayed blocks, not the real heads. + assert_eq!( + heads.iter().map(|head| head.number).collect::>(), + vec![10, 20, 40], + "derivation should receive heads delayed by verifier_l1_confs" + ); +} + +#[tokio::test] +async fn sync_status_reports_derivation_origin_separately_from_live_head_with_verifier_confs() { + let conf_depth: u64 = 4; + let l1_head_number: L1HeadNumber = Arc::new(AtomicU64::new(0)); + let blocks: Vec = (90..=100).map(block_at).collect(); + let fetcher = MockL1Fetcher::with_blocks(blocks.clone()); + + let derivation_client = RecordingDerivationClient::default(); + let (l1_head_tx, _l1_head_rx) = watch::channel(None); + let cancel = CancellationToken::new(); + let head_stream: BoxedBlockStream = Box::pin(futures::stream::iter(vec![block_at(100)])); + let finalized_stream: BoxedBlockStream = Box::pin(futures::stream::pending()); + + let actor = L1WatcherActor::new( + Arc::new(RollupConfig::default()), + fetcher, + l1_head_tx, + derivation_client.clone(), + None, + cancel, + head_stream, + finalized_stream, + conf_depth, + Arc::clone(&l1_head_number), + ); + let _ = actor.start(()).await; + + assert_eq!(l1_head_number.load(Ordering::Relaxed), 100); + let heads = derivation_client.heads.lock().unwrap().clone(); + let derivation_origin = heads.last().copied().expect("derivation should receive a head"); + assert_eq!(derivation_origin.number, 96); + + let (_derivation_origin_tx, derivation_origin_rx) = watch::channel(Some(derivation_origin)); + let executor = L1WatcherQueryExecutor::new( + Arc::new(RollupConfig::default()), + Arc::new(MockL1Fetcher::with_blocks(blocks)), + derivation_origin_rx, + ); + let (sender, receiver) = oneshot::channel(); + + executor.execute(L1WatcherQueries::L1State(sender)).await; + + let state = receiver.await.expect("state query should return a response"); + assert_eq!(state.current_l1.map(|block| block.number), Some(96)); + assert_eq!(state.head_l1.map(|block| block.number), Some(100)); + assert_ne!( + state.current_l1.map(|block| block.number), + state.head_l1.map(|block| block.number), + "verifier_l1_confs should make sync status expose derivation origin separately from live head" + ); }