Changeset View
Changeset View
Standalone View
Standalone View
src/interfaces/wallet.cpp
Show First 20 Lines • Show All 205 Lines • ▼ Show 20 Lines | public: | ||||
return m_wallet->EraseDestData(batch, dest, key); | return m_wallet->EraseDestData(batch, dest, key); | ||||
} | } | ||||
std::vector<std::string> | std::vector<std::string> | ||||
getDestValues(const std::string &prefix) override { | getDestValues(const std::string &prefix) override { | ||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
return m_wallet->GetDestValues(prefix); | return m_wallet->GetDestValues(prefix); | ||||
} | } | ||||
void lockCoin(const COutPoint &output) override { | void lockCoin(const COutPoint &output) override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
return m_wallet->LockCoin(output); | return m_wallet->LockCoin(output); | ||||
} | } | ||||
void unlockCoin(const COutPoint &output) override { | void unlockCoin(const COutPoint &output) override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
return m_wallet->UnlockCoin(output); | return m_wallet->UnlockCoin(output); | ||||
} | } | ||||
bool isLockedCoin(const COutPoint &output) override { | bool isLockedCoin(const COutPoint &output) override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
return m_wallet->IsLockedCoin(output); | return m_wallet->IsLockedCoin(output); | ||||
} | } | ||||
void listLockedCoins(std::vector<COutPoint> &outputs) override { | void listLockedCoins(std::vector<COutPoint> &outputs) override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
return m_wallet->ListLockedCoins(outputs); | return m_wallet->ListLockedCoins(outputs); | ||||
} | } | ||||
CTransactionRef | CTransactionRef | ||||
createTransaction(const std::vector<CRecipient> &recipients, | createTransaction(const std::vector<CRecipient> &recipients, | ||||
const CCoinControl &coin_control, bool sign, | const CCoinControl &coin_control, bool sign, | ||||
int &change_pos, Amount &fee, | int &change_pos, Amount &fee, | ||||
bilingual_str &fail_reason) override { | bilingual_str &fail_reason) override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
CTransactionRef tx; | CTransactionRef tx; | ||||
if (!m_wallet->CreateTransaction(recipients, tx, fee, change_pos, | if (!m_wallet->CreateTransaction(recipients, tx, fee, change_pos, | ||||
fail_reason, coin_control, sign)) { | fail_reason, coin_control, sign)) { | ||||
return {}; | return {}; | ||||
} | } | ||||
return tx; | return tx; | ||||
} | } | ||||
void commitTransaction(CTransactionRef tx, WalletValueMap value_map, | void commitTransaction(CTransactionRef tx, WalletValueMap value_map, | ||||
WalletOrderForm order_form) override { | WalletOrderForm order_form) override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
m_wallet->CommitTransaction(std::move(tx), std::move(value_map), | m_wallet->CommitTransaction(std::move(tx), std::move(value_map), | ||||
std::move(order_form)); | std::move(order_form)); | ||||
} | } | ||||
bool transactionCanBeAbandoned(const TxId &txid) override { | bool transactionCanBeAbandoned(const TxId &txid) override { | ||||
return m_wallet->TransactionCanBeAbandoned(txid); | return m_wallet->TransactionCanBeAbandoned(txid); | ||||
} | } | ||||
bool abandonTransaction(const TxId &txid) override { | bool abandonTransaction(const TxId &txid) override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
return m_wallet->AbandonTransaction(txid); | return m_wallet->AbandonTransaction(txid); | ||||
} | } | ||||
CTransactionRef getTx(const TxId &txid) override { | CTransactionRef getTx(const TxId &txid) override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
auto mi = m_wallet->mapWallet.find(txid); | auto mi = m_wallet->mapWallet.find(txid); | ||||
if (mi != m_wallet->mapWallet.end()) { | if (mi != m_wallet->mapWallet.end()) { | ||||
return mi->second.tx; | return mi->second.tx; | ||||
} | } | ||||
return {}; | return {}; | ||||
} | } | ||||
WalletTx getWalletTx(const TxId &txid) override { | WalletTx getWalletTx(const TxId &txid) override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
auto mi = m_wallet->mapWallet.find(txid); | auto mi = m_wallet->mapWallet.find(txid); | ||||
if (mi != m_wallet->mapWallet.end()) { | if (mi != m_wallet->mapWallet.end()) { | ||||
return MakeWalletTx(*m_wallet, mi->second); | return MakeWalletTx(*m_wallet, mi->second); | ||||
} | } | ||||
return {}; | return {}; | ||||
} | } | ||||
std::vector<WalletTx> getWalletTxs() override { | std::vector<WalletTx> getWalletTxs() override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
std::vector<WalletTx> result; | std::vector<WalletTx> result; | ||||
result.reserve(m_wallet->mapWallet.size()); | result.reserve(m_wallet->mapWallet.size()); | ||||
for (const auto &entry : m_wallet->mapWallet) { | for (const auto &entry : m_wallet->mapWallet) { | ||||
result.emplace_back(MakeWalletTx(*m_wallet, entry.second)); | result.emplace_back(MakeWalletTx(*m_wallet, entry.second)); | ||||
} | } | ||||
return result; | return result; | ||||
} | } | ||||
bool tryGetTxStatus(const TxId &txid, | bool tryGetTxStatus(const TxId &txid, | ||||
interfaces::WalletTxStatus &tx_status, | interfaces::WalletTxStatus &tx_status, | ||||
int &num_blocks, int64_t &block_time) override { | int &num_blocks, int64_t &block_time) override { | ||||
auto locked_chain = m_wallet->chain().lock(true /* try_lock */); | |||||
if (!locked_chain) { | |||||
return false; | |||||
} | |||||
TRY_LOCK(m_wallet->cs_wallet, locked_wallet); | TRY_LOCK(m_wallet->cs_wallet, locked_wallet); | ||||
if (!locked_wallet) { | if (!locked_wallet) { | ||||
return false; | return false; | ||||
} | } | ||||
auto mi = m_wallet->mapWallet.find(txid); | auto mi = m_wallet->mapWallet.find(txid); | ||||
if (mi == m_wallet->mapWallet.end()) { | if (mi == m_wallet->mapWallet.end()) { | ||||
return false; | return false; | ||||
} | } | ||||
num_blocks = m_wallet->GetLastBlockHeight(); | num_blocks = m_wallet->GetLastBlockHeight(); | ||||
block_time = -1; | block_time = -1; | ||||
CHECK_NONFATAL(m_wallet->chain().findBlock( | CHECK_NONFATAL(m_wallet->chain().findBlock( | ||||
m_wallet->GetLastBlockHash(), FoundBlock().time(block_time))); | m_wallet->GetLastBlockHash(), FoundBlock().time(block_time))); | ||||
tx_status = MakeWalletTxStatus(*m_wallet, mi->second); | tx_status = MakeWalletTxStatus(*m_wallet, mi->second); | ||||
return true; | return true; | ||||
} | } | ||||
WalletTx getWalletTxDetails(const TxId &txid, WalletTxStatus &tx_status, | WalletTx getWalletTxDetails(const TxId &txid, WalletTxStatus &tx_status, | ||||
WalletOrderForm &order_form, | WalletOrderForm &order_form, | ||||
bool &in_mempool, | bool &in_mempool, | ||||
int &num_blocks) override { | int &num_blocks) override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
auto mi = m_wallet->mapWallet.find(txid); | auto mi = m_wallet->mapWallet.find(txid); | ||||
if (mi != m_wallet->mapWallet.end()) { | if (mi != m_wallet->mapWallet.end()) { | ||||
num_blocks = m_wallet->GetLastBlockHeight(); | num_blocks = m_wallet->GetLastBlockHeight(); | ||||
in_mempool = mi->second.InMempool(); | in_mempool = mi->second.InMempool(); | ||||
order_form = mi->second.vOrderForm; | order_form = mi->second.vOrderForm; | ||||
tx_status = MakeWalletTxStatus(*m_wallet, mi->second); | tx_status = MakeWalletTxStatus(*m_wallet, mi->second); | ||||
return MakeWalletTx(*m_wallet, mi->second); | return MakeWalletTx(*m_wallet, mi->second); | ||||
Show All 20 Lines | public: | ||||
result.unconfirmed_watch_only_balance = | result.unconfirmed_watch_only_balance = | ||||
bal.m_watchonly_untrusted_pending; | bal.m_watchonly_untrusted_pending; | ||||
result.immature_watch_only_balance = bal.m_watchonly_immature; | result.immature_watch_only_balance = bal.m_watchonly_immature; | ||||
} | } | ||||
return result; | return result; | ||||
} | } | ||||
bool tryGetBalances(WalletBalances &balances, | bool tryGetBalances(WalletBalances &balances, | ||||
int &num_blocks) override { | int &num_blocks) override { | ||||
auto locked_chain = m_wallet->chain().lock(true /* try_lock */); | |||||
if (!locked_chain) { | |||||
return false; | |||||
} | |||||
TRY_LOCK(m_wallet->cs_wallet, locked_wallet); | TRY_LOCK(m_wallet->cs_wallet, locked_wallet); | ||||
if (!locked_wallet) { | if (!locked_wallet) { | ||||
return false; | return false; | ||||
} | } | ||||
num_blocks = m_wallet->GetLastBlockHeight(); | num_blocks = m_wallet->GetLastBlockHeight(); | ||||
balances = getBalances(); | balances = getBalances(); | ||||
return true; | return true; | ||||
} | } | ||||
Amount getBalance() override { | Amount getBalance() override { | ||||
return m_wallet->GetBalance().m_mine_trusted; | return m_wallet->GetBalance().m_mine_trusted; | ||||
} | } | ||||
Amount getAvailableBalance(const CCoinControl &coin_control) override { | Amount getAvailableBalance(const CCoinControl &coin_control) override { | ||||
return m_wallet->GetAvailableBalance(&coin_control); | return m_wallet->GetAvailableBalance(&coin_control); | ||||
} | } | ||||
isminetype txinIsMine(const CTxIn &txin) override { | isminetype txinIsMine(const CTxIn &txin) override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
return m_wallet->IsMine(txin); | return m_wallet->IsMine(txin); | ||||
} | } | ||||
isminetype txoutIsMine(const CTxOut &txout) override { | isminetype txoutIsMine(const CTxOut &txout) override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
return m_wallet->IsMine(txout); | return m_wallet->IsMine(txout); | ||||
} | } | ||||
Amount getDebit(const CTxIn &txin, isminefilter filter) override { | Amount getDebit(const CTxIn &txin, isminefilter filter) override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
return m_wallet->GetDebit(txin, filter); | return m_wallet->GetDebit(txin, filter); | ||||
} | } | ||||
Amount getCredit(const CTxOut &txout, isminefilter filter) override { | Amount getCredit(const CTxOut &txout, isminefilter filter) override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
return m_wallet->GetCredit(txout, filter); | return m_wallet->GetCredit(txout, filter); | ||||
} | } | ||||
CoinsList listCoins() override { | CoinsList listCoins() override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
CoinsList result; | CoinsList result; | ||||
for (const auto &entry : m_wallet->ListCoins()) { | for (const auto &entry : m_wallet->ListCoins()) { | ||||
auto &group = result[entry.first]; | auto &group = result[entry.first]; | ||||
for (const auto &coin : entry.second) { | for (const auto &coin : entry.second) { | ||||
group.emplace_back(COutPoint(coin.tx->GetId(), coin.i), | group.emplace_back(COutPoint(coin.tx->GetId(), coin.i), | ||||
MakeWalletTxOut(*m_wallet, *coin.tx, | MakeWalletTxOut(*m_wallet, *coin.tx, | ||||
coin.i, coin.nDepth)); | coin.i, coin.nDepth)); | ||||
} | } | ||||
} | } | ||||
return result; | return result; | ||||
} | } | ||||
std::vector<WalletTxOut> | std::vector<WalletTxOut> | ||||
getCoins(const std::vector<COutPoint> &outputs) override { | getCoins(const std::vector<COutPoint> &outputs) override { | ||||
auto locked_chain = m_wallet->chain().lock(); | |||||
LOCK(m_wallet->cs_wallet); | LOCK(m_wallet->cs_wallet); | ||||
std::vector<WalletTxOut> result; | std::vector<WalletTxOut> result; | ||||
result.reserve(outputs.size()); | result.reserve(outputs.size()); | ||||
for (const auto &output : outputs) { | for (const auto &output : outputs) { | ||||
result.emplace_back(); | result.emplace_back(); | ||||
auto it = m_wallet->mapWallet.find(output.GetTxId()); | auto it = m_wallet->mapWallet.find(output.GetTxId()); | ||||
if (it != m_wallet->mapWallet.end()) { | if (it != m_wallet->mapWallet.end()) { | ||||
int depth = it->second.GetDepthInMainChain(); | int depth = it->second.GetDepthInMainChain(); | ||||
▲ Show 20 Lines • Show All 59 Lines • ▼ Show 20 Lines | public: | ||||
} | } | ||||
Amount getRequiredFee(unsigned int tx_bytes) override { | Amount getRequiredFee(unsigned int tx_bytes) override { | ||||
return GetRequiredFee(*m_wallet, tx_bytes); | return GetRequiredFee(*m_wallet, tx_bytes); | ||||
} | } | ||||
Amount getMinimumFee(unsigned int tx_bytes, | Amount getMinimumFee(unsigned int tx_bytes, | ||||
const CCoinControl &coin_control) override { | const CCoinControl &coin_control) override { | ||||
return GetMinimumFee(*m_wallet, tx_bytes, coin_control); | return GetMinimumFee(*m_wallet, tx_bytes, coin_control); | ||||
} | } | ||||
CWallet *wallet() override { return m_wallet.get(); } | |||||
std::shared_ptr<CWallet> m_wallet; | std::shared_ptr<CWallet> m_wallet; | ||||
}; | }; | ||||
class WalletClientImpl : public ChainClient { | class WalletClientImpl : public ChainClient { | ||||
public: | public: | ||||
WalletClientImpl(Chain &chain, | WalletClientImpl(Chain &chain, | ||||
std::vector<std::string> wallet_filenames) | std::vector<std::string> wallet_filenames) | ||||
Show All 38 Lines |