22// SPDX-License-Identifier: Apache-2.0, MIT
33
44use fvm_shared:: econ:: TokenAmount ;
5- use ipc_provider:: config:: deserialize :: {
6- deserialize_cors_headers , deserialize_cors_methods , deserialize_cors_origins ,
5+ use ipc_provider:: config:: serialize :: {
6+ vec_to_allow_headers , vec_to_allow_methods , vec_to_allow_origin ,
77} ;
8- use serde:: Deserialize ;
8+ use serde:: de:: Error as DeError ;
9+ use serde:: { Deserialize , Deserializer , Serialize } ;
910use serde_with:: { serde_as, DurationSeconds } ;
1011use std:: time:: Duration ;
1112use tower_http:: cors:: { AllowHeaders , AllowMethods , AllowOrigin } ;
@@ -16,7 +17,7 @@ use crate::{IsHumanReadable, MetricsSettings, SocketAddress};
1617
1718/// Ethereum API facade settings.
1819#[ serde_as]
19- #[ derive( Debug , Deserialize , Clone ) ]
20+ #[ derive( Debug , Deserialize , Serialize , Clone ) ]
2021pub struct EthSettings {
2122 pub listen : SocketAddress ,
2223 #[ serde_as( as = "DurationSeconds<u64>" ) ]
@@ -29,8 +30,36 @@ pub struct EthSettings {
2930 pub tracing : TracingSettings ,
3031}
3132
33+ impl Default for EthSettings {
34+ fn default ( ) -> Self {
35+ EthSettings {
36+ filter_timeout : Duration :: from_secs ( 300 ) ,
37+ cache_capacity : 1000000 ,
38+ max_nonce_gap : 10 ,
39+ gas : GasOpt {
40+ min_gas_premium : TokenAmount :: from_atto ( 100000 ) ,
41+ num_blocks_max_prio_fee : 10 ,
42+ max_fee_hist_size : 1024 ,
43+ } ,
44+ listen : SocketAddress {
45+ host : "127.0.0.1" . into ( ) ,
46+ port : 8545 ,
47+ } ,
48+ metrics : MetricsSettings {
49+ enabled : true ,
50+ listen : SocketAddress {
51+ host : "127.0.0.1" . into ( ) ,
52+ port : 9185 ,
53+ } ,
54+ } ,
55+ cors : CorsOpt :: default ( ) ,
56+ tracing : TracingSettings :: default ( ) ,
57+ }
58+ }
59+ }
60+
3261#[ serde_as]
33- #[ derive( Debug , Clone , Deserialize ) ]
62+ #[ derive( Debug , Clone , Serialize , Deserialize ) ]
3463pub struct GasOpt {
3564 /// Minimum gas fee in atto.
3665 #[ serde_as( as = "IsHumanReadable" ) ]
@@ -40,12 +69,55 @@ pub struct GasOpt {
4069}
4170
4271#[ serde_as]
43- #[ derive( Debug , Clone , Deserialize ) ]
72+ #[ derive( Debug , Clone , Serialize , Default ) ]
4473pub struct CorsOpt {
45- #[ serde( deserialize_with = "deserialize_cors_origins" ) ]
74+ #[ serde( default , rename = "allowed_origins" ) ]
75+ pub temp_origins : Vec < String > ,
76+ #[ serde( default , rename = "allowed_methods" ) ]
77+ pub temp_methods : Vec < String > ,
78+ #[ serde( default , rename = "allowed_headers" ) ]
79+ pub temp_headers : Vec < String > ,
80+
81+ // Runtime representations, skipped during (de)serialization.
82+ #[ serde( skip) ]
4683 pub allowed_origins : AllowOrigin ,
47- #[ serde( deserialize_with = "deserialize_cors_methods" ) ]
84+ #[ serde( skip ) ]
4885 pub allowed_methods : AllowMethods ,
49- #[ serde( deserialize_with = "deserialize_cors_headers" ) ]
86+ #[ serde( skip ) ]
5087 pub allowed_headers : AllowHeaders ,
5188}
89+
90+ impl < ' de > Deserialize < ' de > for CorsOpt {
91+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
92+ where
93+ D : Deserializer < ' de > ,
94+ {
95+ #[ derive( Deserialize ) ]
96+ struct Temp {
97+ #[ serde( default , rename = "allowed_origins" ) ]
98+ allowed_origins : Vec < String > ,
99+ #[ serde( default , rename = "allowed_methods" ) ]
100+ allowed_methods : Vec < String > ,
101+ #[ serde( default , rename = "allowed_headers" ) ]
102+ allowed_headers : Vec < String > ,
103+ }
104+
105+ let temp = Temp :: deserialize ( deserializer) ?;
106+
107+ let allowed_origins =
108+ vec_to_allow_origin ( temp. allowed_origins . clone ( ) ) . map_err ( D :: Error :: custom) ?;
109+ let allowed_methods =
110+ vec_to_allow_methods ( temp. allowed_methods . clone ( ) ) . map_err ( D :: Error :: custom) ?;
111+ let allowed_headers =
112+ vec_to_allow_headers ( temp. allowed_headers . clone ( ) ) . map_err ( D :: Error :: custom) ?;
113+
114+ Ok ( CorsOpt {
115+ temp_origins : temp. allowed_origins ,
116+ temp_methods : temp. allowed_methods ,
117+ temp_headers : temp. allowed_headers ,
118+ allowed_origins,
119+ allowed_methods,
120+ allowed_headers,
121+ } )
122+ }
123+ }
0 commit comments