66 api_client:: { ApiClient , Observation } ,
77 borsh:: BorshDeserialize ,
88 clap:: Parser ,
9+ futures:: future:: join_all,
910 posted_message:: PostedMessageUnreliableData ,
1011 prost:: Message ,
1112 secp256k1:: { rand:: rngs:: OsRng , Secp256k1 } ,
@@ -41,7 +42,7 @@ struct RunListenerInput<T: Signer> {
4142 signer : T ,
4243 wormhole_pid : Pubkey ,
4344 accumulator_address : Pubkey ,
44- api_client : ApiClient ,
45+ api_clients : Vec < ApiClient > ,
4546}
4647
4748fn find_message_pda ( wormhole_pid : & Pubkey , slot : u64 ) -> Pubkey {
@@ -148,16 +149,22 @@ async fn run_listener<T: Signer + 'static>(
148149 } ;
149150
150151 tokio:: spawn ( {
151- let ( api_client , signer) = ( input. api_client . clone ( ) , input. signer . clone ( ) ) ;
152+ let ( api_clients , signer) = ( input. api_clients . clone ( ) , input. signer . clone ( ) ) ;
152153 async move {
153154 let body = message_data_to_body ( & unreliable_data) ;
154155 match Observation :: try_new ( body. clone ( ) , signer. clone ( ) ) {
155156 Ok ( observation) => {
156- if let Err ( e) = api_client. post_observation ( observation) . await {
157- tracing:: error!( error = ?e, "Failed to post observation" ) ;
158- } else {
159- tracing:: info!( "Observation posted successfully" ) ;
160- } ;
157+ join_all ( api_clients. iter ( ) . map ( |api_client| {
158+ let observation = observation. clone ( ) ;
159+ let api_client = api_client. clone ( ) ;
160+ async move {
161+ if let Err ( e) = api_client. post_observation ( observation) . await {
162+ tracing:: warn!( url = api_client. get_base_url( ) . to_string( ) , error = ?e, "Failed to post observation" ) ;
163+ } else {
164+ tracing:: info!( url = api_client. get_base_url( ) . to_string( ) , "Observation posted successfully" ) ;
165+ }
166+ }
167+ } ) ) . await ;
161168 }
162169 Err ( e) => tracing:: error!( error = ?e, "Failed to create observation" ) ,
163170 }
@@ -182,8 +189,13 @@ async fn run(run_options: config::RunOptions) {
182189 . expect ( "Invalid accumulator address" ) ;
183190 let wormhole_pid =
184191 Pubkey :: from_str ( & run_options. wormhole_pid ) . expect ( "Invalid Wormhole program ID" ) ;
185- let api_client =
186- ApiClient :: try_new ( run_options. server_url , None ) . expect ( "Failed to create API client" ) ;
192+ let api_clients: Vec < ApiClient > = run_options
193+ . server_urls
194+ . into_iter ( )
195+ . map ( |server_url| {
196+ ApiClient :: try_new ( server_url, None ) . expect ( "Failed to create API client" )
197+ } )
198+ . collect ( ) ;
187199
188200 let ( pubkey, pubkey_evm) = signer. get_public_key ( ) . expect ( "Failed to get public key" ) ;
189201 let evm_encded_public_key = format ! ( "0x{}" , hex:: encode( pubkey_evm) ) ;
@@ -199,7 +211,7 @@ async fn run(run_options: config::RunOptions) {
199211 signer : signer. clone ( ) ,
200212 wormhole_pid,
201213 accumulator_address,
202- api_client : api_client . clone ( ) ,
214+ api_clients : api_clients . clone ( ) ,
203215 } )
204216 . await
205217 {
0 commit comments