Merge #18278: interfaces: Describe and follow some code conventions
3dc27a1524doc: Add internal interface conventions to developer notes (Russell Yanofsky)1dca9dc4c7refactor: Change createWallet, fillPSBT argument order (Russell Yanofsky)96dfe5ced6refactor: Change Chain::broadcastTransaction param order (Russell Yanofsky)6ceb21909crefactor: Rename Chain::Notifications methods to be consistent with other interfaces methods (Russell Yanofsky)1c2ab1a6d2refactor: Rename Node::disconnect methods (Russell Yanofsky)77e4b06572refactor: Get rid of Wallet::IsWalletFlagSet method (Russell Yanofsky) Pull request description: This PR is part of the [process separation project](https://github.com/bitcoin/bitcoin/projects/10). This PR doesn't change behavior at all, it just cleans up code in [`src/interfaces`](https://github.com/bitcoin/bitcoin/tree/master/src/interfaces) to simplify #10102, and [documents](https://github.com/ryanofsky/bitcoin/blob/pr/ipc-conv/doc/developer-notes.md#internal-interface-guidelines) coding conventions there better ACKs for top commit: hebasto: re-ACK3dc27a1524, the only change since the [previous](https://github.com/bitcoin/bitcoin/pull/18278#pullrequestreview-372582146) review is rebasing. MarcoFalke: ACK3dc27a1524🕍 Tree-SHA512: 62e6a0f2488e3924e559d2074ed460b92e7a0a5d98eab492221cb20d59d04bbe32aef2a8aeba5e4ea9168cfa91acd5bc973dce6677be0180bd7a919354df53ed
This commit is contained in:
17 files changed
+208
-93
No files matched your search
@@ -43,6 +43,7 @@ Developer Notes
|
|||||||
- [Suggestions and examples](#suggestions-and-examples)
|
- [Suggestions and examples](#suggestions-and-examples)
|
||||||
- [Release notes](#release-notes)
|
- [Release notes](#release-notes)
|
||||||
- [RPC interface guidelines](#rpc-interface-guidelines)
|
- [RPC interface guidelines](#rpc-interface-guidelines)
|
||||||
|
- [Internal interface guidelines](#internal-interface-guidelines)
|
||||||
|
|
||||||
<!-- markdown-toc end -->
|
<!-- markdown-toc end -->
|
||||||
|
|
||||||
@@ -1100,3 +1101,124 @@ A few guidelines for introducing and reviewing new RPC interfaces:
|
|||||||
timestamps in the documentation.
|
timestamps in the documentation.
|
||||||
|
|
||||||
- *Rationale*: User-facing consistency.
|
- *Rationale*: User-facing consistency.
|
||||||
|
|
||||||
|
Internal interface guidelines
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
Internal interfaces between parts of the codebase that are meant to be
|
||||||
|
independent (node, wallet, GUI), are defined in
|
||||||
|
[`src/interfaces/`](../src/interfaces/). The main interface classes defined
|
||||||
|
there are [`interfaces::Chain`](../src/interfaces/chain.h), used by wallet to
|
||||||
|
access the node's latest chain state,
|
||||||
|
[`interfaces::Node`](../src/interfaces/node.h), used by the GUI to control the
|
||||||
|
node, and [`interfaces::Wallet`](../src/interfaces/wallet.h), used by the GUI
|
||||||
|
to control an individual wallet. There are also more specialized interface
|
||||||
|
types like [`interfaces::Handler`](../src/interfaces/handler.h)
|
||||||
|
[`interfaces::ChainClient`](../src/interfaces/chain.h) passed to and from
|
||||||
|
various interface methods.
|
||||||
|
|
||||||
|
Interface classes are written in a particular style so node, wallet, and GUI
|
||||||
|
code doesn't need to run in the same process, and so the class declarations
|
||||||
|
work more easily with tools and libraries supporting interprocess
|
||||||
|
communication:
|
||||||
|
|
||||||
|
- Interface classes should be abstract and have methods that are [pure
|
||||||
|
virtual](https://en.cppreference.com/w/cpp/language/abstract_class). This
|
||||||
|
allows multiple implementations to inherit from the same interface class,
|
||||||
|
particularly so one implementation can execute functionality in the local
|
||||||
|
process, and other implementations can forward calls to remote processes.
|
||||||
|
|
||||||
|
- Interface method definitions should wrap existing functionality instead of
|
||||||
|
implementing new functionality. Any substantial new node or wallet
|
||||||
|
functionality should be implemented in [`src/node/`](../src/node/) or
|
||||||
|
[`src/wallet/`](../src/wallet/) and just exposed in
|
||||||
|
[`src/interfaces/`](../src/interfaces/) instead of being implemented there,
|
||||||
|
so it can be more modular and accessible to unit tests.
|
||||||
|
|
||||||
|
- Interface method parameter and return types should either be serializable or
|
||||||
|
be other interface classes. Interface methods shouldn't pass references to
|
||||||
|
objects that can't be serialized or accessed from another process.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
// Good: takes string argument and returns interface class pointer
|
||||||
|
virtual unique_ptr<interfaces::Wallet> loadWallet(std::string filename) = 0;
|
||||||
|
|
||||||
|
// Bad: returns CWallet reference that can't be used from another process
|
||||||
|
virtual CWallet& loadWallet(std::string filename) = 0;
|
||||||
|
```
|
||||||
|
|
||||||
|
```c++
|
||||||
|
// Good: accepts and returns primitive types
|
||||||
|
virtual bool findBlock(const uint256& hash, int& out_height, int64_t& out_time) = 0;
|
||||||
|
|
||||||
|
// Bad: returns pointer to internal node in a linked list inaccessible to
|
||||||
|
// other processes
|
||||||
|
virtual const CBlockIndex* findBlock(const uint256& hash) = 0;
|
||||||
|
```
|
||||||
|
|
||||||
|
```c++
|
||||||
|
// Good: takes plain callback type and returns interface pointer
|
||||||
|
using TipChangedFn = std::function<void(int block_height, int64_t block_time)>;
|
||||||
|
virtual std::unique_ptr<interfaces::Handler> handleTipChanged(TipChangedFn fn) = 0;
|
||||||
|
|
||||||
|
// Bad: returns boost connection specific to local process
|
||||||
|
using TipChangedFn = std::function<void(int block_height, int64_t block_time)>;
|
||||||
|
virtual boost::signals2::scoped_connection connectTipChanged(TipChangedFn fn) = 0;
|
||||||
|
```
|
||||||
|
|
||||||
|
- For consistency and friendliness to code generation tools, interface method
|
||||||
|
input and inout parameters should be ordered first and output parameters
|
||||||
|
should come last.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
// Good: error output param is last
|
||||||
|
virtual bool broadcastTransaction(const CTransactionRef& tx, CAmount max_fee, std::string& error) = 0;
|
||||||
|
|
||||||
|
// Bad: error output param is between input params
|
||||||
|
virtual bool broadcastTransaction(const CTransactionRef& tx, std::string& error, CAmount max_fee) = 0;
|
||||||
|
```
|
||||||
|
|
||||||
|
- For friendliness to code generation tools, interface methods should not be
|
||||||
|
overloaded:
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
// Good: method names are unique
|
||||||
|
virtual bool disconnectByAddress(const CNetAddr& net_addr) = 0;
|
||||||
|
virtual bool disconnectById(NodeId id) = 0;
|
||||||
|
|
||||||
|
// Bad: methods are overloaded by type
|
||||||
|
virtual bool disconnect(const CNetAddr& net_addr) = 0;
|
||||||
|
virtual bool disconnect(NodeId id) = 0;
|
||||||
|
```
|
||||||
|
|
||||||
|
- For consistency and friendliness to code generation tools, interface method
|
||||||
|
names should be `lowerCamelCase` and standalone function names should be
|
||||||
|
`UpperCamelCase`.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
// Good: lowerCamelCase method name
|
||||||
|
virtual void blockConnected(const CBlock& block, int height) = 0;
|
||||||
|
|
||||||
|
// Bad: uppercase class method
|
||||||
|
virtual void BlockConnected(const CBlock& block, int height) = 0;
|
||||||
|
```
|
||||||
|
|
||||||
|
```c++
|
||||||
|
// Good: UpperCamelCase standalone function name
|
||||||
|
std::unique_ptr<Node> MakeNode(LocalInit& init);
|
||||||
|
|
||||||
|
// Bad: lowercase standalone function
|
||||||
|
std::unique_ptr<Node> makeNode(LocalInit& init);
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: This last convention isn't generally followed outside of
|
||||||
|
[`src/interfaces/`](../src/interfaces/), though it did come up for discussion
|
||||||
|
before in [#14635](https://github.com/bitcoin/bitcoin/pull/14635).
|
||||||
@@ -166,25 +166,25 @@ public:
|
|||||||
}
|
}
|
||||||
void TransactionAddedToMempool(const CTransactionRef& tx) override
|
void TransactionAddedToMempool(const CTransactionRef& tx) override
|
||||||
{
|
{
|
||||||
m_notifications->TransactionAddedToMempool(tx);
|
m_notifications->transactionAddedToMempool(tx);
|
||||||
}
|
}
|
||||||
void TransactionRemovedFromMempool(const CTransactionRef& tx) override
|
void TransactionRemovedFromMempool(const CTransactionRef& tx) override
|
||||||
{
|
{
|
||||||
m_notifications->TransactionRemovedFromMempool(tx);
|
m_notifications->transactionRemovedFromMempool(tx);
|
||||||
}
|
}
|
||||||
void BlockConnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* index) override
|
void BlockConnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* index) override
|
||||||
{
|
{
|
||||||
m_notifications->BlockConnected(*block, index->nHeight);
|
m_notifications->blockConnected(*block, index->nHeight);
|
||||||
}
|
}
|
||||||
void BlockDisconnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* index) override
|
void BlockDisconnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* index) override
|
||||||
{
|
{
|
||||||
m_notifications->BlockDisconnected(*block, index->nHeight);
|
m_notifications->blockDisconnected(*block, index->nHeight);
|
||||||
}
|
}
|
||||||
void UpdatedBlockTip(const CBlockIndex* index, const CBlockIndex* fork_index, bool is_ibd) override
|
void UpdatedBlockTip(const CBlockIndex* index, const CBlockIndex* fork_index, bool is_ibd) override
|
||||||
{
|
{
|
||||||
m_notifications->UpdatedBlockTip();
|
m_notifications->updatedBlockTip();
|
||||||
}
|
}
|
||||||
void ChainStateFlushed(const CBlockLocator& locator) override { m_notifications->ChainStateFlushed(locator); }
|
void ChainStateFlushed(const CBlockLocator& locator) override { m_notifications->chainStateFlushed(locator); }
|
||||||
Chain& m_chain;
|
Chain& m_chain;
|
||||||
Chain::Notifications* m_notifications;
|
Chain::Notifications* m_notifications;
|
||||||
};
|
};
|
||||||
@@ -278,7 +278,10 @@ public:
|
|||||||
auto it = ::mempool.GetIter(txid);
|
auto it = ::mempool.GetIter(txid);
|
||||||
return it && (*it)->GetCountWithDescendants() > 1;
|
return it && (*it)->GetCountWithDescendants() > 1;
|
||||||
}
|
}
|
||||||
bool broadcastTransaction(const CTransactionRef& tx, std::string& err_string, const CAmount& max_tx_fee, bool relay) override
|
bool broadcastTransaction(const CTransactionRef& tx,
|
||||||
|
const CAmount& max_tx_fee,
|
||||||
|
bool relay,
|
||||||
|
std::string& err_string) override
|
||||||
{
|
{
|
||||||
const TransactionError err = BroadcastTransaction(m_node, tx, err_string, max_tx_fee, relay, /*wait_callback*/ false);
|
const TransactionError err = BroadcastTransaction(m_node, tx, err_string, max_tx_fee, relay, /*wait_callback*/ false);
|
||||||
// Chain clients only care about failures to accept the tx to the mempool. Disregard non-mempool related failures.
|
// Chain clients only care about failures to accept the tx to the mempool. Disregard non-mempool related failures.
|
||||||
@@ -366,7 +369,7 @@ public:
|
|||||||
{
|
{
|
||||||
LOCK2(::cs_main, ::mempool.cs);
|
LOCK2(::cs_main, ::mempool.cs);
|
||||||
for (const CTxMemPoolEntry& entry : ::mempool.mapTx) {
|
for (const CTxMemPoolEntry& entry : ::mempool.mapTx) {
|
||||||
notifications.TransactionAddedToMempool(entry.GetSharedTx());
|
notifications.transactionAddedToMempool(entry.GetSharedTx());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NodeContext& m_node;
|
NodeContext& m_node;
|
||||||
|
|||||||
+11
-8
@@ -154,7 +154,10 @@ public:
|
|||||||
//! Transaction is added to memory pool, if the transaction fee is below the
|
//! Transaction is added to memory pool, if the transaction fee is below the
|
||||||
//! amount specified by max_tx_fee, and broadcast to all peers if relay is set to true.
|
//! amount specified by max_tx_fee, and broadcast to all peers if relay is set to true.
|
||||||
//! Return false if the transaction could not be added due to the fee or for another reason.
|
//! Return false if the transaction could not be added due to the fee or for another reason.
|
||||||
virtual bool broadcastTransaction(const CTransactionRef& tx, std::string& err_string, const CAmount& max_tx_fee, bool relay) = 0;
|
virtual bool broadcastTransaction(const CTransactionRef& tx,
|
||||||
|
const CAmount& max_tx_fee,
|
||||||
|
bool relay,
|
||||||
|
std::string& err_string) = 0;
|
||||||
|
|
||||||
//! Calculate mempool ancestor and descendant counts for the given transaction.
|
//! Calculate mempool ancestor and descendant counts for the given transaction.
|
||||||
virtual void getTransactionAncestry(const uint256& txid, size_t& ancestors, size_t& descendants) = 0;
|
virtual void getTransactionAncestry(const uint256& txid, size_t& ancestors, size_t& descendants) = 0;
|
||||||
@@ -217,12 +220,12 @@ public:
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~Notifications() {}
|
virtual ~Notifications() {}
|
||||||
virtual void TransactionAddedToMempool(const CTransactionRef& tx) {}
|
virtual void transactionAddedToMempool(const CTransactionRef& tx) {}
|
||||||
virtual void TransactionRemovedFromMempool(const CTransactionRef& ptx) {}
|
virtual void transactionRemovedFromMempool(const CTransactionRef& ptx) {}
|
||||||
virtual void BlockConnected(const CBlock& block, int height) {}
|
virtual void blockConnected(const CBlock& block, int height) {}
|
||||||
virtual void BlockDisconnected(const CBlock& block, int height) {}
|
virtual void blockDisconnected(const CBlock& block, int height) {}
|
||||||
virtual void UpdatedBlockTip() {}
|
virtual void updatedBlockTip() {}
|
||||||
virtual void ChainStateFlushed(const CBlockLocator& locator) {}
|
virtual void chainStateFlushed(const CBlockLocator& locator) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Register handler for notifications.
|
//! Register handler for notifications.
|
||||||
@@ -245,7 +248,7 @@ public:
|
|||||||
//! Current RPC serialization flags.
|
//! Current RPC serialization flags.
|
||||||
virtual int rpcSerializationFlags() = 0;
|
virtual int rpcSerializationFlags() = 0;
|
||||||
|
|
||||||
//! Synchronously send TransactionAddedToMempool notifications about all
|
//! Synchronously send transactionAddedToMempool notifications about all
|
||||||
//! current mempool transactions to the specified handler and return after
|
//! current mempool transactions to the specified handler and return after
|
||||||
//! the last one is sent. These notifications aren't coordinated with async
|
//! the last one is sent. These notifications aren't coordinated with async
|
||||||
//! notifications sent by handleNotifications, so out of date async
|
//! notifications sent by handleNotifications, so out of date async
|
||||||
|
|||||||
@@ -152,14 +152,14 @@ public:
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
bool disconnect(const CNetAddr& net_addr) override
|
bool disconnectByAddress(const CNetAddr& net_addr) override
|
||||||
{
|
{
|
||||||
if (m_context.connman) {
|
if (m_context.connman) {
|
||||||
return m_context.connman->DisconnectNode(net_addr);
|
return m_context.connman->DisconnectNode(net_addr);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
bool disconnect(NodeId id) override
|
bool disconnectById(NodeId id) override
|
||||||
{
|
{
|
||||||
if (m_context.connman) {
|
if (m_context.connman) {
|
||||||
return m_context.connman->DisconnectNode(id);
|
return m_context.connman->DisconnectNode(id);
|
||||||
@@ -262,12 +262,11 @@ public:
|
|||||||
{
|
{
|
||||||
return MakeWallet(LoadWallet(*m_context.chain, name, error, warnings));
|
return MakeWallet(LoadWallet(*m_context.chain, name, error, warnings));
|
||||||
}
|
}
|
||||||
WalletCreationStatus createWallet(const SecureString& passphrase, uint64_t wallet_creation_flags, const std::string& name, std::string& error, std::vector<std::string>& warnings, std::unique_ptr<Wallet>& result) override
|
std::unique_ptr<Wallet> createWallet(const SecureString& passphrase, uint64_t wallet_creation_flags, const std::string& name, std::string& error, std::vector<std::string>& warnings, WalletCreationStatus& status) override
|
||||||
{
|
{
|
||||||
std::shared_ptr<CWallet> wallet;
|
std::shared_ptr<CWallet> wallet;
|
||||||
WalletCreationStatus status = CreateWallet(*m_context.chain, passphrase, wallet_creation_flags, name, error, warnings, wallet);
|
status = CreateWallet(*m_context.chain, passphrase, wallet_creation_flags, name, error, warnings, wallet);
|
||||||
result = MakeWallet(wallet);
|
return MakeWallet(wallet);
|
||||||
return status;
|
|
||||||
}
|
}
|
||||||
std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn) override
|
std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn) override
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -124,10 +124,10 @@ public:
|
|||||||
virtual bool unban(const CSubNet& ip) = 0;
|
virtual bool unban(const CSubNet& ip) = 0;
|
||||||
|
|
||||||
//! Disconnect node by address.
|
//! Disconnect node by address.
|
||||||
virtual bool disconnect(const CNetAddr& net_addr) = 0;
|
virtual bool disconnectByAddress(const CNetAddr& net_addr) = 0;
|
||||||
|
|
||||||
//! Disconnect node by id.
|
//! Disconnect node by id.
|
||||||
virtual bool disconnect(NodeId id) = 0;
|
virtual bool disconnectById(NodeId id) = 0;
|
||||||
|
|
||||||
//! Get total bytes recv.
|
//! Get total bytes recv.
|
||||||
virtual int64_t getTotalBytesRecv() = 0;
|
virtual int64_t getTotalBytesRecv() = 0;
|
||||||
@@ -204,7 +204,7 @@ public:
|
|||||||
virtual std::unique_ptr<Wallet> loadWallet(const std::string& name, std::string& error, std::vector<std::string>& warnings) = 0;
|
virtual std::unique_ptr<Wallet> loadWallet(const std::string& name, std::string& error, std::vector<std::string>& warnings) = 0;
|
||||||
|
|
||||||
//! Create a wallet from file
|
//! Create a wallet from file
|
||||||
virtual WalletCreationStatus createWallet(const SecureString& passphrase, uint64_t wallet_creation_flags, const std::string& name, std::string& error, std::vector<std::string>& warnings, std::unique_ptr<Wallet>& result) = 0;
|
virtual std::unique_ptr<Wallet> createWallet(const SecureString& passphrase, uint64_t wallet_creation_flags, const std::string& name, std::string& error, std::vector<std::string>& warnings, WalletCreationStatus& status) = 0;
|
||||||
|
|
||||||
//! Register handler for init messages.
|
//! Register handler for init messages.
|
||||||
using InitMessageFn = std::function<void(const std::string& message)>;
|
using InitMessageFn = std::function<void(const std::string& message)>;
|
||||||
|
|||||||
@@ -352,11 +352,11 @@ public:
|
|||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
TransactionError fillPSBT(PartiallySignedTransaction& psbtx,
|
TransactionError fillPSBT(int sighash_type,
|
||||||
bool& complete,
|
bool sign,
|
||||||
int sighash_type = 1 /* SIGHASH_ALL */,
|
bool bip32derivs,
|
||||||
bool sign = true,
|
PartiallySignedTransaction& psbtx,
|
||||||
bool bip32derivs = false) const override
|
bool& complete) override
|
||||||
{
|
{
|
||||||
return m_wallet->FillPSBT(psbtx, complete, sighash_type, sign, bip32derivs);
|
return m_wallet->FillPSBT(psbtx, complete, sighash_type, sign, bip32derivs);
|
||||||
}
|
}
|
||||||
@@ -463,8 +463,8 @@ public:
|
|||||||
}
|
}
|
||||||
unsigned int getConfirmTarget() override { return m_wallet->m_confirm_target; }
|
unsigned int getConfirmTarget() override { return m_wallet->m_confirm_target; }
|
||||||
bool hdEnabled() override { return m_wallet->IsHDEnabled(); }
|
bool hdEnabled() override { return m_wallet->IsHDEnabled(); }
|
||||||
bool canGetAddresses() const override { return m_wallet->CanGetAddresses(); }
|
bool canGetAddresses() override { return m_wallet->CanGetAddresses(); }
|
||||||
bool IsWalletFlagSet(uint64_t flag) override { return m_wallet->IsWalletFlagSet(flag); }
|
bool privateKeysDisabled() override { return m_wallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); }
|
||||||
OutputType getDefaultAddressType() override { return m_wallet->m_default_address_type; }
|
OutputType getDefaultAddressType() override { return m_wallet->m_default_address_type; }
|
||||||
OutputType getDefaultChangeType() override { return m_wallet->m_default_change_type; }
|
OutputType getDefaultChangeType() override { return m_wallet->m_default_change_type; }
|
||||||
CAmount getDefaultMaxTxFee() override { return m_wallet->m_default_max_tx_fee; }
|
CAmount getDefaultMaxTxFee() override { return m_wallet->m_default_max_tx_fee; }
|
||||||
|
|||||||
@@ -193,11 +193,11 @@ public:
|
|||||||
int& num_blocks) = 0;
|
int& num_blocks) = 0;
|
||||||
|
|
||||||
//! Fill PSBT.
|
//! Fill PSBT.
|
||||||
virtual TransactionError fillPSBT(PartiallySignedTransaction& psbtx,
|
virtual TransactionError fillPSBT(int sighash_type,
|
||||||
bool& complete,
|
bool sign,
|
||||||
int sighash_type = 1 /* SIGHASH_ALL */,
|
bool bip32derivs,
|
||||||
bool sign = true,
|
PartiallySignedTransaction& psbtx,
|
||||||
bool bip32derivs = false) const = 0;
|
bool& complete) = 0;
|
||||||
|
|
||||||
//! Get balances.
|
//! Get balances.
|
||||||
virtual WalletBalances getBalances() = 0;
|
virtual WalletBalances getBalances() = 0;
|
||||||
@@ -247,10 +247,10 @@ public:
|
|||||||
virtual bool hdEnabled() = 0;
|
virtual bool hdEnabled() = 0;
|
||||||
|
|
||||||
// Return whether the wallet is blank.
|
// Return whether the wallet is blank.
|
||||||
virtual bool canGetAddresses() const = 0;
|
virtual bool canGetAddresses() = 0;
|
||||||
|
|
||||||
// check if a certain wallet flag is set.
|
// Return whether private keys enabled.
|
||||||
virtual bool IsWalletFlagSet(uint64_t flag) = 0;
|
virtual bool privateKeysDisabled() = 0;
|
||||||
|
|
||||||
// Get default address type.
|
// Get default address type.
|
||||||
virtual OutputType getDefaultAddressType() = 0;
|
virtual OutputType getDefaultAddressType() = 0;
|
||||||
|
|||||||
@@ -1258,7 +1258,7 @@ void BitcoinGUI::updateWalletStatus()
|
|||||||
}
|
}
|
||||||
WalletModel * const walletModel = walletView->getWalletModel();
|
WalletModel * const walletModel = walletView->getWalletModel();
|
||||||
setEncryptionStatus(walletModel->getEncryptionStatus());
|
setEncryptionStatus(walletModel->getEncryptionStatus());
|
||||||
setHDStatus(walletModel->privateKeysDisabled(), walletModel->wallet().hdEnabled());
|
setHDStatus(walletModel->wallet().privateKeysDisabled(), walletModel->wallet().hdEnabled());
|
||||||
}
|
}
|
||||||
#endif // ENABLE_WALLET
|
#endif // ENABLE_WALLET
|
||||||
|
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ void OverviewPage::setBalance(const interfaces::WalletBalances& balances)
|
|||||||
{
|
{
|
||||||
int unit = walletModel->getOptionsModel()->getDisplayUnit();
|
int unit = walletModel->getOptionsModel()->getDisplayUnit();
|
||||||
m_balances = balances;
|
m_balances = balances;
|
||||||
if (walletModel->privateKeysDisabled()) {
|
if (walletModel->wallet().privateKeysDisabled()) {
|
||||||
ui->labelBalance->setText(BitcoinUnits::formatWithUnit(unit, balances.watch_only_balance, false, BitcoinUnits::separatorAlways));
|
ui->labelBalance->setText(BitcoinUnits::formatWithUnit(unit, balances.watch_only_balance, false, BitcoinUnits::separatorAlways));
|
||||||
ui->labelUnconfirmed->setText(BitcoinUnits::formatWithUnit(unit, balances.unconfirmed_watch_only_balance, false, BitcoinUnits::separatorAlways));
|
ui->labelUnconfirmed->setText(BitcoinUnits::formatWithUnit(unit, balances.unconfirmed_watch_only_balance, false, BitcoinUnits::separatorAlways));
|
||||||
ui->labelImmature->setText(BitcoinUnits::formatWithUnit(unit, balances.immature_watch_only_balance, false, BitcoinUnits::separatorAlways));
|
ui->labelImmature->setText(BitcoinUnits::formatWithUnit(unit, balances.immature_watch_only_balance, false, BitcoinUnits::separatorAlways));
|
||||||
@@ -184,7 +184,7 @@ void OverviewPage::setBalance(const interfaces::WalletBalances& balances)
|
|||||||
// for symmetry reasons also show immature label when the watch-only one is shown
|
// for symmetry reasons also show immature label when the watch-only one is shown
|
||||||
ui->labelImmature->setVisible(showImmature || showWatchOnlyImmature);
|
ui->labelImmature->setVisible(showImmature || showWatchOnlyImmature);
|
||||||
ui->labelImmatureText->setVisible(showImmature || showWatchOnlyImmature);
|
ui->labelImmatureText->setVisible(showImmature || showWatchOnlyImmature);
|
||||||
ui->labelWatchImmature->setVisible(!walletModel->privateKeysDisabled() && showWatchOnlyImmature); // show watch-only immature balance
|
ui->labelWatchImmature->setVisible(!walletModel->wallet().privateKeysDisabled() && showWatchOnlyImmature); // show watch-only immature balance
|
||||||
}
|
}
|
||||||
|
|
||||||
// show/hide watch-only labels
|
// show/hide watch-only labels
|
||||||
@@ -236,9 +236,9 @@ void OverviewPage::setWalletModel(WalletModel *model)
|
|||||||
|
|
||||||
connect(model->getOptionsModel(), &OptionsModel::displayUnitChanged, this, &OverviewPage::updateDisplayUnit);
|
connect(model->getOptionsModel(), &OptionsModel::displayUnitChanged, this, &OverviewPage::updateDisplayUnit);
|
||||||
|
|
||||||
updateWatchOnlyLabels(wallet.haveWatchOnly() && !model->privateKeysDisabled());
|
updateWatchOnlyLabels(wallet.haveWatchOnly() && !model->wallet().privateKeysDisabled());
|
||||||
connect(model, &WalletModel::notifyWatchonlyChanged, [this](bool showWatchOnly) {
|
connect(model, &WalletModel::notifyWatchonlyChanged, [this](bool showWatchOnly) {
|
||||||
updateWatchOnlyLabels(showWatchOnly && !walletModel->privateKeysDisabled());
|
updateWatchOnlyLabels(showWatchOnly && !walletModel->wallet().privateKeysDisabled());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -99,11 +99,11 @@ void ReceiveCoinsDialog::setModel(WalletModel *_model)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set the button to be enabled or disabled based on whether the wallet can give out new addresses.
|
// Set the button to be enabled or disabled based on whether the wallet can give out new addresses.
|
||||||
ui->receiveButton->setEnabled(model->canGetAddresses());
|
ui->receiveButton->setEnabled(model->wallet().canGetAddresses());
|
||||||
|
|
||||||
// Enable/disable the receive button if the wallet is now able/unable to give out new addresses.
|
// Enable/disable the receive button if the wallet is now able/unable to give out new addresses.
|
||||||
connect(model, &WalletModel::canGetAddressesChanged, [this] {
|
connect(model, &WalletModel::canGetAddressesChanged, [this] {
|
||||||
ui->receiveButton->setEnabled(model->canGetAddresses());
|
ui->receiveButton->setEnabled(model->wallet().canGetAddresses());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1191,7 +1191,7 @@ void RPCConsole::disconnectSelectedNode()
|
|||||||
// Get currently selected peer address
|
// Get currently selected peer address
|
||||||
NodeId id = nodes.at(i).data().toLongLong();
|
NodeId id = nodes.at(i).data().toLongLong();
|
||||||
// Find the node, disconnect it and clear the selected node
|
// Find the node, disconnect it and clear the selected node
|
||||||
if(m_node.disconnect(id))
|
if(m_node.disconnectById(id))
|
||||||
clearSelectedNode();
|
clearSelectedNode();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1216,7 +1216,7 @@ void RPCConsole::banSelectedNode(int bantime)
|
|||||||
const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(detailNodeRow);
|
const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(detailNodeRow);
|
||||||
if (stats) {
|
if (stats) {
|
||||||
m_node.ban(stats->nodeStats.addr, BanReasonManuallyAdded, bantime);
|
m_node.ban(stats->nodeStats.addr, BanReasonManuallyAdded, bantime);
|
||||||
m_node.disconnect(stats->nodeStats.addr);
|
m_node.disconnectByAddress(stats->nodeStats.addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
clearSelectedNode();
|
clearSelectedNode();
|
||||||
|
|||||||
+10
-10
@@ -187,7 +187,7 @@ void SendCoinsDialog::setModel(WalletModel *_model)
|
|||||||
// set default rbf checkbox state
|
// set default rbf checkbox state
|
||||||
ui->optInRBF->setCheckState(Qt::Checked);
|
ui->optInRBF->setCheckState(Qt::Checked);
|
||||||
|
|
||||||
if (model->privateKeysDisabled()) {
|
if (model->wallet().privateKeysDisabled()) {
|
||||||
ui->sendButton->setText(tr("Cr&eate Unsigned"));
|
ui->sendButton->setText(tr("Cr&eate Unsigned"));
|
||||||
ui->sendButton->setToolTip(tr("Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME));
|
ui->sendButton->setToolTip(tr("Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME));
|
||||||
}
|
}
|
||||||
@@ -312,14 +312,14 @@ void SendCoinsDialog::on_sendButton_clicked()
|
|||||||
}
|
}
|
||||||
|
|
||||||
QString questionString;
|
QString questionString;
|
||||||
if (model->privateKeysDisabled()) {
|
if (model->wallet().privateKeysDisabled()) {
|
||||||
questionString.append(tr("Do you want to draft this transaction?"));
|
questionString.append(tr("Do you want to draft this transaction?"));
|
||||||
} else {
|
} else {
|
||||||
questionString.append(tr("Are you sure you want to send?"));
|
questionString.append(tr("Are you sure you want to send?"));
|
||||||
}
|
}
|
||||||
|
|
||||||
questionString.append("<br /><span style='font-size:10pt;'>");
|
questionString.append("<br /><span style='font-size:10pt;'>");
|
||||||
if (model->privateKeysDisabled()) {
|
if (model->wallet().privateKeysDisabled()) {
|
||||||
questionString.append(tr("Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME));
|
questionString.append(tr("Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(PACKAGE_NAME));
|
||||||
} else {
|
} else {
|
||||||
questionString.append(tr("Please, review your transaction."));
|
questionString.append(tr("Please, review your transaction."));
|
||||||
@@ -374,8 +374,8 @@ void SendCoinsDialog::on_sendButton_clicked()
|
|||||||
} else {
|
} else {
|
||||||
questionString = questionString.arg("<br /><br />" + formatted.at(0));
|
questionString = questionString.arg("<br /><br />" + formatted.at(0));
|
||||||
}
|
}
|
||||||
const QString confirmation = model->privateKeysDisabled() ? tr("Confirm transaction proposal") : tr("Confirm send coins");
|
const QString confirmation = model->wallet().privateKeysDisabled() ? tr("Confirm transaction proposal") : tr("Confirm send coins");
|
||||||
const QString confirmButtonText = model->privateKeysDisabled() ? tr("Copy PSBT to clipboard") : tr("Send");
|
const QString confirmButtonText = model->wallet().privateKeysDisabled() ? tr("Copy PSBT to clipboard") : tr("Send");
|
||||||
SendConfirmationDialog confirmationDialog(confirmation, questionString, informative_text, detailed_text, SEND_CONFIRM_DELAY, confirmButtonText, this);
|
SendConfirmationDialog confirmationDialog(confirmation, questionString, informative_text, detailed_text, SEND_CONFIRM_DELAY, confirmButtonText, this);
|
||||||
confirmationDialog.exec();
|
confirmationDialog.exec();
|
||||||
QMessageBox::StandardButton retval = static_cast<QMessageBox::StandardButton>(confirmationDialog.result());
|
QMessageBox::StandardButton retval = static_cast<QMessageBox::StandardButton>(confirmationDialog.result());
|
||||||
@@ -387,11 +387,11 @@ void SendCoinsDialog::on_sendButton_clicked()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool send_failure = false;
|
bool send_failure = false;
|
||||||
if (model->privateKeysDisabled()) {
|
if (model->wallet().privateKeysDisabled()) {
|
||||||
CMutableTransaction mtx = CMutableTransaction{*(currentTransaction.getWtx())};
|
CMutableTransaction mtx = CMutableTransaction{*(currentTransaction.getWtx())};
|
||||||
PartiallySignedTransaction psbtx(mtx);
|
PartiallySignedTransaction psbtx(mtx);
|
||||||
bool complete = false;
|
bool complete = false;
|
||||||
const TransactionError err = model->wallet().fillPSBT(psbtx, complete, SIGHASH_ALL, false /* sign */, true /* bip32derivs */);
|
const TransactionError err = model->wallet().fillPSBT(SIGHASH_ALL, false /* sign */, true /* bip32derivs */, psbtx, complete);
|
||||||
assert(!complete);
|
assert(!complete);
|
||||||
assert(err == TransactionError::OK);
|
assert(err == TransactionError::OK);
|
||||||
// Serialize the PSBT
|
// Serialize the PSBT
|
||||||
@@ -562,7 +562,7 @@ void SendCoinsDialog::setBalance(const interfaces::WalletBalances& balances)
|
|||||||
if(model && model->getOptionsModel())
|
if(model && model->getOptionsModel())
|
||||||
{
|
{
|
||||||
CAmount balance = balances.balance;
|
CAmount balance = balances.balance;
|
||||||
if (model->privateKeysDisabled()) {
|
if (model->wallet().privateKeysDisabled()) {
|
||||||
balance = balances.watch_only_balance;
|
balance = balances.watch_only_balance;
|
||||||
ui->labelBalanceName->setText(tr("Watch-only balance:"));
|
ui->labelBalanceName->setText(tr("Watch-only balance:"));
|
||||||
}
|
}
|
||||||
@@ -652,7 +652,7 @@ void SendCoinsDialog::useAvailableBalance(SendCoinsEntry* entry)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Include watch-only for wallets without private key
|
// Include watch-only for wallets without private key
|
||||||
coin_control.fAllowWatchOnly = model->privateKeysDisabled();
|
coin_control.fAllowWatchOnly = model->wallet().privateKeysDisabled();
|
||||||
|
|
||||||
// Calculate available amount to send.
|
// Calculate available amount to send.
|
||||||
CAmount amount = model->wallet().getAvailableBalance(coin_control);
|
CAmount amount = model->wallet().getAvailableBalance(coin_control);
|
||||||
@@ -707,7 +707,7 @@ void SendCoinsDialog::updateCoinControlState(CCoinControl& ctrl)
|
|||||||
ctrl.m_confirm_target = getConfTargetForIndex(ui->confTargetSelector->currentIndex());
|
ctrl.m_confirm_target = getConfTargetForIndex(ui->confTargetSelector->currentIndex());
|
||||||
ctrl.m_signal_bip125_rbf = ui->optInRBF->isChecked();
|
ctrl.m_signal_bip125_rbf = ui->optInRBF->isChecked();
|
||||||
// Include watch-only for wallets without private key
|
// Include watch-only for wallets without private key
|
||||||
ctrl.fAllowWatchOnly = model->privateKeysDisabled();
|
ctrl.fAllowWatchOnly = model->wallet().privateKeysDisabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendCoinsDialog::updateSmartFeeLabel()
|
void SendCoinsDialog::updateSmartFeeLabel()
|
||||||
|
|||||||
@@ -218,8 +218,8 @@ void CreateWalletActivity::createWallet()
|
|||||||
}
|
}
|
||||||
|
|
||||||
QTimer::singleShot(500, worker(), [this, name, flags] {
|
QTimer::singleShot(500, worker(), [this, name, flags] {
|
||||||
std::unique_ptr<interfaces::Wallet> wallet;
|
WalletCreationStatus status;
|
||||||
WalletCreationStatus status = node().createWallet(m_passphrase, flags, name, m_error_message, m_warning_message, wallet);
|
std::unique_ptr<interfaces::Wallet> wallet = node().createWallet(m_passphrase, flags, name, m_error_message, m_warning_message, status);
|
||||||
|
|
||||||
if (status == WalletCreationStatus::SUCCESS) m_wallet_model = m_wallet_controller->getOrCreateWallet(std::move(wallet));
|
if (status == WalletCreationStatus::SUCCESS) m_wallet_model = m_wallet_controller->getOrCreateWallet(std::move(wallet));
|
||||||
|
|
||||||
|
|||||||
+4
-14
@@ -23,7 +23,7 @@
|
|||||||
#include <ui_interface.h>
|
#include <ui_interface.h>
|
||||||
#include <util/system.h> // for GetBoolArg
|
#include <util/system.h> // for GetBoolArg
|
||||||
#include <wallet/coincontrol.h>
|
#include <wallet/coincontrol.h>
|
||||||
#include <wallet/wallet.h>
|
#include <wallet/wallet.h> // for CRecipient
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
@@ -184,7 +184,7 @@ WalletModel::SendCoinsReturn WalletModel::prepareTransaction(WalletModelTransact
|
|||||||
std::string strFailReason;
|
std::string strFailReason;
|
||||||
|
|
||||||
auto& newTx = transaction.getWtx();
|
auto& newTx = transaction.getWtx();
|
||||||
newTx = m_wallet->createTransaction(vecSend, coinControl, !privateKeysDisabled() /* sign */, nChangePosRet, nFeeRequired, strFailReason);
|
newTx = m_wallet->createTransaction(vecSend, coinControl, !wallet().privateKeysDisabled() /* sign */, nChangePosRet, nFeeRequired, strFailReason);
|
||||||
transaction.setTransactionFee(nFeeRequired);
|
transaction.setTransactionFee(nFeeRequired);
|
||||||
if (fSubtractFeeFromAmount && newTx)
|
if (fSubtractFeeFromAmount && newTx)
|
||||||
transaction.reassignAmounts(nChangePosRet);
|
transaction.reassignAmounts(nChangePosRet);
|
||||||
@@ -488,7 +488,7 @@ bool WalletModel::bumpFee(uint256 hash, uint256& new_hash)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool create_psbt = privateKeysDisabled();
|
const bool create_psbt = m_wallet->privateKeysDisabled();
|
||||||
|
|
||||||
// allow a user based fee verification
|
// allow a user based fee verification
|
||||||
QString questionString = create_psbt ? tr("Do you want to draft a transaction with fee increase?") : tr("Do you want to increase the fee?");
|
QString questionString = create_psbt ? tr("Do you want to draft a transaction with fee increase?") : tr("Do you want to increase the fee?");
|
||||||
@@ -526,7 +526,7 @@ bool WalletModel::bumpFee(uint256 hash, uint256& new_hash)
|
|||||||
if (create_psbt) {
|
if (create_psbt) {
|
||||||
PartiallySignedTransaction psbtx(mtx);
|
PartiallySignedTransaction psbtx(mtx);
|
||||||
bool complete = false;
|
bool complete = false;
|
||||||
const TransactionError err = wallet().fillPSBT(psbtx, complete, SIGHASH_ALL, false /* sign */, true /* bip32derivs */);
|
const TransactionError err = wallet().fillPSBT(SIGHASH_ALL, false /* sign */, true /* bip32derivs */, psbtx, complete);
|
||||||
if (err != TransactionError::OK || complete) {
|
if (err != TransactionError::OK || complete) {
|
||||||
QMessageBox::critical(nullptr, tr("Fee bump error"), tr("Can't draft transaction."));
|
QMessageBox::critical(nullptr, tr("Fee bump error"), tr("Can't draft transaction."));
|
||||||
return false;
|
return false;
|
||||||
@@ -558,16 +558,6 @@ bool WalletModel::isWalletEnabled()
|
|||||||
return !gArgs.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET);
|
return !gArgs.GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WalletModel::privateKeysDisabled() const
|
|
||||||
{
|
|
||||||
return m_wallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WalletModel::canGetAddresses() const
|
|
||||||
{
|
|
||||||
return m_wallet->canGetAddresses();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString WalletModel::getWalletName() const
|
QString WalletModel::getWalletName() const
|
||||||
{
|
{
|
||||||
return QString::fromStdString(m_wallet->getWalletName());
|
return QString::fromStdString(m_wallet->getWalletName());
|
||||||
|
|||||||
@@ -140,8 +140,6 @@ public:
|
|||||||
bool bumpFee(uint256 hash, uint256& new_hash);
|
bool bumpFee(uint256 hash, uint256& new_hash);
|
||||||
|
|
||||||
static bool isWalletEnabled();
|
static bool isWalletEnabled();
|
||||||
bool privateKeysDisabled() const;
|
|
||||||
bool canGetAddresses() const;
|
|
||||||
|
|
||||||
interfaces::Node& node() const { return m_node; }
|
interfaces::Node& node() const { return m_node; }
|
||||||
interfaces::Wallet& wallet() const { return *m_wallet; }
|
interfaces::Wallet& wallet() const { return *m_wallet; }
|
||||||
|
|||||||
+10
-10
@@ -344,7 +344,7 @@ bool CWallet::ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWallet::ChainStateFlushed(const CBlockLocator& loc)
|
void CWallet::chainStateFlushed(const CBlockLocator& loc)
|
||||||
{
|
{
|
||||||
WalletBatch batch(*database);
|
WalletBatch batch(*database);
|
||||||
batch.WriteBestBlock(loc);
|
batch.WriteBestBlock(loc);
|
||||||
@@ -1089,7 +1089,7 @@ void CWallet::SyncTransaction(const CTransactionRef& ptx, CWalletTx::Confirmatio
|
|||||||
MarkInputsDirty(ptx);
|
MarkInputsDirty(ptx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWallet::TransactionAddedToMempool(const CTransactionRef& ptx) {
|
void CWallet::transactionAddedToMempool(const CTransactionRef& ptx) {
|
||||||
auto locked_chain = chain().lock();
|
auto locked_chain = chain().lock();
|
||||||
LOCK(cs_wallet);
|
LOCK(cs_wallet);
|
||||||
CWalletTx::Confirmation confirm(CWalletTx::Status::UNCONFIRMED, /* block_height */ 0, {}, /* nIndex */ 0);
|
CWalletTx::Confirmation confirm(CWalletTx::Status::UNCONFIRMED, /* block_height */ 0, {}, /* nIndex */ 0);
|
||||||
@@ -1101,7 +1101,7 @@ void CWallet::TransactionAddedToMempool(const CTransactionRef& ptx) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWallet::TransactionRemovedFromMempool(const CTransactionRef &ptx) {
|
void CWallet::transactionRemovedFromMempool(const CTransactionRef &ptx) {
|
||||||
LOCK(cs_wallet);
|
LOCK(cs_wallet);
|
||||||
auto it = mapWallet.find(ptx->GetHash());
|
auto it = mapWallet.find(ptx->GetHash());
|
||||||
if (it != mapWallet.end()) {
|
if (it != mapWallet.end()) {
|
||||||
@@ -1109,7 +1109,7 @@ void CWallet::TransactionRemovedFromMempool(const CTransactionRef &ptx) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWallet::BlockConnected(const CBlock& block, int height)
|
void CWallet::blockConnected(const CBlock& block, int height)
|
||||||
{
|
{
|
||||||
const uint256& block_hash = block.GetHash();
|
const uint256& block_hash = block.GetHash();
|
||||||
auto locked_chain = chain().lock();
|
auto locked_chain = chain().lock();
|
||||||
@@ -1120,11 +1120,11 @@ void CWallet::BlockConnected(const CBlock& block, int height)
|
|||||||
for (size_t index = 0; index < block.vtx.size(); index++) {
|
for (size_t index = 0; index < block.vtx.size(); index++) {
|
||||||
CWalletTx::Confirmation confirm(CWalletTx::Status::CONFIRMED, height, block_hash, index);
|
CWalletTx::Confirmation confirm(CWalletTx::Status::CONFIRMED, height, block_hash, index);
|
||||||
SyncTransaction(block.vtx[index], confirm);
|
SyncTransaction(block.vtx[index], confirm);
|
||||||
TransactionRemovedFromMempool(block.vtx[index]);
|
transactionRemovedFromMempool(block.vtx[index]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWallet::BlockDisconnected(const CBlock& block, int height)
|
void CWallet::blockDisconnected(const CBlock& block, int height)
|
||||||
{
|
{
|
||||||
auto locked_chain = chain().lock();
|
auto locked_chain = chain().lock();
|
||||||
LOCK(cs_wallet);
|
LOCK(cs_wallet);
|
||||||
@@ -1141,7 +1141,7 @@ void CWallet::BlockDisconnected(const CBlock& block, int height)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWallet::UpdatedBlockTip()
|
void CWallet::updatedBlockTip()
|
||||||
{
|
{
|
||||||
m_best_block_time = GetTime();
|
m_best_block_time = GetTime();
|
||||||
}
|
}
|
||||||
@@ -1785,7 +1785,7 @@ bool CWalletTx::SubmitMemoryPoolAndRelay(std::string& err_string, bool relay)
|
|||||||
// Irrespective of the failure reason, un-marking fInMempool
|
// Irrespective of the failure reason, un-marking fInMempool
|
||||||
// out-of-order is incorrect - it should be unmarked when
|
// out-of-order is incorrect - it should be unmarked when
|
||||||
// TransactionRemovedFromMempool fires.
|
// TransactionRemovedFromMempool fires.
|
||||||
bool ret = pwallet->chain().broadcastTransaction(tx, err_string, pwallet->m_default_max_tx_fee, relay);
|
bool ret = pwallet->chain().broadcastTransaction(tx, pwallet->m_default_max_tx_fee, relay, err_string);
|
||||||
fInMempool |= ret;
|
fInMempool |= ret;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -3875,7 +3875,7 @@ std::shared_ptr<CWallet> CWallet::CreateWalletFromFile(interfaces::Chain& chain,
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto locked_chain = chain.lock();
|
auto locked_chain = chain.lock();
|
||||||
walletInstance->ChainStateFlushed(locked_chain->getTipLocator());
|
walletInstance->chainStateFlushed(locked_chain->getTipLocator());
|
||||||
} else if (wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS) {
|
} else if (wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS) {
|
||||||
// Make it impossible to disable private keys after creation
|
// Make it impossible to disable private keys after creation
|
||||||
error = strprintf(_("Error loading %s: Private keys can only be disabled during creation").translated, walletFile);
|
error = strprintf(_("Error loading %s: Private keys can only be disabled during creation").translated, walletFile);
|
||||||
@@ -4056,7 +4056,7 @@ std::shared_ptr<CWallet> CWallet::CreateWalletFromFile(interfaces::Chain& chain,
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
walletInstance->ChainStateFlushed(locked_chain->getTipLocator());
|
walletInstance->chainStateFlushed(locked_chain->getTipLocator());
|
||||||
walletInstance->database->IncrementUpdateCounter();
|
walletInstance->database->IncrementUpdateCounter();
|
||||||
|
|
||||||
// Restore wallet transaction metadata after -zapwallettxes=1
|
// Restore wallet transaction metadata after -zapwallettxes=1
|
||||||
|
|||||||
+6
-6
@@ -875,10 +875,10 @@ public:
|
|||||||
void MarkDirty();
|
void MarkDirty();
|
||||||
bool AddToWallet(const CWalletTx& wtxIn, bool fFlushOnClose=true);
|
bool AddToWallet(const CWalletTx& wtxIn, bool fFlushOnClose=true);
|
||||||
void LoadToWallet(CWalletTx& wtxIn) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
void LoadToWallet(CWalletTx& wtxIn) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
void TransactionAddedToMempool(const CTransactionRef& tx) override;
|
void transactionAddedToMempool(const CTransactionRef& tx) override;
|
||||||
void BlockConnected(const CBlock& block, int height) override;
|
void blockConnected(const CBlock& block, int height) override;
|
||||||
void BlockDisconnected(const CBlock& block, int height) override;
|
void blockDisconnected(const CBlock& block, int height) override;
|
||||||
void UpdatedBlockTip() override;
|
void updatedBlockTip() override;
|
||||||
int64_t RescanFromTime(int64_t startTime, const WalletRescanReserver& reserver, bool update);
|
int64_t RescanFromTime(int64_t startTime, const WalletRescanReserver& reserver, bool update);
|
||||||
|
|
||||||
struct ScanResult {
|
struct ScanResult {
|
||||||
@@ -897,7 +897,7 @@ public:
|
|||||||
uint256 last_failed_block;
|
uint256 last_failed_block;
|
||||||
};
|
};
|
||||||
ScanResult ScanForWalletTransactions(const uint256& first_block, const uint256& last_block, const WalletRescanReserver& reserver, bool fUpdate);
|
ScanResult ScanForWalletTransactions(const uint256& first_block, const uint256& last_block, const WalletRescanReserver& reserver, bool fUpdate);
|
||||||
void TransactionRemovedFromMempool(const CTransactionRef &ptx) override;
|
void transactionRemovedFromMempool(const CTransactionRef &ptx) override;
|
||||||
void ReacceptWalletTransactions() EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
void ReacceptWalletTransactions() EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
void ResendWalletTransactions();
|
void ResendWalletTransactions();
|
||||||
struct Balance {
|
struct Balance {
|
||||||
@@ -1033,7 +1033,7 @@ public:
|
|||||||
bool IsAllFromMe(const CTransaction& tx, const isminefilter& filter) const;
|
bool IsAllFromMe(const CTransaction& tx, const isminefilter& filter) const;
|
||||||
CAmount GetCredit(const CTransaction& tx, const isminefilter& filter) const;
|
CAmount GetCredit(const CTransaction& tx, const isminefilter& filter) const;
|
||||||
CAmount GetChange(const CTransaction& tx) const;
|
CAmount GetChange(const CTransaction& tx) const;
|
||||||
void ChainStateFlushed(const CBlockLocator& loc) override;
|
void chainStateFlushed(const CBlockLocator& loc) override;
|
||||||
|
|
||||||
DBErrors LoadWallet(bool& fFirstRunRet);
|
DBErrors LoadWallet(bool& fFirstRunRet);
|
||||||
DBErrors ZapWalletTx(std::vector<CWalletTx>& vWtx);
|
DBErrors ZapWalletTx(std::vector<CWalletTx>& vWtx);
|
||||||
|
|||||||
Reference in new issue
Block a user