@@ -6,7 +6,7 @@ use std::{
66 u64,
77} ;
88
9- use alloy:: primitives:: U256 ;
9+ use alloy:: { primitives:: U256 , rpc :: types :: beacon :: relay :: ValidatorRegistration } ;
1010use cb_common:: {
1111 config:: { PbsConfig , PbsModuleConfig , RuntimeMuxConfig } ,
1212 pbs:: RelayClient ,
@@ -18,7 +18,7 @@ use cb_pbs::{DefaultBuilderApi, PbsService, PbsState};
1818use cb_tests:: {
1919 mock_relay:: { start_mock_relay_service, MockRelayState } ,
2020 mock_validator:: MockValidator ,
21- utils:: { generate_mock_relay, setup_test_env} ,
21+ utils:: { generate_mock_relay, generate_mock_relay_with_batch_size , setup_test_env} ,
2222} ;
2323use eyre:: Result ;
2424use tracing:: info;
@@ -143,6 +143,48 @@ async fn test_register_validators() -> Result<()> {
143143 Ok ( ( ) )
144144}
145145
146+ #[ tokio:: test]
147+ async fn test_batch_register_validators ( ) -> Result < ( ) > {
148+ setup_test_env ( ) ;
149+ let signer = random_secret ( ) ;
150+ let pubkey: BlsPublicKey = blst_pubkey_to_alloy ( & signer. sk_to_pk ( ) ) . into ( ) ;
151+
152+ let chain = Chain :: Holesky ;
153+ let port = 3310 ;
154+
155+ let relays = vec ! [ generate_mock_relay_with_batch_size( port + 1 , * pubkey, 5 ) ?] ;
156+ let mock_state = Arc :: new ( MockRelayState :: new ( chain, signer) ) ;
157+ tokio:: spawn ( start_mock_relay_service ( mock_state. clone ( ) , port + 1 ) ) ;
158+
159+ let config = to_pbs_config ( chain, get_pbs_static_config ( port) , relays) ;
160+ let state = PbsState :: new ( config) ;
161+ tokio:: spawn ( PbsService :: run :: < ( ) , DefaultBuilderApi > ( state) ) ;
162+
163+ // leave some time to start servers
164+ tokio:: time:: sleep ( Duration :: from_millis ( 100 ) ) . await ;
165+
166+ let data = include_str ! ( "../data/registration_holesky.json" ) ;
167+ let registrations: Vec < ValidatorRegistration > = serde_json:: from_str ( data) ?;
168+
169+ let mock_validator = MockValidator :: new ( port) ?;
170+ info ! ( "Sending register validator" ) ;
171+ let res = mock_validator. do_register_custom_validators ( registrations. clone ( ) ) . await ;
172+
173+ // registrations.len() == 17. 5 per batch, 4 batches
174+ assert ! ( res. is_ok( ) ) ;
175+ assert_eq ! ( mock_state. received_register_validator( ) , 4 ) ;
176+
177+ let mock_validator = MockValidator :: new ( port) ?;
178+ info ! ( "Sending register validator" ) ;
179+ let res = mock_validator. do_register_custom_validators ( registrations[ ..2 ] . to_vec ( ) ) . await ;
180+
181+ // Expected one more registration request
182+ assert ! ( res. is_ok( ) ) ;
183+ assert_eq ! ( mock_state. received_register_validator( ) , 5 ) ;
184+
185+ Ok ( ( ) )
186+ }
187+
146188#[ tokio:: test]
147189async fn test_submit_block ( ) -> Result < ( ) > {
148190 setup_test_env ( ) ;
0 commit comments