@ -806,42 +806,62 @@ UniValue estimatesmartfee(const JSONRPCRequest& request)
{
if ( request . fHelp | | request . params . size ( ) < 1 | | request . params . size ( ) > 2 )
throw std : : runtime_error (
" estimatesmartfee nblocks ( conservative )\n "
" estimatesmartfee nblocks ( \" estimate_mode \" )\n "
" \n Estimates the approximate fee per kilobyte needed for a transaction to begin \n "
" confirmation within nblocks blocks if possible and return the number of blocks \n "
" for which the estimate is valid. Uses virtual transaction size as defined \n "
" in BIP 141 (witness data is discounted). \n "
" \n Arguments: \n "
" 1. nblocks (numeric) \n "
" 2. conservative (bool, optional, default=true) Whether to return a more conservative estimate which \n "
" also satisfies a longer history. A conservative estimate potentially returns a higher \n "
" feerate and is more likely to be sufficient for the desired target, but is not as \n "
" responsive to short term drops in the prevailing fee market \n "
" 1. nblocks (numeric) Confirmation target in blocks (1 - 1008) \n "
" 2. \" estimate_mode \" (string, optional, default=CONSERVATIVE) The fee estimate mode. \n "
" Whether to return a more conservative estimate which also satisfies \n "
" a longer history. A conservative estimate potentially returns a \n "
" higher feerate and is more likely to be sufficient for the desired \n "
" target, but is not as responsive to short term drops in the \n "
" prevailing fee market. Must be one of: \n "
" \" UNSET \" (defaults to CONSERVATIVE) \n "
" \" ECONOMICAL \" \n "
" \" CONSERVATIVE \" \n "
" \n Result: \n "
" { \n "
" \" feerate \" : x.x, (numeric) estimate fee-per-kilobyte (in BTC) \n "
" \" feerate \" : x.x, (numeric, optional) estimate fee-per-kilobyte (in BTC) \n "
" \" errors \" : [ str... ] (json array of strings, optional) Errors encountered during processing \n "
" \" blocks \" : n (numeric) block number where estimate was found \n "
" } \n "
" \n "
" A negative value is returned if not enough transactions and blocks \n "
" The request target will be clamped between 2 and the highest target \n "
" fee estimation is able to return based on how long it has been running. \n "
" An error is returned if not enough transactions and blocks \n "
" have been observed to make an estimate for any number of blocks. \n "
" \n Example: \n "
+ HelpExampleCli ( " estimatesmartfee " , " 6 " )
) ;
RPCTypeCheck ( request . params , { UniValue : : VNUM }) ;
RPCTypeCheck ( request . params , { UniValue : : VNUM , UniValue : : VSTR }) ;
RPCTypeCheckArgument ( request . params [ 0 ] , UniValue : : VNUM ) ;
int nBlocks = request . params [ 0 ] . get_int ( ) ;
if ( nBlocks < 1 | | ( unsigned int ) nBlocks > : : feeEstimator . HighestTargetTracked ( FeeEstimateHorizon : : LONG_HALFLIFE ) ) {
throw JSONRPCError ( RPC_INVALID_PARAMETER , " Invalid nblocks " ) ;
}
bool conservative = true ;
if ( request . params . size ( ) > 1 & & ! request . params [ 1 ] . isNull ( ) ) {
RPCTypeCheckArgument ( request . params [ 1 ] , UniValue : : VBOOL ) ;
conservative = request . params [ 1 ] . get_bool ( ) ;
FeeEstimateMode fee_mode ;
if ( ! FeeModeFromString ( request . params [ 1 ] . get_str ( ) , fee_mode ) ) {
throw JSONRPCError ( RPC_INVALID_PARAMETER , " Invalid estimate_mode parameter " ) ;
}
if ( fee_mode = = FeeEstimateMode : : ECONOMICAL ) conservative = false ;
}
UniValue result ( UniValue : : VOBJ ) ;
UniValue errors ( UniValue : : VARR ) ;
FeeCalculation feeCalc ;
CFeeRate feeRate = : : feeEstimator . estimateSmartFee ( nBlocks , & feeCalc , conservative ) ;
result . push_back ( Pair ( " feerate " , feeRate = = CFeeRate ( 0 ) ? - 1.0 : ValueFromAmount ( feeRate . GetFeePerK ( ) ) ) ) ;
if ( feeRate ! = CFeeRate ( 0 ) ) {
result . push_back ( Pair ( " feerate " , ValueFromAmount ( feeRate . GetFeePerK ( ) ) ) ) ;
} else {
errors . push_back ( " Insufficient data or no feerate found " ) ;
result . push_back ( Pair ( " errors " , errors ) ) ;
}
result . push_back ( Pair ( " blocks " , feeCalc . returnedTarget ) ) ;
return result ;
}
@ -889,7 +909,7 @@ UniValue estimaterawfee(const JSONRPCRequest& request)
+ HelpExampleCli ( " estimaterawfee " , " 6 0.9 " )
) ;
RPCTypeCheck ( request . params , { UniValue : : VNUM , UniValue : : VNUM , UniValue : : VNUM }, true ) ;
RPCTypeCheck ( request . params , { UniValue : : VNUM , UniValue : : VNUM }, true ) ;
RPCTypeCheckArgument ( request . params [ 0 ] , UniValue : : VNUM ) ;
int nBlocks = request . params [ 0 ] . get_int ( ) ;
if ( nBlocks < 1 | | ( unsigned int ) nBlocks > : : feeEstimator . HighestTargetTracked ( FeeEstimateHorizon : : LONG_HALFLIFE ) ) {
@ -963,7 +983,7 @@ static const CRPCCommand commands[] =
{ " generating " , " generatetoaddress " , & generatetoaddress , true , { " nblocks " , " address " , " maxtries " } } ,
{ " util " , " estimatefee " , & estimatefee , true , { " nblocks " } } ,
{ " util " , " estimatesmartfee " , & estimatesmartfee , true , { " nblocks " , " conservativ e" } } ,
{ " util " , " estimatesmartfee " , & estimatesmartfee , true , { " nblocks " , " estimate_mod e" } } ,
{ " hidden " , " estimaterawfee " , & estimaterawfee , true , { " nblocks " , " threshold " } } ,
} ;