63 result.txin_is_mine.reserve(wtx.tx->vin.size());
64 for (
const auto& txin : wtx.tx->vin) {
67 result.txout_is_mine.reserve(wtx.tx->vout.size());
68 result.txout_address.reserve(wtx.tx->vout.size());
69 result.txout_address_is_mine.reserve(wtx.tx->vout.size());
70 for (
const auto& txout : wtx.tx->vout) {
73 result.txout_address.emplace_back();
81 result.time = wtx.GetTxTime();
82 result.value_map = wtx.mapValue;
83 result.is_coinbase = wtx.IsCoinBase();
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();
98 result.blocks_to_maturity =
wallet.GetTxBlocksToMaturity(wtx);
99 result.depth_in_main_chain =
wallet.GetTxDepthInMainChain(wtx);
100 result.time_received = wtx.nTimeReceived;
101 result.lock_time = wtx.tx->nLockTime;
103 result.is_abandoned = wtx.isAbandoned();
104 result.is_coinbase = wtx.IsCoinBase();
105 result.is_in_main_chain = wtx.isConfirmed();
111 const CWalletTx& wtx,
116 result.txout = wtx.tx->vout[n];
117 result.time = wtx.GetTxTime();
118 result.depth_in_main_chain = depth;
127 result.txout = output.txout;
128 result.time = output.time;
129 result.depth_in_main_chain = output.depth;
134 class 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->HasEncryptionKeys(); }
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,
263 std::optional<unsigned int> change_pos)
override 273 m_wallet->CommitTransaction(std::move(tx), std::move(value_map), std::move(order_form));
275 bool transactionCanBeAbandoned(
const Txid& txid)
override {
return m_wallet->TransactionCanBeAbandoned(txid); }
276 bool abandonTransaction(
const Txid& txid)
override 279 return m_wallet->AbandonTransaction(txid);
281 bool transactionCanBeBumped(
const Txid& txid)
override 285 bool createBumpTransaction(
const Txid& txid,
286 const CCoinControl& coin_control,
287 std::vector<bilingual_str>& errors,
292 std::vector<CTxOut> outputs;
296 bool commitBumpTransaction(
const Txid& txid,
298 std::vector<bilingual_str>& errors,
299 Txid& bumped_txid)
override 307 auto mi =
m_wallet->mapWallet.find(txid);
308 if (mi !=
m_wallet->mapWallet.end()) {
309 return mi->second.tx;
316 auto mi =
m_wallet->mapWallet.find(txid);
317 if (mi !=
m_wallet->mapWallet.end()) {
318 return MakeWalletTx(*
m_wallet, mi->second);
322 std::set<WalletTx> getWalletTxs()
override 325 std::set<WalletTx>
result;
326 for (
const auto& entry :
m_wallet->mapWallet) {
331 bool tryGetTxStatus(
const Txid& txid,
334 int64_t& block_time)
override 337 if (!locked_wallet) {
340 auto mi =
m_wallet->mapWallet.find(txid);
341 if (mi ==
m_wallet->mapWallet.end()) {
344 num_blocks =
m_wallet->GetLastBlockHeight();
347 tx_status = MakeWalletTxStatus(*
m_wallet, mi->second);
354 int& num_blocks)
override 357 auto mi =
m_wallet->mapWallet.find(txid);
358 if (mi !=
m_wallet->mapWallet.end()) {
359 num_blocks =
m_wallet->GetLastBlockHeight();
360 in_mempool = mi->second.InMempool();
361 order_form = mi->second.vOrderForm;
362 tx_status = MakeWalletTxStatus(*
m_wallet, mi->second);
363 return MakeWalletTx(*
m_wallet, mi->second);
367 std::optional<PSBTError> fillPSBT(std::optional<int> sighash_type,
372 bool& complete)
override 374 return m_wallet->FillPSBT(psbtx, complete, sighash_type,
sign, bip32derivs, n_signed);
380 result.balance = bal.m_mine_trusted;
381 result.unconfirmed_balance = bal.m_mine_untrusted_pending;
382 result.immature_balance = bal.m_mine_immature;
388 if (!locked_wallet) {
391 block_hash =
m_wallet->GetLastBlockHash();
392 balances = getBalances();
396 CAmount getAvailableBalance(
const CCoinControl& coin_control)
override 401 if (coin_control.HasSelected()) {
403 CoinSelectionParams params(rng);
406 total_amount += res->GetTotalAmount();
411 if (coin_control.m_allow_other_inputs) {
417 bool txinIsMine(
const CTxIn& txin)
override 422 bool txoutIsMine(
const CTxOut& txout)
override 437 CoinsList listCoins()
override 443 for (
const auto& coin : entry.second) {
444 group.emplace_back(coin.outpoint,
450 std::vector<WalletTxOut> getCoins(
const std::vector<COutPoint>& outputs)
override 453 std::vector<WalletTxOut>
result;
454 result.reserve(outputs.size());
455 for (
const auto& output : outputs) {
458 if (it !=
m_wallet->mapWallet.end()) {
459 int depth =
m_wallet->GetTxDepthInMainChain(it->second);
461 result.back() = MakeWalletTxOut(*
m_wallet, it->second, output.
n, depth);
468 CAmount getMinimumFee(
unsigned int tx_bytes,
469 const CCoinControl& coin_control,
470 int* returned_target,
477 if (reason) *reason = fee_calc.
reason;
480 unsigned int getConfirmTarget()
override {
return m_wallet->m_confirm_target; }
481 bool hdEnabled()
override {
return m_wallet->IsHDEnabled(); }
482 bool canGetAddresses()
override {
return m_wallet->CanGetAddresses(); }
485 bool taprootEnabled()
override {
487 return spk_man !=
nullptr;
489 OutputType getDefaultAddressType()
override {
return m_wallet->m_default_address_type; }
490 CAmount getDefaultMaxTxFee()
override {
return m_wallet->m_default_max_tx_fee; }
491 void remove()
override 495 std::unique_ptr<Handler> handleUnload(UnloadFn fn)
override 499 std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn)
override 503 std::unique_ptr<Handler> handleStatusChanged(StatusChangedFn fn)
override 507 std::unique_ptr<Handler> handleAddressBookChanged(AddressBookChangedFn fn)
override 510 [fn](
const CTxDestination& address,
const std::string& label,
bool is_mine,
513 std::unique_ptr<Handler> handleTransactionChanged(TransactionChangedFn fn)
override 516 [fn](
const Txid& txid,
ChangeType status) { fn(txid, status); }));
518 std::unique_ptr<Handler> handleCanGetAddressesChanged(CanGetAddressesChangedFn fn)
override 536 ~WalletLoaderImpl()
override {
stop(); }
539 void registerRpcs()
override 543 JSONRPCRequest wallet_request = request;
544 wallet_request.context = &m_context;
545 return command.actor(wallet_request, result, last_handler);
558 void setMockTime(int64_t time)
override {
return SetMockTime(time); }
559 void schedulerMockForward(std::chrono::seconds delta)
override {
Assert(
m_context.scheduler)->MockForward(delta); }
564 DatabaseOptions options;
567 options.require_create =
true;
568 options.create_flags = wallet_creation_flags;
569 options.create_passphrase = passphrase;
580 DatabaseOptions options;
583 options.require_existing =
true;
597 if (!error.
empty()) {
608 .watchonly_wallet_name = res->watchonly_wallet ? std::make_optional(res->watchonly_wallet->GetName()) : std::nullopt,
609 .solvables_wallet_name = res->solvables_wallet ? std::make_optional(res->solvables_wallet->GetName()) : std::nullopt,
610 .backup_path = res->backup_path,
614 bool isEncrypted(
const std::string& wallet_name)
override 617 auto it = std::find_if(wallets.begin(), wallets.end(), [&](std::shared_ptr<CWallet> w){
return w->GetName() == wallet_name; });
618 if (it != wallets.end())
return (*it)->HasEncryptionKeys();
621 DatabaseOptions options;
622 options.require_existing =
true;
630 if (!db)
return false;
631 return WalletBatch(*db).IsEncrypted();
633 std::string getWalletDir()
override 637 std::vector<std::pair<std::string, std::string>> listWalletDir()
override 639 std::vector<std::pair<std::string, std::string>> paths;
641 paths.emplace_back(fs::PathToString(path),
format);
645 std::vector<std::unique_ptr<Wallet>> getWallets()
override 647 std::vector<std::unique_ptr<Wallet>> wallets;
653 std::unique_ptr<Handler> handleLoadWallet(
LoadWalletFn fn)
override 657 WalletContext* context()
override {
return &
m_context; }
672 return std::make_unique<wallet::WalletLoaderImpl>(chain,
args);
std::shared_ptr< const CTransaction > CTransactionRef
Helper for findBlock to selectively return pieces of block data.
CAmount CachedTxGetDebit(const CWallet &wallet, const CWalletTx &wtx, bool avoid_reuse)
bool TransactionCanBeBumped(const CWallet &wallet, const Txid &txid)
Return whether transaction can be bumped.
bool CachedTxIsTrusted(const CWallet &wallet, const CWalletTx &wtx, std::set< Txid > &trusted_parents)
void ReadDatabaseArgs(const ArgsManager &args, DatabaseOptions &options)
util::Result< CoinsResult > FetchSelectedInputs(const CWallet &wallet, const CCoinControl &coin_control, const CoinSelectionParams &coin_selection_params)
Fetch and validate coin control selected inputs.
const std::vector< std::string > m_wallet_filenames
std::function< void(std::unique_ptr< interfaces::Wallet > wallet)> LoadWalletFn
bool OutputIsChange(const CWallet &wallet, const CTxOut &txout)
#define TRY_LOCK(cs, name)
std::vector< std::pair< fs::path, std::string > > ListDatabases(const fs::path &wallet_dir)
Recursively list database paths in directory.
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.
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)
std::shared_ptr< CWallet > m_wallet
Result CommitTransaction(CWallet &wallet, const Txid &txid, CMutableTransaction &&mtx, std::vector< bilingual_str > &errors, Txid &bumped_txid)
Commit the bumpfee transaction.
#define CHECK_NONFATAL(condition)
Identity function.
std::basic_string< char, std::char_traits< char >, secure_allocator< char > > SecureString
CAmount CachedTxGetCredit(const CWallet &wallet, const CWalletTx &wtx, bool avoid_reuse)
std::unique_ptr< Wallet > MakeWallet(wallet::WalletContext &context, const std::shared_ptr< wallet::CWallet > &wallet)
Return implementation of Wallet interface.
Balance GetBalance(const CWallet &wallet, const int min_depth, bool avoid_reuse)
A version of CTransaction with the PSBT format.
CAmount CachedTxGetChange(const CWallet &wallet, const CWalletTx &wtx)
CTxDestination getNewDestination(CWallet &w, OutputType output_type)
Returns a new destination, of an specific type, from the wallet.
std::map< std::string, std::string > WalletValueMap
fs::path GetWalletDir()
Get the path of the wallet directory.
bool LoadWallets(WalletContext &context)
Load wallet databases.
int64_t CAmount
Amount in satoshis (Can be negative)
void StartWallets(WalletContext &context)
Complete startup of wallets.
bool VerifyWallets(WalletContext &context)
Responsible for reading and validating the -wallet arguments and verifying the wallet database...
AddressPurpose
Address purpose field that has been been stored with wallet sending and receiving addresses since BIP...
Indicates that the wallet needs an external signer.
std::unique_ptr< WalletLoader > MakeWalletLoader(Chain &chain, ArgsManager &args)
Return implementation of ChainClient interface for a wallet loader.
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a scriptPubKey for the destination.
Collection of wallet balances.
An input of a transaction.
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...
An encapsulated public key.
Interface for accessing a wallet.
static bool verify(const CScriptNum10 &bignum, const CScriptNum &scriptnum)
An output of a transaction.
An outpoint - a combination of a transaction hash and an index n into its vout.
Wallet chain client that in addition to having chain client methods for starting up, shutting down, and registering RPCs, also has additional methods (called by the GUI) to load and create wallets.
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.
bool SignTransaction(CWallet &wallet, CMutableTransaction &mtx)
Sign the new transaction,.
bool RemoveWallet(WalletContext &context, const std::shared_ptr< CWallet > &wallet, std::optional< bool > load_on_start, std::vector< bilingual_str > &warnings)
Generic interface for managing an event handler or callback function registered with another interfac...
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)
CAmount OutputGetCredit(const CWallet &wallet, const CTxOut &txout)
#define EXCLUSIVE_LOCKS_REQUIRED(...)
std::vector< std::shared_ptr< CWallet > > GetWallets(WalletContext &context)
Interface giving clients (wallet processes, maybe other analysis tools in the future) ability to acce...
Serialized script, used inside transaction inputs and outputs.
std::vector< std::unique_ptr< Handler > > m_rpc_handlers
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
A reference to a CKey: the Hash160 of its serialized public key.
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.
static std::string PathToString(const path &path)
Convert path object to a byte string.
std::unique_ptr< interfaces::Handler > HandleLoadWallet(WalletContext &context, LoadWalletFn load_wallet)
WalletContext struct containing references to state shared between CWallet instances, like the reference to the chain interface, and the list of opened wallets.
CAmount m_mine_trusted
Trusted, at depth=GetBalance.min_depth or more.
std::span< const CRPCCommand > GetWalletRPCCommands()
std::vector< std::pair< std::string, std::string > > WalletOrderForm
bilingual_str ErrorString(const Result< T > &result)
Information about one wallet address.
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
A mutable version of CTransaction.
std::unique_ptr< Handler > MakeSignalHandler(boost::signals2::connection connection)
Return handler wrapping a boost signal connection.
void UnloadWallets(WalletContext &context)
CAmount GetRequiredFee(const CWallet &wallet, unsigned int nTxBytes)
Return the minimum required absolute fee for this size based on the required fee rate.
bool InputIsMine(const CWallet &wallet, const CTxIn &txin)
Simple class for background tasks that should be run periodically or once "after a while"...
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)
ChangeType
General change type (added, updated, removed).
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.
is a home for public enum and struct type definitions that are used internally by node code...
CAmount GetTotalAmount() const
std::list< CRPCCommand > m_rpc_commands
Wallet transaction output.
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
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, bool allow_unnamed)
Updated transaction status.
FoundBlock & time(int64_t &time)
std::unique_ptr< WalletDatabase > MakeWalletDatabase(const std::string &name, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error_string)
#define Assert(val)
Identity function.
std::map< CTxDestination, std::vector< COutput > > ListCoins(const CWallet &wallet)
Return list of available coins and locked coins grouped by non-change output address.