61 result.
tx = wtx.GetTx();
63 for (
const auto& txin : result.
tx->vin) {
69 for (
const auto& txout : result.
tx->vout) {
80 result.
time = wtx.GetTxTime();
81 result.
from = wtx.m_from;
97 wtx.state<TxStateConfirmed>() ? wtx.state<TxStateConfirmed>()->confirmed_block_height :
98 wtx.state<TxStateBlockConflicted>() ? wtx.state<TxStateBlockConflicted>()->conflicting_block_height :
99 std::numeric_limits<int>::max();
103 result.
lock_time = wtx.GetTx()->nLockTime;
113 const CWalletTx& wtx,
118 result.
txout = wtx.GetTx()->vout[n];
119 result.
time = wtx.GetTxTime();
129 result.
txout = output.txout;
130 result.
time = output.time;
136class WalletImpl :
public Wallet
141 bool encryptWallet(
const SecureString& wallet_passphrase)
override
143 return m_wallet->EncryptWallet(wallet_passphrase);
145 bool isCrypted()
override {
return m_wallet->HasEncryptionKeys(); }
146 bool lock()
override {
return m_wallet->Lock(); }
147 bool unlock(
const SecureString& wallet_passphrase)
override {
return m_wallet->Unlock(wallet_passphrase); }
148 bool isLocked()
override {
return m_wallet->IsLocked(); }
149 bool changeWalletPassphrase(
const SecureString& old_wallet_passphrase,
152 return m_wallet->ChangeWalletPassphrase(old_wallet_passphrase, new_wallet_passphrase);
154 void abortRescan()
override {
m_wallet->AbortRescan(); }
155 bool backupWallet(
const std::string& filename)
override {
return m_wallet->BackupWallet(filename); }
156 std::string getWalletName()
override {
return m_wallet->GetName(); }
160 return m_wallet->GetNewDestination(type, label);
166 return provider->GetPubKey(address, pub_key);
170 SigningResult signMessage(
const std::string& message,
const PKHash& pkhash, std::string& str_sig)
override
172 return m_wallet->SignMessage(message, pkhash, str_sig);
179 bool setAddressBook(
const CTxDestination& dest,
const std::string&
name,
const std::optional<AddressPurpose>& purpose)
override
185 return m_wallet->DelAddressBook(dest);
192 const auto& entry =
m_wallet->FindAddressBookEntry(dest,
false);
193 if (!entry)
return false;
195 *
name = entry->GetLabel();
203 std::vector<WalletAddress> getAddresses()
override
206 std::vector<WalletAddress> result;
208 if (is_change) return;
209 bool is_mine = m_wallet->IsMine(dest);
211 result.emplace_back(dest, is_mine, purpose.value_or(is_mine ? AddressPurpose::RECEIVE : AddressPurpose::SEND), label);
215 std::vector<std::string> getAddressReceiveRequests()
override {
217 return m_wallet->GetAddressReceiveRequests();
219 bool setAddressReceiveRequest(
const CTxDestination& dest,
const std::string&
id,
const std::string& value)
override {
233 WalletBatch batch{
m_wallet->GetDatabase()};
234 return value.empty() ?
m_wallet->EraseAddressReceiveRequest(batch, dest,
id)
235 :
m_wallet->SetAddressReceiveRequest(batch, dest,
id, value);
240 return m_wallet->DisplayAddress(dest);
242 bool lockCoin(
const COutPoint& output,
const bool write_to_db)
override
245 return m_wallet->LockCoin(output, write_to_db);
247 bool unlockCoin(
const COutPoint& output)
override
250 return m_wallet->UnlockCoin(output);
252 bool isLockedCoin(
const COutPoint& output)
override
255 return m_wallet->IsLockedCoin(output);
257 void listLockedCoins(std::vector<COutPoint>& outputs)
override
260 return m_wallet->ListLockedCoins(outputs);
263 const CCoinControl& coin_control,
265 std::optional<unsigned int> change_pos)
override
273 m_wallet->CommitTransaction(std::move(tx), std::nullopt, std::nullopt, std::nullopt,
messages);
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.GetTx();
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) {
327 result.emplace(MakeWalletTx(*
m_wallet, entry.second));
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);
353 std::vector<std::string>& payment_requests,
355 int& num_blocks)
override
358 auto mi =
m_wallet->mapWallet.find(txid);
359 if (mi !=
m_wallet->mapWallet.end()) {
360 num_blocks =
m_wallet->GetLastBlockHeight();
361 in_mempool = mi->second.InMempool();
363 payment_requests = mi->second.m_payment_requests;
364 tx_status = MakeWalletTxStatus(*
m_wallet, mi->second);
365 return MakeWalletTx(*
m_wallet, mi->second);
372 bool& complete)
override
374 return m_wallet->FillPSBT(psbtx, options, complete, n_signed);
380 result.
balance = bal.m_mine_trusted;
390 if (!locked_wallet) {
393 block_hash =
m_wallet->GetLastBlockHash();
394 balances = getBalances();
398 CAmount getAvailableBalance(
const CCoinControl& coin_control)
override
403 if (coin_control.HasSelected()) {
405 CoinSelectionParams params(
rng);
408 total_amount += res->GetTotalAmount();
413 if (coin_control.m_allow_other_inputs) {
419 bool txinIsMine(
const CTxIn& txin)
override
424 bool txoutIsMine(
const CTxOut& txout)
override
439 CoinsList listCoins()
override
444 auto&
group = result[entry.first];
445 for (
const auto& coin : entry.second) {
446 group.emplace_back(coin.outpoint,
452 std::vector<WalletTxOut> getCoins(
const std::vector<COutPoint>& outputs)
override
455 std::vector<WalletTxOut> result;
456 result.reserve(outputs.size());
457 for (
const auto& output : outputs) {
458 result.emplace_back();
460 if (it !=
m_wallet->mapWallet.end()) {
461 int depth =
m_wallet->GetTxDepthInMainChain(it->second);
463 result.back() = MakeWalletTxOut(*
m_wallet, it->second, output.
n, depth);
470 CAmount getMinimumFee(
unsigned int tx_bytes,
471 const CCoinControl& coin_control,
472 int* returned_target,
479 if (reason) *reason = fee_calc.
reason;
482 unsigned int getConfirmTarget()
override {
return m_wallet->m_confirm_target; }
483 bool hdEnabled()
override {
return m_wallet->IsHDEnabled(); }
484 bool canGetAddresses()
override {
return m_wallet->CanGetAddresses(); }
487 bool taprootEnabled()
override {
489 return spk_man !=
nullptr;
491 OutputType getDefaultAddressType()
override {
return m_wallet->m_default_address_type; }
492 CAmount getDefaultMaxTxFee()
override {
return m_wallet->m_default_max_tx_fee; }
493 void remove()
override
497 std::unique_ptr<Handler> handleUnload(UnloadFn fn)
override
501 std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn)
override
505 std::unique_ptr<Handler> handleStatusChanged(StatusChangedFn fn)
override
509 std::unique_ptr<Handler> handleAddressBookChanged(AddressBookChangedFn fn)
override
512 [fn](
const CTxDestination& address,
const std::string& label,
bool is_mine,
515 std::unique_ptr<Handler> handleTransactionChanged(TransactionChangedFn fn)
override
518 [fn](
const Txid& txid,
ChangeType status) { fn(txid, status); }));
520 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);
567 void setMockTime(int64_t time)
override {
return SetMockTime(time); }
568 void schedulerMockForward(std::chrono::seconds delta)
override {
Assert(
m_context.scheduler)->MockForward(delta); }
573 DatabaseOptions options;
576 options.require_create =
true;
577 options.create_flags = wallet_creation_flags;
578 options.create_passphrase = passphrase;
589 DatabaseOptions options;
592 options.require_existing =
true;
601 util::Result<std::unique_ptr<Wallet>> restoreWallet(
const fs::path& backup_file,
const std::string& wallet_name, std::vector<bilingual_str>& warnings,
bool load_after_restore)
override
606 if (!error.
empty()) {
617 .watchonly_wallet_name = res->watchonly_wallet_name,
618 .solvables_wallet_name = res->solvables_wallet_name,
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)->HasEncryptionKeys();
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.
A version of CTransaction with the PSBT format.
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< WalletLoader > MakeWalletLoader(Chain &chain, ArgsManager &args)
Return implementation of ChainClient interface for a wallet loader.
std::unique_ptr< Handler > MakeSignalHandler(btcsignals::connection connection)
Return handler wrapping a btcsignals connection.
std::unique_ptr< Wallet > MakeWallet(wallet::WalletContext &context, const std::shared_ptr< wallet::CWallet > &wallet)
Return implementation of Wallet interface.
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)
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)
util::Result< MigrationResult > MigrateLegacyToDescriptor(const std::string &wallet_name, const SecureString &passphrase, WalletContext &context, bool load_wallet)
Do all steps to migrate a legacy wallet to a descriptor wallet.
util::Result< CoinsResult > FetchSelectedInputs(const CWallet &wallet, const CCoinControl &coin_control, const CoinSelectionParams &coin_selection_params)
Fetch and validate coin control selected inputs.
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.
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.
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)
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)
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...
util::Result< std::string > ExportWatchOnlyWallet(const CWallet &wallet, const fs::path &destination, WalletContext &context)
Make a new watchonly wallet file containing the public descriptors from this wallet The exported watc...
Balance GetBalance(const CWallet &wallet, const int min_depth, bool avoid_reuse, bool include_nonmempool)
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.
Instructions for how a PSBT should be signed or filled with information.
Information about one wallet address.
Collection of wallet balances.
CAmount nonmempool_balance
CAmount unconfirmed_balance
std::vector< bool > txin_is_mine
std::optional< std::string > comment
std::vector< CTxDestination > txout_address
std::vector< bool > txout_address_is_mine
std::optional< std::string > comment_to
std::vector< bool > txout_is_change
std::vector< bool > txout_is_mine
std::optional< std::string > message
std::optional< std::string > from
Wallet transaction output.
Updated transaction status.
unsigned int time_received
CAmount m_mine_trusted
Trusted, at depth=GetBalance.min_depth or more.
CAmount GetTotalAmount() const
WalletContext struct containing references to state shared between CWallet instances,...
#define TRY_LOCK(cs, name)
FuzzedDataProvider provider
#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