Skip to content

Commit

Permalink
wallet: automatic birth time update
Browse files Browse the repository at this point in the history
As the user could have imported a descriptor with
a newer timestamp (by blindly setting 'timestamp=now'),
the wallet needs to update the birth time when it detects
a transaction older than the oldest descriptor timestamp.
  • Loading branch information
furszy committed Nov 20, 2023
1 parent 573ae3d commit 3f0b677
Showing 1 changed file with 8 additions and 1 deletion.
9 changes: 8 additions & 1 deletion src/wallet/wallet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1080,6 +1080,9 @@ CWalletTx* CWallet::AddToWallet(CTransactionRef tx, const TxState& state, const
wtx.m_it_wtxOrdered = wtxOrdered.insert(std::make_pair(wtx.nOrderPos, &wtx));
wtx.nTimeSmart = ComputeTimeSmart(wtx, rescanning_old_block);
AddToSpends(wtx, &batch);

// Update birth time when tx time is older than it.
FirstKeyTimeChanged(/*spkm=*/nullptr, wtx.GetTxTime());
}

if (!fInsertedNew)
Expand Down Expand Up @@ -1199,6 +1202,10 @@ bool CWallet::LoadToWallet(const uint256& hash, const UpdateWalletTxFn& fill_wtx
}
}
}

// Update birth time when tx time is older than it.
FirstKeyTimeChanged(/*spkm=*/nullptr, wtx.GetTxTime());

return true;
}

Expand Down Expand Up @@ -3087,7 +3094,7 @@ std::shared_ptr<CWallet> CWallet::Create(WalletContext& context, const std::stri
int64_t time = spk_man->GetTimeFirstKey();
if (!time_first_key || time < *time_first_key) time_first_key = time;
}
if (time_first_key) walletInstance->m_birth_time = *time_first_key;
if (time_first_key) walletInstance->FirstKeyTimeChanged(/*spkm=*/nullptr, *time_first_key);

if (chain && !AttachChain(walletInstance, *chain, rescan_required, error, warnings)) {
return nullptr;
Expand Down

0 comments on commit 3f0b677

Please sign in to comment.