Inside Bitcoin
Opening the selected file…
Inside Bitcoin
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.
1// Copyright (c) 2011-present The Bitcoin Core developers2// Distributed under the MIT software license, see the accompanying3// file COPYING or http://www.opensource.org/licenses/mit-license.php.5#include <qt/guiutil.h>7#include <qt/bitcoinaddressvalidator.h>8#include <qt/bitcoinunits.h>9#include <qt/platformstyle.h>10#include <qt/qvalidatedlineedit.h>11#include <qt/sendcoinsrecipient.h>13#include <addresstype.h>14#include <base58.h>15#include <chainparams.h>16#include <common/args.h>17#include <interfaces/node.h>18#include <key_io.h>19#include <logging.h>20#include <policy/policy.h>21#include <primitives/transaction.h>22#include <protocol.h>23#include <script/script.h>24#include <util/chaintype.h>25#include <util/exception.h>26#include <util/fs.h>27#include <util/fs_helpers.h>28#include <util/time.h>30#ifdef WIN3231#include <shellapi.h>32#include <shlobj.h>33#include <shlwapi.h>34#endif36#include <QAbstractButton>37#include <QAbstractItemView>38#include <QApplication>39#include <QClipboard>40#include <QDateTime>41#include <QDesktopServices>42#include <QDialog>43#include <QDoubleValidator>44#include <QFileDialog>45#include <QFont>46#include <QFontDatabase>47#include <QFontMetrics>48#include <QGuiApplication>49#include <QJsonObject>50#include <QKeyEvent>51#include <QKeySequence>52#include <QLatin1String>53#include <QLineEdit>54#include <QList>55#include <QLocale>56#include <QMenu>57#include <QMouseEvent>58#include <QPluginLoader>59#include <QProgressDialog>60#include <QRegularExpression>61#include <QScreen>62#include <QSettings>63#include <QShortcut>64#include <QSize>65#include <QStandardPaths>66#include <QString>67#include <QTextDocument>68#include <QThread>69#include <QUrlQuery>70#include <QtGlobal>72#include <cassert>73#include <chrono>74#include <exception>75#include <fstream>76#include <string>77#include <vector>79#if defined(Q_OS_MACOS)81#include <QProcess>83void ForceActivation();84#endif86using namespace std::chrono_literals;88namespace GUIUtil {90QString dateTimeStr(const QDateTime &date)91{92return QLocale::system().toString(date.date(), QLocale::ShortFormat) + QString(" ") + date.toString("hh:mm");93}95QString dateTimeStr(qint64 nTime)96{97return dateTimeStr(QDateTime::fromSecsSinceEpoch(nTime));98}100QFont fixedPitchFont(bool use_embedded_font)101{102if (use_embedded_font) {103return {"Roboto Mono"};104}105return QFontDatabase::systemFont(QFontDatabase::FixedFont);106}108// Return a pre-generated dummy bech32m address (P2TR) with invalid checksum.109static std::string DummyAddress(const CChainParams ¶ms)110{111std::string addr;112switch (params.GetChainType()) {113case ChainType::MAIN:114addr = "bc1p35yvjel7srp783ztf8v6jdra7dhfzk5jaun8xz2qp6ws7z80n4tq2jku9f";115break;116case ChainType::SIGNET:117case ChainType::TESTNET:118case ChainType::TESTNET4:119addr = "tb1p35yvjel7srp783ztf8v6jdra7dhfzk5jaun8xz2qp6ws7z80n4tqa6qnlg";120break;121case ChainType::REGTEST:122addr = "bcrt1p35yvjel7srp783ztf8v6jdra7dhfzk5jaun8xz2qp6ws7z80n4tqsr2427";123break;124} // no default case, so the compiler can warn about missing cases125assert(!addr.empty());127if (Assume(!IsValidDestinationString(addr))) return addr;128return {};129}131void setupAddressWidget(QValidatedLineEdit *widget, QWidget *parent)132{133parent->setFocusProxy(widget);135widget->setFont(fixedPitchFont());136// We don't want translators to use own addresses in translations137// and this is the only place, where this address is supplied.138widget->setPlaceholderText(QObject::tr("Enter a Bitcoin address (e.g. %1)").arg(139QString::fromStdString(DummyAddress(Params()))));140widget->setValidator(new BitcoinAddressEntryValidator(parent));141widget->setCheckValidator(new BitcoinAddressCheckValidator(parent));142}144void AddButtonShortcut(QAbstractButton* button, const QKeySequence& shortcut)145{146QObject::connect(new QShortcut(shortcut, button), &QShortcut::activated, [button]() { button->animateClick(); });147}149bool parseBitcoinURI(const QUrl &uri, SendCoinsRecipient *out)150{151// return if URI is not valid or is no bitcoin: URI152if(!uri.isValid() || uri.scheme() != QString("bitcoin"))153return false;155SendCoinsRecipient rv;156rv.address = uri.path();157// Trim any following forward slash which may have been added by the OS158if (rv.address.endsWith("/")) {159rv.address.truncate(rv.address.length() - 1);160}161rv.amount = 0;163QUrlQuery uriQuery(uri);164QList<QPair<QString, QString> > items = uriQuery.queryItems();165for (QList<QPair<QString, QString> >::iterator i = items.begin(); i != items.end(); i++)166{167bool fShouldReturnFalse = false;168if (i->first.startsWith("req-"))169{170i->first.remove(0, 4);171fShouldReturnFalse = true;172}174if (i->first == "label")175{176rv.label = i->second;177fShouldReturnFalse = false;178}179if (i->first == "message")180{181rv.message = i->second;182fShouldReturnFalse = false;183}184else if (i->first == "amount")185{186if(!i->second.isEmpty())187{188if (!BitcoinUnits::parse(BitcoinUnit::BTC, i->second, &rv.amount)) {189return false;190}191}192fShouldReturnFalse = false;193}195if (fShouldReturnFalse)196return false;197}198if(out)199{200*out = rv;201}202return true;203}205bool parseBitcoinURI(QString uri, SendCoinsRecipient *out)206{207QUrl uriInstance(uri);208return parseBitcoinURI(uriInstance, out);209}211QString formatBitcoinURI(const SendCoinsRecipient &info)212{213bool bech_32 = info.address.startsWith(QString::fromStdString(Params().Bech32HRP() + "1"));215QString ret = QString("bitcoin:%1").arg(bech_32 ? info.address.toUpper() : info.address);216int paramCount = 0;218if (info.amount)219{220ret += QString("?amount=%1").arg(BitcoinUnits::format(BitcoinUnit::BTC, info.amount, false, BitcoinUnits::SeparatorStyle::NEVER));221paramCount++;222}224if (!info.label.isEmpty())225{226QString lbl(QUrl::toPercentEncoding(info.label));227ret += QString("%1label=%2").arg(paramCount == 0 ? "?" : "&").arg(lbl);228paramCount++;229}231if (!info.message.isEmpty())232{233QString msg(QUrl::toPercentEncoding(info.message));234ret += QString("%1message=%2").arg(paramCount == 0 ? "?" : "&").arg(msg);235paramCount++;236}238return ret;239}241bool isDust(interfaces::Node& node, const QString& address, const CAmount& amount)242{243CTxDestination dest = DecodeDestination(address.toStdString());244CScript script = GetScriptForDestination(dest);245CTxOut txOut(amount, script);246return IsDust(txOut, node.getDustRelayFee());247}249QString HtmlEscape(const QString& str, bool fMultiLine)250{
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.