mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-04-04 12:55:02 +02:00
Merge #16373: bumpfee: Return PSBT when wallet has privkeys disabled
091a876664Test watchonly wallet bumpfee with PSBT return (Gregory Sanders)e9b4f9419cbumpfee: Return PSBT when wallet has privkeys disabled (Gregory Sanders)75a5e478b6Change bumpfee to use watch-only funds for legacy watchonly wallets (Gregory Sanders) Pull request description: The main use-case here is for using with watch-only wallets with PSBT-signing cold wallets of all kinds. ACKs for top commit: achow101: ACK091a876664Sjors: Tested ACK091a876664meshcollider: utACK091a876664Tree-SHA512: f7cf663e1af0b029e5c99eac88c5fdc3bc9e9a3841da8a608e8a9957e9bcf6a78864b8c2706fcaf78a480ffe11badd80c4fad29f97c0bb929e0470fafda5c22e
This commit is contained in:
@@ -3365,10 +3365,11 @@ static UniValue bumpfee(const JSONRPCRequest& request)
|
||||
},
|
||||
RPCResult{
|
||||
"{\n"
|
||||
" \"txid\": \"value\", (string) The id of the new transaction\n"
|
||||
" \"origfee\": n, (numeric) Fee of the replaced transaction\n"
|
||||
" \"fee\": n, (numeric) Fee of the new transaction\n"
|
||||
" \"errors\": [ str... ] (json array of strings) Errors encountered during processing (may be empty)\n"
|
||||
" \"psbt\": \"psbt\", (string) The base64-encoded unsigned PSBT of the new transaction. Only returned when wallet private keys are disabled.\n"
|
||||
" \"txid\": \"value\", (string) The id of the new transaction. Only returned when wallet private keys are enabled.\n"
|
||||
" \"origfee\": n, (numeric) The fee of the replaced transaction.\n"
|
||||
" \"fee\": n, (numeric) The fee of the new transaction.\n"
|
||||
" \"errors\": [ str... ] (json array of strings) Errors encountered during processing (may be empty).\n"
|
||||
"}\n"
|
||||
},
|
||||
RPCExamples{
|
||||
@@ -3380,10 +3381,12 @@ static UniValue bumpfee(const JSONRPCRequest& request)
|
||||
RPCTypeCheck(request.params, {UniValue::VSTR, UniValue::VOBJ});
|
||||
uint256 hash(ParseHashV(request.params[0], "txid"));
|
||||
|
||||
CCoinControl coin_control;
|
||||
coin_control.fAllowWatchOnly = pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS);
|
||||
// optional parameters
|
||||
CAmount totalFee = 0;
|
||||
CCoinControl coin_control;
|
||||
coin_control.m_signal_bip125_rbf = true;
|
||||
|
||||
if (!request.params[1].isNull()) {
|
||||
UniValue options = request.params[1];
|
||||
RPCTypeCheckObj(options,
|
||||
@@ -3468,17 +3471,32 @@ static UniValue bumpfee(const JSONRPCRequest& request)
|
||||
}
|
||||
}
|
||||
|
||||
// sign bumped transaction
|
||||
if (!feebumper::SignTransaction(*pwallet, mtx)) {
|
||||
throw JSONRPCError(RPC_WALLET_ERROR, "Can't sign transaction.");
|
||||
}
|
||||
// commit the bumped transaction
|
||||
uint256 txid;
|
||||
if (feebumper::CommitTransaction(*pwallet, hash, std::move(mtx), errors, txid) != feebumper::Result::OK) {
|
||||
throw JSONRPCError(RPC_WALLET_ERROR, errors[0]);
|
||||
}
|
||||
UniValue result(UniValue::VOBJ);
|
||||
result.pushKV("txid", txid.GetHex());
|
||||
|
||||
// If wallet private keys are enabled, return the new transaction id,
|
||||
// otherwise return the base64-encoded unsigned PSBT of the new transaction.
|
||||
if (!pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
|
||||
if (!feebumper::SignTransaction(*pwallet, mtx)) {
|
||||
throw JSONRPCError(RPC_WALLET_ERROR, "Can't sign transaction.");
|
||||
}
|
||||
|
||||
uint256 txid;
|
||||
if (feebumper::CommitTransaction(*pwallet, hash, std::move(mtx), errors, txid) != feebumper::Result::OK) {
|
||||
throw JSONRPCError(RPC_WALLET_ERROR, errors[0]);
|
||||
}
|
||||
|
||||
result.pushKV("txid", txid.GetHex());
|
||||
} else {
|
||||
PartiallySignedTransaction psbtx(mtx);
|
||||
bool complete = false;
|
||||
const TransactionError err = FillPSBT(pwallet, psbtx, complete, SIGHASH_ALL, false /* sign */, true /* bip32derivs */);
|
||||
CHECK_NONFATAL(err == TransactionError::OK);
|
||||
CHECK_NONFATAL(!complete);
|
||||
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
|
||||
ssTx << psbtx;
|
||||
result.pushKV("psbt", EncodeBase64(ssTx.str()));
|
||||
}
|
||||
|
||||
result.pushKV("origfee", ValueFromAmount(old_fee));
|
||||
result.pushKV("fee", ValueFromAmount(new_fee));
|
||||
UniValue result_errors(UniValue::VARR);
|
||||
|
||||
Reference in New Issue
Block a user