Wait until after find_unspent_notes() to lock notes in z_sendmany

This commit is contained in:
Duke
2025-05-30 08:40:42 -04:00
parent 88143a87fc
commit dba46b2ba6

View File

@@ -120,11 +120,6 @@ AsyncRPCOperation_sendmany::AsyncRPCOperation_sendmany(
LogPrint("zrpc", "%s: z_sendmany initialized\n", getId());
}
// Lock UTXOs
lock_utxos();
// Lock shielded input notes
lock_notes();
LogPrint("zrpc", "%s: z_sendmany input notes locked\n", getId());
}
AsyncRPCOperation_sendmany::~AsyncRPCOperation_sendmany() {
@@ -240,6 +235,15 @@ bool AsyncRPCOperation_sendmany::main_impl() {
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Insufficient funds, no unspent notes found for zaddr from address.");
}
// Now that find_unspent_notes() has run, we now know which
// notes need to be locked
// Lock UTXOs
lock_utxos();
// Lock shielded input notes
lock_notes();
LogPrint("zrpc", "%s: z_sendmany input notes locked\n", getId());
CAmount t_inputs_total = 0;
for (SendManyInputUTXO & t : t_inputs_) {
t_inputs_total += std::get<2>(t);
@@ -802,7 +806,7 @@ void AsyncRPCOperation_sendmany::unlock_utxos() {
// Lock input notes
void AsyncRPCOperation_sendmany::lock_notes() {
LOCK2(cs_main, pwalletMain->cs_wallet);
fprintf(stderr,"%s: found %d notes to lock\n", z_sapling_inputs_.count() );
fprintf(stderr,"%s: found %lu notes to lock\n", __func__, z_sapling_inputs_.size() );
for (auto note : z_sapling_inputs_) {
pwalletMain->LockNote(note.op);
}
@@ -811,7 +815,7 @@ void AsyncRPCOperation_sendmany::lock_notes() {
// Unlock input notes
void AsyncRPCOperation_sendmany::unlock_notes() {
LOCK2(cs_main, pwalletMain->cs_wallet);
fprintf(stderr,"%s: found %d notes to unlock\n", z_sapling_inputs_.count() );
fprintf(stderr,"%s: found %lu notes to unlock\n", __func__, z_sapling_inputs_.size() );
for (auto note : z_sapling_inputs_) {
pwalletMain->UnlockNote(note.op);
}