Skip to content
Merged
Show file tree
Hide file tree
Changes from 79 commits
Commits
Show all changes
187 commits
Select commit Hold shift + click to select a range
08d483d
Add fee config encoding
avilagaston9 Oct 27, 2025
b112619
Add fee config decoder
avilagaston9 Oct 27, 2025
8636b88
Update committer and payload builder
avilagaston9 Oct 28, 2025
8e6392a
Update prover
avilagaston9 Oct 29, 2025
50c85a7
Update state reconstruct
avilagaston9 Oct 29, 2025
e56c0b8
Restore blobs
avilagaston9 Oct 30, 2025
ba0db8e
Fix blobs
avilagaston9 Nov 3, 2025
5a94906
Merge branch 'main' into feat/l2/commit_blocks_instead_of_state_diffs
avilagaston9 Nov 3, 2025
9fdd474
make osaka activation time optional
avilagaston9 Nov 3, 2025
ddd16bc
Fix
avilagaston9 Nov 3, 2025
dcefba3
Add measurements state diff vs transaction list
gianbelinche Nov 3, 2025
b357ef3
Update block_vs_state_diff_measurements.md
gianbelinche Nov 3, 2025
7eab9ba
wip: sending messages
avilagaston9 Nov 3, 2025
d5c3c8b
Add erc20 block measurements
gianbelinche Nov 4, 2025
b23ee0b
Add erc20 state diff measurements
gianbelinche Nov 4, 2025
2d0bc2c
Add conclusion
gianbelinche Nov 4, 2025
0eb2ae0
final touches
Nov 4, 2025
e4b6530
Update measurements and code
gianbelinche Nov 4, 2025
3cfbc91
Add erc20 state diff
gianbelinche Nov 4, 2025
3e2258a
Add BalanceDiffs
avilagaston9 Nov 4, 2025
cdea5c3
Add eth transfers blocks
gianbelinche Nov 4, 2025
a37aaf6
Update ETH transfer state diff
gianbelinche Nov 4, 2025
771aa23
Implement verifyMessage
avilagaston9 Nov 4, 2025
4cba453
Fix comments
gianbelinche Nov 5, 2025
00542be
Fix solidity compilation
gianbelinche Nov 5, 2025
5e5e5fd
Add deploy router
gianbelinche Nov 5, 2025
4db8571
wip: update watcher to fetch logs from other L2s
avilagaston9 Nov 5, 2025
9752080
Merge branch 'main' into feat/l2/commit_blocks_instead_of_state_diffs
avilagaston9 Nov 5, 2025
fa13fa9
Fix linter
avilagaston9 Nov 5, 2025
2292491
Improve state reconstruct
avilagaston9 Nov 5, 2025
0888af5
Store balance diffs
gianbelinche Nov 5, 2025
b43ff95
Fix decode l2 message from log
gianbelinche Nov 5, 2025
a0b69f7
Improve payload builder
avilagaston9 Nov 5, 2025
a89e614
Update last encoded block size
avilagaston9 Nov 5, 2025
54e7962
Fix L2 watch
gianbelinche Nov 5, 2025
697e655
Remove state diff from codebase
avilagaston9 Nov 5, 2025
270392b
Restore state diff docs
avilagaston9 Nov 6, 2025
96cecbc
Update tests
avilagaston9 Nov 6, 2025
b716604
Merge branch 'main' into feat/l2/commit_blocks_instead_of_state_diffs
avilagaston9 Nov 6, 2025
186804e
Fix estimate gas
avilagaston9 Nov 6, 2025
2b2358e
Fix tests
avilagaston9 Nov 6, 2025
1f49e3c
Execute privileged transaction
gianbelinche Nov 6, 2025
32f0de9
Merge branch 'main' into feat/l2/commit_blocks_instead_of_state_diffs
avilagaston9 Nov 6, 2025
cfc0cec
Restore state diffs doc name
avilagaston9 Nov 6, 2025
6ea663e
Minor improvements
avilagaston9 Nov 6, 2025
9f474a4
Update docs
avilagaston9 Nov 6, 2025
3ce72a0
Restore blobs
avilagaston9 Nov 6, 2025
9aad9e7
Fix docs CI
avilagaston9 Nov 6, 2025
67b1978
Remove unnecesary deploy constract step
avilagaston9 Nov 7, 2025
b133b30
restore convertion from generic to transaction
avilagaston9 Nov 7, 2025
c11deb2
Inspect node logs
avilagaston9 Nov 7, 2025
d46a397
Send tx to mint eth
gianbelinche Nov 7, 2025
37aa9e0
Restore state reconstruct workflow
avilagaston9 Nov 7, 2025
c975b1e
Merge branch 'main' into feat/l2/commit_blocks_instead_of_state_diffs
avilagaston9 Nov 7, 2025
4b6ff13
Create checkpoints in state reconstruct
avilagaston9 Nov 7, 2025
71e260a
Dehardcode l2s rpcs
gianbelinche Nov 7, 2025
d57a8e4
Format
gianbelinche Nov 7, 2025
2a7aa7a
Add prints for debugging
avilagaston9 Nov 7, 2025
7fa554c
Fix rollup store path
avilagaston9 Nov 7, 2025
3f625c4
Build docker image with l2-sql
avilagaston9 Nov 7, 2025
51b7a37
Fix balance diffs double send
gianbelinche Nov 10, 2025
ea040ab
Send balances on verify
gianbelinche Nov 10, 2025
6ac9acc
Add verification of l2 messages
gianbelinche Nov 10, 2025
97f665c
Format
gianbelinche Nov 10, 2025
cd31966
Change default on chain proposer
gianbelinche Nov 10, 2025
8f14e43
Add documentation
gianbelinche Nov 11, 2025
d94dadf
Merge branch 'main' into feat/l2/commit_blocks_instead_of_state_diffs
avilagaston9 Nov 11, 2025
fb36d17
Add steps for contract call
gianbelinche Nov 11, 2025
3af87fd
Add troubleshooting
gianbelinche Nov 11, 2025
2786006
Merge branch 'feat/l2/commit_blocks_instead_of_state_diffs' into feat…
gianbelinche Nov 11, 2025
95f33dc
Fix compilation
gianbelinche Nov 11, 2025
e2d1414
Fix
gianbelinche Nov 11, 2025
4445666
Fix tests
gianbelinche Nov 11, 2025
f0b13b7
Fix tests
gianbelinche Nov 11, 2025
9d9da06
Fix clippy
gianbelinche Nov 11, 2025
e0a994c
Add source chain id
gianbelinche Nov 11, 2025
d6e567a
Format
gianbelinche Nov 12, 2025
c2dc3fa
Fix gas price
gianbelinche Nov 12, 2025
827ca13
Update calldata for commit
gianbelinche Nov 12, 2025
7bf7fe8
Test EIP1559_DEFAULT_SERIALIZED_LENGTH constant
avilagaston9 Nov 12, 2025
20007fd
Rename BlobKZGVersionedHash
avilagaston9 Nov 12, 2025
ade2665
Reuse cloned tx
avilagaston9 Nov 12, 2025
dc434fd
Update docs/l2/fundamentals/shared_bridge.md
gianbelinche Nov 12, 2025
8dead17
Break if there is no more space for privileged
avilagaston9 Nov 12, 2025
4f0af0d
Fix based commit
gianbelinche Nov 12, 2025
1d144c2
Merge branch 'feat/l2/shared_bridge' of https://github.com/lambdaclas…
gianbelinche Nov 12, 2025
59b845f
Add sanity check on blocks and fee configs length
avilagaston9 Nov 12, 2025
c17173b
Round metric numbers
avilagaston9 Nov 12, 2025
a5dd91c
Fix default on chain proposer
gianbelinche Nov 12, 2025
167cf9b
Merge branch 'main' into feat/l2/commit_blocks_instead_of_state_diffs
avilagaston9 Nov 12, 2025
5f23e66
Remove log
gianbelinche Nov 12, 2025
fa91e96
Format
gianbelinche Nov 12, 2025
872951b
Fix state diff reconstruct
gianbelinche Nov 12, 2025
7d8c2f3
Merge branch 'feat/l2/commit_blocks_instead_of_state_diffs' into feat…
gianbelinche Nov 12, 2025
b38625b
Fix bridge address
gianbelinche Nov 12, 2025
c554b10
Fix state reconstruct
gianbelinche Nov 12, 2025
ce3e847
Format
gianbelinche Nov 12, 2025
3a5df21
Merge branch 'main' into feat/l2/shared_bridge
gianbelinche Nov 12, 2025
a084a77
Add more retries
gianbelinche Nov 12, 2025
ad8a459
Update docs
Nov 12, 2025
6ca55a3
Add more retries
gianbelinche Nov 13, 2025
97a7cfa
Merge branch 'main' into feat/l2/shared_bridge
gianbelinche Nov 13, 2025
c50c185
Add log
gianbelinche Nov 13, 2025
3be8496
Add more retries
gianbelinche Nov 13, 2025
6a82086
Solve comments
gianbelinche Nov 13, 2025
f0c197c
Change base dir
gianbelinche Nov 13, 2025
db73197
Remove source chain id
gianbelinche Nov 13, 2025
4ce8a69
Merge branch 'main' into feat/l2/shared_bridge
gianbelinche Nov 14, 2025
4aaf120
Fix bridge address
gianbelinche Nov 14, 2025
1c1081c
Update blobs state reconstruct
gianbelinche Nov 14, 2025
8dbba54
Fix lint
gianbelinche Nov 14, 2025
de21ae6
Amp retries
gianbelinche Nov 14, 2025
d669f25
Fix router reverts on random chainid
gianbelinche Nov 14, 2025
722fda1
Solve comments
gianbelinche Nov 14, 2025
eb79078
Merge branch 'main' into feat/l2/shared_bridge
gianbelinche Nov 14, 2025
f72bb33
Dont add l2tol2 if chain id doesnt exist
gianbelinche Nov 14, 2025
50c9b28
Merge branch 'main' into feat/l2/shared_bridge
gianbelinche Nov 14, 2025
d90ce22
Fix merge
gianbelinche Nov 14, 2025
3900768
Fix when no router
gianbelinche Nov 14, 2025
ef53563
Update blobs
gianbelinche Nov 14, 2025
a5bd8dd
Format
gianbelinche Nov 14, 2025
293c5da
clippy
gianbelinche Nov 14, 2025
8f0a8df
Fix clippy
gianbelinche Nov 15, 2025
1ae37aa
Merge branch 'main' into feat/l2/shared_bridge
gianbelinche Nov 17, 2025
78e1ca1
Add more docs
gianbelinche Nov 17, 2025
88e9b24
add more docs
gianbelinche Nov 17, 2025
d70e620
Add image
gianbelinche Nov 25, 2025
42a2e8c
Merge branch 'main' into feat/l2/shared_bridge
gianbelinche Nov 25, 2025
8224a1e
Update docs/l2/fundamentals/shared_bridge.md
gianbelinche Nov 26, 2025
8d122a8
Update crates/l2/contracts/src/l1/CommonBridge.sol
gianbelinche Nov 26, 2025
28d793c
Update crates/l2/sequencer/l1_watcher.rs
gianbelinche Nov 26, 2025
4c6f005
Update crates/networking/p2p/rlpx/l2/messages.rs
gianbelinche Nov 26, 2025
f23a1c3
Add balance diff doc
gianbelinche Nov 26, 2025
d19ba0f
Remove context clone
gianbelinche Nov 26, 2025
cf00ad8
Differentiate l1 and l2 privileged
gianbelinche Nov 26, 2025
f821ab0
Merge branch 'main' into feat/l2/shared_bridge
gianbelinche Nov 26, 2025
1b2beb9
format
gianbelinche Nov 26, 2025
1fc11bc
Fix lint
gianbelinche Nov 26, 2025
d7b3016
Change function name
gianbelinche Nov 27, 2025
7007be8
Remove unneeded count
gianbelinche Nov 27, 2025
9b52e36
Remove comment
gianbelinche Nov 27, 2025
2f9ee96
Change info level
gianbelinche Nov 27, 2025
3bf6a02
Add not l2 source doc
gianbelinche Nov 27, 2025
6f6ce01
Fix state reconstruct
gianbelinche Nov 27, 2025
3022345
Change privileged tx count position
gianbelinche Nov 27, 2025
f754818
Change address
gianbelinche Nov 27, 2025
c54e022
Change to rex
gianbelinche Nov 27, 2025
0168d2d
Change rest of cast
gianbelinche Nov 27, 2025
453ff15
Merge branch 'main' into feat/l2/shared_bridge
gianbelinche Nov 27, 2025
eb6192f
Update crates/l2/contracts/src/l1/interfaces/ICommonBridge.sol
gianbelinche Nov 27, 2025
3485ee7
Update crates/l2/contracts/src/l1/interfaces/ICommonBridge.sol
gianbelinche Nov 27, 2025
ac4e25c
Update crates/l2/contracts/src/l1/CommonBridge.sol
gianbelinche Nov 27, 2025
7894cb8
Fix comments
gianbelinche Nov 27, 2025
4ccbb6a
Merge branch 'main' into feat/l2/shared_bridge
gianbelinche Nov 28, 2025
29c01e5
Fix comment
gianbelinche Nov 28, 2025
5c633b1
Fix index bug
gianbelinche Nov 28, 2025
084d8e4
Add shared bridge test
gianbelinche Nov 28, 2025
7a8bb5d
Fix compose
gianbelinche Nov 28, 2025
a2ada1b
Add override shared bridge
gianbelinche Nov 28, 2025
72412d7
Fix workflow
gianbelinche Nov 28, 2025
d98f876
More fix workflow
gianbelinche Nov 28, 2025
8435970
Fix compose
gianbelinche Nov 28, 2025
98b109b
Fix workflow
gianbelinche Dec 1, 2025
376718d
Fix l2 connection
gianbelinche Dec 1, 2025
615a2f9
format
gianbelinche Dec 1, 2025
45e0fbd
Fix workflow
gianbelinche Dec 1, 2025
faf6051
Fix env volume
gianbelinche Dec 1, 2025
0c9a9a3
Fix register chain
gianbelinche Dec 1, 2025
92e5987
Fix tests step
gianbelinche Dec 1, 2025
fe14547
Solve comments
gianbelinche Dec 1, 2025
83ff794
Rename l2 to l2 messenger
gianbelinche Dec 1, 2025
0aa27cd
Ignore clippy on test
gianbelinche Dec 1, 2025
02818be
Add contract call test
gianbelinche Dec 1, 2025
bbcdc3a
Merge branch 'main' into feat/l2/shared_bridge
gianbelinche Dec 1, 2025
fc06412
Format code
gianbelinche Dec 1, 2025
cbfb64f
Add migrations doc
gianbelinche Dec 1, 2025
4fcc242
Fix clippy
gianbelinche Dec 1, 2025
48f14ad
Fix messenger doc
gianbelinche Dec 1, 2025
49bd28a
Fix ci
gianbelinche Dec 1, 2025
90b2428
Move shared bridge steps
gianbelinche Dec 1, 2025
278beb7
Merge branch 'main' into feat/l2/shared_bridge
gianbelinche Dec 1, 2025
1fe8c31
Merge branch 'main' into feat/l2/shared_bridge
gianbelinche Dec 3, 2025
6d6197a
Fix conflicts
gianbelinche Dec 3, 2025
2441375
Fix get batch state reconstruct
gianbelinche Dec 3, 2025
54cbf8d
Merge branch 'main' into feat/l2/shared_bridge
gianbelinche Dec 3, 2025
f83d0d9
Fix comments
gianbelinche Dec 3, 2025
345728a
Change migrations path
gianbelinche Dec 4, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/pr-main_l2.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ jobs:
password: ${{ secrets.DOCKERHUB_TOKEN }}
tags: ethrex:main-l2
artifact_path: ethrex_image_l2.tar
build_args: BUILD_FLAGS=--features l2
build_args: BUILD_FLAGS=--features l2,l2-sql

- name: Upload artifacts
uses: actions/upload-artifact@v4
Expand Down
5 changes: 5 additions & 0 deletions cmd/ethrex/build_l2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,10 @@ pub fn download_script() {
&Path::new("../../crates/l2/contracts/src/l1/CommonBridge.sol"),
"CommonBridge",
),
(
&Path::new("../../crates/l2/contracts/src/l1/Router.sol"),
"Router",
),
];
for (path, name) in l1_contracts {
compile_contract_to_bytecode(
Expand Down Expand Up @@ -170,6 +174,7 @@ fn write_empty_bytecode_files(output_contracts_path: &Path) {
"SP1Verifier",
"OnChainProposer",
"CommonBridge",
"Router",
"CommonBridgeL2",
"L2ToL1Messenger",
"UpgradeableSystemContract",
Expand Down
206 changes: 112 additions & 94 deletions cmd/ethrex/l2/command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,21 @@ use crate::{
},
utils::{self, default_datadir, init_datadir, parse_private_key},
};
use bytes::Bytes;
use clap::{FromArgMatches, Parser, Subcommand};
use ethrex_common::utils::keccak;
use ethrex_blockchain::{
Blockchain, BlockchainOptions, BlockchainType, L2Config, fork_choice::apply_fork_choice,
};
use ethrex_common::{
Address, H256, U256,
types::{BYTES_PER_BLOB, BlobsBundle, BlockHeader, batch::Batch, bytes_from_blob},
Address, U256,
types::{BYTES_PER_BLOB, Block, blobs_bundle, bytes_from_blob, fee_config::FeeConfig},
};
use ethrex_common::{types::BlobsBundle, utils::keccak};
use ethrex_config::networks::Network;
use ethrex_l2_common::{calldata::Value, l1_messages::get_l1_message_hash, state_diff::StateDiff};
use ethrex_l2::utils::state_reconstruct::get_batch;
use ethrex_l2_common::calldata::Value;
use ethrex_l2_sdk::call_contract;
use ethrex_rlp::decode::RLPDecode as _;
use ethrex_rpc::{
EthClient, clients::beacon::BeaconClient, types::block_identifier::BlockIdentifier,
};
Expand Down Expand Up @@ -138,8 +144,12 @@ pub enum Command {
blobs_dir: PathBuf,
#[arg(short = 's', long, help = "The path to the store.")]
store_path: PathBuf,
#[arg(short = 'c', long, help = "Address of the L2 proposer coinbase")]
coinbase: Address,
#[arg(
short = 'o',
long,
help = "Whether Osaka fork is activated or not. If None, it assumes it is active."
)]
osaka_activated: Option<bool>,
},
#[command(about = "Reverts unverified batches.")]
RevertBatch {
Expand Down Expand Up @@ -370,7 +380,7 @@ impl Command {
genesis,
blobs_dir,
store_path,
coinbase,
osaka_activated,
} => {
#[cfg(feature = "rocksdb")]
let store_type = EngineType::RocksDB;
Expand All @@ -389,21 +399,13 @@ impl Command {
.await?;

let rollup_store =
StoreRollup::new(&store_path.join("./rollup_store"), rollup_store_type)?;
StoreRollup::new(&store_path.join("rollup_store"), rollup_store_type)?;
rollup_store
.init()
.await
.map_err(|e| format!("Failed to init rollup store: {e}"))
.unwrap();

// Get genesis
let genesis_header = store.get_block_header(0)?.expect("Genesis block not found");

let mut current_state_root = genesis_header.state_root;

let mut last_block_number = 0;
let mut new_canonical_blocks = vec![];

// Iterate over each blob
let files: Vec<std::fs::DirEntry> = read_dir(blobs_dir)?.try_collect()?;
for (file_number, file) in files
Expand All @@ -418,100 +420,116 @@ impl Command {
panic!("Invalid blob size");
}

// Decode state diff from blob
let blob = bytes_from_blob(blob.into());
let state_diff = StateDiff::decode(&blob)?;

// Apply all account updates to trie
let mut trie = store.open_direct_state_trie(current_state_root)?;
// Decode blocks
let blocks_count = u64::from_be_bytes(
blob[0..8].try_into().expect("Failed to get blob length"),
);

let account_updates = state_diff.to_account_updates(&trie)?;
let mut buf = &blob[8..];
let mut blocks = Vec::new();
for _ in 0..blocks_count {
let (item, rest) = Block::decode_unfinished(buf)?;
blocks.push(item);
buf = rest;
}

let account_updates_list = store
.apply_account_updates_from_trie_batch(&mut trie, account_updates.values())
.map_err(|e| format!("Error applying account updates: {e}"))
.unwrap();
// Decode fee configs
let mut fee_configs = Vec::new();

store
.open_direct_state_trie(current_state_root)?
.db()
.put_batch(account_updates_list.state_updates)?;
for _ in 0..blocks_count {
let (consumed, fee_config) = FeeConfig::decode(buf)?;
fee_configs.push(fee_config);
buf = &buf[consumed..];
}

current_state_root = account_updates_list.state_trie_hash;
// Create blockchain to execute blocks
let blockchain_type =
ethrex_blockchain::BlockchainType::L2(L2Config::default());
let opts = BlockchainOptions {
r#type: blockchain_type,
..Default::default()
};
let blockchain = Blockchain::new(store.clone(), opts);

store
.write_storage_trie_nodes_batch(account_updates_list.storage_updates)
.await?;
for (i, block) in blocks.iter().enumerate() {
// Update blockchain with the block's fee config
let fee_config = fee_configs
.get(i)
.cloned()
.ok_or_eyre("Fee config not found for block")?;

store
.write_account_code_batch(account_updates_list.code_updates)
.await?;
let BlockchainType::L2(l2_config) = &blockchain.options.r#type else {
panic!("Invalid blockchain type. Expected L2.");
};

// Get withdrawal hashes
let message_hashes = state_diff
.l1_messages
.iter()
.map(get_l1_message_hash)
.collect();

// Get the first block of the batch
let first_block_number = last_block_number + 1;

// Build the header of the last block.
// Note that its state_root is the root of new_trie.
let new_block = BlockHeader {
coinbase,
state_root: account_updates_list.state_trie_hash,
..state_diff.last_header
};
{
let Ok(mut fee_config_guard) = l2_config.fee_config.write() else {
panic!("Fee config lock was poisoned.");
};

// Store last block.
let new_block_hash = new_block.hash();
store
.add_block_header(new_block_hash, new_block.clone())
.await?;
store
.add_block_number(new_block_hash, state_diff.last_header.number)
.await?;
new_canonical_blocks.push((state_diff.last_header.number, new_block_hash));
println!(
"Stored last block of blob. Block {}. State root {}",
new_block.number, new_block.state_root
);
*fee_config_guard = fee_config;
}

// Execute block
blockchain.add_block(block.clone())?;

// Add fee config to rollup store
rollup_store
.store_fee_config_by_block(block.header.number, fee_config)
.await?;

info!(
"Added block {} with hash {:#x}",
block.header.number,
block.hash(),
);
}
// Apply fork choice
let latest_hash_on_batch = blocks.last().ok_or_eyre("Batch is empty")?.hash();
apply_fork_choice(
&store,
latest_hash_on_batch,
latest_hash_on_batch,
latest_hash_on_batch,
)
.await?;

// Prepare batch sealing
let blob = blobs_bundle::blob_from_bytes(Bytes::copy_from_slice(&blob))
.expect("Failed to create blob from bytes; blob was just read from file");

last_block_number = new_block.number;

let batch = Batch {
number: batch_number,
first_block: first_block_number,
last_block: new_block.number,
state_root: new_block.state_root,
privileged_transactions_hash: H256::zero(),
message_hashes,
blobs_bundle: BlobsBundle::empty(),
commit_tx: None,
verify_tx: None,
let wrapper_version = if let Some(activated) = osaka_activated
&& !activated
{
None
} else {
Some(1)
};

// Store batch info in L2 storage
rollup_store
.seal_batch(batch)
.await
.map_err(|e| format!("Error storing batch: {e}"))
.unwrap();
}
let Some((last_number, last_hash)) = new_canonical_blocks.pop() else {
return Err(eyre::eyre!("No blocks found in blobs directory"));
};
store
.forkchoice_update(
Some(new_canonical_blocks),
last_number,
last_hash,
None,
let blobs_bundle =
BlobsBundle::create_from_blobs(&vec![blob], wrapper_version)?;

let batch = get_batch(
&store,
&blocks,
U256::from(batch_number),
None,
blobs_bundle,
)
.await?;

// Seal batch
rollup_store.seal_batch(batch).await?;

// Create checkpoint
let checkpoint_path =
store_path.join(format!("checkpoint_batch_{batch_number}"));
store.create_checkpoint(&checkpoint_path).await?;

info!("Sealed batch {batch_number}.");
}
}
Command::RevertBatch {
batch,
Expand Down
Loading
Loading