Add sendall RPC née sweep
Motivation
Currently, the wallet uses a fSubtractFeeAmount (SFFO) flag on the
recipients objects for all forms of sending calls. According to the
commit discussion, this flag was chiefly introduced to permit sweeping
without manually calculating the fees of transactions. However, the flag
leads to unintuitive behavior and makes it more complicated to test
many wallet RPCs exhaustively. We proposed to introduce a dedicated
sendall
RPC with the intention to cover this functionality.
Since the proposal, it was discovered in further discussion that our
proposed sendall
rpc and SFFO have subtly different scopes of
operation.
• sendall:
Use given UTXOs to pay a destination the remainder after fees.
• SFFO:
Use a given budget to pay an address the remainder after fees.
While sendall
will simplify cases of spending a given set of
UTXOs such as paying the value from one or more specific UTXOs, emptying
a wallet, or burning dust, we realized that there are some cases in
which SFFO is used to pay other parties from a limited budget,
which can often lead to the creation of change outputs. This cannot be
easily replicated using sendall
as it would require manual
computation of the appropriate change amount.
As such, sendall cannot replace all uses of SFFO, but it still has a different use case and will aid in simplifying some wallet calls and numerous wallet tests.
Sendall call details
The proposed sendall call builds a transaction from a specific
subset of the wallet’s UTXO pool (by default all of them) and assigns
the funds to one or more receivers. Receivers can either be specified
with a given amount or receive an equal share of the remaining
unassigned funds. At least one recipient must be provided without
assigned amount to collect the remainder. The sendall
call will
never create change. The call has a send_max
option that changes the
default behavior of spending all UTXOs (“no UTXO left behind”), to
maximizing the output amount of the transaction by skipping uneconomic
UTXOs. The send_max
option is incompatible with providing a specific
set of inputs.
Edit: Replaced OP with latest commit message to reflect my updated motivation of the proposal.