1
1
//! The command line argument.
2
2
3
3
use ckb_sdk:: { rpc:: CkbRpcClient , types:: NetworkType } ;
4
- use clap:: { Parser , Subcommand } ;
4
+ use ckb_types:: core:: FeeRate ;
5
+ use clap:: { Args , Parser , Subcommand } ;
5
6
use clap_verbosity_flag:: { InfoLevel , Verbosity } ;
6
7
use url:: Url ;
7
8
8
9
use crate :: {
9
10
components:: BitcoinClient ,
11
+ prelude:: * ,
10
12
result:: Result ,
11
13
utilities:: { value_parsers, Key256Bits } ,
12
14
} ;
@@ -66,11 +68,10 @@ pub struct CkbArgs {
66
68
value_parser = value_parsers:: NetworkTypeValueParser ,
67
69
default_value = "testnet"
68
70
) ]
69
- pub network : NetworkType ,
71
+ pub ( crate ) network : NetworkType ,
70
72
71
- /// The fee rate for CKB transactions.
72
- #[ arg( long = "ckb-fee-rate" , default_value = "1000" ) ]
73
- pub ( crate ) fee_rate : u64 ,
73
+ #[ command( flatten) ]
74
+ pub ( crate ) fee_rate : FeeRateArgs ,
74
75
75
76
/// A binary file, which contains a secp256k1 private key.
76
77
/// This private key will be used to provide all CKBytes.
@@ -92,7 +93,39 @@ pub struct CkbRoArgs {
92
93
value_parser = value_parsers:: NetworkTypeValueParser ,
93
94
default_value = "testnet"
94
95
) ]
95
- pub network : NetworkType ,
96
+ pub ( crate ) network : NetworkType ,
97
+ }
98
+
99
+ #[ derive( Args ) ]
100
+ #[ group( multiple = false ) ]
101
+ pub struct FeeRateArgs {
102
+ /// The fixed fee rate for CKB transactions.
103
+ #[ arg(
104
+ group = "fixed-fee-rate" ,
105
+ conflicts_with = "dynamic-fee-rate" ,
106
+ long = "ckb-fee-rate" ,
107
+ default_value = "1000"
108
+ ) ]
109
+ fixed_value : u64 ,
110
+
111
+ /// [Experimental] Enable dynamic fee rate for CKB transactions.
112
+ ///
113
+ /// The actual fee rate will be the `median` fee rate which is fetched through the CKB RPC method `get_fee_rate_statistics`.
114
+ ///
115
+ /// For security, a hard limit is required.
116
+ /// When the returned dynamic fee rate is larger than the hard limit, the hard limit will be used.
117
+ ///
118
+ /// ### Warning
119
+ ///
120
+ /// Users have to make sure the remote CKB node they used are trustsed.
121
+ ///
122
+ /// Ref: <https://github.com/nervosnetwork/ckb/tree/v0.114.0/rpc#method-get_fee_rate_statistics>
123
+ #[ arg(
124
+ group = "dynamic-fee-rate" ,
125
+ conflicts_with = "fixed-fee-rate" ,
126
+ long = "enable-dynamic-ckb-fee-rate-with-limit"
127
+ ) ]
128
+ limit_for_dynamic : Option < u64 > ,
96
129
}
97
130
98
131
#[ derive( Parser ) ]
@@ -160,6 +193,29 @@ impl CkbArgs {
160
193
pub fn client ( & self ) -> CkbRpcClient {
161
194
CkbRpcClient :: new ( self . ckb_endpoint . as_str ( ) )
162
195
}
196
+
197
+ pub fn fee_rate ( & self ) -> Result < u64 > {
198
+ let value = if let Some ( limit) = self . fee_rate . limit_for_dynamic {
199
+ let dynamic = self . client ( ) . dynamic_fee_rate ( ) ?;
200
+ log:: info!( "CKB fee rate: {} (dynamic)" , FeeRate ( dynamic) ) ;
201
+ if dynamic > limit {
202
+ log:: warn!(
203
+ "dynamic CKB fee rate {} is too large, it seems unreasonable;\
204
+ so the upper limit {} will be used",
205
+ FeeRate ( dynamic) ,
206
+ FeeRate ( limit)
207
+ ) ;
208
+ limit
209
+ } else {
210
+ dynamic
211
+ }
212
+ } else {
213
+ let fixed = self . fee_rate . fixed_value ;
214
+ log:: info!( "CKB fee rate: {} (fixed)" , FeeRate ( fixed) ) ;
215
+ fixed
216
+ } ;
217
+ Ok ( value)
218
+ }
163
219
}
164
220
165
221
impl CkbRoArgs {
0 commit comments