@@ -5,32 +5,65 @@ use alloy::{
5
5
rpc:: types:: eth:: TransactionRequest ,
6
6
signers:: aws:: AwsSigner ,
7
7
} ;
8
- use aws_config:: BehaviorVersion ;
9
- use builder:: config:: { HostProvider , load_address, load_string, load_u64, load_url} ;
8
+ use builder:: config:: HostProvider ;
10
9
use init4_bin_base:: {
11
10
deps:: metrics:: { counter, histogram} ,
12
11
init4,
12
+ utils:: from_env:: FromEnv ,
13
13
} ;
14
14
use std:: time:: { Duration , Instant } ;
15
15
use tokio:: time:: timeout;
16
16
17
+ #[ derive( Debug , Clone , FromEnv ) ]
18
+ struct Config {
19
+ #[ from_env( var = "RPC_URL" , desc = "Ethereum RPC URL" ) ]
20
+ rpc_url : String ,
21
+ #[ from_env( var = "CHAIN_ID" , desc = "Ethereum chain ID" ) ]
22
+ chain_id : u64 ,
23
+ #[ from_env( var = "AWS_KMS_KEY_ID" , desc = "AWS KMS key ID" ) ]
24
+ kms_key_id : String ,
25
+ #[ from_env( var = "RECIPIENT_ADDRESS" , desc = "Recipient address" ) ]
26
+ recipient_address : Address ,
27
+ #[ from_env( var = "SLEEP_TIME" , desc = "Time to sleep between transactions" ) ]
28
+ sleep_time : u64 ,
29
+ }
30
+
31
+ impl Config {
32
+ async fn provider ( & self ) -> HostProvider {
33
+ let config = aws_config:: load_defaults ( aws_config:: BehaviorVersion :: latest ( ) ) . await ;
34
+ let client = aws_sdk_kms:: Client :: new ( & config) ;
35
+ let signer =
36
+ AwsSigner :: new ( client, self . kms_key_id . clone ( ) , Some ( self . chain_id ) ) . await . unwrap ( ) ;
37
+
38
+ ProviderBuilder :: new ( )
39
+ . wallet ( EthereumWallet :: from ( signer) )
40
+ . connect ( & self . rpc_url )
41
+ . await
42
+ . unwrap ( )
43
+ }
44
+ }
45
+
17
46
#[ tokio:: main]
18
47
async fn main ( ) {
19
48
init4 ( ) ;
20
49
21
50
tracing:: trace!( "connecting to provider" ) ;
22
- let ( provider, recipient_address, sleep_time) = connect_from_config ( ) . await ;
51
+
52
+ let config = Config :: from_env ( ) . unwrap ( ) ;
53
+ let provider = config. provider ( ) . await ;
54
+ let recipient_address = config. recipient_address ;
55
+ let sleep_time = config. sleep_time ;
23
56
24
57
loop {
25
58
tracing:: debug!( "attempting transaction" ) ;
26
- send_transaction ( provider. clone ( ) , recipient_address) . await ;
59
+ send_transaction ( & provider, recipient_address) . await ;
27
60
28
61
tracing:: debug!( sleep_time, "sleeping" ) ;
29
62
tokio:: time:: sleep ( tokio:: time:: Duration :: from_secs ( sleep_time) ) . await ;
30
63
}
31
64
}
32
65
33
- async fn send_transaction ( provider : HostProvider , recipient_address : Address ) {
66
+ async fn send_transaction ( provider : & HostProvider , recipient_address : Address ) {
34
67
// construct simple transaction to send ETH to a recipient
35
68
let tx = TransactionRequest :: default ( )
36
69
. with_from ( provider. default_signer_address ( ) )
@@ -66,26 +99,3 @@ async fn send_transaction(provider: HostProvider, recipient_address: Address) {
66
99
tracing:: debug!( success = receipt. status( ) , mine_time, hash, "transaction mined" ) ;
67
100
histogram ! ( "txn_submitter.tx_mine_time" ) . record ( mine_time as f64 ) ;
68
101
}
69
-
70
- async fn connect_from_config ( ) -> ( HostProvider , Address , u64 ) {
71
- // load signer config values from .env
72
- let rpc_url = load_url ( "RPC_URL" ) . unwrap ( ) ;
73
- let chain_id = load_u64 ( "CHAIN_ID" ) . unwrap ( ) ;
74
- let kms_key_id = load_string ( "AWS_KMS_KEY_ID" ) . unwrap ( ) ;
75
- // load transaction sending config value from .env
76
- let recipient_address: Address = load_address ( "RECIPIENT_ADDRESS" ) . unwrap ( ) ;
77
- let sleep_time = load_u64 ( "SLEEP_TIME" ) . unwrap ( ) ;
78
-
79
- // connect signer & provider
80
- let config = aws_config:: load_defaults ( BehaviorVersion :: latest ( ) ) . await ;
81
- let client = aws_sdk_kms:: Client :: new ( & config) ;
82
- let signer = AwsSigner :: new ( client, kms_key_id. to_string ( ) , Some ( chain_id) ) . await . unwrap ( ) ;
83
-
84
- let provider = ProviderBuilder :: new ( )
85
- . wallet ( EthereumWallet :: from ( signer) )
86
- . connect ( & rpc_url)
87
- . await
88
- . unwrap ( ) ;
89
-
90
- ( provider, recipient_address, sleep_time)
91
- }
0 commit comments