mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-25 02:33:24 -03:00
wallet, refactor: Add CWalletTx::updateState function
No change in behavior, this just moves code which updates transaction state to a new method so it can be used after offline processes such as wallet migration.
This commit is contained in:
parent
d724bb5291
commit
262a78b133
3 changed files with 34 additions and 17 deletions
|
@ -4,6 +4,10 @@
|
|||
|
||||
#include <wallet/transaction.h>
|
||||
|
||||
#include <interfaces/chain.h>
|
||||
|
||||
using interfaces::FoundBlock;
|
||||
|
||||
namespace wallet {
|
||||
bool CWalletTx::IsEquivalentTo(const CWalletTx& _tx) const
|
||||
{
|
||||
|
@ -25,6 +29,27 @@ int64_t CWalletTx::GetTxTime() const
|
|||
return n ? n : nTimeReceived;
|
||||
}
|
||||
|
||||
void CWalletTx::updateState(interfaces::Chain& chain)
|
||||
{
|
||||
bool active;
|
||||
auto lookup_block = [&](const uint256& hash, int& height, TxState& state) {
|
||||
// If tx block (or conflicting block) was reorged out of chain
|
||||
// while the wallet was shutdown, change tx status to UNCONFIRMED
|
||||
// and reset block height, hash, and index. ABANDONED tx don't have
|
||||
// associated blocks and don't need to be updated. The case where a
|
||||
// transaction was reorged out while online and then reconfirmed
|
||||
// while offline is covered by the rescan logic.
|
||||
if (!chain.findBlock(hash, FoundBlock().inActiveChain(active).height(height)) || !active) {
|
||||
state = TxStateInactive{};
|
||||
}
|
||||
};
|
||||
if (auto* conf = state<TxStateConfirmed>()) {
|
||||
lookup_block(conf->confirmed_block_hash, conf->confirmed_block_height, m_state);
|
||||
} else if (auto* conf = state<TxStateConflicted>()) {
|
||||
lookup_block(conf->conflicting_block_hash, conf->conflicting_block_height, m_state);
|
||||
}
|
||||
}
|
||||
|
||||
void CWalletTx::CopyFrom(const CWalletTx& _tx)
|
||||
{
|
||||
*this = _tx;
|
||||
|
|
|
@ -21,6 +21,10 @@
|
|||
#include <variant>
|
||||
#include <vector>
|
||||
|
||||
namespace interfaces {
|
||||
class Chain;
|
||||
} // namespace interfaces
|
||||
|
||||
namespace wallet {
|
||||
//! State of transaction confirmed in a block.
|
||||
struct TxStateConfirmed {
|
||||
|
@ -325,6 +329,10 @@ public:
|
|||
template<typename T> const T* state() const { return std::get_if<T>(&m_state); }
|
||||
template<typename T> T* state() { return std::get_if<T>(&m_state); }
|
||||
|
||||
//! Update transaction state when attaching to a chain, filling in heights
|
||||
//! of conflicted and confirmed blocks
|
||||
void updateState(interfaces::Chain& chain);
|
||||
|
||||
bool isAbandoned() const { return state<TxStateInactive>() && state<TxStateInactive>()->abandoned; }
|
||||
bool isConflicted() const { return state<TxStateConflicted>(); }
|
||||
bool isInactive() const { return state<TxStateInactive>(); }
|
||||
|
|
|
@ -1184,23 +1184,7 @@ bool CWallet::LoadToWallet(const uint256& hash, const UpdateWalletTxFn& fill_wtx
|
|||
// If wallet doesn't have a chain (e.g when using bitcoin-wallet tool),
|
||||
// don't bother to update txn.
|
||||
if (HaveChain()) {
|
||||
bool active;
|
||||
auto lookup_block = [&](const uint256& hash, int& height, TxState& state) {
|
||||
// If tx block (or conflicting block) was reorged out of chain
|
||||
// while the wallet was shutdown, change tx status to UNCONFIRMED
|
||||
// and reset block height, hash, and index. ABANDONED tx don't have
|
||||
// associated blocks and don't need to be updated. The case where a
|
||||
// transaction was reorged out while online and then reconfirmed
|
||||
// while offline is covered by the rescan logic.
|
||||
if (!chain().findBlock(hash, FoundBlock().inActiveChain(active).height(height)) || !active) {
|
||||
state = TxStateInactive{};
|
||||
}
|
||||
};
|
||||
if (auto* conf = wtx.state<TxStateConfirmed>()) {
|
||||
lookup_block(conf->confirmed_block_hash, conf->confirmed_block_height, wtx.m_state);
|
||||
} else if (auto* conf = wtx.state<TxStateConflicted>()) {
|
||||
lookup_block(conf->conflicting_block_hash, conf->conflicting_block_height, wtx.m_state);
|
||||
}
|
||||
wtx.updateState(chain());
|
||||
}
|
||||
if (/* insertion took place */ ins.second) {
|
||||
wtx.m_it_wtxOrdered = wtxOrdered.insert(std::make_pair(wtx.nOrderPos, &wtx));
|
||||
|
|
Loading…
Add table
Reference in a new issue