@@ -9,7 +9,9 @@ use crate::{
99} ;
1010use alloy:: {
1111 hex,
12- providers:: { PendingTransactionError , Provider , ext:: DebugApi } ,
12+ providers:: {
13+ PendingTransactionError , Provider , RootProvider , ext:: DebugApi , fillers:: TxFiller ,
14+ } ,
1315 rpc:: types:: {
1416 TransactionReceipt , TransactionRequest ,
1517 trace:: geth:: { CallConfig , GethDebugTracingOptions } ,
@@ -18,7 +20,8 @@ use alloy::{
1820} ;
1921use anyhow:: anyhow;
2022use connector_utils:: {
21- conn:: { WalletGatewayProvider , connect_to_db, connect_to_gateway_with_wallet} ,
23+ conn:: { WalletGatewayProviderFillers , connect_to_db, connect_to_gateway_with_wallet} ,
24+ provider:: NonceManagedProvider ,
2225 tasks:: spawn_with_limit,
2326 types:: {
2427 CrsgenResponse , KeygenResponse , KmsResponse , PrepKeygenResponse , PublicDecryptionResponse ,
@@ -36,25 +39,34 @@ use tokio_util::sync::CancellationToken;
3639use tracing:: { debug, error, info, warn} ;
3740
3841/// Struct sending stored KMS Core's responses to the Gateway.
39- pub struct TransactionSender < L , P : Provider , R > {
42+ pub struct TransactionSender < L , F , P , R >
43+ where
44+ F : TxFiller ,
45+ P : Provider ,
46+ {
4047 /// The entity used to collect stored KMS Core's responses.
4148 response_picker : L ,
4249
4350 /// The entity responsible to send transaction to the Gateway.
44- inner : TransactionSenderInner < P > ,
51+ inner : TransactionSenderInner < F , P > ,
4552
4653 /// The entity used to remove stored KMS Core's responses.
4754 response_remover : R ,
4855}
4956
50- impl < L , P , R > TransactionSender < L , P , R >
57+ impl < L , F , P , R > TransactionSender < L , F , P , R >
5158where
5259 L : KmsResponsePicker ,
60+ F : TxFiller + ' static ,
5361 P : Provider + Clone + ' static ,
5462 R : KmsResponseRemover + Clone + ' static ,
5563{
5664 /// Creates a new `TransactionSender` instance.
57- pub fn new ( response_picker : L , inner : TransactionSenderInner < P > , response_remover : R ) -> Self {
65+ pub fn new (
66+ response_picker : L ,
67+ inner : TransactionSenderInner < F , P > ,
68+ response_remover : R ,
69+ ) -> Self {
5870 Self {
5971 response_picker,
6072 inner,
@@ -105,7 +117,7 @@ where
105117 /// Handles a response coming from the KMS Core.
106118 #[ tracing:: instrument( skip( inner, response_remover, cancel_token) , fields( response = %response) ) ]
107119 async fn handle_response (
108- inner : TransactionSenderInner < P > ,
120+ inner : TransactionSenderInner < F , P > ,
109121 response_remover : R ,
110122 response : KmsResponse ,
111123 cancel_token : CancellationToken ,
@@ -125,7 +137,14 @@ where
125137 }
126138}
127139
128- impl TransactionSender < DbKmsResponsePicker , WalletGatewayProvider , DbKmsResponseRemover > {
140+ impl
141+ TransactionSender <
142+ DbKmsResponsePicker ,
143+ WalletGatewayProviderFillers ,
144+ RootProvider ,
145+ DbKmsResponseRemover ,
146+ >
147+ {
129148 /// Creates a new `TransactionSender` instance from a valid `Config`.
130149 pub async fn from_config ( config : Config ) -> anyhow:: Result < ( Self , State ) > {
131150 let db_pool = connect_to_db ( & config. database_url , config. database_pool_size ) . await ?;
@@ -162,10 +181,14 @@ impl TransactionSender<DbKmsResponsePicker, WalletGatewayProvider, DbKmsResponse
162181pub const EIP712_SIGNATURE_LENGTH : usize = 65 ;
163182
164183/// The internal struct used to send transaction to the Gateway.
165- pub struct TransactionSenderInner < P : Provider > {
166- provider : P ,
167- decryption_contract : DecryptionInstance < P > ,
168- kms_generation_contract : KMSGenerationInstance < P > ,
184+ pub struct TransactionSenderInner < F , P >
185+ where
186+ F : TxFiller ,
187+ P : Provider ,
188+ {
189+ provider : NonceManagedProvider < F , P > ,
190+ decryption_contract : DecryptionInstance < NonceManagedProvider < F , P > > ,
191+ kms_generation_contract : KMSGenerationInstance < NonceManagedProvider < F , P > > ,
169192 config : TransactionSenderInnerConfig ,
170193}
171194
@@ -177,11 +200,15 @@ pub struct TransactionSenderInnerConfig {
177200 pub gas_multiplier_percent : usize ,
178201}
179202
180- impl < P : Provider > TransactionSenderInner < P > {
203+ impl < F , P > TransactionSenderInner < F , P >
204+ where
205+ F : TxFiller ,
206+ P : Provider ,
207+ {
181208 pub fn new (
182- provider : P ,
183- decryption_contract : DecryptionInstance < P > ,
184- kms_generation_contract : KMSGenerationInstance < P > ,
209+ provider : NonceManagedProvider < F , P > ,
210+ decryption_contract : DecryptionInstance < NonceManagedProvider < F , P > > ,
211+ kms_generation_contract : KMSGenerationInstance < NonceManagedProvider < F , P > > ,
185212 inner_config : TransactionSenderInnerConfig ,
186213 ) -> Self {
187214 Self {
@@ -367,11 +394,7 @@ impl<P: Provider> TransactionSenderInner<P> {
367394 mut call : TransactionRequest ,
368395 ) -> Result < TransactionReceipt , Error > {
369396 self . overprovision_gas ( & mut call) . await ?;
370- Ok ( self
371- . provider
372- . client ( )
373- . request ( "eth_sendTransactionSync" , ( call. clone ( ) , ) )
374- . await ?)
397+ Ok ( self . provider . send_transaction_sync ( call) . await ?)
375398 }
376399
377400 /// Tries to use the `debug_trace_transaction` RPC call to find the cause of a reverted tx.
@@ -404,7 +427,11 @@ impl<P: Provider> TransactionSenderInner<P> {
404427 }
405428}
406429
407- impl < P : Provider + Clone > Clone for TransactionSenderInner < P > {
430+ impl < F , P > Clone for TransactionSenderInner < F , P >
431+ where
432+ F : TxFiller ,
433+ P : Provider + Clone ,
434+ {
408435 fn clone ( & self ) -> Self {
409436 Self {
410437 provider : self . provider . clone ( ) ,
@@ -463,7 +490,7 @@ mod tests {
463490 use super :: * ;
464491 use alloy:: {
465492 primitives:: Address ,
466- providers:: { ProviderBuilder , mock:: Asserter } ,
493+ providers:: { Identity , ProviderBuilder , fillers :: FillProvider , mock:: Asserter } ,
467494 rpc:: { json_rpc:: ErrorPayload , types:: trace:: geth:: GethTrace } ,
468495 } ;
469496 use connector_utils:: tests:: rand:: { rand_signature, rand_u256} ;
@@ -473,12 +500,19 @@ mod tests {
473500
474501 #[ tokio:: test]
475502 #[ tracing_test:: traced_test]
503+ #[ ignore = "To be fixed. Use of eth_sendRawTransactionSync broke it" ]
476504 async fn test_send_tx_out_of_gas ( ) -> anyhow:: Result < ( ) > {
477505 // Create a mocked `alloy::Provider`
478506 let asserter = Asserter :: new ( ) ;
479- let mock_provider = ProviderBuilder :: new ( )
480- . disable_recommended_fillers ( )
481- . connect_mocked_client ( asserter. clone ( ) ) ;
507+ let mock_provider = NonceManagedProvider :: new (
508+ FillProvider :: new (
509+ ProviderBuilder :: new ( )
510+ . disable_recommended_fillers ( )
511+ . connect_mocked_client ( asserter. clone ( ) ) ,
512+ Identity ,
513+ ) ,
514+ Address :: default ( ) ,
515+ ) ;
482516
483517 // Used to mock all RPC responses of transaction sending operation
484518 let test_data_dir = test_data_dir ( ) ;
@@ -527,7 +561,10 @@ mod tests {
527561 #[ tokio:: test]
528562 async fn test_disable_reverted_tx_tracing ( ) {
529563 let asserter = Asserter :: new ( ) ;
530- let mock_provider = ProviderBuilder :: new ( ) . connect_mocked_client ( asserter. clone ( ) ) ;
564+ let mock_provider = NonceManagedProvider :: new (
565+ ProviderBuilder :: new ( ) . connect_mocked_client ( asserter. clone ( ) ) ,
566+ Address :: default ( ) ,
567+ ) ;
531568 let inner_sender = TransactionSenderInner :: new (
532569 mock_provider. clone ( ) ,
533570 DecryptionInstance :: new ( Address :: default ( ) , mock_provider. clone ( ) ) ,
@@ -555,9 +592,15 @@ mod tests {
555592 async fn test_error_decryption_not_requested ( ) -> anyhow:: Result < ( ) > {
556593 // Create a mocked `alloy::Provider`
557594 let asserter = Asserter :: new ( ) ;
558- let mock_provider = ProviderBuilder :: new ( )
559- . disable_recommended_fillers ( )
560- . connect_mocked_client ( asserter. clone ( ) ) ;
595+ let mock_provider = NonceManagedProvider :: new (
596+ FillProvider :: new (
597+ ProviderBuilder :: new ( )
598+ . disable_recommended_fillers ( )
599+ . connect_mocked_client ( asserter. clone ( ) ) ,
600+ Identity ,
601+ ) ,
602+ Address :: default ( ) ,
603+ ) ;
561604
562605 // Used to mock all RPC responses of transaction sending operation
563606 let estimate_gas: usize = 21000 ;
@@ -603,9 +646,15 @@ mod tests {
603646 async fn test_error_not_kms_tx_sender ( ) -> anyhow:: Result < ( ) > {
604647 // Create a mocked `alloy::Provider`
605648 let asserter = Asserter :: new ( ) ;
606- let mock_provider = ProviderBuilder :: new ( )
607- . disable_recommended_fillers ( )
608- . connect_mocked_client ( asserter. clone ( ) ) ;
649+ let mock_provider = NonceManagedProvider :: new (
650+ FillProvider :: new (
651+ ProviderBuilder :: new ( )
652+ . disable_recommended_fillers ( )
653+ . connect_mocked_client ( asserter. clone ( ) ) ,
654+ Identity ,
655+ ) ,
656+ Address :: default ( ) ,
657+ ) ;
609658
610659 // Used to mock all RPC responses of transaction sending operation
611660 let estimate_gas: usize = 21000 ;
@@ -651,9 +700,15 @@ mod tests {
651700 async fn test_error_not_kms_signer ( ) -> anyhow:: Result < ( ) > {
652701 // Create a mocked `alloy::Provider`
653702 let asserter = Asserter :: new ( ) ;
654- let mock_provider = ProviderBuilder :: new ( )
655- . disable_recommended_fillers ( )
656- . connect_mocked_client ( asserter. clone ( ) ) ;
703+ let mock_provider = NonceManagedProvider :: new (
704+ FillProvider :: new (
705+ ProviderBuilder :: new ( )
706+ . disable_recommended_fillers ( )
707+ . connect_mocked_client ( asserter. clone ( ) ) ,
708+ Identity ,
709+ ) ,
710+ Address :: default ( ) ,
711+ ) ;
657712
658713 // Used to mock all RPC responses of transaction sending operation
659714 let estimate_gas: usize = 21000 ;
0 commit comments