Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
50 changes: 38 additions & 12 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ resolver = "2"
default-members = ["node"]

[workspace.package]
version = "1.23.27"
version = "1.23.28"
edition = "2024"
repository = "https://github.com/NethermindEth/Catalyst"
license = "MIT"
Expand Down Expand Up @@ -80,9 +80,9 @@ shasta = { path = "shasta" }
strum = { version = "0.27", features = ["derive"] }

taiko_alethia_reth = { git = "https://github.com/taikoxyz/alethia-reth.git", rev = "e07c13fc011798adfa5436f24646b7305337cdf3", package = "alethia-reth-consensus" }
taiko_bindings = { git = "https://github.com/taikoxyz/taiko-mono.git", rev = "4a495188afbdbddf41457d440762b89023b32d84", package = "bindings" }
taiko_protocol = { git = "https://github.com/taikoxyz/taiko-mono.git", rev = "4a495188afbdbddf41457d440762b89023b32d84", package = "protocol" }
taiko_rpc = { git = "https://github.com/taikoxyz/taiko-mono.git", rev = "4a495188afbdbddf41457d440762b89023b32d84", package = "rpc" }
taiko_bindings = { git = "https://github.com/taikoxyz/taiko-mono.git", rev = "d8741f16b36db30c200b1592310c3d85b625a16c", package = "bindings" }
taiko_protocol = { git = "https://github.com/taikoxyz/taiko-mono.git", rev = "d8741f16b36db30c200b1592310c3d85b625a16c", package = "protocol" }
taiko_rpc = { git = "https://github.com/taikoxyz/taiko-mono.git", rev = "d8741f16b36db30c200b1592310c3d85b625a16c", package = "rpc" }
tiny-keccak = { version = "2.0", default-features = false }
tokio = { version = "1.45", default-features = false, features = ["full"] }
tokio-util = { version = "0.7", default-features = false }
Expand Down
4 changes: 3 additions & 1 deletion e2e_tests/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,6 @@ L2_PRIVATE_KEY=53321db7c1e331d93a11a41d16f004d7ff63972ec8ec7c25db329728ceeb1710
FORCED_INCLUSION_STORE_ADDRESS=0xc5092f6c1f30C8970dc835F0F754057f79b89CC6

MAX_BLOCKS_PER_BATCH=10
PRECONF_HEARTBEAT_MS=2000
PRECONF_HEARTBEAT_MS=2000

PROTOCOL=pacaya
4 changes: 2 additions & 2 deletions e2e_tests/chain_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ class ChainInfo:
block_hash: HexBytes

@classmethod
def from_chain(cls, fi_account_address, l2_client_node1, l1_client, taiko_inbox_address, beacon_client, verbose: bool = True):
def from_chain(cls, fi_account_address, l2_client_node1, l1_client, env_vars, beacon_client, verbose: bool = True):
"""Create ChainInfo instance from current chain state"""
fi_sender_nonce = l2_client_node1.eth.get_transaction_count(fi_account_address)
batch_id = get_last_batch_id(l1_client, taiko_inbox_address)
batch_id = get_last_batch_id(l1_client, env_vars)
block_number = l2_client_node1.eth.block_number
block_hash = l2_client_node1.eth.get_block(block_number).hash

Expand Down
22 changes: 19 additions & 3 deletions e2e_tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@
from eth_account import Account
import os
from dotenv import load_dotenv
from utils import ensure_catalyst_node_running, spam_n_blocks
from forced_inclusion_store import forced_inclusion_store_is_empty, check_empty_forced_inclusion_store
from utils import ensure_catalyst_node_running, spam_n_blocks, forced_inclusion_store_is_empty, check_empty_forced_inclusion_store
from dataclasses import dataclass
from taiko_inbox import get_last_block_id

Expand All @@ -23,6 +22,7 @@ class EnvVars:
preconf_heartbeat_ms: int
l2_private_key: str
max_blocks_per_batch: int
protocol: str

@classmethod
def from_env(cls):
Expand Down Expand Up @@ -64,6 +64,10 @@ def from_env(cls):
if not max_blocks_per_batch:
raise Exception("Environment variable MAX_BLOCKS_PER_BATCH not set")

protocol = os.getenv("PROTOCOL")
if not protocol:
raise Exception("Environment variable PROTOCOL not set")

return cls(
l2_prefunded_priv_key=l2_prefunded_priv_key,
l2_prefunded_priv_key_2=l2_prefunded_priv_key_2,
Expand All @@ -74,8 +78,15 @@ def from_env(cls):
preconf_heartbeat_ms=preconf_heartbeat_ms,
l2_private_key=l2_private_key,
max_blocks_per_batch=max_blocks_per_batch,
protocol=protocol,
)

def is_shasta(self):
return self.protocol == "shasta"

def is_pacaya(self):
return self.protocol == "pacaya"

@pytest.fixture(scope="session")
def env_vars():
"""Centralized environment variables fixture"""
Expand Down Expand Up @@ -124,13 +135,18 @@ def forced_inclusion_teardown(l1_client, l2_client_node1, env_vars):
"""Fixture to ensure forced inclusion store is empty after test"""
yield None
print("Test teardown: ensuring forced inclusion store is empty")
if not forced_inclusion_store_is_empty(l1_client, env_vars.forced_inclusion_store_address):
if not forced_inclusion_store_is_empty(l1_client, env_vars):
print("Spamming blocks to ensure forced inclusion store is empty")
spam_n_blocks(l2_client_node1, env_vars.l2_prefunded_priv_key, env_vars.max_blocks_per_batch, env_vars.preconf_min_txs)

@pytest.fixture(scope="session", autouse=True)
def global_setup(l1_client, l2_client_node1, l2_client_node2, env_vars):
"""Run once before all tests"""

if env_vars.protocol == "shasta":
yield
return

print("Wait for Geth sync with TaikoInbox")
block_number_contract = get_last_block_id(l1_client, env_vars.taiko_inbox_address)

Expand Down
20 changes: 1 addition & 19 deletions e2e_tests/forced_inclusion_store.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
from web3 import Web3
import json

abi = [
pacaya_fi_abi = [
{
"inputs": [],
"name": "head",
Expand Down Expand Up @@ -29,18 +26,3 @@
"type": "function"
}
]

def get_forced_inclusion_store_head(l1_client, forced_inclusion_address):
contract = l1_client.eth.contract(address=forced_inclusion_address, abi=abi)
head = contract.functions.head().call()
return int(head)

def forced_inclusion_store_is_empty(l1_client, forced_inclusion_address):
contract = l1_client.eth.contract(address=forced_inclusion_address, abi=abi)
head = contract.functions.head().call()
tail = contract.functions.tail().call()
print("Forced Inclusion head:", head, "tail: ", tail)
return head == tail

def check_empty_forced_inclusion_store(l1_client, env_vars):
assert forced_inclusion_store_is_empty(l1_client, env_vars.forced_inclusion_store_address), "Forced inclusion store should be empty"
42 changes: 30 additions & 12 deletions e2e_tests/taiko_inbox.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,36 @@
from web3 import Web3
import json
from utils import get_shasta_inbox_abi

with open("../pacaya/src/l1/abi/ITaikoInbox.json") as f:
abi = json.load(f)
pacaya_abi = json.load(f)

def get_last_batch_id(l1_client, taiko_inbox_address):
contract = l1_client.eth.contract(address=taiko_inbox_address, abi=abi)
result = contract.functions.getStats2().call()
last_batch_id = result[0]
return last_batch_id
def get_last_batch_id(l1_client, env_vars):
if env_vars.is_pacaya():
contract = l1_client.eth.contract(address=env_vars.taiko_inbox_address, abi=pacaya_abi)
result = contract.functions.getStats2().call()
last_batch_id = result[0]
return last_batch_id
else:
core_state = get_core_state(l1_client, env_vars)
last_batch_id = core_state[0] - 1
return last_batch_id

def get_last_block_id(l1_client, taiko_inbox_address):
batch_id = int(get_last_batch_id(l1_client, taiko_inbox_address)) - 1
contract = l1_client.eth.contract(address=taiko_inbox_address, abi=abi)
result = contract.functions.getBatch(batch_id).call()
last_block_id = result[1]
return last_block_id
def get_last_block_id(l1_client, env_vars):
if env_vars.is_pacaya():
batch_id = int(get_last_batch_id(l1_client, env_vars)) - 1
contract = l1_client.eth.contract(address=env_vars.taiko_inbox_address, abi=pacaya_abi)
result = contract.functions.getBatch(batch_id).call()
last_block_id = result[1]
return last_block_id
else:
core_state = get_core_state(l1_client, env_vars)
last_block_id = core_state[1]
#print(f"Last L2 block id from core state: {last_block_id}, next proposal id: {core_state[0]}")
return last_block_id

def get_core_state(l1_client, env_vars):
shasta_abi = get_shasta_inbox_abi()
contract = l1_client.eth.contract(address=env_vars.taiko_inbox_address, abi=shasta_abi)
result = contract.functions.getCoreState().call()
return result
Loading