Inside Bitcoin
Opening the selected file…
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
251bool isLockedCoin(const COutPoint& output) override252{253LOCK(m_wallet->cs_wallet);254return m_wallet->IsLockedCoin(output);255}256void listLockedCoins(std::vector<COutPoint>& outputs) override257{258LOCK(m_wallet->cs_wallet);259return m_wallet->ListLockedCoins(outputs);260}261util::Result<wallet::CreatedTransactionResult> createTransaction(const std::vector<CRecipient>& recipients,262const CCoinControl& coin_control,263bool sign,264std::optional<unsigned int> change_pos) override265{266LOCK(m_wallet->cs_wallet);267return CreateTransaction(*m_wallet, recipients, change_pos, coin_control, sign);268}269void commitTransaction(CTransactionRef tx, const std::vector<std::string>& messages) override270{271LOCK(m_wallet->cs_wallet);272m_wallet->CommitTransaction(std::move(tx), /*replaces_txid=*/std::nullopt, /*comment=*/std::nullopt, /*comment_to=*/std::nullopt, messages);273}274bool transactionCanBeAbandoned(const Txid& txid) override { return m_wallet->TransactionCanBeAbandoned(txid); }275bool abandonTransaction(const Txid& txid) override276{277LOCK(m_wallet->cs_wallet);278return m_wallet->AbandonTransaction(txid);279}280bool transactionCanBeBumped(const Txid& txid) override281{282return feebumper::TransactionCanBeBumped(*m_wallet.get(), txid);283}284bool createBumpTransaction(const Txid& txid,285const CCoinControl& coin_control,286std::vector<bilingual_str>& errors,287CAmount& old_fee,288CAmount& new_fee,289CMutableTransaction& mtx) override290{291std::vector<CTxOut> outputs; // just an empty list of new recipients for now292return feebumper::CreateRateBumpTransaction(*m_wallet.get(), txid, coin_control, errors, old_fee, new_fee, mtx, /* require_mine= */ true, outputs) == feebumper::Result::OK;293}294bool signBumpTransaction(CMutableTransaction& mtx) override { return feebumper::SignTransaction(*m_wallet.get(), mtx); }295bool commitBumpTransaction(const Txid& txid,296CMutableTransaction&& mtx,297std::vector<bilingual_str>& errors,298Txid& bumped_txid) override299{300return feebumper::CommitTransaction(*m_wallet.get(), txid, std::move(mtx), errors, bumped_txid) ==301feebumper::Result::OK;302}303CTransactionRef getTx(const Txid& txid) override304{305LOCK(m_wallet->cs_wallet);306auto mi = m_wallet->mapWallet.find(txid);307if (mi != m_wallet->mapWallet.end()) {308return mi->second.GetTx();309}310return {};311}312WalletTx getWalletTx(const Txid& txid) override313{314LOCK(m_wallet->cs_wallet);315auto mi = m_wallet->mapWallet.find(txid);316if (mi != m_wallet->mapWallet.end()) {317return MakeWalletTx(*m_wallet, mi->second);318}319return {};320}321std::set<WalletTx> getWalletTxs() override322{323LOCK(m_wallet->cs_wallet);324std::set<WalletTx> result;325for (const auto& entry : m_wallet->mapWallet) {326result.emplace(MakeWalletTx(*m_wallet, entry.second));327}328return result;329}330bool tryGetTxStatus(const Txid& txid,331interfaces::WalletTxStatus& tx_status,332int& num_blocks,333int64_t& block_time) override334{335TRY_LOCK(m_wallet->cs_wallet, locked_wallet);336if (!locked_wallet) {337return false;338}339auto mi = m_wallet->mapWallet.find(txid);340if (mi == m_wallet->mapWallet.end()) {341return false;342}343num_blocks = m_wallet->GetLastBlockHeight();344block_time = -1;345CHECK_NONFATAL(m_wallet->chain().findBlock(m_wallet->GetLastBlockHash(), FoundBlock().time(block_time)));346tx_status = MakeWalletTxStatus(*m_wallet, mi->second);347return true;348}349WalletTx getWalletTxDetails(const Txid& txid,350WalletTxStatus& tx_status,351std::vector<std::string>& messages,352std::vector<std::string>& payment_requests,353bool& in_mempool,354int& num_blocks) override355{356LOCK(m_wallet->cs_wallet);357auto mi = m_wallet->mapWallet.find(txid);358if (mi != m_wallet->mapWallet.end()) {359num_blocks = m_wallet->GetLastBlockHeight();360in_mempool = mi->second.InMempool();361messages = mi->second.m_messages;362payment_requests = mi->second.m_payment_requests;363tx_status = MakeWalletTxStatus(*m_wallet, mi->second);364return MakeWalletTx(*m_wallet, mi->second);365}366return {};367}368std::optional<PSBTError> fillPSBT(const common::PSBTFillOptions& options,369size_t* n_signed,370PartiallySignedTransaction& psbtx,371bool& complete) override372{373return m_wallet->FillPSBT(psbtx, options, complete, n_signed);374}375WalletBalances getBalances() override376{377const auto bal = GetBalance(*m_wallet);378WalletBalances result;379result.balance = bal.m_mine_trusted;380result.unconfirmed_balance = bal.m_mine_untrusted_pending;381result.immature_balance = bal.m_mine_immature;382result.used_balance = bal.m_mine_used;383result.nonmempool_balance = bal.m_mine_nonmempool;384return result;385}386bool tryGetBalances(WalletBalances& balances, uint256& block_hash) override387{388TRY_LOCK(m_wallet->cs_wallet, locked_wallet);389if (!locked_wallet) {390return false;391}392block_hash = m_wallet->GetLastBlockHash();393balances = getBalances();394return true;395}396CAmount getBalance() override { return GetBalance(*m_wallet).m_mine_trusted; }397CAmount getAvailableBalance(const CCoinControl& coin_control) override398{399LOCK(m_wallet->cs_wallet);400CAmount total_amount = 0;401// Fetch selected coins total amount402if (coin_control.HasSelected()) {403FastRandomContext rng{};404CoinSelectionParams params(rng);405// Note: for now, swallow any error.406if (auto res = FetchSelectedInputs(*m_wallet, coin_control, params)) {407total_amount += res->GetTotalAmount();408}409}411// And fetch the wallet available coins412if (coin_control.m_allow_other_inputs) {413total_amount += AvailableCoins(*m_wallet, &coin_control).GetTotalAmount();414}416return total_amount;417}418bool txinIsMine(const CTxIn& txin) override419{420LOCK(m_wallet->cs_wallet);421return InputIsMine(*m_wallet, txin);422}423bool txoutIsMine(const CTxOut& txout) override424{425LOCK(m_wallet->cs_wallet);426return m_wallet->IsMine(txout);427}428CAmount getDebit(const CTxIn& txin) override429{430LOCK(m_wallet->cs_wallet);431return m_wallet->GetDebit(txin);432}433CAmount getCredit(const CTxOut& txout) override434{435LOCK(m_wallet->cs_wallet);436return OutputGetCredit(*m_wallet, txout);437}438CoinsList listCoins() override439{440LOCK(m_wallet->cs_wallet);441CoinsList result;442for (const auto& entry : ListCoins(*m_wallet)) {443auto& group = result[entry.first];444for (const auto& coin : entry.second) {445group.emplace_back(coin.outpoint,446MakeWalletTxOut(*m_wallet, coin));447}448}449return result;450}451std::vector<WalletTxOut> getCoins(const std::vector<COutPoint>& outputs) override452{453LOCK(m_wallet->cs_wallet);454std::vector<WalletTxOut> result;455result.reserve(outputs.size());456for (const auto& output : outputs) {457result.emplace_back();458auto it = m_wallet->mapWallet.find(output.hash);459if (it != m_wallet->mapWallet.end()) {460int depth = m_wallet->GetTxDepthInMainChain(it->second);461if (depth >= 0) {462result.back() = MakeWalletTxOut(*m_wallet, it->second, output.n, depth);463}464}465}466return result;467}468CAmount getRequiredFee(unsigned int tx_bytes) override { return GetRequiredFee(*m_wallet, tx_bytes); }469CAmount getMinimumFee(unsigned int tx_bytes,470const CCoinControl& coin_control,471std::optional<int>* returned_target,472FeeReason* reason) override473{474auto min_fee_rate{GetMinimumFeeRate(*m_wallet, coin_control)};475auto result = GetMinimumFee(min_fee_rate, tx_bytes);476if (returned_target) *returned_target = min_fee_rate.returned_target;477if (reason) *reason = min_fee_rate.fee_reason;478return result;479}480unsigned int getConfirmTarget() override { return m_wallet->m_confirm_target; }481bool hdEnabled() override { return m_wallet->IsHDEnabled(); }482bool canGetAddresses() override { return m_wallet->CanGetAddresses(); }483bool hasExternalSigner() override { return m_wallet->IsWalletFlagSet(WALLET_FLAG_EXTERNAL_SIGNER); }484bool privateKeysDisabled() override { return m_wallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); }485bool taprootEnabled() override {486auto spk_man = m_wallet->GetScriptPubKeyMan(OutputType::BECH32M, /*internal=*/false);487return spk_man != nullptr;488}489OutputType getDefaultAddressType() override { return m_wallet->m_default_address_type; }490CAmount getDefaultMaxTxFee() override { return m_wallet->m_default_max_tx_fee; }491void remove() override492{493RemoveWallet(m_context, m_wallet, /*load_on_start=*/false);494}495std::unique_ptr<Handler> handleUnload(UnloadFn fn) override496{497return MakeSignalHandler(m_wallet->NotifyUnload.connect(fn));498}499std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn) override500{