@@ -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