11use alloy:: {
2- network:: { EthereumWallet , Network , ReceiptResponse } ,
2+ network:: { Network , ReceiptResponse } ,
33 primitives:: { Address , B256 } ,
44 providers:: { Provider , ProviderBuilder } ,
55 signers:: local:: PrivateKeySigner ,
66 sol,
7- transports:: Transport ,
87} ;
98use anyhow:: { Context , Result } ;
109use reqwest:: Url ;
@@ -22,8 +21,6 @@ use tendermint_light_client_verifier::Verdict;
2221use tracing:: { error, info, Instrument } ;
2322use tracing_subscriber:: EnvFilter ;
2423
25- use sp1_blobstream_script:: util:: signer:: MaybeWallet ;
26-
2724/////// Contract ///////
2825
2926sol ! {
@@ -84,21 +81,20 @@ impl std::str::FromStr for SignerMode {
8481
8582/////// Operator ///////
8683
87- struct SP1BlobstreamOperator < P , T , N > {
84+ struct SP1BlobstreamOperator < P , N > {
8885 pk : Arc < SP1ProvingKey > ,
8986 vk : SP1VerifyingKey ,
9087 client : TendermintRPCClient ,
91- contracts : HashMap < u64 , SP1BlobstreamContract < T , P , N > > ,
88+ contracts : HashMap < u64 , SP1BlobstreamContract < P , N > > ,
9289 network_prover : Arc < NetworkProver > ,
9390 signer_mode : SignerMode ,
9491}
9592
9693/////// Constructor ///////
9794
98- impl < P , T , N > SP1BlobstreamOperator < P , T , N >
95+ impl < P , N > SP1BlobstreamOperator < P , N >
9996where
100- P : Provider < T , N > + ' static ,
101- T : Transport + Clone ,
97+ P : Provider < N > + ' static ,
10298 N : Network ,
10399{
104100 /// Create a new SP1 Blobstream operator.
@@ -142,10 +138,9 @@ where
142138
143139/////// Control Flow ///////
144140
145- impl < P , T , N > SP1BlobstreamOperator < P , T , N >
141+ impl < P , N > SP1BlobstreamOperator < P , N >
146142where
147- P : Provider < T , N > + ' static ,
148- T : Transport + Clone ,
143+ P : Provider < N > + ' static ,
149144 N : Network ,
150145{
151146 /// Create and relay a block range proof to multiple chains.
@@ -243,7 +238,7 @@ where
243238 let latest_blocks =
244239 futures:: future:: try_join_all ( self . contracts . iter ( ) . map ( |( id, contract) | async move {
245240 match contract. latestBlock ( ) . call ( ) . await {
246- Ok ( latest_block) => anyhow:: Result :: Ok ( ( id, latest_block. latestBlock ) ) ,
241+ Ok ( latest_block) => anyhow:: Result :: Ok ( ( id, latest_block) ) ,
247242 Err ( e) => {
248243 error ! ( "Failed to get latest block for chain {}: {}" , id, e) ;
249244 anyhow:: Result :: Err ( e)
@@ -388,10 +383,9 @@ where
388383
389384///// Methods ///////
390385
391- impl < P , T , N > SP1BlobstreamOperator < P , T , N >
386+ impl < P , N > SP1BlobstreamOperator < P , N >
392387where
393- P : Provider < T , N > + ' static ,
394- T : Transport + Clone ,
388+ P : Provider < N > + ' static ,
395389 N : Network ,
396390{
397391 /// Check the verifying key in the contract matches the verifying key in the prover.
@@ -400,13 +394,9 @@ where
400394 /// - If the verifying key in the operator does not match the verifying key in the contract.
401395 async fn check_vkey ( & self , chain_id : u64 ) -> Result < ( ) > {
402396 let contract = self . contracts . get ( & chain_id) . unwrap ( ) ;
403- let verifying_key = contract
404- . blobstreamProgramVkey ( )
405- . call ( )
406- . await ?
407- . blobstreamProgramVkey ;
397+ let verifying_key = contract. blobstreamProgramVkey ( ) . call ( ) . await ?;
408398
409- if verifying_key. 0 . to_vec ( )
399+ if verifying_key. to_vec ( )
410400 != hex:: decode ( self . vk . bytes32 ( ) . strip_prefix ( "0x" ) . unwrap ( ) ) . unwrap ( )
411401 {
412402 return Err ( anyhow:: anyhow!(
@@ -440,9 +430,7 @@ where
440430 let max_commits =
441431 futures:: future:: try_join_all ( self . contracts . iter ( ) . map ( |( id, contract) | async move {
442432 match contract. DATA_COMMITMENT_MAX ( ) . call ( ) . await {
443- Ok ( data_commitment_max) => {
444- anyhow:: Result :: Ok ( data_commitment_max. DATA_COMMITMENT_MAX )
445- }
433+ Ok ( data_commitment_max) => anyhow:: Result :: Ok ( data_commitment_max) ,
446434 Err ( e) => {
447435 error ! ( "Failed to get data commitment max for chain {}: {}" , id, e) ;
448436 anyhow:: Result :: Err ( e)
@@ -631,40 +619,59 @@ async fn main() {
631619
632620 // Succinct deployments use the `CHAINS` environment variable.
633621 let config = ChainConfig :: fetch ( ) . expect ( "Failed to fetch chain config" ) ;
634- let maybe_private_key: Option < PrivateKeySigner > = env:: var ( "PRIVATE_KEY" )
635- . ok ( )
636- . map ( |s| s. parse ( ) . expect ( "Failed to parse PRIVATE_KEY" ) ) ;
637622
638623 // Set up the KMS relayer config.
639624 let signer_mode = env:: var ( "SIGNER_MODE" )
640625 . map ( |s| s. parse ( ) . expect ( "SIGNER_MODE failed to parse" ) )
641626 . unwrap_or ( SignerMode :: Kms ) ;
642627
643- // Ensure a signer is set if KMS relayer is false.
644- if matches ! ( signer_mode , SignerMode :: Local ) && maybe_private_key . is_none ( ) {
645- panic ! ( "PRIVATE_KEY is not set but signer mode is local." ) ;
628+ match signer_mode {
629+ SignerMode :: Local => run_with_wallet ( config ) . await ,
630+ SignerMode :: Kms => run_with_kms_relayer ( config ) . await ,
646631 }
632+ }
647633
648- // Set up the signer.
649- let signer = MaybeWallet :: new ( maybe_private_key. map ( EthereumWallet :: new) ) ;
634+ async fn run_with_wallet ( config : Vec < ChainConfig > ) {
635+ let key = env:: var ( "PRIVATE_KEY" ) . expect ( "PRIVATE_KEY not set" ) ;
636+ let signer: PrivateKeySigner = key. parse ( ) . expect ( "Failed to parse PRIVATE_KEY" ) ;
650637
651- // Set up the prover and program keys.
652638 let prover = ProverClient :: builder ( ) . network ( ) . build ( ) ;
653639 let ( pk, vk) = prover. setup ( TENDERMINT_ELF ) ;
654640
655641 let client = TendermintRPCClient :: default ( ) ;
656642
657- let mut operator = SP1BlobstreamOperator :: new ( pk , vk , client , signer_mode , Arc :: new ( prover ) ) ;
658-
643+ let mut operator =
644+ SP1BlobstreamOperator :: new ( pk , vk , client , SignerMode :: Local , Arc :: new ( prover ) ) ;
659645 for ( i, c) in config. iter ( ) . enumerate ( ) {
660646 let url: Url = c. rpc_url . parse ( ) . expect ( "Failed to parse RPC URL" ) ;
661647 tracing:: info!( "Adding chain {:?} to operator" , url. domain( ) ) ;
662648 tracing:: info!( "Chain {} of {}" , i + 1 , config. len( ) ) ;
663649
664650 let provider = ProviderBuilder :: new ( )
665- . with_recommended_fillers ( )
666651 . wallet ( signer. clone ( ) )
667- . on_http ( url) ;
652+ . connect_http ( url) ;
653+
654+ operator = operator. with_chain ( provider, c. blobstream_address ) . await ;
655+ }
656+
657+ operator. run ( ) . await ;
658+ }
659+
660+ async fn run_with_kms_relayer ( config : Vec < ChainConfig > ) {
661+ let prover = ProverClient :: builder ( ) . network ( ) . build ( ) ;
662+ let ( pk, vk) = prover. setup ( TENDERMINT_ELF ) ;
663+
664+ let client = TendermintRPCClient :: default ( ) ;
665+
666+ let mut operator =
667+ SP1BlobstreamOperator :: new ( pk, vk, client, SignerMode :: Kms , Arc :: new ( prover) ) ;
668+
669+ for ( i, c) in config. iter ( ) . enumerate ( ) {
670+ let url: Url = c. rpc_url . parse ( ) . expect ( "Failed to parse RPC URL" ) ;
671+ tracing:: info!( "Adding chain {:?} to operator" , url. domain( ) ) ;
672+ tracing:: info!( "Chain {} of {}" , i + 1 , config. len( ) ) ;
673+
674+ let provider = ProviderBuilder :: new ( ) . connect_http ( url) ;
668675
669676 operator = operator. with_chain ( provider, c. blobstream_address ) . await ;
670677 }
0 commit comments