1- use anyhow:: { bail, ensure, Result } ;
1+ use anyhow:: { bail, ensure, Error , Result } ;
22use clap:: { Args , ValueEnum } ;
33use conversions:: serde:: deserialize:: CairoDeserialize ;
44use conversions:: TryIntoConv ;
5+ use shared:: print:: print_as_warning;
56use starknet:: core:: types:: BlockId ;
67use starknet:: providers:: Provider ;
78use starknet_types_core:: felt:: { Felt , NonZeroFelt } ;
9+ use std:: str:: FromStr ;
810
911#[ derive( Args , Debug , Clone ) ]
1012pub struct FeeArgs {
1113 /// Token that transaction fee will be paid in
12- #[ clap( long) ]
14+ #[ clap( long, value_parser = parse_fee_token ) ]
1315 pub fee_token : Option < FeeToken > ,
1416
1517 /// Max fee for the transaction. If not provided, will be automatically estimated.
@@ -50,9 +52,9 @@ impl From<ScriptFeeSettings> for FeeArgs {
5052
5153impl FeeArgs {
5254 #[ must_use]
53- pub fn fee_token ( self , fee_token : Option < FeeToken > ) -> Self {
55+ pub fn fee_token ( self , fee_token : FeeToken ) -> Self {
5456 Self {
55- fee_token : fee_token . or ( self . fee_token ) ,
57+ fee_token : Some ( fee_token) ,
5658 ..self
5759 }
5860 }
@@ -138,9 +140,10 @@ impl FeeArgs {
138140 }
139141}
140142
141- #[ derive( ValueEnum , Debug , Clone , PartialEq ) ]
143+ #[ derive( ValueEnum , Default , Debug , Clone , PartialEq ) ]
142144pub enum FeeToken {
143145 Eth ,
146+ #[ default]
144147 Strk ,
145148}
146149
@@ -187,7 +190,7 @@ impl From<ScriptFeeSettings> for FeeSettings {
187190
188191pub trait PayableTransaction {
189192 fn error_message ( & self , token : & str , version : & str ) -> String ;
190- fn validate ( & self ) -> Result < ( ) > ;
193+ fn validate_and_get_token ( & self ) -> Result < FeeToken > ;
191194 fn token_from_version ( & self ) -> Option < FeeToken > ;
192195}
193196
@@ -199,21 +202,27 @@ macro_rules! impl_payable_transaction {
199202 $err_func( token, version)
200203 }
201204
202- fn validate ( & self ) -> Result <( ) > {
205+ fn validate_and_get_token ( & self ) -> Result <FeeToken > {
203206 match (
204207 & self . token_from_version( ) ,
205208 & self . fee_args. fee_token,
206209 ) {
207210 ( Some ( token_from_version) , Some ( token) ) if token_from_version != token => {
208211 Err ( anyhow!( self . error_message(
209- & format!( "{token :?}" ) . to_lowercase( ) ,
212+ & format!( "{:?}" , token ) . to_lowercase( ) ,
210213 & format!( "{:?}" , self . version. clone( ) . unwrap( ) ) . to_lowercase( )
211214 ) ) )
212- }
215+ } ,
216+ ( None , Some ( token) ) => {
217+ Ok ( token. clone( ) )
218+ } ,
219+ ( Some ( token_from_version) , None ) => {
220+ Ok ( token_from_version. clone( ) )
221+ } ,
213222 ( None , None ) => {
214- Err ( anyhow! ( "Either --fee-token or --version must be provided" ) )
215- }
216- _ => Ok ( ( ) ) ,
223+ Ok ( FeeToken :: default ( ) )
224+ } ,
225+ _ => Ok ( self . fee_args . fee_token . clone ( ) . unwrap_or_else ( || self . token_from_version ( ) . unwrap_or_else ( || unreachable! ( ) ) ) )
217226 }
218227 }
219228
@@ -225,3 +234,30 @@ macro_rules! impl_payable_transaction {
225234 }
226235 } ;
227236}
237+
238+ impl FromStr for FeeToken {
239+ type Err = String ;
240+
241+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
242+ match s. to_lowercase ( ) . as_str ( ) {
243+ "eth" => Ok ( FeeToken :: Eth ) ,
244+ "strk" => Ok ( FeeToken :: Strk ) ,
245+ _ => Err ( String :: from ( "Possible values: eth, strk" ) ) ,
246+ }
247+ }
248+ }
249+
250+ fn parse_fee_token ( s : & str ) -> Result < FeeToken , String > {
251+ let deprecation_message = "Specifying '--fee-token' flag is deprecated and will be removed in the future. Use '--version' instead" ;
252+ print_as_warning ( & Error :: msg ( deprecation_message) ) ;
253+
254+ let parsed_token: FeeToken = s. parse ( ) ?;
255+
256+ if parsed_token == FeeToken :: Eth {
257+ print_as_warning ( & Error :: msg (
258+ "Eth transactions will stop being supported in the future due to 'SNIP-16'" ,
259+ ) ) ;
260+ }
261+
262+ Ok ( parsed_token)
263+ }
0 commit comments