From 1d7411eb2fd48c09e24691b5081c9997e902936a Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Wed, 7 Jan 2026 15:12:21 +0530 Subject: [PATCH 01/20] add backward let test --- .github/workflows/aggkit-e2e-single-chain.yml | 3 +- tests/aggkit/bridge-sovereign-chain-e2e.bats | 132 ++++++++++++++++++ tests/aggkit/e2e-pp.bats | 15 -- 3 files changed, 133 insertions(+), 17 deletions(-) delete mode 100644 tests/aggkit/e2e-pp.bats diff --git a/.github/workflows/aggkit-e2e-single-chain.yml b/.github/workflows/aggkit-e2e-single-chain.yml index 42d3cd626..0bc8c99de 100644 --- a/.github/workflows/aggkit-e2e-single-chain.yml +++ b/.github/workflows/aggkit-e2e-single-chain.yml @@ -57,7 +57,7 @@ on: required: false type: boolean default: false - + fail-fast: description: "Stop test execution on first failure" required: false @@ -184,7 +184,6 @@ jobs: else # Always-run tests run_test ./tests/aggkit/bridge-e2e.bats - run_test ./tests/aggkit/e2e-pp.bats run_test ./tests/aggkit/bridge-sovereign-chain-e2e.bats # Extra tests, whose execution is time consuming diff --git a/tests/aggkit/bridge-sovereign-chain-e2e.bats b/tests/aggkit/bridge-sovereign-chain-e2e.bats index fb3c7b730..54a206447 100644 --- a/tests/aggkit/bridge-sovereign-chain-e2e.bats +++ b/tests/aggkit/bridge-sovereign-chain-e2e.bats @@ -23,6 +23,12 @@ setup() { readonly empty_proof=$(jq -nc '[range(32) | "0x0000000000000000000000000000000000000000000000000000000000000000"]') + # backwardLET function signatures + readonly backward_let_func_sig="function backwardLET(uint256,bytes32[32],bytes32,bytes32[32])" + readonly activate_emergency_state_func_sig="function activateEmergencyState()" + readonly deactivate_emergency_state_func_sig="function deactivateEmergencyState()" + readonly deposit_count_func_sig="function depositCount() (uint256)" + contracts_url="$(kurtosis port print "$ENCLAVE_NAME" "$contracts_container" http)" input_args="$(curl -s "${contracts_url}/opt/input/input_args.json")" @@ -306,3 +312,129 @@ setup() { wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$global_index" log "โœ… Certificate settlement completed for global index: $global_index" } + +@test "Test backwardLET feature" { + log "=== ๐Ÿงช Testing backwardLET feature ===" >&3 + + # Step 1: Make 1 bridge from L1 to L2 (0.7 ETH) and claim it + log "๐Ÿš€ Step 1: Making 1 bridge from L1 to L2 (0.7 ETH) and claiming it" + destination_addr="$receiver" + destination_net="$l2_rpc_network_id" + amount=$(cast --to-unit 0.7ether wei) + + log "๐Ÿš€ Bridge L1 -> L2 (0.7 ETH)" + run bridge_asset "$native_token_addr" "$l1_rpc_url" "$l1_bridge_addr" + assert_success + local step1_bridge_tx_hash="$output" + log "โœ… Bridge tx hash: $step1_bridge_tx_hash" + + # Claim the bridge on L2 + log "๐Ÿ” Claiming bridge on L2" + run process_bridge_claim "backwardLET-step1" "$l1_rpc_network_id" "$step1_bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" + assert_success + log "โœ… Claimed bridge, global_index: $output" + local claimed_global_index="$output" + # Wait for certificate to settle containing the claimed global index + log "โณ Waiting for certificate settlement containing global index: $claimed_global_index" + wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$claimed_global_index" + log "โœ… Certificate settled for global index: $claimed_global_index" + + # Step 2: Make 3 bridges from L2 to L1 + log "๐Ÿš€ Step 2: Making 3 bridges from L2 to L1" + local l2_to_l1_tx_hashes=() + destination_addr="$sender_addr" + destination_net="$l1_rpc_network_id" + amount=$(cast --to-unit 0.01ether wei) + + for i in {1..3}; do + log "๐Ÿš€ Bridge $i/3: L2 -> L1" + run bridge_asset "$native_token_addr" "$L2_RPC_URL" "$l2_bridge_addr" + assert_success + l2_to_l1_tx_hashes+=("$output") + log "โœ… Bridge $i/3 tx hash: $output" + done + log "โœ… Completed 3 bridges from L2 to L1" + + log "Step 3: Getting the last L2->L1 bridge deposit count for backwardLET calculation" + + # Get the last L2->L1 bridge deposit count for backwardLET calculation + local last_l2_bridge_tx="${l2_to_l1_tx_hashes[2]}" + run get_bridge "backwardLET" "$l2_rpc_network_id" "$last_l2_bridge_tx" 50 10 "$aggkit_bridge_url" + assert_success + local last_bridge_info="$output" + local last_deposit_count + last_deposit_count=$(echo "$last_bridge_info" | jq -r '.deposit_count') + log "๐Ÿ“‹ Last L2->L1 deposit count: $last_deposit_count" + + # Step 4: Perform backwardLET to remove 2 deposit counts + log "๐Ÿ”ง Step 4: Performing backwardLET to roll back 2 deposit counts" + + # Calculate the target deposit count (remove 2 deposits, keep 1) + local target_deposit_count=$((last_deposit_count - 2)) + log "๐Ÿ“‹ Rolling back to deposit count: $target_deposit_count" + + # Get backward-let data from zkevm-bridge-service + log "๐Ÿ” Fetching backward-let proof data" + local backward_let_response + backward_let_response=$(curl -s "$zkevm_bridge_url/backward-let?net_id=$l2_rpc_network_id&deposit_cnt=$target_deposit_count") + log "๐Ÿ“‹ backward-let response: $backward_let_response" + + local leaf_hash + leaf_hash=$(echo "$backward_let_response" | jq -r '.leaf_hash') + local frontier + frontier=$(echo "$backward_let_response" | jq -r '.frontier | "[" + (join(",")) + "]"') + local rollup_merkle_proof + rollup_merkle_proof=$(echo "$backward_let_response" | jq -r '.rollup_merkle_proof | "[" + (join(",")) + "]"') + + log "๐Ÿ“‹ leaf_hash: $leaf_hash" + log "๐Ÿ“‹ frontier: $frontier" + log "๐Ÿ“‹ rollup_merkle_proof: $rollup_merkle_proof" + + # Activate emergency state (required for backwardLET) + log "๐Ÿšจ Activating emergency state on L2 bridge" + run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$activate_emergency_state_func_sig" + assert_success + log "โœ… Emergency state activated" + + # Execute backwardLET + log "๐Ÿ”„ Executing backwardLET" + run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$backward_let_func_sig" "$target_deposit_count" "$frontier" "$leaf_hash" "$rollup_merkle_proof" + assert_success + log "โœ… backwardLET executed successfully" + + # Deactivate emergency state + log "๐Ÿ”“ Deactivating emergency state on L2 bridge" + run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$deactivate_emergency_state_func_sig" + assert_success + log "โœ… Emergency state deactivated" + + # Verify the deposit count has been rolled back + sleep 10 # Wait for state to sync + run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$deposit_count_func_sig" + assert_success + local current_deposit_count="$output" + log "๐Ÿ“‹ Current deposit count after backwardLET: $current_deposit_count" + + # Step 5: Do a new bridge from L1 to L2 and verify certificate settles + log "๐Ÿš€ Step 5: Making new bridge from L1 to L2 after backwardLET" + # Bridge from L1 to L2 + destination_addr="$receiver" + destination_net="$l2_rpc_network_id" + run bridge_asset "$native_token_addr" "$l1_rpc_url" "$l1_bridge_addr" + assert_success + local step5_bridge_tx_hash="$output" + log "โœ… Step 5 bridge tx hash: $step5_bridge_tx_hash" + + # Claim the deposit on L2 + run process_bridge_claim "backwardLET-step5" "$l1_rpc_network_id" "$step5_bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" + assert_success + local claimed_global_index="$output" + log "๐Ÿ“‹ Claimed global index: $claimed_global_index" + + # Wait for certificate to settle containing the claimed global index + log "โณ Waiting for certificate settlement containing global index: $claimed_global_index" + wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$claimed_global_index" + log "โœ… Certificate settled for global index: $claimed_global_index" + + log "โœ… backwardLET test completed successfully!" +} diff --git a/tests/aggkit/e2e-pp.bats b/tests/aggkit/e2e-pp.bats deleted file mode 100644 index df39b1808..000000000 --- a/tests/aggkit/e2e-pp.bats +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bats -# bats file_tags=aggkit -# shellcheck disable=SC2154,SC2034 - -setup() { - load '../../core/helpers/agglayer-cdk-common-setup' - _agglayer_cdk_common_setup -} - -@test "Verify certificate settlement" { - echo "Waiting 10 minutes to get some settle certificate...." >&3 - - run $PROJECT_ROOT/core/helpers/scripts/agglayer_certificates_monitor.sh 1 600 "$l2_rpc_network_id" - assert_success -} From e5d3622443a801430df9801250c027993357d3c7 Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Wed, 7 Jan 2026 15:38:10 +0530 Subject: [PATCH 02/20] add forward let test --- tests/aggkit/bridge-sovereign-chain-e2e.bats | 227 ++++++++++++++++++- 1 file changed, 226 insertions(+), 1 deletion(-) diff --git a/tests/aggkit/bridge-sovereign-chain-e2e.bats b/tests/aggkit/bridge-sovereign-chain-e2e.bats index 54a206447..9f212588d 100644 --- a/tests/aggkit/bridge-sovereign-chain-e2e.bats +++ b/tests/aggkit/bridge-sovereign-chain-e2e.bats @@ -23,8 +23,11 @@ setup() { readonly empty_proof=$(jq -nc '[range(32) | "0x0000000000000000000000000000000000000000000000000000000000000000"]') - # backwardLET function signatures + # backwardLET and forwardLET function signatures readonly backward_let_func_sig="function backwardLET(uint256,bytes32[32],bytes32,bytes32[32])" + # forwardLET takes LeafData[] (leafType, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata) and expectedLER + readonly forward_let_func_sig="function forwardLET((uint8,uint32,address,uint32,address,uint256,bytes)[],bytes32)" + readonly get_root_func_sig="function getRoot() (bytes32)" readonly activate_emergency_state_func_sig="function activateEmergencyState()" readonly deactivate_emergency_state_func_sig="function deactivateEmergencyState()" readonly deposit_count_func_sig="function depositCount() (uint256)" @@ -438,3 +441,225 @@ setup() { log "โœ… backwardLET test completed successfully!" } + +@test "Test forwardLET feature" { + log "=== Testing forwardLET feature ===" >&3 + + # Step 1: Make 1 bridge from L1 to L2 (0.7 ETH) and claim it + log "Step 1: Making 1 bridge from L1 to L2 (0.7 ETH) and claiming it" + destination_addr="$receiver" + destination_net="$l2_rpc_network_id" + amount=$(cast --to-unit 0.7ether wei) + + log "Bridge L1 -> L2 (0.7 ETH)" + run bridge_asset "$native_token_addr" "$l1_rpc_url" "$l1_bridge_addr" + assert_success + local step1_bridge_tx_hash="$output" + log "Bridge tx hash: $step1_bridge_tx_hash" + + # Claim the bridge on L2 + log "Claiming bridge on L2" + run process_bridge_claim "forwardLET-step1" "$l1_rpc_network_id" "$step1_bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" + assert_success + log "Claimed bridge, global_index: $output" + local claimed_global_index="$output" + + # Wait for certificate to settle containing the claimed global index + log "Waiting for certificate settlement containing global index: $claimed_global_index" + wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$claimed_global_index" + log "Certificate settled for global index: $claimed_global_index" + + # Step 2: Make 3 bridges from L2 to L1 and store their info for forwardLET + log "Step 2: Making 3 bridges from L2 to L1" + local l2_to_l1_tx_hashes=() + destination_addr="$sender_addr" + destination_net="$l1_rpc_network_id" + amount=$(cast --to-unit 0.01ether wei) + + for i in {1..3}; do + log "Bridge $i/3: L2 -> L1" + run bridge_asset "$native_token_addr" "$L2_RPC_URL" "$l2_bridge_addr" + assert_success + l2_to_l1_tx_hashes+=("$output") + log "Bridge $i/3 tx hash: $output" + done + log "Completed 3 bridges from L2 to L1" + + # Step 3: Get bridge info for all 3 bridges BEFORE backwardLET (needed for forwardLET) + log "Step 3: Fetching bridge info for all 3 bridges (for forwardLET reconstruction)" + local bridge_infos=() + for i in {0..2}; do + local tx_hash="${l2_to_l1_tx_hashes[$i]}" + run get_bridge "forwardLET-bridge$((i+1))" "$l2_rpc_network_id" "$tx_hash" 50 10 "$aggkit_bridge_url" + assert_success + bridge_infos+=("$output") + log "Bridge $((i+1)) info: $output" + done + + # Get the last bridge deposit count + local last_bridge_info="${bridge_infos[2]}" + local last_deposit_count + last_deposit_count=$(echo "$last_bridge_info" | jq -r '.deposit_count') + log "Last L2->L1 deposit count: $last_deposit_count" + + # Get the current LER (Local Exit Root) from L2 bridge contract BEFORE backwardLET + # This will be the expected LER we need to restore with forwardLET + log "Fetching current LER from L2 bridge contract (before backwardLET)" + run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$get_root_func_sig" + assert_success + local expected_ler="$output" + log "Expected LER (to restore after forwardLET): $expected_ler" + + # Step 4: Perform backwardLET to roll back 2 deposit counts + log "Step 4: Performing backwardLET to roll back 2 deposit counts" + + # Calculate the target deposit count for backwardLET (remove 2 deposits) + local backward_target_deposit_count=$((last_deposit_count - 2)) + log "Rolling back to deposit count: $backward_target_deposit_count" + + # Get backward-let data from zkevm-bridge-service + log "Fetching backward-let proof data" + local backward_let_response + backward_let_response=$(curl -s "$zkevm_bridge_url/backward-let?net_id=$l2_rpc_network_id&deposit_cnt=$backward_target_deposit_count") + log "backward-let response: $backward_let_response" + + local backward_leaf_hash + backward_leaf_hash=$(echo "$backward_let_response" | jq -r '.leaf_hash') + local backward_frontier + backward_frontier=$(echo "$backward_let_response" | jq -r '.frontier | "[" + (join(",")) + "]"') + local backward_rollup_merkle_proof + backward_rollup_merkle_proof=$(echo "$backward_let_response" | jq -r '.rollup_merkle_proof | "[" + (join(",")) + "]"') + + # Activate emergency state (required for backwardLET) + log "Activating emergency state on L2 bridge" + run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$activate_emergency_state_func_sig" + assert_success + log "Emergency state activated" + + # Execute backwardLET + log "Executing backwardLET" + run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$backward_let_func_sig" "$backward_target_deposit_count" "$backward_frontier" "$backward_leaf_hash" "$backward_rollup_merkle_proof" + assert_success + log "backwardLET executed successfully" + + # Deactivate emergency state + log "Deactivating emergency state on L2 bridge" + run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$deactivate_emergency_state_func_sig" + assert_success + log "Emergency state deactivated" + + # Verify the deposit count has been rolled back + sleep 10 # Wait for state to sync + run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$deposit_count_func_sig" + assert_success + local current_deposit_count="$output" + log "Current deposit count after backwardLET: $current_deposit_count" + + # Step 5: Perform forwardLET to restore the deposit count + log "Step 5: Performing forwardLET to restore deposit count" + log "Using expected LER captured before backwardLET: $expected_ler" + + # Construct LeafData array from the rolled-back bridges (bridges 2 and 3, indices 1 and 2) + # LeafData: (leafType, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata) + log "Constructing LeafData array for forwardLET" + + # Build leaves array - we need to add back bridges at indices 1 and 2 (the last 2 that were rolled back) + local leaves_array="[" + for i in 1 2; do + local bridge_info="${bridge_infos[$i]}" + local leaf_type + leaf_type=$(echo "$bridge_info" | jq -r '.leaf_type') + local origin_network + origin_network=$(echo "$bridge_info" | jq -r '.origin_network') + local origin_address + origin_address=$(echo "$bridge_info" | jq -r '.origin_address') + local dest_network + dest_network=$(echo "$bridge_info" | jq -r '.destination_network') + local dest_address + dest_address=$(echo "$bridge_info" | jq -r '.destination_address') + local bridge_amount + bridge_amount=$(echo "$bridge_info" | jq -r '.amount') + local metadata + metadata=$(echo "$bridge_info" | jq -r '.metadata') + + # Default leaf_type to 0 if not present (asset bridge) + if [[ "$leaf_type" == "null" || -z "$leaf_type" ]]; then + leaf_type="0" + fi + + # Default metadata to 0x if empty + if [[ "$metadata" == "null" || -z "$metadata" ]]; then + metadata="0x" + fi + + log "Leaf $i: type=$leaf_type, originNet=$origin_network, originAddr=$origin_address, destNet=$dest_network, destAddr=$dest_address, amount=$bridge_amount" + + # Build the tuple for this leaf + local leaf_tuple="($leaf_type,$origin_network,$origin_address,$dest_network,$dest_address,$bridge_amount,$metadata)" + + if [[ $i -eq 1 ]]; then + leaves_array+="$leaf_tuple" + else + leaves_array+=",$leaf_tuple" + fi + done + leaves_array+="]" + log "Leaves array: $leaves_array" + + # Activate emergency state (required for forwardLET) + log "Activating emergency state on L2 bridge" + run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$activate_emergency_state_func_sig" + assert_success + log "Emergency state activated" + + # Execute forwardLET with the constructed leaves and expected LER + log "Executing forwardLET" + run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$forward_let_func_sig" "$leaves_array" "$expected_ler" + assert_success + log "forwardLET executed successfully" + + # Deactivate emergency state + log "Deactivating emergency state on L2 bridge" + run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$deactivate_emergency_state_func_sig" + assert_success + log "Emergency state deactivated" + + # Verify the deposit count has been restored + sleep 10 # Wait for state to sync + run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$deposit_count_func_sig" + assert_success + local restored_deposit_count="$output" + log "Current deposit count after forwardLET: $restored_deposit_count" + + # Verify deposit count was restored correctly + if [[ "$restored_deposit_count" != "$last_deposit_count" ]]; then + log "Warning: Deposit count mismatch. Expected: $last_deposit_count, Got: $restored_deposit_count" + fi + + # Step 6: Do a new bridge from L2 to L1 and verify certificate settles + log "Step 6: Making new bridge from L2 to L1 after forwardLET" + destination_addr="$sender_addr" + destination_net="$l1_rpc_network_id" + amount=$(cast --to-unit 0.01ether wei) + run bridge_asset "$native_token_addr" "$L2_RPC_URL" "$l2_bridge_addr" + assert_success + local new_bridge_tx_hash="$output" + log "New bridge tx hash: $new_bridge_tx_hash" + + # Wait for the new bridge to be indexed + run get_bridge "forwardLET-post" "$l2_rpc_network_id" "$new_bridge_tx_hash" 50 10 "$aggkit_bridge_url" + assert_success + local new_bridge_info="$output" + local new_deposit_count + new_deposit_count=$(echo "$new_bridge_info" | jq -r '.deposit_count') + local new_global_index + new_global_index=$(echo "$new_bridge_info" | jq -r '.global_index') + log "New deposit count: $new_deposit_count, global_index: $new_global_index" + + # Wait for certificate to settle containing the new global index + log "Waiting for certificate settlement containing global index: $new_global_index" + wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$new_global_index" + log "Certificate settled for global index: $new_global_index" + + log "forwardLET test completed successfully!" +} From 3b29112462a5dc855d6e9900609b95c592e00a46 Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Thu, 8 Jan 2026 13:22:28 +0530 Subject: [PATCH 03/20] update inventory --- TESTSINVENTORY.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/TESTSINVENTORY.md b/TESTSINVENTORY.md index b37e4ce17..cc3c54374 100644 --- a/TESTSINVENTORY.md +++ b/TESTSINVENTORY.md @@ -287,10 +287,12 @@ Table of tests currently implemented or being implemented in the E2E repository. | Remove single validator from committee | [Link](./tests/aggkit/aggsender-committee-updates.bats#L147) | | | Test Aggoracle committee | [Link](./tests/aggkit/bridge-e2e-aggoracle-committee.bats#L10) | | | Test L2 to L2 bridge | [Link](./tests/aggkit/bridge-e2e-2-chains.bats#L15) | | -| Test Sovereign Chain Bridge Events | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L48) | | +| Test Sovereign Chain Bridge Events | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L57) | | +| Test backwardLET feature | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L319) | | | Test block gas limit increase to 60M | [Link](./tests/fusaka/eip7935.bats#L19) | | | Test execute multiple claimMessages via testClaim with internal reentrancy and bridgeAsset call | [Link](./tests/aggkit/claim-reetrancy.bats#L472) | | -| Test inject invalid GER on L2 (bridges are valid) | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L212) | | +| Test forwardLET feature | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L445) | | +| Test inject invalid GER on L2 (bridges are valid) | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L221) | | | Test invalid GER injection case A (FEP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L825) | | | Test invalid GER injection case A (PP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L716) | | | Test invalid GER injection case B2 (FEP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L396) | | @@ -307,7 +309,6 @@ Table of tests currently implemented or being implemented in the E2E repository. | Transfer message L2 to L2 | [Link](./tests/aggkit/bridge-e2e-2-chains.bats#L68) | | | Transfer message | [Link](./tests/aggkit/bridge-e2e.bats#L11) | | | Verify batches | [Link](./tests/zkevm/batch-verification.bats#L10) | | -| Verify certificate settlement | [Link](./tests/aggkit/e2e-pp.bats#L10) | | | foo | [Link](./tests/foo.bats#L10) | | | p256verify call | [Link](./tests/fusaka/eip7951.bats#L46) | | | prover stress test | [Link](./tests/pessimistic/prover-stress.bats#L10) | | From 64cedb5666ba92e9fb7b4c0a6798a18859ee3a72 Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Thu, 8 Jan 2026 19:36:06 +0530 Subject: [PATCH 04/20] update config --- TESTSINVENTORY.md | 3 +- core/helpers/agglayer-cdk-common-setup.bash | 24 ++ tests/aggkit/bridge-sovereign-chain-e2e.bats | 243 ++++++------------- 3 files changed, 99 insertions(+), 171 deletions(-) diff --git a/TESTSINVENTORY.md b/TESTSINVENTORY.md index cc3c54374..ccfc36803 100644 --- a/TESTSINVENTORY.md +++ b/TESTSINVENTORY.md @@ -288,10 +288,9 @@ Table of tests currently implemented or being implemented in the E2E repository. | Test Aggoracle committee | [Link](./tests/aggkit/bridge-e2e-aggoracle-committee.bats#L10) | | | Test L2 to L2 bridge | [Link](./tests/aggkit/bridge-e2e-2-chains.bats#L15) | | | Test Sovereign Chain Bridge Events | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L57) | | -| Test backwardLET feature | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L319) | | +| Test backwardlet, forwardlet feature | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L319) | | | Test block gas limit increase to 60M | [Link](./tests/fusaka/eip7935.bats#L19) | | | Test execute multiple claimMessages via testClaim with internal reentrancy and bridgeAsset call | [Link](./tests/aggkit/claim-reetrancy.bats#L472) | | -| Test forwardLET feature | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L445) | | | Test inject invalid GER on L2 (bridges are valid) | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L221) | | | Test invalid GER injection case A (FEP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L825) | | | Test invalid GER injection case A (PP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L716) | | diff --git a/core/helpers/agglayer-cdk-common-setup.bash b/core/helpers/agglayer-cdk-common-setup.bash index d0769fdaa..03bb52ce2 100644 --- a/core/helpers/agglayer-cdk-common-setup.bash +++ b/core/helpers/agglayer-cdk-common-setup.bash @@ -33,6 +33,8 @@ _agglayer_cdk_common_setup() { # โœ… Resolve URLs _resolve_required_urls + manage_kurtosis_service "stop" "zkevm-bridge-service-001" + # โœ… Generate and fund wallet _generate_and_fund_wallet @@ -598,3 +600,25 @@ log_prefix_test(){ echo "=== $1 $test_log_prefix" >&3 echo "=====================================================================" >&3 } + +# Helper function to manage bridge spammer service +manage_kurtosis_service() { + local action="$1" # start or stop + local service="$2" + + if [[ "$action" == "stop" ]]; then + echo "Stopping $service..." >&3 + kurtosis service stop "$ENCLAVE_NAME" "$service" || { + echo "Error: Failed to stop $service" >&3 + return 1 + } + echo "$service stopped." >&3 + elif [[ "$action" == "start" ]]; then + echo "Starting $service..." >&3 + kurtosis service start "$ENCLAVE_NAME" "$service" || { + echo "Error: Failed to start $service" >&3 + return 1 + } + echo "$service started." >&3 + fi +} diff --git a/tests/aggkit/bridge-sovereign-chain-e2e.bats b/tests/aggkit/bridge-sovereign-chain-e2e.bats index 9f212588d..737bae611 100644 --- a/tests/aggkit/bridge-sovereign-chain-e2e.bats +++ b/tests/aggkit/bridge-sovereign-chain-e2e.bats @@ -316,135 +316,9 @@ setup() { log "โœ… Certificate settlement completed for global index: $global_index" } -@test "Test backwardLET feature" { - log "=== ๐Ÿงช Testing backwardLET feature ===" >&3 - - # Step 1: Make 1 bridge from L1 to L2 (0.7 ETH) and claim it - log "๐Ÿš€ Step 1: Making 1 bridge from L1 to L2 (0.7 ETH) and claiming it" - destination_addr="$receiver" - destination_net="$l2_rpc_network_id" - amount=$(cast --to-unit 0.7ether wei) - - log "๐Ÿš€ Bridge L1 -> L2 (0.7 ETH)" - run bridge_asset "$native_token_addr" "$l1_rpc_url" "$l1_bridge_addr" - assert_success - local step1_bridge_tx_hash="$output" - log "โœ… Bridge tx hash: $step1_bridge_tx_hash" - - # Claim the bridge on L2 - log "๐Ÿ” Claiming bridge on L2" - run process_bridge_claim "backwardLET-step1" "$l1_rpc_network_id" "$step1_bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" - assert_success - log "โœ… Claimed bridge, global_index: $output" - local claimed_global_index="$output" - # Wait for certificate to settle containing the claimed global index - log "โณ Waiting for certificate settlement containing global index: $claimed_global_index" - wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$claimed_global_index" - log "โœ… Certificate settled for global index: $claimed_global_index" - - # Step 2: Make 3 bridges from L2 to L1 - log "๐Ÿš€ Step 2: Making 3 bridges from L2 to L1" - local l2_to_l1_tx_hashes=() - destination_addr="$sender_addr" - destination_net="$l1_rpc_network_id" - amount=$(cast --to-unit 0.01ether wei) - - for i in {1..3}; do - log "๐Ÿš€ Bridge $i/3: L2 -> L1" - run bridge_asset "$native_token_addr" "$L2_RPC_URL" "$l2_bridge_addr" - assert_success - l2_to_l1_tx_hashes+=("$output") - log "โœ… Bridge $i/3 tx hash: $output" - done - log "โœ… Completed 3 bridges from L2 to L1" - - log "Step 3: Getting the last L2->L1 bridge deposit count for backwardLET calculation" - - # Get the last L2->L1 bridge deposit count for backwardLET calculation - local last_l2_bridge_tx="${l2_to_l1_tx_hashes[2]}" - run get_bridge "backwardLET" "$l2_rpc_network_id" "$last_l2_bridge_tx" 50 10 "$aggkit_bridge_url" - assert_success - local last_bridge_info="$output" - local last_deposit_count - last_deposit_count=$(echo "$last_bridge_info" | jq -r '.deposit_count') - log "๐Ÿ“‹ Last L2->L1 deposit count: $last_deposit_count" - - # Step 4: Perform backwardLET to remove 2 deposit counts - log "๐Ÿ”ง Step 4: Performing backwardLET to roll back 2 deposit counts" - - # Calculate the target deposit count (remove 2 deposits, keep 1) - local target_deposit_count=$((last_deposit_count - 2)) - log "๐Ÿ“‹ Rolling back to deposit count: $target_deposit_count" - - # Get backward-let data from zkevm-bridge-service - log "๐Ÿ” Fetching backward-let proof data" - local backward_let_response - backward_let_response=$(curl -s "$zkevm_bridge_url/backward-let?net_id=$l2_rpc_network_id&deposit_cnt=$target_deposit_count") - log "๐Ÿ“‹ backward-let response: $backward_let_response" - - local leaf_hash - leaf_hash=$(echo "$backward_let_response" | jq -r '.leaf_hash') - local frontier - frontier=$(echo "$backward_let_response" | jq -r '.frontier | "[" + (join(",")) + "]"') - local rollup_merkle_proof - rollup_merkle_proof=$(echo "$backward_let_response" | jq -r '.rollup_merkle_proof | "[" + (join(",")) + "]"') - - log "๐Ÿ“‹ leaf_hash: $leaf_hash" - log "๐Ÿ“‹ frontier: $frontier" - log "๐Ÿ“‹ rollup_merkle_proof: $rollup_merkle_proof" - - # Activate emergency state (required for backwardLET) - log "๐Ÿšจ Activating emergency state on L2 bridge" - run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$activate_emergency_state_func_sig" - assert_success - log "โœ… Emergency state activated" - - # Execute backwardLET - log "๐Ÿ”„ Executing backwardLET" - run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$backward_let_func_sig" "$target_deposit_count" "$frontier" "$leaf_hash" "$rollup_merkle_proof" - assert_success - log "โœ… backwardLET executed successfully" - - # Deactivate emergency state - log "๐Ÿ”“ Deactivating emergency state on L2 bridge" - run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$deactivate_emergency_state_func_sig" - assert_success - log "โœ… Emergency state deactivated" - - # Verify the deposit count has been rolled back - sleep 10 # Wait for state to sync - run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$deposit_count_func_sig" - assert_success - local current_deposit_count="$output" - log "๐Ÿ“‹ Current deposit count after backwardLET: $current_deposit_count" - - # Step 5: Do a new bridge from L1 to L2 and verify certificate settles - log "๐Ÿš€ Step 5: Making new bridge from L1 to L2 after backwardLET" - # Bridge from L1 to L2 - destination_addr="$receiver" - destination_net="$l2_rpc_network_id" - run bridge_asset "$native_token_addr" "$l1_rpc_url" "$l1_bridge_addr" - assert_success - local step5_bridge_tx_hash="$output" - log "โœ… Step 5 bridge tx hash: $step5_bridge_tx_hash" - - # Claim the deposit on L2 - run process_bridge_claim "backwardLET-step5" "$l1_rpc_network_id" "$step5_bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" - assert_success - local claimed_global_index="$output" - log "๐Ÿ“‹ Claimed global index: $claimed_global_index" - - # Wait for certificate to settle containing the claimed global index - log "โณ Waiting for certificate settlement containing global index: $claimed_global_index" - wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$claimed_global_index" - log "โœ… Certificate settled for global index: $claimed_global_index" - - log "โœ… backwardLET test completed successfully!" -} - -@test "Test forwardLET feature" { - log "=== Testing forwardLET feature ===" >&3 - +@test "Test backwardlet, forwardlet feature" { + manage_kurtosis_service "start" "zkevm-bridge-service-001" + zkevm_bridge_url=$(kurtosis port print "$ENCLAVE_NAME" zkevm-bridge-service-001 rpc) # Step 1: Make 1 bridge from L1 to L2 (0.7 ETH) and claim it log "Step 1: Making 1 bridge from L1 to L2 (0.7 ETH) and claiming it" destination_addr="$receiver" @@ -459,45 +333,41 @@ setup() { # Claim the bridge on L2 log "Claiming bridge on L2" - run process_bridge_claim "forwardLET-step1" "$l1_rpc_network_id" "$step1_bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" + run process_bridge_claim "step1" "$l1_rpc_network_id" "$step1_bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" assert_success log "Claimed bridge, global_index: $output" local claimed_global_index="$output" - # Wait for certificate to settle containing the claimed global index - log "Waiting for certificate settlement containing global index: $claimed_global_index" - wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$claimed_global_index" - log "Certificate settled for global index: $claimed_global_index" - - # Step 2: Make 3 bridges from L2 to L1 and store their info for forwardLET - log "Step 2: Making 3 bridges from L2 to L1" + manage_kurtosis_service "stop" "aggkit-001" + # Step 2: Make 5 bridges from L2 to L1 and store their info for forwardLET + log "Step 2: Making 5 bridges from L2 to L1" local l2_to_l1_tx_hashes=() destination_addr="$sender_addr" destination_net="$l1_rpc_network_id" amount=$(cast --to-unit 0.01ether wei) - for i in {1..3}; do - log "Bridge $i/3: L2 -> L1" + for i in {1..5}; do + log "Bridge $i/5: L2 -> L1" run bridge_asset "$native_token_addr" "$L2_RPC_URL" "$l2_bridge_addr" assert_success l2_to_l1_tx_hashes+=("$output") - log "Bridge $i/3 tx hash: $output" + log "Bridge $i/5 tx hash: $output" done - log "Completed 3 bridges from L2 to L1" + log "Completed 5 bridges from L2 to L1" - # Step 3: Get bridge info for all 3 bridges BEFORE backwardLET (needed for forwardLET) - log "Step 3: Fetching bridge info for all 3 bridges (for forwardLET reconstruction)" + # Step 3: Get bridge info for all 5 bridges BEFORE backwardLET (needed for forwardLET) + log "Step 3: Fetching bridge info for all 5 bridges (for forwardLET reconstruction)" local bridge_infos=() - for i in {0..2}; do + for i in {0..4}; do local tx_hash="${l2_to_l1_tx_hashes[$i]}" - run get_bridge "forwardLET-bridge$((i+1))" "$l2_rpc_network_id" "$tx_hash" 50 10 "$aggkit_bridge_url" + run get_bridge "backwardlet, forwardlet feature-bridge-$((i+1))" "$l2_rpc_network_id" "$tx_hash" 50 10 "$aggkit_bridge_url" assert_success bridge_infos+=("$output") log "Bridge $((i+1)) info: $output" done # Get the last bridge deposit count - local last_bridge_info="${bridge_infos[2]}" + local last_bridge_info="${bridge_infos[4]}" local last_deposit_count last_deposit_count=$(echo "$last_bridge_info" | jq -r '.deposit_count') log "Last L2->L1 deposit count: $last_deposit_count" @@ -513,7 +383,7 @@ setup() { # Step 4: Perform backwardLET to roll back 2 deposit counts log "Step 4: Performing backwardLET to roll back 2 deposit counts" - # Calculate the target deposit count for backwardLET (remove 2 deposits) + # Calculate the target deposit count for backwardLET (remove 3 deposits) local backward_target_deposit_count=$((last_deposit_count - 2)) log "Rolling back to deposit count: $backward_target_deposit_count" @@ -555,6 +425,34 @@ setup() { local current_deposit_count="$output" log "Current deposit count after backwardLET: $current_deposit_count" + # Bridge from L1 to L2 and claim it + log "Bridging from L1 to L2" + destination_addr="$receiver" + destination_net="$l2_rpc_network_id" + amount=$(cast --to-unit 0.1ether wei) + run bridge_asset "$native_token_addr" "$l1_rpc_url" "$l1_bridge_addr" + assert_success + local bridge_tx_hash_426="$output" + log "Bridge tx hash: $bridge_tx_hash_426" + manage_kurtosis_service "start" "aggkit-001" + aggkit_rpc_url=$(kurtosis port print "$ENCLAVE_NAME" aggkit-001 rpc) + log "Aggkit RPC URL: $aggkit_rpc_url" + + # Claim the bridge on L2 + log "Claiming bridge on L2" + run process_bridge_claim "line426" "$l1_rpc_network_id" "$bridge_tx_hash_426" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" + assert_success + local claimed_global_index="$output" + log "Claimed bridge, global_index: $claimed_global_index" + + + sleep 10 + + # Wait for certificate settlement + log "Waiting for certificate settlement containing global index: $claimed_global_index" + wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$claimed_global_index" + log "โœ… Certificate settled for global index: $claimed_global_index" + # Step 5: Perform forwardLET to restore the deposit count log "Step 5: Performing forwardLET to restore deposit count" log "Using expected LER captured before backwardLET: $expected_ler" @@ -565,7 +463,7 @@ setup() { # Build leaves array - we need to add back bridges at indices 1 and 2 (the last 2 that were rolled back) local leaves_array="[" - for i in 1 2; do + for i in 2 3 4; do local bridge_info="${bridge_infos[$i]}" local leaf_type leaf_type=$(echo "$bridge_info" | jq -r '.leaf_type') @@ -597,7 +495,7 @@ setup() { # Build the tuple for this leaf local leaf_tuple="($leaf_type,$origin_network,$origin_address,$dest_network,$dest_address,$bridge_amount,$metadata)" - if [[ $i -eq 1 ]]; then + if [[ $i -eq 2 ]]; then leaves_array+="$leaf_tuple" else leaves_array+=",$leaf_tuple" @@ -637,29 +535,36 @@ setup() { fi # Step 6: Do a new bridge from L2 to L1 and verify certificate settles - log "Step 6: Making new bridge from L2 to L1 after forwardLET" - destination_addr="$sender_addr" - destination_net="$l1_rpc_network_id" - amount=$(cast --to-unit 0.01ether wei) - run bridge_asset "$native_token_addr" "$L2_RPC_URL" "$l2_bridge_addr" + log "Step 6: Making new bridge from L1 to L2 after forwardLET" + # Bridge from L1 to L2 and claim it + log "Bridging from L1 to L2" + destination_addr="$receiver" + destination_net="$l2_rpc_network_id" + amount=$(cast --to-unit 0.1ether wei) + run bridge_asset "$native_token_addr" "$l1_rpc_url" "$l1_bridge_addr" assert_success - local new_bridge_tx_hash="$output" - log "New bridge tx hash: $new_bridge_tx_hash" + local bridge_tx_hash_426="$output" + log "Bridge tx hash: $bridge_tx_hash_426" + manage_kurtosis_service "start" "aggkit-001" + aggkit_rpc_url=$(kurtosis port print "$ENCLAVE_NAME" aggkit-001 rpc) + log "Aggkit RPC URL: $aggkit_rpc_url" - # Wait for the new bridge to be indexed - run get_bridge "forwardLET-post" "$l2_rpc_network_id" "$new_bridge_tx_hash" 50 10 "$aggkit_bridge_url" + # Claim the bridge on L2 + log "Claiming bridge on L2" + run process_bridge_claim "line426" "$l1_rpc_network_id" "$bridge_tx_hash_426" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" assert_success - local new_bridge_info="$output" - local new_deposit_count - new_deposit_count=$(echo "$new_bridge_info" | jq -r '.deposit_count') - local new_global_index - new_global_index=$(echo "$new_bridge_info" | jq -r '.global_index') - log "New deposit count: $new_deposit_count, global_index: $new_global_index" + local claimed_global_index="$output" + log "Claimed bridge, global_index: $claimed_global_index" + + + sleep 10 + + # Wait for certificate settlement + log "Waiting for certificate settlement containing global index: $claimed_global_index" + wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$claimed_global_index" + log "โœ… Certificate settled for global index: $claimed_global_index" - # Wait for certificate to settle containing the new global index - log "Waiting for certificate settlement containing global index: $new_global_index" - wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$new_global_index" - log "Certificate settled for global index: $new_global_index" + log "backwardlet, forwardlet feature test completed successfully!" - log "forwardLET test completed successfully!" + manage_kurtosis_service "stop" "zkevm-bridge-service-001" } From bc2ca8bca942a4dfc8ce11781dcfc590f2950a7e Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Thu, 8 Jan 2026 22:21:06 +0530 Subject: [PATCH 05/20] fix errors --- core/helpers/agglayer-cdk-common-setup.bash | 17 +++++++++++------ tests/aggkit/bridge-sovereign-chain-e2e.bats | 15 ++++++--------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/core/helpers/agglayer-cdk-common-setup.bash b/core/helpers/agglayer-cdk-common-setup.bash index 03bb52ce2..2b4e0ea4e 100644 --- a/core/helpers/agglayer-cdk-common-setup.bash +++ b/core/helpers/agglayer-cdk-common-setup.bash @@ -607,12 +607,17 @@ manage_kurtosis_service() { local service="$2" if [[ "$action" == "stop" ]]; then - echo "Stopping $service..." >&3 - kurtosis service stop "$ENCLAVE_NAME" "$service" || { - echo "Error: Failed to stop $service" >&3 - return 1 - } - echo "$service stopped." >&3 + # Check if service is running before attempting to stop + if kurtosis service inspect "$ENCLAVE_NAME" "$service" >/dev/null 2>&1; then + echo "Stopping $service..." >&3 + kurtosis service stop "$ENCLAVE_NAME" "$service" || { + echo "Error: Failed to stop $service" >&3 + return 1 + } + echo "$service stopped." >&3 + else + echo "$service is not running, skipping stop." >&3 + fi elif [[ "$action" == "start" ]]; then echo "Starting $service..." >&3 kurtosis service start "$ENCLAVE_NAME" "$service" || { diff --git a/tests/aggkit/bridge-sovereign-chain-e2e.bats b/tests/aggkit/bridge-sovereign-chain-e2e.bats index 737bae611..0e585fc7c 100644 --- a/tests/aggkit/bridge-sovereign-chain-e2e.bats +++ b/tests/aggkit/bridge-sovereign-chain-e2e.bats @@ -432,15 +432,15 @@ setup() { amount=$(cast --to-unit 0.1ether wei) run bridge_asset "$native_token_addr" "$l1_rpc_url" "$l1_bridge_addr" assert_success - local bridge_tx_hash_426="$output" - log "Bridge tx hash: $bridge_tx_hash_426" + local bridge_tx_hash="$output" + log "Bridge tx hash: $bridge_tx_hash" manage_kurtosis_service "start" "aggkit-001" aggkit_rpc_url=$(kurtosis port print "$ENCLAVE_NAME" aggkit-001 rpc) log "Aggkit RPC URL: $aggkit_rpc_url" # Claim the bridge on L2 log "Claiming bridge on L2" - run process_bridge_claim "line426" "$l1_rpc_network_id" "$bridge_tx_hash_426" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" + run process_bridge_claim "" "$l1_rpc_network_id" "$bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" assert_success local claimed_global_index="$output" log "Claimed bridge, global_index: $claimed_global_index" @@ -543,15 +543,12 @@ setup() { amount=$(cast --to-unit 0.1ether wei) run bridge_asset "$native_token_addr" "$l1_rpc_url" "$l1_bridge_addr" assert_success - local bridge_tx_hash_426="$output" - log "Bridge tx hash: $bridge_tx_hash_426" - manage_kurtosis_service "start" "aggkit-001" - aggkit_rpc_url=$(kurtosis port print "$ENCLAVE_NAME" aggkit-001 rpc) - log "Aggkit RPC URL: $aggkit_rpc_url" + local bridge_tx_hash="$output" + log "Bridge tx hash: $bridge_tx_hash" # Claim the bridge on L2 log "Claiming bridge on L2" - run process_bridge_claim "line426" "$l1_rpc_network_id" "$bridge_tx_hash_426" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" + run process_bridge_claim "" "$l1_rpc_network_id" "$bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" assert_success local claimed_global_index="$output" log "Claimed bridge, global_index: $claimed_global_index" From 0e664ec01cc4edde00a874a0b8fed5132fc3099c Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Fri, 9 Jan 2026 09:56:25 +0530 Subject: [PATCH 06/20] fix errors --- tests/aggkit/bridge-sovereign-chain-e2e.bats | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/aggkit/bridge-sovereign-chain-e2e.bats b/tests/aggkit/bridge-sovereign-chain-e2e.bats index 0e585fc7c..d091db4c9 100644 --- a/tests/aggkit/bridge-sovereign-chain-e2e.bats +++ b/tests/aggkit/bridge-sovereign-chain-e2e.bats @@ -318,6 +318,7 @@ setup() { @test "Test backwardlet, forwardlet feature" { manage_kurtosis_service "start" "zkevm-bridge-service-001" + manage_kurtosis_service "stop" "bridge-spammer-001" zkevm_bridge_url=$(kurtosis port print "$ENCLAVE_NAME" zkevm-bridge-service-001 rpc) # Step 1: Make 1 bridge from L1 to L2 (0.7 ETH) and claim it log "Step 1: Making 1 bridge from L1 to L2 (0.7 ETH) and claiming it" @@ -553,7 +554,6 @@ setup() { local claimed_global_index="$output" log "Claimed bridge, global_index: $claimed_global_index" - sleep 10 # Wait for certificate settlement @@ -564,4 +564,5 @@ setup() { log "backwardlet, forwardlet feature test completed successfully!" manage_kurtosis_service "stop" "zkevm-bridge-service-001" + manage_kurtosis_service "start" "bridge-spammer-001" } From 82ab9077363e43c7fd3fc1dcb54e2f4789215eb1 Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Fri, 9 Jan 2026 10:29:31 +0530 Subject: [PATCH 07/20] fix test --- tests/aggkit/bridge-sovereign-chain-e2e.bats | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/aggkit/bridge-sovereign-chain-e2e.bats b/tests/aggkit/bridge-sovereign-chain-e2e.bats index d091db4c9..e3dc86645 100644 --- a/tests/aggkit/bridge-sovereign-chain-e2e.bats +++ b/tests/aggkit/bridge-sovereign-chain-e2e.bats @@ -522,9 +522,9 @@ setup() { run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$deactivate_emergency_state_func_sig" assert_success log "Emergency state deactivated" + manage_kurtosis_service "start" "bridge-spammer-001" # Verify the deposit count has been restored - sleep 10 # Wait for state to sync run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$deposit_count_func_sig" assert_success local restored_deposit_count="$output" @@ -554,8 +554,6 @@ setup() { local claimed_global_index="$output" log "Claimed bridge, global_index: $claimed_global_index" - sleep 10 - # Wait for certificate settlement log "Waiting for certificate settlement containing global index: $claimed_global_index" wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$claimed_global_index" @@ -564,5 +562,4 @@ setup() { log "backwardlet, forwardlet feature test completed successfully!" manage_kurtosis_service "stop" "zkevm-bridge-service-001" - manage_kurtosis_service "start" "bridge-spammer-001" } From e97583c88a065c6f8f81d7b32010e0bb64c1887c Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Fri, 9 Jan 2026 15:21:54 +0530 Subject: [PATCH 08/20] fix test --- core/helpers/agglayer-cdk-common-setup.bash | 16 ++++++++++------ tests/aggkit/bridge-sovereign-chain-e2e.bats | 1 - 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/core/helpers/agglayer-cdk-common-setup.bash b/core/helpers/agglayer-cdk-common-setup.bash index 2b4e0ea4e..31b6d7fd2 100644 --- a/core/helpers/agglayer-cdk-common-setup.bash +++ b/core/helpers/agglayer-cdk-common-setup.bash @@ -619,11 +619,15 @@ manage_kurtosis_service() { echo "$service is not running, skipping stop." >&3 fi elif [[ "$action" == "start" ]]; then - echo "Starting $service..." >&3 - kurtosis service start "$ENCLAVE_NAME" "$service" || { - echo "Error: Failed to start $service" >&3 - return 1 - } - echo "$service started." >&3 + if kurtosis service inspect "$ENCLAVE_NAME" "$service" >/dev/null 2>&1; then + echo "Starting $service..." >&3 + kurtosis service start "$ENCLAVE_NAME" "$service" || { + echo "Error: Failed to start $service" >&3 + return 1 + } + echo "$service started." >&3 + else + echo "$service is not running, skipping start." >&3 + fi fi } diff --git a/tests/aggkit/bridge-sovereign-chain-e2e.bats b/tests/aggkit/bridge-sovereign-chain-e2e.bats index e3dc86645..0763c05bb 100644 --- a/tests/aggkit/bridge-sovereign-chain-e2e.bats +++ b/tests/aggkit/bridge-sovereign-chain-e2e.bats @@ -420,7 +420,6 @@ setup() { log "Emergency state deactivated" # Verify the deposit count has been rolled back - sleep 10 # Wait for state to sync run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$deposit_count_func_sig" assert_success local current_deposit_count="$output" From 88a4ffe04db1c5148f1b29b82a615825c7d83c7e Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Sat, 10 Jan 2026 11:00:49 +0530 Subject: [PATCH 09/20] add test --- tests/aggkit/bridge-sovereign-chain-e2e.bats | 372 +++++++++++++++---- 1 file changed, 305 insertions(+), 67 deletions(-) diff --git a/tests/aggkit/bridge-sovereign-chain-e2e.bats b/tests/aggkit/bridge-sovereign-chain-e2e.bats index 0763c05bb..7c9798e75 100644 --- a/tests/aggkit/bridge-sovereign-chain-e2e.bats +++ b/tests/aggkit/bridge-sovereign-chain-e2e.bats @@ -218,7 +218,7 @@ setup() { log "Final legacy token migrations: $final_legacy_token_migrations" } -@test "Test inject invalid GER on L2 (bridges are valid)" { +@test "Test inject invalid GER on L2 - B1 case" { log "๐Ÿš€ Sending bridge from L1 to L2" destination_addr="$receiver" destination_net="$l2_rpc_network_id" @@ -316,17 +316,21 @@ setup() { log "โœ… Certificate settlement completed for global index: $global_index" } -@test "Test backwardlet, forwardlet feature" { +@test "Test backwardLET with reorg scenarios" { manage_kurtosis_service "start" "zkevm-bridge-service-001" manage_kurtosis_service "stop" "bridge-spammer-001" - zkevm_bridge_url=$(kurtosis port print "$ENCLAVE_NAME" zkevm-bridge-service-001 rpc) - # Step 1: Make 1 bridge from L1 to L2 (0.7 ETH) and claim it - log "Step 1: Making 1 bridge from L1 to L2 (0.7 ETH) and claiming it" + + zkevm_bridge_url=$(_resolve_url_or_use_env "TEST_ZKEVM_BRIDGE_URL" \ + "zkevm-bridge-service-001" "rpc" \ + "Zk EVM Bridge service is not running" false) + + # Step 1: Make 1 bridge from L1 to L2 and claim it + log "Step 1: Making 1 bridge from L1 to L2 and claiming it" destination_addr="$receiver" destination_net="$l2_rpc_network_id" - amount=$(cast --to-unit 0.7ether wei) + amount=$(cast --to-unit 0.5ether wei) - log "Bridge L1 -> L2 (0.7 ETH)" + log "Bridge L1 -> L2 (0.5 ETH)" run bridge_asset "$native_token_addr" "$l1_rpc_url" "$l1_bridge_addr" assert_success local step1_bridge_tx_hash="$output" @@ -337,10 +341,10 @@ setup() { run process_bridge_claim "step1" "$l1_rpc_network_id" "$step1_bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" assert_success log "Claimed bridge, global_index: $output" - local claimed_global_index="$output" manage_kurtosis_service "stop" "aggkit-001" - # Step 2: Make 5 bridges from L2 to L1 and store their info for forwardLET + + # Step 2: Make 5 bridges from L2 to L1 and store their info log "Step 2: Making 5 bridges from L2 to L1" local l2_to_l1_tx_hashes=() destination_addr="$sender_addr" @@ -356,38 +360,42 @@ setup() { done log "Completed 5 bridges from L2 to L1" - # Step 3: Get bridge info for all 5 bridges BEFORE backwardLET (needed for forwardLET) - log "Step 3: Fetching bridge info for all 5 bridges (for forwardLET reconstruction)" + # Step 3: Get bridge info for all 5 bridges (needed for forwardLET) + log "Step 3: Fetching bridge info for all 5 bridges" local bridge_infos=() for i in {0..4}; do local tx_hash="${l2_to_l1_tx_hashes[$i]}" - run get_bridge "backwardlet, forwardlet feature-bridge-$((i+1))" "$l2_rpc_network_id" "$tx_hash" 50 10 "$aggkit_bridge_url" + run get_bridge "reorg-test-bridge-$((i+1))" "$l2_rpc_network_id" "$tx_hash" 50 10 "$aggkit_bridge_url" assert_success bridge_infos+=("$output") log "Bridge $((i+1)) info: $output" done - # Get the last bridge deposit count + # Get the last bridge deposit count and expected LER local last_bridge_info="${bridge_infos[4]}" local last_deposit_count last_deposit_count=$(echo "$last_bridge_info" | jq -r '.deposit_count') log "Last L2->L1 deposit count: $last_deposit_count" - # Get the current LER (Local Exit Root) from L2 bridge contract BEFORE backwardLET - # This will be the expected LER we need to restore with forwardLET + # Get the current LER from L2 bridge contract BEFORE backwardLET log "Fetching current LER from L2 bridge contract (before backwardLET)" run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$get_root_func_sig" assert_success local expected_ler="$output" log "Expected LER (to restore after forwardLET): $expected_ler" - # Step 4: Perform backwardLET to roll back 2 deposit counts - log "Step 4: Performing backwardLET to roll back 2 deposit counts" + # Get deposit count before backwardLET + run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$deposit_count_func_sig" + assert_success + local deposit_count_after_5_bridges="$output" + log "Deposit count after 5 bridges: $deposit_count_after_5_bridges" - # Calculate the target deposit count for backwardLET (remove 3 deposits) + # Step 4: Perform backwardLET to roll back 3 deposits + log "Step 4: Performing backwardLET to roll back 3 deposit counts" local backward_target_deposit_count=$((last_deposit_count - 2)) log "Rolling back to deposit count: $backward_target_deposit_count" + sleep 10 # Get backward-let data from zkevm-bridge-service log "Fetching backward-let proof data" local backward_let_response @@ -401,13 +409,21 @@ setup() { local backward_rollup_merkle_proof backward_rollup_merkle_proof=$(echo "$backward_let_response" | jq -r '.rollup_merkle_proof | "[" + (join(",")) + "]"') - # Activate emergency state (required for backwardLET) + # Note down block number before backwardLET + local l2_block_before_backward_let + l2_block_before_backward_let=$(cast block-number --rpc-url "$L2_RPC_URL") + l2_blockhash_before_backward_let=$(cast block "$l2_block_before_backward_let" --rpc-url "$L2_RPC_URL" --json | jq -r '.hash') + log "L2 block number before backwardLET: $l2_block_before_backward_let" + log "L2 block hash before backwardLET: $l2_blockhash_before_backward_let" + + sleep 10 + + # Activate emergency state and execute backwardLET log "Activating emergency state on L2 bridge" run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$activate_emergency_state_func_sig" assert_success log "Emergency state activated" - # Execute backwardLET log "Executing backwardLET" run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$backward_let_func_sig" "$backward_target_deposit_count" "$backward_frontier" "$backward_leaf_hash" "$backward_rollup_merkle_proof" assert_success @@ -419,49 +435,219 @@ setup() { assert_success log "Emergency state deactivated" - # Verify the deposit count has been rolled back + # Note down block number after backwardLET + local l2_block_after_backward_let + l2_block_after_backward_let=$(cast block-number --rpc-url "$L2_RPC_URL") + l2_blockhash_after_backward_let=$(cast block "$l2_block_after_backward_let" --rpc-url "$L2_RPC_URL" --json | jq -r '.hash') + log "L2 block number after backwardLET: $l2_block_after_backward_let" + log "L2 block hash after backwardLET: $l2_blockhash_after_backward_let" + sleep 10 + + # Step 5: Do a reorg BEFORE backward let - revert to block before backwardLET + log "Step 5: Performing L2 reorg to revert state before backwardLET" + log "Target block for reorg: $l2_block_before_backward_let" + + # Stop the L2 consensus client before reorg + manage_kurtosis_service "stop" "op-batcher-001" + manage_kurtosis_service "stop" "op-cl-1-op-node-op-geth-001" + manage_kurtosis_service "stop" "op-cl-2-op-node-op-geth-001" + sleep 10 + + # Perform the reorg using debug_setHead (only affects execution client) + local target_hex + target_hex=$(printf "0x%x" "$l2_block_before_backward_let") + log "Executing debug_setHead to block $target_hex (execution client only)" + run cast rpc debug_setHead "$target_hex" --rpc-url "$L2_RPC_URL" + assert_success + log "debug_setHead executed successfully on execution client" + + manage_kurtosis_service "stop" "op-el-1-op-geth-op-node-001" + manage_kurtosis_service "stop" "op-el-2-op-geth-op-node-001" + manage_kurtosis_service "start" "op-el-1-op-geth-op-node-001" + manage_kurtosis_service "start" "op-el-2-op-geth-op-node-001" + + # Restart the L2 consensus client - it should resync from the execution client's rolled-back state + # The op-node will query the execution client's current head and resync from there + manage_kurtosis_service "start" "op-cl-1-op-node-op-geth-001" + manage_kurtosis_service "start" "op-cl-2-op-node-op-geth-001" + manage_kurtosis_service "start" "op-batcher-001" + sleep 10 + + L2_RPC_URL=$(_resolve_url_or_use_env "TEST_L2_RPC_URL" \ + "op-el-1-op-geth-op-node-001" "rpc" "cdk-erigon-rpc-001" "rpc" \ + "Failed to resolve L2 RPC URL" true) + + # Step 6: Check the state of L2 - deposit count should be same as after making 5 bridges + log "Step 6: Checking L2 state after reorg" run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$deposit_count_func_sig" assert_success - local current_deposit_count="$output" - log "Current deposit count after backwardLET: $current_deposit_count" + local deposit_count_after_reorg="$output" + log "Deposit count after reorg: $deposit_count_after_reorg" + assert_equal "$deposit_count_after_reorg" "$deposit_count_after_5_bridges" + log "Deposit count matches expected value after reorg" - # Bridge from L1 to L2 and claim it - log "Bridging from L1 to L2" + # Step 7: Check the state of bridge service - it should have the 5 bridges + log "Step 7: Checking bridge service state" + for i in {0..4}; do + local tx_hash="${l2_to_l1_tx_hashes[$i]}" + run get_bridge "reorg-verify-bridge-$((i+1))" "$l2_rpc_network_id" "$tx_hash" 50 10 "$aggkit_bridge_url" + assert_success + log "Bridge $((i+1)) still exists in bridge service" + done + log "All 5 bridges are present in bridge service" + + # Step 8: Do a txn from L1 to L2 to see if cert settles + log "Step 8: Making bridge from L1 to L2 to verify certificate settlement after reorg" destination_addr="$receiver" destination_net="$l2_rpc_network_id" amount=$(cast --to-unit 0.1ether wei) run bridge_asset "$native_token_addr" "$l1_rpc_url" "$l1_bridge_addr" assert_success - local bridge_tx_hash="$output" - log "Bridge tx hash: $bridge_tx_hash" + local final_bridge_tx_hash="$output" + log "Final bridge tx hash: $final_bridge_tx_hash" + manage_kurtosis_service "start" "aggkit-001" - aggkit_rpc_url=$(kurtosis port print "$ENCLAVE_NAME" aggkit-001 rpc) - log "Aggkit RPC URL: $aggkit_rpc_url" + aggkit_rpc_url=$(_resolve_url_or_use_env "TEST_AGGKIT_RPC_URL" \ + "aggkit-001" "rpc" "cdk-node-001" "rpc" \ + "Failed to resolve aggkit rpc url" true) + + # Claim the bridge on L2 + log "Claiming final bridge on L2" + run process_bridge_claim "" "$l1_rpc_network_id" "$final_bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" + assert_success + local final_global_index="$output" + log "Claimed final bridge, global_index: $final_global_index" + + # Wait for certificate settlement + log "Waiting for certificate settlement containing global index: $final_global_index" + wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$final_global_index" + log "Certificate settled for global index: $final_global_index" + + log "backwardLET with reorg scenarios test completed successfully!" + + manage_kurtosis_service "stop" "zkevm-bridge-service-001" + manage_kurtosis_service "start" "bridge-spammer-001" +} + +@test "Test forwardLET with reorg scenarios" { + manage_kurtosis_service "start" "zkevm-bridge-service-001" + manage_kurtosis_service "stop" "bridge-spammer-001" + + zkevm_bridge_url=$(_resolve_url_or_use_env "TEST_ZKEVM_BRIDGE_URL" \ + "zkevm-bridge-service-001" "rpc" \ + "Zk EVM Bridge service is not running" false) + + # Step 1: Make 1 bridge from L1 to L2 and claim it + log "Step 1: Making 1 bridge from L1 to L2 and claiming it" + destination_addr="$receiver" + destination_net="$l2_rpc_network_id" + amount=$(cast --to-unit 0.5ether wei) + + log "Bridge L1 -> L2 (0.5 ETH)" + run bridge_asset "$native_token_addr" "$l1_rpc_url" "$l1_bridge_addr" + assert_success + local step1_bridge_tx_hash="$output" + log "Bridge tx hash: $step1_bridge_tx_hash" # Claim the bridge on L2 log "Claiming bridge on L2" - run process_bridge_claim "" "$l1_rpc_network_id" "$bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" + run process_bridge_claim "step1" "$l1_rpc_network_id" "$step1_bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" + assert_success + log "Claimed bridge, global_index: $output" + + manage_kurtosis_service "stop" "aggkit-001" + + # Step 2: Make 5 bridges from L2 to L1 and store their info + log "Step 2: Making 5 bridges from L2 to L1" + local l2_to_l1_tx_hashes=() + destination_addr="$sender_addr" + destination_net="$l1_rpc_network_id" + amount=$(cast --to-unit 0.01ether wei) + + for i in {1..5}; do + log "Bridge $i/5: L2 -> L1" + run bridge_asset "$native_token_addr" "$L2_RPC_URL" "$l2_bridge_addr" + assert_success + l2_to_l1_tx_hashes+=("$output") + log "Bridge $i/5 tx hash: $output" + done + log "Completed 5 bridges from L2 to L1" + + # Step 3: Get bridge info for all 5 bridges (needed for forwardLET) + log "Step 3: Fetching bridge info for all 5 bridges" + local bridge_infos=() + for i in {0..4}; do + local tx_hash="${l2_to_l1_tx_hashes[$i]}" + run get_bridge "reorg-test-bridge-$((i+1))" "$l2_rpc_network_id" "$tx_hash" 50 10 "$aggkit_bridge_url" + assert_success + bridge_infos+=("$output") + log "Bridge $((i+1)) info: $output" + done + + # Get the last bridge deposit count and expected LER + local last_bridge_info="${bridge_infos[4]}" + local last_deposit_count + last_deposit_count=$(echo "$last_bridge_info" | jq -r '.deposit_count') + log "Last L2->L1 deposit count: $last_deposit_count" + + # Get the current LER from L2 bridge contract BEFORE backwardLET + log "Fetching current LER from L2 bridge contract (before backwardLET)" + run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$get_root_func_sig" + assert_success + local expected_ler="$output" + log "Expected LER (to restore after forwardLET): $expected_ler" + + # Get deposit count before backwardLET + run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$deposit_count_func_sig" assert_success - local claimed_global_index="$output" - log "Claimed bridge, global_index: $claimed_global_index" + local deposit_count_after_5_bridges="$output" + log "Deposit count after 5 bridges: $deposit_count_after_5_bridges" + # Step 4: Perform backwardLET to roll back 3 deposits + log "Step 4: Performing backwardLET to roll back 3 deposit counts" + local backward_target_deposit_count=$((last_deposit_count - 2)) + log "Rolling back to deposit count: $backward_target_deposit_count" sleep 10 + # Get backward-let data from zkevm-bridge-service + log "Fetching backward-let proof data" + local backward_let_response + backward_let_response=$(curl -s "$zkevm_bridge_url/backward-let?net_id=$l2_rpc_network_id&deposit_cnt=$backward_target_deposit_count") + log "backward-let response: $backward_let_response" - # Wait for certificate settlement - log "Waiting for certificate settlement containing global index: $claimed_global_index" - wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$claimed_global_index" - log "โœ… Certificate settled for global index: $claimed_global_index" + local backward_leaf_hash + backward_leaf_hash=$(echo "$backward_let_response" | jq -r '.leaf_hash') + local backward_frontier + backward_frontier=$(echo "$backward_let_response" | jq -r '.frontier | "[" + (join(",")) + "]"') + local backward_rollup_merkle_proof + backward_rollup_merkle_proof=$(echo "$backward_let_response" | jq -r '.rollup_merkle_proof | "[" + (join(",")) + "]"') - # Step 5: Perform forwardLET to restore the deposit count - log "Step 5: Performing forwardLET to restore deposit count" - log "Using expected LER captured before backwardLET: $expected_ler" + # Step 5: Do a backwardLET of 3 bridges + log "Step 5: Performing backwardLET to roll back 3 deposits" - # Construct LeafData array from the rolled-back bridges (bridges 2 and 3, indices 1 and 2) - # LeafData: (leafType, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata) - log "Constructing LeafData array for forwardLET" + # Activate emergency state and execute backwardLET + log "Activating emergency state on L2 bridge" + run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$activate_emergency_state_func_sig" + assert_success + log "Emergency state activated" + + log "Executing backwardLET" + run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$backward_let_func_sig" "$backward_target_deposit_count" "$backward_frontier" "$backward_leaf_hash" "$backward_rollup_merkle_proof" + assert_success + log "backwardLET executed successfully" + + # Deactivate emergency state + log "Deactivating emergency state on L2 bridge" + run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$deactivate_emergency_state_func_sig" + assert_success + log "Emergency state deactivated" + + # Step 6: Do a forwardLET of 3 bridges + log "Step 6: Performing forwardLET to restore 3 deposits" + log "Using expected LER: $expected_ler" - # Build leaves array - we need to add back bridges at indices 1 and 2 (the last 2 that were rolled back) + # Construct LeafData array from the rolled-back bridges (indices 2, 3, 4 - the last 3 that were rolled back) + log "Constructing LeafData array for forwardLET" local leaves_array="[" for i in 2 3 4; do local bridge_info="${bridge_infos[$i]}" @@ -492,7 +678,6 @@ setup() { log "Leaf $i: type=$leaf_type, originNet=$origin_network, originAddr=$origin_address, destNet=$dest_network, destAddr=$dest_address, amount=$bridge_amount" - # Build the tuple for this leaf local leaf_tuple="($leaf_type,$origin_network,$origin_address,$dest_network,$dest_address,$bridge_amount,$metadata)" if [[ $i -eq 2 ]]; then @@ -504,13 +689,18 @@ setup() { leaves_array+="]" log "Leaves array: $leaves_array" + # Note down block number before forwardLET + local l2_block_before_forward_let + l2_block_before_forward_let=$(cast block-number --rpc-url "$L2_RPC_URL") + log "L2 block number before forwardLET: $l2_block_before_forward_let" + # Activate emergency state (required for forwardLET) log "Activating emergency state on L2 bridge" run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$activate_emergency_state_func_sig" assert_success log "Emergency state activated" - # Execute forwardLET with the constructed leaves and expected LER + # Execute forwardLET log "Executing forwardLET" run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$forward_let_func_sig" "$leaves_array" "$expected_ler" assert_success @@ -521,44 +711,92 @@ setup() { run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$deactivate_emergency_state_func_sig" assert_success log "Emergency state deactivated" - manage_kurtosis_service "start" "bridge-spammer-001" - # Verify the deposit count has been restored + # Note down block number after forwardLET + local l2_block_after_forward_let + l2_block_after_forward_let=$(cast block-number --rpc-url "$L2_RPC_URL") + log "L2 block number after forwardLET: $l2_block_after_forward_let" + + # Step 11: Check L2 contract and bridge service - new bridges should be added + log "Step 11: Checking L2 state after forwardLET" run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$deposit_count_func_sig" assert_success - local restored_deposit_count="$output" - log "Current deposit count after forwardLET: $restored_deposit_count" + local deposit_count_after_forward="$output" + log "Deposit count after forwardLET: $deposit_count_after_forward" + assert_equal "$deposit_count_after_forward" "$((last_deposit_count + 1))" + log "Deposit count restored correctly after forwardLET" - # Verify deposit count was restored correctly - if [[ "$restored_deposit_count" != "$last_deposit_count" ]]; then - log "Warning: Deposit count mismatch. Expected: $last_deposit_count, Got: $restored_deposit_count" - fi + # Step 12: Do a reorg to revert the state (revert forwardLET) + log "Step 12: Performing L2 reorg to revert forwardLET state" + log "Target block for reorg: $l2_block_before_forward_let" + + # Stop the L2 consensus client before reorg + manage_kurtosis_service "stop" "op-batcher-001" + manage_kurtosis_service "stop" "op-cl-1-op-node-op-geth-001" + manage_kurtosis_service "stop" "op-cl-2-op-node-op-geth-001" + sleep 10 + + # Perform the reorg using debug_setHead + target_hex=$(printf "0x%x" "$l2_block_before_forward_let") + log "Executing debug_setHead to block $target_hex" + run cast rpc debug_setHead "$target_hex" --rpc-url "$L2_RPC_URL" + assert_success + log "debug_setHead executed successfully" + + manage_kurtosis_service "stop" "op-el-1-op-geth-op-node-001" + manage_kurtosis_service "stop" "op-el-2-op-geth-op-node-001" + manage_kurtosis_service "start" "op-el-1-op-geth-op-node-001" + manage_kurtosis_service "start" "op-el-2-op-geth-op-node-001" + + # Restart the L2 consensus client - it should resync from the execution client's rolled-back state + # The op-node will query the execution client's current head and resync from there + manage_kurtosis_service "start" "op-cl-1-op-node-op-geth-001" + manage_kurtosis_service "start" "op-cl-2-op-node-op-geth-001" + manage_kurtosis_service "start" "op-batcher-001" + sleep 10 + + L2_RPC_URL=$(_resolve_url_or_use_env "TEST_L2_RPC_URL" \ + "op-el-1-op-geth-op-node-001" "rpc" "cdk-erigon-rpc-001" "rpc" \ + "Failed to resolve L2 RPC URL" true) - # Step 6: Do a new bridge from L2 to L1 and verify certificate settles - log "Step 6: Making new bridge from L1 to L2 after forwardLET" - # Bridge from L1 to L2 and claim it - log "Bridging from L1 to L2" + # Step 13: Check L2 state - bridges added by forwardLET should not be present + log "Step 13: Checking L2 state after reorg - forwardLET bridges should be reverted" + run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$deposit_count_func_sig" + assert_success + local deposit_count_after_forward_reorg="$output" + log "Deposit count after reorg (should be back to after backwardLET): $deposit_count_after_forward_reorg" + assert_equal "$deposit_count_after_forward_reorg" "$backward_target_deposit_count" + log "Deposit count correctly reverted after reorg" + + # Step 14: Do a txn from L1 to L2 to see if cert settles + log "Step 14: Making bridge from L1 to L2 to verify certificate settlement after reorg" destination_addr="$receiver" destination_net="$l2_rpc_network_id" amount=$(cast --to-unit 0.1ether wei) run bridge_asset "$native_token_addr" "$l1_rpc_url" "$l1_bridge_addr" assert_success - local bridge_tx_hash="$output" - log "Bridge tx hash: $bridge_tx_hash" + local final_bridge_tx_hash="$output" + log "Final bridge tx hash: $final_bridge_tx_hash" + + manage_kurtosis_service "start" "aggkit-001" + aggkit_rpc_url=$(_resolve_url_or_use_env "TEST_AGGKIT_RPC_URL" \ + "aggkit-001" "rpc" "cdk-node-001" "rpc" \ + "Failed to resolve aggkit rpc url" true) # Claim the bridge on L2 - log "Claiming bridge on L2" - run process_bridge_claim "" "$l1_rpc_network_id" "$bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" + log "Claiming final bridge on L2" + run process_bridge_claim "" "$l1_rpc_network_id" "$final_bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" assert_success - local claimed_global_index="$output" - log "Claimed bridge, global_index: $claimed_global_index" + local final_global_index="$output" + log "Claimed final bridge, global_index: $final_global_index" # Wait for certificate settlement - log "Waiting for certificate settlement containing global index: $claimed_global_index" - wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$claimed_global_index" - log "โœ… Certificate settled for global index: $claimed_global_index" + log "Waiting for certificate settlement containing global index: $final_global_index" + wait_to_settle_certificate_containing_global_index "$aggkit_rpc_url" "$final_global_index" + log "Certificate settled for global index: $final_global_index" - log "backwardlet, forwardlet feature test completed successfully!" + log "forwardLET with reorg scenarios test completed successfully!" manage_kurtosis_service "stop" "zkevm-bridge-service-001" + manage_kurtosis_service "start" "bridge-spammer-001" } From 45891d12f326003b171e868951d96d50df8810f5 Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Sat, 10 Jan 2026 11:22:23 +0530 Subject: [PATCH 10/20] update inventory --- TESTSINVENTORY.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/TESTSINVENTORY.md b/TESTSINVENTORY.md index ccfc36803..27f581e34 100644 --- a/TESTSINVENTORY.md +++ b/TESTSINVENTORY.md @@ -288,10 +288,11 @@ Table of tests currently implemented or being implemented in the E2E repository. | Test Aggoracle committee | [Link](./tests/aggkit/bridge-e2e-aggoracle-committee.bats#L10) | | | Test L2 to L2 bridge | [Link](./tests/aggkit/bridge-e2e-2-chains.bats#L15) | | | Test Sovereign Chain Bridge Events | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L57) | | -| Test backwardlet, forwardlet feature | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L319) | | +| Test backwardLET with reorg scenarios | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L319) | | | Test block gas limit increase to 60M | [Link](./tests/fusaka/eip7935.bats#L19) | | | Test execute multiple claimMessages via testClaim with internal reentrancy and bridgeAsset call | [Link](./tests/aggkit/claim-reetrancy.bats#L472) | | -| Test inject invalid GER on L2 (bridges are valid) | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L221) | | +| Test forwardLET with reorg scenarios | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L532) | | +| Test inject invalid GER on L2 - B1 case | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L221) | | | Test invalid GER injection case A (FEP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L825) | | | Test invalid GER injection case A (PP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L716) | | | Test invalid GER injection case B2 (FEP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L396) | | From ae104ce6c6fcfa04aea9b0a67fbe576518c7c7b1 Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Sat, 10 Jan 2026 11:27:59 +0530 Subject: [PATCH 11/20] fix comment --- core/helpers/agglayer-cdk-common-setup.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/helpers/agglayer-cdk-common-setup.bash b/core/helpers/agglayer-cdk-common-setup.bash index 31b6d7fd2..449924087 100644 --- a/core/helpers/agglayer-cdk-common-setup.bash +++ b/core/helpers/agglayer-cdk-common-setup.bash @@ -601,7 +601,7 @@ log_prefix_test(){ echo "=====================================================================" >&3 } -# Helper function to manage bridge spammer service +# Helper function to manage kurtosis service manage_kurtosis_service() { local action="$1" # start or stop local service="$2" From 07746b751489a9ea7fa3975593bdc6f464a662d3 Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Sat, 10 Jan 2026 11:40:53 +0530 Subject: [PATCH 12/20] Update tests/aggkit/bridge-sovereign-chain-e2e.bats Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/aggkit/bridge-sovereign-chain-e2e.bats | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/aggkit/bridge-sovereign-chain-e2e.bats b/tests/aggkit/bridge-sovereign-chain-e2e.bats index 7c9798e75..df5ed6158 100644 --- a/tests/aggkit/bridge-sovereign-chain-e2e.bats +++ b/tests/aggkit/bridge-sovereign-chain-e2e.bats @@ -443,7 +443,7 @@ setup() { log "L2 block hash after backwardLET: $l2_blockhash_after_backward_let" sleep 10 - # Step 5: Do a reorg BEFORE backward let - revert to block before backwardLET + # Step 5: Do a reorg to undo backwardLET - revert to block before backwardLET log "Step 5: Performing L2 reorg to revert state before backwardLET" log "Target block for reorg: $l2_block_before_backward_let" From 1e451ae5f8325c6e7b1068e26918e0be376254da Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Tue, 13 Jan 2026 10:03:10 +0530 Subject: [PATCH 13/20] fix reviews --- tests/aggkit/bridge-sovereign-chain-e2e.bats | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/aggkit/bridge-sovereign-chain-e2e.bats b/tests/aggkit/bridge-sovereign-chain-e2e.bats index 7c9798e75..7f2e6b4b8 100644 --- a/tests/aggkit/bridge-sovereign-chain-e2e.bats +++ b/tests/aggkit/bridge-sovereign-chain-e2e.bats @@ -23,7 +23,7 @@ setup() { readonly empty_proof=$(jq -nc '[range(32) | "0x0000000000000000000000000000000000000000000000000000000000000000"]') - # backwardLET and forwardLET function signatures + # backwardLET takes deposit count, frontier, leaf hash, and rollup merkle proof readonly backward_let_func_sig="function backwardLET(uint256,bytes32[32],bytes32,bytes32[32])" # forwardLET takes LeafData[] (leafType, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata) and expectedLER readonly forward_let_func_sig="function forwardLET((uint8,uint32,address,uint32,address,uint256,bytes)[],bytes32)" @@ -342,6 +342,7 @@ setup() { assert_success log "Claimed bridge, global_index: $output" + # Stop aggkit to make sure no cert goes, otherwise we cant reorg to a block before the cert was settled manage_kurtosis_service "stop" "aggkit-001" # Step 2: Make 5 bridges from L2 to L1 and store their info @@ -717,8 +718,8 @@ setup() { l2_block_after_forward_let=$(cast block-number --rpc-url "$L2_RPC_URL") log "L2 block number after forwardLET: $l2_block_after_forward_let" - # Step 11: Check L2 contract and bridge service - new bridges should be added - log "Step 11: Checking L2 state after forwardLET" + # Step 7: Check L2 contract and bridge service - new bridges should be added + log "Step 7: Checking L2 state after forwardLET" run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$deposit_count_func_sig" assert_success local deposit_count_after_forward="$output" @@ -726,8 +727,8 @@ setup() { assert_equal "$deposit_count_after_forward" "$((last_deposit_count + 1))" log "Deposit count restored correctly after forwardLET" - # Step 12: Do a reorg to revert the state (revert forwardLET) - log "Step 12: Performing L2 reorg to revert forwardLET state" + # Step 8: Do a reorg to revert the state (revert forwardLET) + log "Step 8: Performing L2 reorg to revert forwardLET state" log "Target block for reorg: $l2_block_before_forward_let" # Stop the L2 consensus client before reorg @@ -759,8 +760,8 @@ setup() { "op-el-1-op-geth-op-node-001" "rpc" "cdk-erigon-rpc-001" "rpc" \ "Failed to resolve L2 RPC URL" true) - # Step 13: Check L2 state - bridges added by forwardLET should not be present - log "Step 13: Checking L2 state after reorg - forwardLET bridges should be reverted" + # Step 9: Check L2 state - bridges added by forwardLET should not be present + log "Step 9: Checking L2 state after reorg - forwardLET bridges should be reverted" run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$deposit_count_func_sig" assert_success local deposit_count_after_forward_reorg="$output" @@ -768,8 +769,8 @@ setup() { assert_equal "$deposit_count_after_forward_reorg" "$backward_target_deposit_count" log "Deposit count correctly reverted after reorg" - # Step 14: Do a txn from L1 to L2 to see if cert settles - log "Step 14: Making bridge from L1 to L2 to verify certificate settlement after reorg" + # Step 10: Do a txn from L1 to L2 to see if cert settles + log "Step 10: Making bridge from L1 to L2 to verify certificate settlement after reorg" destination_addr="$receiver" destination_net="$l2_rpc_network_id" amount=$(cast --to-unit 0.1ether wei) From 4c599f56f27a0407d749bbbfbc4c6eda214c29e3 Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Tue, 13 Jan 2026 10:04:06 +0530 Subject: [PATCH 14/20] update inventory --- TESTSINVENTORY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TESTSINVENTORY.md b/TESTSINVENTORY.md index 27f581e34..8a3d2cba4 100644 --- a/TESTSINVENTORY.md +++ b/TESTSINVENTORY.md @@ -291,7 +291,7 @@ Table of tests currently implemented or being implemented in the E2E repository. | Test backwardLET with reorg scenarios | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L319) | | | Test block gas limit increase to 60M | [Link](./tests/fusaka/eip7935.bats#L19) | | | Test execute multiple claimMessages via testClaim with internal reentrancy and bridgeAsset call | [Link](./tests/aggkit/claim-reetrancy.bats#L472) | | -| Test forwardLET with reorg scenarios | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L532) | | +| Test forwardLET with reorg scenarios | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L533) | | | Test inject invalid GER on L2 - B1 case | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L221) | | | Test invalid GER injection case A (FEP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L825) | | | Test invalid GER injection case A (PP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L716) | | From 4f58af0eb732f7b405fa7037818d2daf90252c3b Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Tue, 13 Jan 2026 14:36:11 +0530 Subject: [PATCH 15/20] fix reviews --- core/helpers/scripts/kurtosis-helpers.bash | 26 ------------------- .../bridge-e2e-aggoracle-committee.bats | 8 +++--- tests/aggkit/bridge-sovereign-chain-e2e.bats | 3 --- 3 files changed, 4 insertions(+), 33 deletions(-) diff --git a/core/helpers/scripts/kurtosis-helpers.bash b/core/helpers/scripts/kurtosis-helpers.bash index a6171161c..a86ee53e1 100644 --- a/core/helpers/scripts/kurtosis-helpers.bash +++ b/core/helpers/scripts/kurtosis-helpers.bash @@ -20,29 +20,3 @@ function kurtosis_filer_exec_method() { # So if kurtosis version is <1.7.0 need tail -n +2, if not just same output dpkg --compare-versions "$_kurtosis_version" "ge" "1.7.0" && cat || tail -n +2 } - -function update_kurtosis_service_state() { - local service="$1" - local action="$2" # start or stop - - if [[ "$action" == "stop" ]]; then - if docker ps | grep "$service"; then - echo "Stopping $service..." >&3 - kurtosis service stop "$ENCLAVE_NAME" "$service" || { - echo "Error: Failed to stop $service" >&3 - return 1 - } - echo "$service stopped." >&3 - else - echo "Error: $service does not exist in enclave $ENCLAVE_NAME" >&3 - return 1 - fi - elif [[ "$action" == "start" ]]; then - echo "Starting $service..." >&3 - kurtosis service start "$ENCLAVE_NAME" "$service" || { - echo "Error: Failed to start $service" >&3 - return 1 - } - echo "$service started." >&3 - fi -} diff --git a/tests/aggkit/bridge-e2e-aggoracle-committee.bats b/tests/aggkit/bridge-e2e-aggoracle-committee.bats index e0c9e5d17..37bb0ad82 100644 --- a/tests/aggkit/bridge-e2e-aggoracle-committee.bats +++ b/tests/aggkit/bridge-e2e-aggoracle-committee.bats @@ -20,8 +20,8 @@ setup() { assert_success echo "Step 2: Stopping aggkit-001-aggoracle-committee-001, aggkit-001-aggoracle-committee-002 service..." >&3 - update_kurtosis_service_state "aggkit-001-aggoracle-committee-001" "stop" - update_kurtosis_service_state "aggkit-001-aggoracle-committee-002" "stop" + manage_kurtosis_service "stop" "aggkit-001-aggoracle-committee-001" + manage_kurtosis_service "stop" "aggkit-001-aggoracle-committee-002" echo "Step 3: Bridging asset from L1 to L2 (without claiming)..." >&3 destination_addr=$sender_addr @@ -43,8 +43,8 @@ setup() { assert_equal "$l2_ger_status" "0" echo "Step 5: Starting aggkit-001-aggoracle-committee-001, aggkit-001-aggoracle-committee-002 service..." >&3 - update_kurtosis_service_state "aggkit-001-aggoracle-committee-001" "start" - update_kurtosis_service_state "aggkit-001-aggoracle-committee-002" "start" + manage_kurtosis_service "start" "aggkit-001-aggoracle-committee-001" + manage_kurtosis_service "start" "aggkit-001-aggoracle-committee-002" echo "Step 6: Attempting to claim the second bridge transaction..., should succeed" >&3 run process_bridge_claim "aggoracle_committee: $LINENO" "$l1_rpc_network_id" "$bridge_tx_hash" "$l2_rpc_network_id" "$l2_bridge_addr" "$aggkit_bridge_url" "$aggkit_bridge_url" "$L2_RPC_URL" "$sender_addr" diff --git a/tests/aggkit/bridge-sovereign-chain-e2e.bats b/tests/aggkit/bridge-sovereign-chain-e2e.bats index 42874142a..74eda1a3d 100644 --- a/tests/aggkit/bridge-sovereign-chain-e2e.bats +++ b/tests/aggkit/bridge-sovereign-chain-e2e.bats @@ -417,8 +417,6 @@ setup() { log "L2 block number before backwardLET: $l2_block_before_backward_let" log "L2 block hash before backwardLET: $l2_blockhash_before_backward_let" - sleep 10 - # Activate emergency state and execute backwardLET log "Activating emergency state on L2 bridge" run cast send --legacy --private-key "$l2_sovereign_admin_private_key" --rpc-url "$L2_RPC_URL" "$l2_bridge_addr" "$activate_emergency_state_func_sig" @@ -609,7 +607,6 @@ setup() { local backward_target_deposit_count=$((last_deposit_count - 2)) log "Rolling back to deposit count: $backward_target_deposit_count" - sleep 10 # Get backward-let data from zkevm-bridge-service log "Fetching backward-let proof data" local backward_let_response From 7bc5611558c045484326665933d7d8506ace8c8a Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Tue, 13 Jan 2026 15:08:06 +0530 Subject: [PATCH 16/20] update inventory --- TESTSINVENTORY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TESTSINVENTORY.md b/TESTSINVENTORY.md index 8a3d2cba4..4a9968389 100644 --- a/TESTSINVENTORY.md +++ b/TESTSINVENTORY.md @@ -291,7 +291,7 @@ Table of tests currently implemented or being implemented in the E2E repository. | Test backwardLET with reorg scenarios | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L319) | | | Test block gas limit increase to 60M | [Link](./tests/fusaka/eip7935.bats#L19) | | | Test execute multiple claimMessages via testClaim with internal reentrancy and bridgeAsset call | [Link](./tests/aggkit/claim-reetrancy.bats#L472) | | -| Test forwardLET with reorg scenarios | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L533) | | +| Test forwardLET with reorg scenarios | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L531) | | | Test inject invalid GER on L2 - B1 case | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L221) | | | Test invalid GER injection case A (FEP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L825) | | | Test invalid GER injection case A (PP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L716) | | From 08ab6159d0e857bc64c5cdbb3824862dca74456c Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Thu, 15 Jan 2026 13:14:10 +0530 Subject: [PATCH 17/20] update test --- tests/aggkit/bridge-sovereign-chain-e2e.bats | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/aggkit/bridge-sovereign-chain-e2e.bats b/tests/aggkit/bridge-sovereign-chain-e2e.bats index 74eda1a3d..90e192eca 100644 --- a/tests/aggkit/bridge-sovereign-chain-e2e.bats +++ b/tests/aggkit/bridge-sovereign-chain-e2e.bats @@ -460,10 +460,12 @@ setup() { assert_success log "debug_setHead executed successfully on execution client" + manage_kurtosis_service "stop" "zkevm-bridge-service-001" manage_kurtosis_service "stop" "op-el-1-op-geth-op-node-001" manage_kurtosis_service "stop" "op-el-2-op-geth-op-node-001" manage_kurtosis_service "start" "op-el-1-op-geth-op-node-001" manage_kurtosis_service "start" "op-el-2-op-geth-op-node-001" + manage_kurtosis_service "start" "zkevm-bridge-service-001" # Restart the L2 consensus client - it should resync from the execution client's rolled-back state # The op-node will query the execution client's current head and resync from there From ce7f75e8d67c774fd8afdd9effae38f90ee41024 Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Thu, 15 Jan 2026 13:14:32 +0530 Subject: [PATCH 18/20] update inventory --- TESTSINVENTORY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TESTSINVENTORY.md b/TESTSINVENTORY.md index 4a9968389..8a3d2cba4 100644 --- a/TESTSINVENTORY.md +++ b/TESTSINVENTORY.md @@ -291,7 +291,7 @@ Table of tests currently implemented or being implemented in the E2E repository. | Test backwardLET with reorg scenarios | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L319) | | | Test block gas limit increase to 60M | [Link](./tests/fusaka/eip7935.bats#L19) | | | Test execute multiple claimMessages via testClaim with internal reentrancy and bridgeAsset call | [Link](./tests/aggkit/claim-reetrancy.bats#L472) | | -| Test forwardLET with reorg scenarios | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L531) | | +| Test forwardLET with reorg scenarios | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L533) | | | Test inject invalid GER on L2 - B1 case | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L221) | | | Test invalid GER injection case A (FEP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L825) | | | Test invalid GER injection case A (PP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L716) | | From e6a82374d52253099b92db12dcb86c6d92f4cfe1 Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Thu, 15 Jan 2026 14:07:38 +0530 Subject: [PATCH 19/20] update test --- tests/aggkit/bridge-sovereign-chain-e2e.bats | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/tests/aggkit/bridge-sovereign-chain-e2e.bats b/tests/aggkit/bridge-sovereign-chain-e2e.bats index 90e192eca..6786a3a46 100644 --- a/tests/aggkit/bridge-sovereign-chain-e2e.bats +++ b/tests/aggkit/bridge-sovereign-chain-e2e.bats @@ -460,13 +460,6 @@ setup() { assert_success log "debug_setHead executed successfully on execution client" - manage_kurtosis_service "stop" "zkevm-bridge-service-001" - manage_kurtosis_service "stop" "op-el-1-op-geth-op-node-001" - manage_kurtosis_service "stop" "op-el-2-op-geth-op-node-001" - manage_kurtosis_service "start" "op-el-1-op-geth-op-node-001" - manage_kurtosis_service "start" "op-el-2-op-geth-op-node-001" - manage_kurtosis_service "start" "zkevm-bridge-service-001" - # Restart the L2 consensus client - it should resync from the execution client's rolled-back state # The op-node will query the execution client's current head and resync from there manage_kurtosis_service "start" "op-cl-1-op-node-op-geth-001" @@ -743,11 +736,6 @@ setup() { assert_success log "debug_setHead executed successfully" - manage_kurtosis_service "stop" "op-el-1-op-geth-op-node-001" - manage_kurtosis_service "stop" "op-el-2-op-geth-op-node-001" - manage_kurtosis_service "start" "op-el-1-op-geth-op-node-001" - manage_kurtosis_service "start" "op-el-2-op-geth-op-node-001" - # Restart the L2 consensus client - it should resync from the execution client's rolled-back state # The op-node will query the execution client's current head and resync from there manage_kurtosis_service "start" "op-cl-1-op-node-op-geth-001" From 55457421ba75b421cc611022db81bbeefd3e1f60 Mon Sep 17 00:00:00 2001 From: Arpit Temani Date: Thu, 15 Jan 2026 18:25:23 +0530 Subject: [PATCH 20/20] update tests --- TESTSINVENTORY.md | 2 +- tests/aggkit/bridge-sovereign-chain-e2e.bats | 28 -------------------- 2 files changed, 1 insertion(+), 29 deletions(-) diff --git a/TESTSINVENTORY.md b/TESTSINVENTORY.md index 8a3d2cba4..5cfdae1e5 100644 --- a/TESTSINVENTORY.md +++ b/TESTSINVENTORY.md @@ -291,7 +291,7 @@ Table of tests currently implemented or being implemented in the E2E repository. | Test backwardLET with reorg scenarios | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L319) | | | Test block gas limit increase to 60M | [Link](./tests/fusaka/eip7935.bats#L19) | | | Test execute multiple claimMessages via testClaim with internal reentrancy and bridgeAsset call | [Link](./tests/aggkit/claim-reetrancy.bats#L472) | | -| Test forwardLET with reorg scenarios | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L533) | | +| Test forwardLET with reorg scenarios | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L507) | | | Test inject invalid GER on L2 - B1 case | [Link](./tests/aggkit/bridge-sovereign-chain-e2e.bats#L221) | | | Test invalid GER injection case A (FEP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L825) | | | Test invalid GER injection case A (PP mode) | [Link](./tests/aggkit/latest-n-injected-ger.bats#L716) | | diff --git a/tests/aggkit/bridge-sovereign-chain-e2e.bats b/tests/aggkit/bridge-sovereign-chain-e2e.bats index 6786a3a46..450cd591c 100644 --- a/tests/aggkit/bridge-sovereign-chain-e2e.bats +++ b/tests/aggkit/bridge-sovereign-chain-e2e.bats @@ -471,25 +471,6 @@ setup() { "op-el-1-op-geth-op-node-001" "rpc" "cdk-erigon-rpc-001" "rpc" \ "Failed to resolve L2 RPC URL" true) - # Step 6: Check the state of L2 - deposit count should be same as after making 5 bridges - log "Step 6: Checking L2 state after reorg" - run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$deposit_count_func_sig" - assert_success - local deposit_count_after_reorg="$output" - log "Deposit count after reorg: $deposit_count_after_reorg" - assert_equal "$deposit_count_after_reorg" "$deposit_count_after_5_bridges" - log "Deposit count matches expected value after reorg" - - # Step 7: Check the state of bridge service - it should have the 5 bridges - log "Step 7: Checking bridge service state" - for i in {0..4}; do - local tx_hash="${l2_to_l1_tx_hashes[$i]}" - run get_bridge "reorg-verify-bridge-$((i+1))" "$l2_rpc_network_id" "$tx_hash" 50 10 "$aggkit_bridge_url" - assert_success - log "Bridge $((i+1)) still exists in bridge service" - done - log "All 5 bridges are present in bridge service" - # Step 8: Do a txn from L1 to L2 to see if cert settles log "Step 8: Making bridge from L1 to L2 to verify certificate settlement after reorg" destination_addr="$receiver" @@ -747,15 +728,6 @@ setup() { "op-el-1-op-geth-op-node-001" "rpc" "cdk-erigon-rpc-001" "rpc" \ "Failed to resolve L2 RPC URL" true) - # Step 9: Check L2 state - bridges added by forwardLET should not be present - log "Step 9: Checking L2 state after reorg - forwardLET bridges should be reverted" - run query_contract "$L2_RPC_URL" "$l2_bridge_addr" "$deposit_count_func_sig" - assert_success - local deposit_count_after_forward_reorg="$output" - log "Deposit count after reorg (should be back to after backwardLET): $deposit_count_after_forward_reorg" - assert_equal "$deposit_count_after_forward_reorg" "$backward_target_deposit_count" - log "Deposit count correctly reverted after reorg" - # Step 10: Do a txn from L1 to L2 to see if cert settles log "Step 10: Making bridge from L1 to L2 to verify certificate settlement after reorg" destination_addr="$receiver"