64 for (
const auto& txin : wtx.tx->vin) {
70 for (
const auto& txout : wtx.tx->vout) {
81 result.
time = wtx.GetTxTime();
95 wtx.state<TxStateConfirmed>() ? wtx.state<TxStateConfirmed>()->confirmed_block_height :
96 wtx.state<TxStateBlockConflicted>() ? wtx.state<TxStateBlockConflicted>()->conflicting_block_height :
97 std::numeric_limits<int>::max();
111 const CWalletTx& wtx,
116 result.
txout = wtx.tx->vout[n];
117 result.
time = wtx.GetTxTime();
127 result.
txout = output.txout;
128 result.
time = output.time;
134class WalletImpl :
public Wallet
139 bool encryptWallet(
const SecureString& wallet_passphrase)
override
141 return m_wallet->EncryptWallet(wallet_passphrase);
143 bool isCrypted()
override {
return m_wallet->IsCrypted(); }
144 bool lock()
override {
return m_wallet->Lock(); }
145 bool unlock(
const SecureString& wallet_passphrase)
override {
return m_wallet->Unlock(wallet_passphrase); }
146 bool isLocked()
override {
return m_wallet->IsLocked(); }
147 bool changeWalletPassphrase(
const SecureString& old_wallet_passphrase,
150 return m_wallet->ChangeWalletPassphrase(old_wallet_passphrase, new_wallet_passphrase);
152 void abortRescan()
override {
m_wallet->AbortRescan(); }
153 bool backupWallet(
const std::string& filename)
override {
return m_wallet->BackupWallet(filename); }
154 std::string getWalletName()
override {
return m_wallet->GetName(); }
158 return m_wallet->GetNewDestination(type, label);
162 std::unique_ptr<SigningProvider> provider =
m_wallet->GetSolvingProvider(
script);
164 return provider->GetPubKey(address, pub_key);
168 SigningResult signMessage(
const std::string& message,
const PKHash& pkhash, std::string& str_sig)
override
170 return m_wallet->SignMessage(message, pkhash, str_sig);
177 bool setAddressBook(
const CTxDestination& dest,
const std::string&
name,
const std::optional<AddressPurpose>& purpose)
override
183 return m_wallet->DelAddressBook(dest);
190 const auto& entry =
m_wallet->FindAddressBookEntry(dest,
false);
191 if (!entry)
return false;
193 *
name = entry->GetLabel();
201 std::vector<WalletAddress> getAddresses()
override
204 std::vector<WalletAddress> result;
206 if (is_change) return;
207 bool is_mine = m_wallet->IsMine(dest);
209 result.emplace_back(dest, is_mine, purpose.value_or(is_mine ? AddressPurpose::RECEIVE : AddressPurpose::SEND), label);
213 std::vector<std::string> getAddressReceiveRequests()
override {
215 return m_wallet->GetAddressReceiveRequests();
217 bool setAddressReceiveRequest(
const CTxDestination& dest,
const std::string&
id,
const std::string& value)
override {
231 WalletBatch batch{
m_wallet->GetDatabase()};
232 return value.empty() ?
m_wallet->EraseAddressReceiveRequest(batch, dest,
id)
233 :
m_wallet->SetAddressReceiveRequest(batch, dest,
id, value);
238 return m_wallet->DisplayAddress(dest);
240 bool lockCoin(
const COutPoint& output,
const bool write_to_db)
override
243 return m_wallet->LockCoin(output, write_to_db);
245 bool unlockCoin(
const COutPoint& output)
override
248 return m_wallet->UnlockCoin(output);
250 bool isLockedCoin(
const COutPoint& output)
override
253 return m_wallet->IsLockedCoin(output);
255 void listLockedCoins(std::vector<COutPoint>& outputs)
override
258 return m_wallet->ListLockedCoins(outputs);
261 const CCoinControl& coin_control,
270 const auto& txr = *res;
272 change_pos = txr.change_pos ? int(*txr.change_pos) : -1;
281 m_wallet->CommitTransaction(std::move(tx), std::move(value_map), std::move(order_form));
283 bool transactionCanBeAbandoned(
const Txid& txid)
override {
return m_wallet->TransactionCanBeAbandoned(txid); }
284 bool abandonTransaction(
const Txid& txid)
override
287 return m_wallet->AbandonTransaction(txid);
289 bool transactionCanBeBumped(
const Txid& txid)
override
293 bool createBumpTransaction(
const Txid& txid,
294 const CCoinControl& coin_control,
295 std::vector<bilingual_str>& errors,
300 std::vector<CTxOut> outputs;
304 bool commitBumpTransaction(
const Txid& txid,
306 std::vector<bilingual_str>& errors,
307 Txid& bumped_txid)
override
315 auto mi =
m_wallet->mapWallet.find(txid);
316 if (mi !=
m_wallet->mapWallet.end()) {
317 return mi->second.tx;
324 auto mi =
m_wallet->mapWallet.find(txid);
325 if (mi !=
m_wallet->mapWallet.end()) {
326 return MakeWalletTx(*
m_wallet, mi->second);
330 std::set<WalletTx> getWalletTxs()
override
333 std::set<WalletTx> result;
334 for (
const auto& entry :
m_wallet->mapWallet) {
335 result.emplace(MakeWalletTx(*
m_wallet, entry.second));
339 bool tryGetTxStatus(
const Txid& txid,
342 int64_t& block_time)
override
345 if (!locked_wallet) {
348 auto mi =
m_wallet->mapWallet.find(txid);
349 if (mi ==
m_wallet->mapWallet.end()) {
352 num_blocks =
m_wallet->GetLastBlockHeight();
355 tx_status = MakeWalletTxStatus(*
m_wallet, mi->second);
362 int& num_blocks)
override
365 auto mi =
m_wallet->mapWallet.find(txid);
366 if (mi !=
m_wallet->mapWallet.end()) {
367 num_blocks =
m_wallet->GetLastBlockHeight();
368 in_mempool = mi->second.InMempool();
369 order_form = mi->second.vOrderForm;
370 tx_status = MakeWalletTxStatus(*
m_wallet, mi->second);
371 return MakeWalletTx(*
m_wallet, mi->second);
375 std::optional<PSBTError> fillPSBT(std::optional<int> sighash_type,
380 bool& complete)
override
382 return m_wallet->FillPSBT(psbtx, complete, sighash_type,
sign, bip32derivs, n_signed);
388 result.
balance = bal.m_mine_trusted;
396 if (!locked_wallet) {
399 block_hash =
m_wallet->GetLastBlockHash();
400 balances = getBalances();
404 CAmount getAvailableBalance(
const CCoinControl& coin_control)
override
409 if (coin_control.HasSelected()) {
411 CoinSelectionParams params(rng);
414 total_amount += res->total_amount;
419 if (coin_control.m_allow_other_inputs) {
425 bool txinIsMine(
const CTxIn& txin)
override
430 bool txoutIsMine(
const CTxOut& txout)
override
445 CoinsList listCoins()
override
450 auto&
group = result[entry.first];
451 for (
const auto& coin : entry.second) {
452 group.emplace_back(coin.outpoint,
458 std::vector<WalletTxOut> getCoins(
const std::vector<COutPoint>& outputs)
override
461 std::vector<WalletTxOut> result;
462 result.reserve(outputs.size());
463 for (
const auto& output : outputs) {
464 result.emplace_back();
466 if (it !=
m_wallet->mapWallet.end()) {
467 int depth =
m_wallet->GetTxDepthInMainChain(it->second);
469 result.back() = MakeWalletTxOut(*
m_wallet, it->second, output.
n, depth);
476 CAmount getMinimumFee(
unsigned int tx_bytes,
477 const CCoinControl& coin_control,
478 int* returned_target,
485 if (reason) *reason = fee_calc.
reason;
488 unsigned int getConfirmTarget()
override {
return m_wallet->m_confirm_target; }
489 bool hdEnabled()
override {
return m_wallet->IsHDEnabled(); }
490 bool canGetAddresses()
override {
return m_wallet->CanGetAddresses(); }
493 bool taprootEnabled()
override {
495 return spk_man !=
nullptr;
497 OutputType getDefaultAddressType()
override {
return m_wallet->m_default_address_type; }
498 CAmount getDefaultMaxTxFee()
override {
return m_wallet->m_default_max_tx_fee; }
499 void remove()
override
503 std::unique_ptr<Handler> handleUnload(UnloadFn fn)
override
507 std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn)
override
511 std::unique_ptr<Handler> handleStatusChanged(StatusChangedFn fn)
override
515 std::unique_ptr<Handler> handleAddressBookChanged(AddressBookChangedFn fn)
override
518 [fn](
const CTxDestination& address,
const std::string& label,
bool is_mine,
521 std::unique_ptr<Handler> handleTransactionChanged(TransactionChangedFn fn)
override
524 [fn](
const Txid& txid,
ChangeType status) { fn(txid, status); }));
526 std::unique_ptr<Handler> handleCanGetAddressesChanged(CanGetAddressesChangedFn fn)
override
544 ~WalletLoaderImpl()
override {
stop(); }
547 void registerRpcs()
override
551 JSONRPCRequest wallet_request = request;
552 wallet_request.context = &m_context;
553 return command.actor(wallet_request, result, last_handler);
566 void setMockTime(int64_t time)
override {
return SetMockTime(time); }
567 void schedulerMockForward(std::chrono::seconds delta)
override {
Assert(
m_context.scheduler)->MockForward(delta); }
572 DatabaseOptions options;
575 options.require_create =
true;
576 options.create_flags = wallet_creation_flags;
577 options.create_passphrase = passphrase;
588 DatabaseOptions options;
591 options.require_existing =
true;
617 .watchonly_wallet_name = res->watchonly_wallet ? std::make_optional(res->watchonly_wallet->GetName()) :
std::nullopt,
618 .solvables_wallet_name = res->solvables_wallet ?
std::make_optional(res->solvables_wallet->GetName()) :
std::nullopt,
619 .backup_path = res->backup_path,
623 bool isEncrypted(
const std::string& wallet_name)
override
626 auto it = std::find_if(wallets.begin(), wallets.end(), [&](std::shared_ptr<CWallet> w){ return w->GetName() == wallet_name; });
627 if (it != wallets.end())
return (*it)->IsCrypted();
630 DatabaseOptions options;
631 options.require_existing =
true;
639 if (!db)
return false;
640 return WalletBatch(*db).IsEncrypted();
642 std::string getWalletDir()
override
646 std::vector<std::pair<std::string, std::string>> listWalletDir()
override
648 std::vector<std::pair<std::string, std::string>> paths;
650 paths.emplace_back(fs::PathToString(path),
format);
654 std::vector<std::unique_ptr<Wallet>> getWallets()
override
656 std::vector<std::unique_ptr<Wallet>> wallets;
662 std::unique_ptr<Handler> handleLoadWallet(
LoadWalletFn fn)
override
666 WalletContext* context()
override {
return &
m_context; }
681 return std::make_unique<wallet::WalletLoaderImpl>(chain,
args);
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a scriptPubKey for the destination.
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
int64_t CAmount
Amount in satoshis (Can be negative)
#define CHECK_NONFATAL(condition)
Identity function.
#define Assert(val)
Identity function.
A reference to a CKey: the Hash160 of its serialized public key.
An outpoint - a combination of a transaction hash and an index n into its vout.
An encapsulated public key.
Simple class for background tasks that should be run periodically or once "after a while".
Serialized script, used inside transaction inputs and outputs.
An input of a transaction.
An output of a transaction.
Interface giving clients (wallet processes, maybe other analysis tools in the future) ability to acce...
Helper for findBlock to selectively return pieces of block data.
Generic interface for managing an event handler or callback function registered with another interfac...
Interface for accessing a wallet.
Wallet chain client that in addition to having chain client methods for starting up,...
static std::string PathToString(const path &path)
Convert path object to a byte string.
static int sign(const secp256k1_context *ctx, struct signer_secrets *signer_secrets, struct signer *signer, const secp256k1_musig_keyagg_cache *cache, const unsigned char *msg32, unsigned char *sig64)
std::unique_ptr< Handler > MakeSignalHandler(boost::signals2::connection connection)
Return handler wrapping a boost signal connection.
std::unique_ptr< WalletLoader > MakeWalletLoader(Chain &chain, ArgsManager &args)
Return implementation of ChainClient interface for a wallet loader.
std::vector< std::pair< std::string, std::string > > WalletOrderForm
std::unique_ptr< Wallet > MakeWallet(wallet::WalletContext &context, const std::shared_ptr< wallet::CWallet > &wallet)
Return implementation of Wallet interface.
std::map< std::string, std::string > WalletValueMap
bilingual_str ErrorString(const Result< T > &result)
Result CreateRateBumpTransaction(CWallet &wallet, const Txid &txid, const CCoinControl &coin_control, std::vector< bilingual_str > &errors, CAmount &old_fee, CAmount &new_fee, CMutableTransaction &mtx, bool require_mine, const std::vector< CTxOut > &outputs, std::optional< uint32_t > original_change_index)
Create bumpfee transaction based on feerate estimates.
bool TransactionCanBeBumped(const CWallet &wallet, const Txid &txid)
Return whether transaction can be bumped.
bool SignTransaction(CWallet &wallet, CMutableTransaction &mtx)
Sign the new transaction,.
Result CommitTransaction(CWallet &wallet, const Txid &txid, CMutableTransaction &&mtx, std::vector< bilingual_str > &errors, Txid &bumped_txid)
Commit the bumpfee transaction.
void StartWallets(WalletContext &context)
Complete startup of wallets.
bool OutputIsChange(const CWallet &wallet, const CTxOut &txout)
void ReadDatabaseArgs(const ArgsManager &args, DatabaseOptions &options)
Balance GetBalance(const CWallet &wallet, const int min_depth, bool avoid_reuse)
std::shared_ptr< CWallet > LoadWallet(WalletContext &context, const std::string &name, std::optional< bool > load_on_start, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error, std::vector< bilingual_str > &warnings)
util::Result< CreatedTransactionResult > CreateTransaction(CWallet &wallet, const std::vector< CRecipient > &vecSend, std::optional< unsigned int > change_pos, const CCoinControl &coin_control, bool sign)
Create a new transaction paying the recipients with a set of coins selected by SelectCoins(); Also cr...
std::vector< std::shared_ptr< CWallet > > GetWallets(WalletContext &context)
bool CachedTxIsTrusted(const CWallet &wallet, const CWalletTx &wtx, std::set< Txid > &trusted_parents)
CAmount GetMinimumFee(const CWallet &wallet, unsigned int nTxBytes, const CCoinControl &coin_control, FeeCalculation *feeCalc)
Estimate the minimum fee considering user set parameters and the required fee.
std::shared_ptr< CWallet > RestoreWallet(WalletContext &context, const fs::path &backup_file, const std::string &wallet_name, std::optional< bool > load_on_start, DatabaseStatus &status, bilingual_str &error, std::vector< bilingual_str > &warnings, bool load_after_restore)
util::Result< PreSelectedInputs > FetchSelectedInputs(const CWallet &wallet, const CCoinControl &coin_control, const CoinSelectionParams &coin_selection_params)
Fetch and validate coin control selected inputs.
bool VerifyWallets(WalletContext &context)
Responsible for reading and validating the -wallet arguments and verifying the wallet database.
std::unique_ptr< interfaces::Handler > HandleLoadWallet(WalletContext &context, LoadWalletFn load_wallet)
fs::path GetWalletDir()
Get the path of the wallet directory.
util::Result< MigrationResult > MigrateLegacyToDescriptor(const std::string &wallet_name, const SecureString &passphrase, WalletContext &context)
Do all steps to migrate a legacy wallet to a descriptor wallet.
std::unique_ptr< WalletDatabase > MakeWalletDatabase(const std::string &name, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error_string)
std::map< CTxDestination, std::vector< COutput > > ListCoins(const CWallet &wallet)
Return list of available coins and locked coins grouped by non-change output address.
CAmount CachedTxGetDebit(const CWallet &wallet, const CWalletTx &wtx, bool avoid_reuse)
CAmount CachedTxGetChange(const CWallet &wallet, const CWalletTx &wtx)
CAmount CachedTxGetCredit(const CWallet &wallet, const CWalletTx &wtx, bool avoid_reuse)
AddressPurpose
Address purpose field that has been been stored with wallet sending and receiving addresses since BIP...
void UnloadWallets(WalletContext &context)
std::shared_ptr< CWallet > CreateWallet(WalletContext &context, const std::string &name, std::optional< bool > load_on_start, DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error, std::vector< bilingual_str > &warnings)
bool LoadWallets(WalletContext &context)
Load wallet databases.
@ WALLET_FLAG_EXTERNAL_SIGNER
Indicates that the wallet needs an external signer.
@ WALLET_FLAG_DISABLE_PRIVATE_KEYS
CAmount GetRequiredFee(const CWallet &wallet, unsigned int nTxBytes)
Return the minimum required absolute fee for this size based on the required fee rate.
std::span< const CRPCCommand > GetWalletRPCCommands()
bool InputIsMine(const CWallet &wallet, const CTxIn &txin)
CTxDestination getNewDestination(CWallet &w, OutputType output_type)
Returns a new destination, of an specific type, from the wallet.
CAmount OutputGetCredit(const CWallet &wallet, const CTxOut &txout)
std::vector< std::pair< fs::path, std::string > > ListDatabases(const fs::path &wallet_dir)
Recursively list database paths in directory.
bool RemoveWallet(WalletContext &context, const std::shared_ptr< CWallet > &wallet, std::optional< bool > load_on_start, std::vector< bilingual_str > &warnings)
CoinsResult AvailableCoins(const CWallet &wallet, const CCoinControl *coinControl, std::optional< CFeeRate > feerate, const CoinFilterParams ¶ms)
Populate the CoinsResult struct with vectors of available COutputs, organized by OutputType.
is a home for public enum and struct type definitions that are used internally by node code,...
std::shared_ptr< const CTransaction > CTransactionRef
static bool verify(const CScriptNum10 &bignum, const CScriptNum &scriptnum)
std::basic_string< char, std::char_traits< char >, secure_allocator< char > > SecureString
A mutable version of CTransaction.
A version of CTransaction with the PSBT format.
Information about one wallet address.
Collection of wallet balances.
CAmount unconfirmed_balance
std::vector< bool > txin_is_mine
std::vector< CTxDestination > txout_address
std::vector< bool > txout_address_is_mine
std::vector< bool > txout_is_change
std::map< std::string, std::string > value_map
std::vector< bool > txout_is_mine
Wallet transaction output.
Updated transaction status.
unsigned int time_received
CAmount m_mine_trusted
Trusted, at depth=GetBalance.min_depth or more.
WalletContext struct containing references to state shared between CWallet instances,...
#define TRY_LOCK(cs, name)
#define EXCLUSIVE_LOCKS_REQUIRED(...)
ChangeType
General change type (added, updated, removed).
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
std::list< CRPCCommand > m_rpc_commands
std::shared_ptr< CWallet > m_wallet
std::vector< std::unique_ptr< Handler > > m_rpc_handlers
const std::vector< std::string > m_wallet_filenames
std::function< void(std::unique_ptr< interfaces::Wallet > wallet)> LoadWalletFn