Try harder to avoid selecting locked notes to spend
This commit is contained in:
@@ -129,8 +129,9 @@ void AsyncRPCOperation_sendmany::main() {
|
|||||||
|
|
||||||
// clean up locks if we are cancelled
|
// clean up locks if we are cancelled
|
||||||
if (isCancelled()) {
|
if (isCancelled()) {
|
||||||
unlock_utxos();
|
// We are more likely to be spending notes, so unlock them first
|
||||||
unlock_notes();
|
unlock_notes();
|
||||||
|
unlock_utxos();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,9 +193,9 @@ void AsyncRPCOperation_sendmany::main() {
|
|||||||
}
|
}
|
||||||
LogPrintf("%s",s);
|
LogPrintf("%s",s);
|
||||||
|
|
||||||
unlock_utxos(); // clean up
|
|
||||||
unlock_notes(); // clean up
|
unlock_notes(); // clean up
|
||||||
LogPrint("zrpc", "%s: z_sendmany input notes unlocked\n", getId());
|
unlock_utxos(); // clean up
|
||||||
|
LogPrint("zrpc", "%s: z_sendmany input notes+utxos unlocked\n", getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notes:
|
// Notes:
|
||||||
@@ -411,7 +412,14 @@ bool AsyncRPCOperation_sendmany::main_impl() {
|
|||||||
// saplingNoteInputs_ is a list of notes we will actually spend
|
// saplingNoteInputs_ is a list of notes we will actually spend
|
||||||
// and need to lock. It is a subset of z_sapling_inputs_
|
// and need to lock. It is a subset of z_sapling_inputs_
|
||||||
for (const auto t : z_sapling_inputs_) {
|
for (const auto t : z_sapling_inputs_) {
|
||||||
// keep track of notes to lock later on in lock_notes()
|
// locked status of these inputs may have changed, check again
|
||||||
|
const bool isLocked = pwalletMain->IsLockedNote(t.op);
|
||||||
|
if (isLocked) {
|
||||||
|
LogPrintf("%s: skipping locked note %s\n", __func__, t.op.hash.ToString().substr(0,10).c_str());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// keep track of currently unlocked notes to lock later on in lock_notes()
|
||||||
saplingNoteInputs_.emplace_back(t.op, t.note, t.note.value() );
|
saplingNoteInputs_.emplace_back(t.op, t.note, t.note.value() );
|
||||||
|
|
||||||
ops.push_back(t.op);
|
ops.push_back(t.op);
|
||||||
@@ -658,7 +666,7 @@ bool AsyncRPCOperation_sendmany::find_utxos(bool fAcceptCoinbase=false) {
|
|||||||
return t_inputs_.size() > 0;
|
return t_inputs_.size() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// find unspent notes which are also unlocked
|
||||||
bool AsyncRPCOperation_sendmany::find_unspent_notes() {
|
bool AsyncRPCOperation_sendmany::find_unspent_notes() {
|
||||||
if(fZdebug)
|
if(fZdebug)
|
||||||
LogPrintf("%s: For address %s depth=%d\n", __FUNCTION__, fromaddress_.c_str(), mindepth_);
|
LogPrintf("%s: For address %s depth=%d\n", __FUNCTION__, fromaddress_.c_str(), mindepth_);
|
||||||
@@ -666,11 +674,19 @@ bool AsyncRPCOperation_sendmany::find_unspent_notes() {
|
|||||||
std::vector<SaplingNoteEntry> saplingEntries;
|
std::vector<SaplingNoteEntry> saplingEntries;
|
||||||
{
|
{
|
||||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
|
// GetFilteredNotes ignores locked notes by default
|
||||||
pwalletMain->GetFilteredNotes(saplingEntries, fromaddress_, mindepth_);
|
pwalletMain->GetFilteredNotes(saplingEntries, fromaddress_, mindepth_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (auto entry : saplingEntries) {
|
for (auto entry : saplingEntries) {
|
||||||
|
// locked status of note may have changed since GetFilteredNotes()
|
||||||
|
// returned data, so we check again
|
||||||
|
const bool isLocked = pwalletMain->IsLockedNote(entry.op);
|
||||||
|
if (isLocked) {
|
||||||
|
LogPrintf("%s: skipping locked note %s:%d\n", __func__, entry.op.hash.ToString().substr(0,10).c_str(), entry.op.n);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
z_sapling_inputs_.push_back(entry);
|
z_sapling_inputs_.push_back(entry);
|
||||||
|
|
||||||
std::string data(entry.memo.begin(), entry.memo.end());
|
std::string data(entry.memo.begin(), entry.memo.end());
|
||||||
|
|||||||
@@ -4942,8 +4942,8 @@ void CWallet::GetFilteredNotes(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// skip locked notes
|
// skip locked notes
|
||||||
// TODO: Add locking for Sapling notes -> done
|
|
||||||
if (ignoreLocked && IsLockedNote(op)) {
|
if (ignoreLocked && IsLockedNote(op)) {
|
||||||
|
LogPrintf("%s: skipping locked note %s\n", __func__, op.hash.ToString().substr(0,10).c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user