@@ -9,15 +9,14 @@ async fn admin_add_evm_contract(
99 chain_name : String ,
1010 chain_id : u64 ,
1111 address : String ,
12- decimals : u8 ,
1312) -> Result < ( ) , String > {
14- let address = check_admin_add_evm_contract ( & chain_name, chain_id, & address, decimals ) ?;
13+ let address = check_admin_add_evm_contract ( & chain_name, chain_id, & address) ?;
1514 let cli = store:: state:: evm_client ( & chain_name) ;
1615 let now_ms = ic_cdk:: api:: time ( ) / 1_000_000 ;
17- let ( cid, gas_price, block_number, symbol, dec ) = futures:: future:: try_join5 (
16+ let ( cid, gas_price, block_number, symbol, decimals ) = futures:: future:: try_join5 (
1817 cli. chain_id ( now_ms) ,
1918 cli. gas_price ( now_ms) ,
20- cli. finalized_block_number ( now_ms) ,
19+ cli. block_number ( now_ms) ,
2120 cli. erc20_symbol ( now_ms, & address) ,
2221 cli. erc20_decimals ( now_ms, & address) ,
2322 )
@@ -29,12 +28,6 @@ async fn admin_add_evm_contract(
2928 cid, chain_id
3029 ) ) ;
3130 }
32- if decimals != dec {
33- return Err ( format ! (
34- "decimals mismatch, got {}, expected {}" ,
35- dec, decimals
36- ) ) ;
37- }
3831
3932 store:: state:: with_mut ( |s| {
4033 if s. token_symbol != symbol {
@@ -46,8 +39,13 @@ async fn admin_add_evm_contract(
4639
4740 s. evm_token_contracts
4841 . insert ( chain_name. clone ( ) , ( address, decimals, chain_id) ) ;
49- s. evm_finalized_block
50- . insert ( chain_name, ( block_number, gas_price) ) ;
42+ s. evm_finalized_block . insert (
43+ chain_name,
44+ (
45+ block_number. saturating_sub ( cli. max_confirmations ) ,
46+ gas_price,
47+ ) ,
48+ ) ;
5149 Ok ( ( ) )
5250 } )
5351}
@@ -57,17 +55,15 @@ fn validate_admin_add_evm_contract(
5755 chain_name : String ,
5856 chain_id : u64 ,
5957 address : String ,
60- decimals : u8 ,
6158) -> Result < String , String > {
62- check_admin_add_evm_contract ( & chain_name, chain_id, & address, decimals ) ?;
63- pretty_format ( & ( chain_name, chain_id, address, decimals ) )
59+ check_admin_add_evm_contract ( & chain_name, chain_id, & address) ?;
60+ pretty_format ( & ( chain_name, chain_id, address) )
6461}
6562
6663fn check_admin_add_evm_contract (
6764 chain_name : & str ,
6865 chain_id : u64 ,
6966 address : & str ,
70- decimals : u8 ,
7167) -> Result < Address , String > {
7268 if chain_name. trim ( ) . to_ascii_uppercase ( ) != chain_name
7369 || chain_name. is_empty ( )
@@ -80,13 +76,6 @@ fn check_admin_add_evm_contract(
8076 . map_err ( |err| format ! ( "invalid address: {err:?}" ) ) ?;
8177
8278 store:: state:: with ( |s| {
83- if decimals < s. token_decimals {
84- return Err ( format ! (
85- "decimals must be >= {}, got {}" ,
86- s. token_decimals, decimals
87- ) ) ;
88- }
89-
9079 if s. evm_token_contracts . contains_key ( chain_name) {
9180 return Err ( "chain_id already exists" . to_string ( ) ) ;
9281 }
@@ -103,23 +92,32 @@ fn check_admin_add_evm_contract(
10392}
10493
10594#[ ic_cdk:: update( guard = "is_controller" ) ]
106- fn admin_set_evm_providers ( chain_name : String , providers : Vec < String > ) -> Result < ( ) , String > {
95+ fn admin_set_evm_providers (
96+ chain_name : String ,
97+ max_confirmations : u64 ,
98+ providers : Vec < String > ,
99+ ) -> Result < ( ) , String > {
107100 for url in & providers {
108101 let v = Url :: parse ( url) . map_err ( |err| format ! ( "invalid url {url}, error: {err}" ) ) ?;
109102 if v. scheme ( ) != "https" {
110103 return Err ( format ! ( "url scheme must be https, got: {url}" ) ) ;
111104 }
112105 }
106+ if max_confirmations < 2 {
107+ return Err ( "max_confirmations must be at least 2" . to_string ( ) ) ;
108+ }
113109
114110 store:: state:: with_mut ( |s| {
115- s. evm_providers . insert ( chain_name, providers) ;
111+ s. evm_providers
112+ . insert ( chain_name, ( max_confirmations, providers) ) ;
116113 Ok ( ( ) )
117114 } )
118115}
119116
120117#[ ic_cdk:: update]
121118fn validate_admin_set_evm_providers (
122- chain_name : u64 ,
119+ chain_name : String ,
120+ max_confirmations : u64 ,
123121 providers : Vec < String > ,
124122) -> Result < String , String > {
125123 for url in & providers {
@@ -128,7 +126,15 @@ fn validate_admin_set_evm_providers(
128126 return Err ( format ! ( "url scheme must be https, got: {url}" ) ) ;
129127 }
130128 }
131- pretty_format ( & ( chain_name, providers) )
129+ if max_confirmations < 2 {
130+ return Err ( "max_confirmations must be at least 2" . to_string ( ) ) ;
131+ }
132+ pretty_format ( & ( chain_name, max_confirmations, providers) )
133+ }
134+
135+ #[ ic_cdk:: update( guard = "is_controller" ) ]
136+ async fn admin_update_evm_gas_price ( ) -> Result < ( ) , String > {
137+ unimplemented ! ( )
132138}
133139
134140fn is_controller ( ) -> Result < ( ) , String > {
0 commit comments