62 for (
const auto& txin : wtx.tx->vin) {
68 for (
const auto& txout : wtx.tx->vout) {
79 result.
time = wtx.GetTxTime();
93 wtx.state<TxStateConfirmed>() ? wtx.state<TxStateConfirmed>()->confirmed_block_height :
94 wtx.state<TxStateConflicted>() ? wtx.state<TxStateConflicted>()->conflicting_block_height :
95 std::numeric_limits<int>::max();
109 const CWalletTx& wtx,
114 result.
txout = wtx.tx->vout[n];
115 result.
time = wtx.GetTxTime();
125 result.
txout = output.txout;
126 result.
time = output.time;
132 class WalletImpl :
public Wallet 137 bool encryptWallet(
const SecureString& wallet_passphrase)
override 139 return m_wallet->EncryptWallet(wallet_passphrase);
141 bool isCrypted()
override {
return m_wallet->IsCrypted(); }
142 bool lock()
override {
return m_wallet->Lock(); }
143 bool unlock(
const SecureString& wallet_passphrase)
override {
return m_wallet->Unlock(wallet_passphrase); }
144 bool isLocked()
override {
return m_wallet->IsLocked(); }
145 bool changeWalletPassphrase(
const SecureString& old_wallet_passphrase,
148 return m_wallet->ChangeWalletPassphrase(old_wallet_passphrase, new_wallet_passphrase);
150 void abortRescan()
override {
m_wallet->AbortRescan(); }
151 bool backupWallet(
const std::string& filename)
override {
return m_wallet->BackupWallet(filename); }
152 std::string getWalletName()
override {
return m_wallet->GetName(); }
156 return m_wallet->GetNewDestination(type, label);
160 std::unique_ptr<SigningProvider> provider =
m_wallet->GetSolvingProvider(script);
162 return provider->GetPubKey(address, pub_key);
166 SigningResult signMessage(
const std::string& message,
const PKHash& pkhash, std::string& str_sig)
override 168 return m_wallet->SignMessage(message, pkhash, str_sig);
175 bool haveWatchOnly()
override 177 auto spk_man =
m_wallet->GetLegacyScriptPubKeyMan();
179 return spk_man->HaveWatchOnly();
183 bool setAddressBook(
const CTxDestination& dest,
const std::string&
name,
const std::optional<AddressPurpose>& purpose)
override 189 return m_wallet->DelAddressBook(dest);
197 const auto& entry =
m_wallet->FindAddressBookEntry(dest,
false);
198 if (!entry)
return false;
200 *
name = entry->GetLabel();
202 std::optional<isminetype> dest_is_mine;
203 if (is_mine || purpose) {
204 dest_is_mine =
m_wallet->IsMine(dest);
207 *is_mine = *dest_is_mine;
215 std::vector<WalletAddress> getAddresses()
const override 218 std::vector<WalletAddress> result;
220 if (is_change) return;
221 isminetype is_mine = m_wallet->IsMine(dest);
223 result.emplace_back(dest, is_mine, purpose.value_or(is_mine ? AddressPurpose::RECEIVE : AddressPurpose::SEND), label);
227 std::vector<std::string> getAddressReceiveRequests()
override {
229 return m_wallet->GetAddressReceiveRequests();
231 bool setAddressReceiveRequest(
const CTxDestination& dest,
const std::string&
id,
const std::string& value)
override {
245 WalletBatch batch{
m_wallet->GetDatabase()};
246 return value.empty() ?
m_wallet->EraseAddressReceiveRequest(batch, dest,
id)
247 :
m_wallet->SetAddressReceiveRequest(batch, dest,
id, value);
252 return m_wallet->DisplayAddress(dest);
254 bool lockCoin(
const COutPoint& output,
const bool write_to_db)
override 257 std::unique_ptr<WalletBatch> batch = write_to_db ? std::make_unique<WalletBatch>(
m_wallet->GetDatabase()) :
nullptr;
258 return m_wallet->LockCoin(output, batch.get());
260 bool unlockCoin(
const COutPoint& output)
override 263 std::unique_ptr<WalletBatch> batch = std::make_unique<WalletBatch>(
m_wallet->GetDatabase());
264 return m_wallet->UnlockCoin(output, batch.get());
266 bool isLockedCoin(
const COutPoint& output)
override 269 return m_wallet->IsLockedCoin(output);
271 void listLockedCoins(std::vector<COutPoint>& outputs)
override 274 return m_wallet->ListLockedCoins(outputs);
277 const CCoinControl& coin_control,
286 const auto& txr = *res;
288 change_pos = txr.change_pos;
297 m_wallet->CommitTransaction(std::move(tx), std::move(value_map), std::move(order_form));
299 bool transactionCanBeAbandoned(
const uint256& txid)
override {
return m_wallet->TransactionCanBeAbandoned(txid); }
300 bool abandonTransaction(
const uint256& txid)
override 303 return m_wallet->AbandonTransaction(txid);
305 bool transactionCanBeBumped(
const uint256& txid)
override 309 bool createBumpTransaction(
const uint256& txid,
310 const CCoinControl& coin_control,
311 std::vector<bilingual_str>& errors,
316 std::vector<CTxOut> outputs;
320 bool commitBumpTransaction(
const uint256& txid,
322 std::vector<bilingual_str>& errors,
331 auto mi =
m_wallet->mapWallet.find(txid);
332 if (mi !=
m_wallet->mapWallet.end()) {
333 return mi->second.tx;
340 auto mi =
m_wallet->mapWallet.find(txid);
341 if (mi !=
m_wallet->mapWallet.end()) {
342 return MakeWalletTx(*
m_wallet, mi->second);
346 std::set<WalletTx> getWalletTxs()
override 349 std::set<WalletTx> result;
350 for (
const auto& entry :
m_wallet->mapWallet) {
351 result.emplace(MakeWalletTx(*
m_wallet, entry.second));
355 bool tryGetTxStatus(
const uint256& txid,
358 int64_t& block_time)
override 361 if (!locked_wallet) {
364 auto mi =
m_wallet->mapWallet.find(txid);
365 if (mi ==
m_wallet->mapWallet.end()) {
368 num_blocks =
m_wallet->GetLastBlockHeight();
371 tx_status = MakeWalletTxStatus(*
m_wallet, mi->second);
378 int& num_blocks)
override 381 auto mi =
m_wallet->mapWallet.find(txid);
382 if (mi !=
m_wallet->mapWallet.end()) {
383 num_blocks =
m_wallet->GetLastBlockHeight();
384 in_mempool = mi->second.InMempool();
385 order_form = mi->second.vOrderForm;
386 tx_status = MakeWalletTxStatus(*
m_wallet, mi->second);
387 return MakeWalletTx(*
m_wallet, mi->second);
396 bool& complete)
override 398 return m_wallet->FillPSBT(psbtx, complete, sighash_type, sign, bip32derivs, n_signed);
404 result.
balance = bal.m_mine_trusted;
418 if (!locked_wallet) {
421 block_hash =
m_wallet->GetLastBlockHash();
422 balances = getBalances();
426 CAmount getAvailableBalance(
const CCoinControl& coin_control)
override 431 if (coin_control.HasSelected()) {
433 CoinSelectionParams params(rng);
436 total_amount += res->total_amount;
441 if (coin_control.m_allow_other_inputs) {
460 return m_wallet->GetDebit(txin, filter);
467 CoinsList listCoins()
override 472 auto&
group = result[entry.first];
473 for (
const auto& coin : entry.second) {
474 group.emplace_back(coin.outpoint,
480 std::vector<WalletTxOut> getCoins(
const std::vector<COutPoint>& outputs)
override 483 std::vector<WalletTxOut> result;
484 result.reserve(outputs.size());
485 for (
const auto& output : outputs) {
486 result.emplace_back();
488 if (it !=
m_wallet->mapWallet.end()) {
489 int depth =
m_wallet->GetTxDepthInMainChain(it->second);
491 result.back() = MakeWalletTxOut(*
m_wallet, it->second, output.
n, depth);
498 CAmount getMinimumFee(
unsigned int tx_bytes,
499 const CCoinControl& coin_control,
500 int* returned_target,
507 if (reason) *reason = fee_calc.
reason;
510 unsigned int getConfirmTarget()
override {
return m_wallet->m_confirm_target; }
511 bool hdEnabled()
override {
return m_wallet->IsHDEnabled(); }
512 bool canGetAddresses()
override {
return m_wallet->CanGetAddresses(); }
515 bool taprootEnabled()
override {
516 if (
m_wallet->IsLegacy())
return false;
518 return spk_man !=
nullptr;
520 OutputType getDefaultAddressType()
override {
return m_wallet->m_default_address_type; }
521 CAmount getDefaultMaxTxFee()
override {
return m_wallet->m_default_max_tx_fee; }
522 void remove()
override 526 bool isLegacy()
override {
return m_wallet->IsLegacy(); }
527 std::unique_ptr<Handler> handleUnload(UnloadFn fn)
override 531 std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn)
override 535 std::unique_ptr<Handler> handleStatusChanged(StatusChangedFn fn)
override 539 std::unique_ptr<Handler> handleAddressBookChanged(AddressBookChangedFn fn)
override 542 [fn](
const CTxDestination& address,
const std::string& label,
bool is_mine,
545 std::unique_ptr<Handler> handleTransactionChanged(TransactionChangedFn fn)
override 550 std::unique_ptr<Handler> handleWatchOnlyChanged(WatchOnlyChangedFn fn)
override 554 std::unique_ptr<Handler> handleCanGetAddressesChanged(CanGetAddressesChangedFn fn)
override 575 void registerRpcs()
override 579 JSONRPCRequest wallet_request = request;
580 wallet_request.context = &m_context;
581 return command.actor(wallet_request, result, last_handler);
591 void setMockTime(int64_t time)
override {
return SetMockTime(time); }
596 DatabaseOptions options;
599 options.require_create =
true;
600 options.create_flags = wallet_creation_flags;
601 options.create_passphrase = passphrase;
605 return {std::move(
wallet)};
612 DatabaseOptions options;
615 options.require_existing =
true;
619 return {std::move(
wallet)};
630 return {std::move(
wallet)};
641 .watchonly_wallet_name = res->watchonly_wallet ? std::make_optional(res->watchonly_wallet->GetName()) : std::nullopt,
642 .solvables_wallet_name = res->solvables_wallet ? std::make_optional(res->solvables_wallet->GetName()) : std::nullopt,
643 .backup_path = res->backup_path,
645 return {std::move(
out)};
647 std::string getWalletDir()
override 651 std::vector<std::string> listWalletDir()
override 653 std::vector<std::string> paths;
659 std::vector<std::unique_ptr<Wallet>> getWallets()
override 661 std::vector<std::unique_ptr<Wallet>> wallets;
667 std::unique_ptr<Handler> handleLoadWallet(
LoadWalletFn fn)
override 686 return std::make_unique<wallet::WalletLoaderImpl>(chain,
args);
std::shared_ptr< const CTransaction > CTransactionRef
Helper for findBlock to selectively return pieces of block data.
void ReadDatabaseArgs(const ArgsManager &args, DatabaseOptions &options)
isminetype InputIsMine(const CWallet &wallet, const CTxIn &txin)
std::vector< CTxDestination > txout_address
const std::vector< std::string > m_wallet_filenames
void FlushWallets(WalletContext &context)
Flush all wallets in preparation for shutdown.
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< wallet::isminetype > txin_is_mine
unsigned int time_received
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
#define CHECK_NONFATAL(condition)
Identity function.
std::basic_string< char, std::char_traits< char >, secure_allocator< char > > SecureString
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.
Result CreateRateBumpTransaction(CWallet &wallet, const uint256 &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.
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 TransactionCanBeBumped(const CWallet &wallet, const uint256 &txid)
Return whether transaction can be bumped.
bool LoadWallets(WalletContext &context)
Load wallet databases.
Result CommitTransaction(CWallet &wallet, const uint256 &txid, CMutableTransaction &&mtx, std::vector< bilingual_str > &errors, uint256 &bumped_txid)
Commit the bumpfee transaction.
void StopWallets(WalletContext &context)
Stop all wallets. Wallets will be flushed first.
int64_t CAmount
Amount in satoshis (Can be negative)
std::vector< bool > txout_is_change
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
std::vector< wallet::isminetype > txout_is_mine
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.
CAmount watch_only_balance
std::underlying_type< isminetype >::type isminefilter
used for bitflags of isminetype
CAmount CachedTxGetCredit(const CWallet &wallet, const CWalletTx &wtx, const isminefilter &filter)
static std::string PathToString(const path &path)
Convert path object to a byte string.
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a scriptPubKey for the destination.
void StartWallets(WalletContext &context, CScheduler &scheduler)
Complete startup of wallets.
Collection of wallet balances.
An input of a transaction.
bool CachedTxIsTrusted(const CWallet &wallet, const CWalletTx &wtx, std::set< uint256 > &trusted_parents)
An encapsulated public key.
isminetype
IsMine() return codes, which depend on ScriptPubKeyMan implementation.
Interface for accessing a wallet.
static bool verify(const CScriptNum10 &bignum, const CScriptNum &scriptnum)
An output of a transaction.
std::vector< wallet::isminetype > txout_address_is_mine
CAmount immature_watch_only_balance
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...
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
util::Result< PreSelectedInputs > FetchSelectedInputs(const CWallet &wallet, const CCoinControl &coin_control, const CoinSelectionParams &coin_selection_params) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet)
Fetch and validate coin control selected inputs.
CAmount unconfirmed_balance
#define EXCLUSIVE_LOCKS_REQUIRED(...)
std::vector< std::shared_ptr< CWallet > > GetWallets(WalletContext &context)
CAmount unconfirmed_watch_only_balance
Interface giving clients (wallet processes, maybe other analysis tools in the future) ability to acce...
bool error(const char *fmt, const Args &... args)
Serialized script, used inside transaction inputs and outputs.
std::vector< std::unique_ptr< Handler > > m_rpc_handlers
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.
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.
util::Result< CreatedTransactionResult > CreateTransaction(CWallet &wallet, const std::vector< CRecipient > &vecSend, 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::pair< std::string, std::string > > WalletOrderForm
bilingual_str ErrorString(const Result< T > &result)
Information about one wallet address.
A mutable version of CTransaction.
std::unique_ptr< Handler > MakeSignalHandler(boost::signals2::connection connection)
Return handler wrapping a boost signal connection.
std::vector< fs::path > ListDatabases(const fs::path &wallet_dir)
Recursively list database paths in directory.
void UnloadWallets(WalletContext &context)
Close all wallets.
std::map< std::string, std::string > value_map
CAmount GetRequiredFee(const CWallet &wallet, unsigned int nTxBytes)
Return the minimum required absolute fee for this size based on the required fee rate.
Span< const CRPCCommand > GetWalletRPCCommands()
std::shared_ptr< CWallet > wallet
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.
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)
std::list< CRPCCommand > m_rpc_commands
Wallet transaction output.
CAmount OutputGetCredit(const CWallet &wallet, const CTxOut &txout, const isminefilter &filter)
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
Updated transaction status.
FoundBlock & time(int64_t &time)
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, const isminefilter &filter)
filter decides which addresses will count towards the debit