New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[RPC] add feerate option to fundrawtransaction #7967
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2458,6 +2458,7 @@ UniValue fundrawtransaction(const UniValue& params, bool fHelp) | |
" \"changePosition\" (numeric, optional, default random) The index of the change output\n" | ||
" \"includeWatching\" (boolean, optional, default false) Also select inputs which are watch only\n" | ||
" \"lockUnspents\" (boolean, optional, default false) Lock selected unspent outputs\n" | ||
" \"feeRate\" (numeric, optional, default 0=estimate) Set a specific feerate (fee per KB)\n" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. the default is not "estimate" but whatever happens to be set by the user on startup or after startup. Either make it |
||
" }\n" | ||
" for backward compatibility: passing in a true instead of an object will result in {\"includeWatching\":true}\n" | ||
"\nResult:\n" | ||
|
@@ -2484,6 +2485,7 @@ UniValue fundrawtransaction(const UniValue& params, bool fHelp) | |
int changePosition = -1; | ||
bool includeWatching = false; | ||
bool lockUnspents = false; | ||
CFeeRate feeRate = CFeeRate(0); | ||
|
||
if (params.size() > 1) { | ||
if (params[1].type() == UniValue::VBOOL) { | ||
|
@@ -2495,7 +2497,7 @@ UniValue fundrawtransaction(const UniValue& params, bool fHelp) | |
|
||
UniValue options = params[1]; | ||
|
||
RPCTypeCheckObj(options, boost::assign::map_list_of("changeAddress", UniValue::VSTR)("changePosition", UniValue::VNUM)("includeWatching", UniValue::VBOOL)("lockUnspents", UniValue::VBOOL), true, true); | ||
RPCTypeCheckObj(options, boost::assign::map_list_of("changeAddress", UniValue::VSTR)("changePosition", UniValue::VNUM)("includeWatching", UniValue::VBOOL)("lockUnspents", UniValue::VBOOL)("feeRate", UniValue::VNUM), true, true); | ||
|
||
if (options.exists("changeAddress")) { | ||
CBitcoinAddress address(options["changeAddress"].get_str()); | ||
|
@@ -2514,6 +2516,9 @@ UniValue fundrawtransaction(const UniValue& params, bool fHelp) | |
|
||
if (options.exists("lockUnspents")) | ||
lockUnspents = options["lockUnspents"].get_bool(); | ||
|
||
if (options.exists("feeRate")) | ||
feeRate = CFeeRate(options["feeRate"].get_real()); | ||
} | ||
} | ||
|
||
|
@@ -2529,16 +2534,16 @@ UniValue fundrawtransaction(const UniValue& params, bool fHelp) | |
throw JSONRPCError(RPC_INVALID_PARAMETER, "changePosition out of bounds"); | ||
|
||
CMutableTransaction tx(origTx); | ||
CAmount nFee; | ||
CAmount nFeeOut; | ||
string strFailReason; | ||
|
||
if(!pwalletMain->FundTransaction(tx, nFee, changePosition, strFailReason, includeWatching, lockUnspents, changeAddress)) | ||
if(!pwalletMain->FundTransaction(tx, nFeeOut, feeRate, changePosition, strFailReason, includeWatching, lockUnspents, changeAddress)) | ||
throw JSONRPCError(RPC_INTERNAL_ERROR, strFailReason); | ||
|
||
UniValue result(UniValue::VOBJ); | ||
result.push_back(Pair("hex", EncodeHexTx(tx))); | ||
result.push_back(Pair("changepos", changePosition)); | ||
result.push_back(Pair("fee", ValueFromAmount(nFee))); | ||
result.push_back(Pair("fee", ValueFromAmount(nFeeOut))); | ||
|
||
return result; | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1918,7 +1918,7 @@ bool CWallet::SelectCoins(const vector<COutput>& vAvailableCoins, const CAmount& | |
return res; | ||
} | ||
|
||
bool CWallet::FundTransaction(CMutableTransaction& tx, CAmount& nFeeRet, int& nChangePosInOut, std::string& strFailReason, bool includeWatching, bool lockUnspents, const CTxDestination& destChange) | ||
bool CWallet::FundTransaction(CMutableTransaction& tx, CAmount& nFeeRet, const CFeeRate& specificFeeRate, int& nChangePosInOut, std::string& strFailReason, bool includeWatching, bool lockUnspents, const CTxDestination& destChange) | ||
{ | ||
vector<CRecipient> vecSend; | ||
|
||
|
@@ -1933,6 +1933,8 @@ bool CWallet::FundTransaction(CMutableTransaction& tx, CAmount& nFeeRet, int& nC | |
coinControl.destChange = destChange; | ||
coinControl.fAllowOtherInputs = true; | ||
coinControl.fAllowWatchOnly = includeWatching; | ||
coinControl.nFeeRate = specificFeeRate; | ||
|
||
BOOST_FOREACH(const CTxIn& txin, tx.vin) | ||
coinControl.Select(txin.prevout); | ||
|
||
|
@@ -2242,6 +2244,8 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wt | |
if (coinControl && nFeeNeeded > 0 && coinControl->nMinimumTotalFee > nFeeNeeded) { | ||
nFeeNeeded = coinControl->nMinimumTotalFee; | ||
} | ||
if (coinControl && coinControl->nFeeRate > CFeeRate(0)) | ||
nFeeNeeded = coinControl->nFeeRate.GetFee(nBytes); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Concept ACK. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes. We could use an extra boolean (like |
||
|
||
// If we made it here and we aren't even able to meet the relay fee on the next pass, give up | ||
// because we must be at the maximum allowed fee. | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: empty arg.
Nit: Missing comment mentioning that
min_relay_tx_fee=1000
is used.(Comments help to identify the issue when something breaks)