Skip to content

Commit 4d94b9e

Browse files
authored
Add more process_deposit_request tests (#5086)
1 parent bfbef99 commit 4d94b9e

1 file changed

Lines changed: 155 additions & 0 deletions

File tree

tests/core/pyspec/eth_consensus_specs/test/gloas/block_processing/test_process_deposit_request.py

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,3 +1123,158 @@ def test_process_deposit_request__routing__pending_deposit_builder_credentials(s
11231123
deposit_request=deposit_request,
11241124
is_builder_deposit=False,
11251125
)
1126+
1127+
1128+
@with_gloas_and_later
1129+
@spec_state_test
1130+
def test_process_deposit_request__routing__pending_deposit_different_pubkeys(spec, state):
1131+
"""
1132+
Test is_pending_validator skips non-matching pubkeys before finding matching one.
1133+
1134+
Exercises the `continue` branch in is_pending_validator when pending deposits
1135+
with different pubkeys exist before the matching deposit.
1136+
1137+
Input State Configured:
1138+
- Pending deposits for two unrelated validator pubkeys
1139+
- Pending deposit for the target pubkey
1140+
- Builder-credential deposit request for the target pubkey
1141+
1142+
Output State Verified:
1143+
- Deposit routed to validator queue (not builder)
1144+
- is_pending_validator returns True after skipping non-matching deposits
1145+
"""
1146+
new_validator_index = len(state.validators)
1147+
amount = spec.MIN_DEPOSIT_AMOUNT
1148+
1149+
# Add pending deposits with different pubkeys (these will be skipped via `continue`)
1150+
for i in range(2):
1151+
unrelated_index = new_validator_index + 1 + i
1152+
unrelated_pending = prepare_pending_deposit(
1153+
spec,
1154+
unrelated_index,
1155+
amount,
1156+
signed=True,
1157+
)
1158+
state.pending_deposits.append(unrelated_pending)
1159+
1160+
# Add a pending deposit with the target pubkey (this will match)
1161+
target_pending = prepare_pending_deposit(
1162+
spec,
1163+
new_validator_index,
1164+
amount,
1165+
signed=True,
1166+
)
1167+
state.pending_deposits.append(target_pending)
1168+
1169+
# Create a deposit request with builder credentials for the target pubkey
1170+
deposit_request = prepare_deposit_request(
1171+
spec,
1172+
new_validator_index,
1173+
amount,
1174+
index=0,
1175+
withdrawal_credentials=make_withdrawal_credentials(
1176+
spec, spec.BUILDER_WITHDRAWAL_PREFIX, b"\x59"
1177+
),
1178+
signed=True,
1179+
)
1180+
1181+
pre_state = state.copy()
1182+
1183+
yield from run_deposit_request_processing(spec, state, deposit_request)
1184+
1185+
# Should NOT create a new builder (is_pending_validator finds matching deposit)
1186+
assert_process_deposit_request(
1187+
spec,
1188+
state,
1189+
pre_state,
1190+
deposit_request=deposit_request,
1191+
is_builder_deposit=False,
1192+
)
1193+
1194+
1195+
@with_gloas_and_later
1196+
@spec_state_test
1197+
def test_process_deposit_request__routing__empty_pending_deposits(spec, state):
1198+
"""
1199+
Test is_pending_validator with empty pending deposit queue.
1200+
1201+
When pending_deposits is empty, is_pending_validator returns False
1202+
immediately and the deposit is routed to the builder path.
1203+
1204+
Input State Configured:
1205+
- Empty pending_deposits queue
1206+
- Builder-credential deposit request for a new pubkey
1207+
1208+
Output State Verified:
1209+
- Deposit routed to builder path (new builder created)
1210+
"""
1211+
amount = spec.MIN_DEPOSIT_AMOUNT
1212+
1213+
# Ensure pending deposits is empty
1214+
state.pending_deposits = []
1215+
1216+
deposit_request = prepare_process_deposit_request(
1217+
spec, state, for_builder=True, amount=amount, signed=True
1218+
)
1219+
pre_state = state.copy()
1220+
1221+
yield from run_deposit_request_processing(spec, state, deposit_request)
1222+
1223+
# Should create a new builder (no pending deposits, is_pending_validator returns False)
1224+
assert_process_deposit_request(
1225+
spec,
1226+
state,
1227+
pre_state,
1228+
deposit_request=deposit_request,
1229+
is_builder_deposit=True,
1230+
expected_builder_balance=amount,
1231+
)
1232+
1233+
1234+
@with_gloas_and_later
1235+
@spec_state_test
1236+
def test_process_deposit_request__routing__pending_deposits_all_different_pubkeys(spec, state):
1237+
"""
1238+
Test is_pending_validator when all pending deposits have different pubkeys.
1239+
1240+
When no pending deposit matches the target pubkey, is_pending_validator
1241+
hits `continue` for every deposit and returns False.
1242+
1243+
Input State Configured:
1244+
- Pending deposits for two unrelated validator pubkeys
1245+
- Builder-credential deposit request for a pubkey not in the queue
1246+
1247+
Output State Verified:
1248+
- Deposit routed to builder path (new builder created)
1249+
"""
1250+
new_validator_index = len(state.validators)
1251+
amount = spec.MIN_DEPOSIT_AMOUNT
1252+
1253+
# Add pending deposits with unrelated pubkeys
1254+
for i in range(2):
1255+
unrelated_index = new_validator_index + 1 + i
1256+
unrelated_pending = prepare_pending_deposit(
1257+
spec,
1258+
unrelated_index,
1259+
amount,
1260+
signed=True,
1261+
)
1262+
state.pending_deposits.append(unrelated_pending)
1263+
1264+
# Create a builder deposit request for a pubkey NOT in the pending queue
1265+
deposit_request = prepare_process_deposit_request(
1266+
spec, state, for_builder=True, amount=amount, signed=True
1267+
)
1268+
pre_state = state.copy()
1269+
1270+
yield from run_deposit_request_processing(spec, state, deposit_request)
1271+
1272+
# Should create a new builder (no matching pubkey, is_pending_validator returns False)
1273+
assert_process_deposit_request(
1274+
spec,
1275+
state,
1276+
pre_state,
1277+
deposit_request=deposit_request,
1278+
is_builder_deposit=True,
1279+
expected_builder_balance=amount,
1280+
)

0 commit comments

Comments
 (0)