Skip to content

Commit

Permalink
wallet,rpc: Add ParseOutputs function
Browse files Browse the repository at this point in the history
Move the options parsing logic for SFFO out of FundTransaction into this
function.

Copy the options parsing logic from AddOutputs (called in
ConstructTransaction) into this function.

This sets us up to use ParseRecipients in the next commit and remove
SFFO logic from FundTransaction.
  • Loading branch information
josibake committed Dec 11, 2023
1 parent 5270f96 commit ef1e445
Showing 1 changed file with 32 additions and 0 deletions.
32 changes: 32 additions & 0 deletions src/wallet/rpc/spend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,38 @@ std::set<int> ParseSubtractFeeFromOutputs(const UniValue& subtract_fee_from_outp
return set_sffo;
}

std::vector<CRecipient> ParseOutputs(const UniValue& outputs_in, const UniValue& options)
{
if (outputs_in.isNull()) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, output argument must be non-null");
}

const bool outputs_is_obj = outputs_in.isObject();
UniValue outputs = outputs_is_obj ? outputs_in.get_obj() : outputs_in.get_array();

if (!outputs_is_obj) {
// Translate array of key-value pairs into dict
UniValue outputs_dict = UniValue(UniValue::VOBJ);
for (size_t i = 0; i < outputs.size(); ++i) {
const UniValue& output = outputs[i];
if (!output.isObject()) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, key-value pair not an object as expected");
}
if (output.size() != 1) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, key-value pair must contain exactly one key");
}
outputs_dict.pushKVs(output);
}
outputs = std::move(outputs_dict);
}
std::set<int> set_sffo;
if (options.exists("subtractFeeFromOutputs") || options.exists("subtract_fee_from_outputs") ) {
UniValue sffo = (options.exists("subtract_fee_from_outputs") ? options["subtract_fee_from_outputs"] : options["subtractFeeFromOutputs"]).get_array();
set_sffo = ParseSubtractFeeFromOutputs(sffo, outputs.getKeys());
}
return ParseRecipients(outputs, set_sffo);
}

static void InterpretFeeEstimationInstructions(const UniValue& conf_target, const UniValue& estimate_mode, const UniValue& fee_rate, UniValue& options)
{
if (options.exists("conf_target") || options.exists("estimate_mode")) {
Expand Down

0 comments on commit ef1e445

Please sign in to comment.