24 m_wallet_model(wallet_model),
25 m_client_model(client_model)
28 setWindowTitle(
"PSBT Operations");
35 connect(
m_ui->
closeButton, &QPushButton::clicked,
this, &PSBTOperationsDialog::close);
55 showStatus(tr(
"Failed to load transaction: %1")
73 showStatus(tr(
"Failed to sign transaction: %1")
80 if (!complete && n_signed < 1) {
82 }
else if (!complete) {
83 showStatus(tr(
"Signed %1 inputs, but more signatures are still required.").arg(n_signed),
86 showStatus(tr(
"Signed transaction successfully. Transaction is ready to broadcast."),
103 std::string err_string;
108 showStatus(tr(
"Transaction broadcast successfully! Transaction ID: %1")
111 showStatus(tr(
"Transaction broadcast failed: %1")
127 QString selected_filter;
128 QString filename_suggestion =
"";
132 filename_suggestion.append(
"-");
138 filename_suggestion.append(address_str +
"-" + amount);
141 filename_suggestion.append(
".psbt");
143 tr(
"Save Transaction Data"), filename_suggestion,
144 tr(
"Partially Signed Transaction (Binary) (*.psbt)"), &selected_filter);
145 if (filename.isEmpty()) {
148 std::ofstream out(filename.toLocal8Bit().data(), std::ofstream::out | std::ofstream::binary);
161 QString tx_description =
"";
163 for (
const CTxOut& out : psbtx.
tx->vout) {
166 totalAmount += out.
nValue;
167 tx_description.append(tr(
" * Sends %1 to %2")
170 tx_description.append(
"<br>");
174 tx_description.append(
" * ");
175 if (!*analysis.
fee) {
177 tx_description.append(tr(
"Unable to calculate transaction fee or total transaction amount."));
179 tx_description.append(tr(
"Pays transaction fee: "));
183 tx_description.append(
"<hr />");
184 QStringList alternativeUnits;
191 tx_description.append(QString(
"<b>%1</b>: <b>%2</b>").arg(tr(
"Total Amount"))
193 tx_description.append(QString(
"<br /><span style='font-size:10pt; font-weight:normal;'>(=%1)</span>")
194 .arg(alternativeUnits.join(
" " + tr(
"or") +
" ")));
198 if (num_unsigned > 0) {
199 tx_description.append(
"<br><br>");
200 tx_description.append(tr(
"Transaction has %1 unsigned inputs.").arg(QString::number(num_unsigned)));
203 return tx_description.toStdString();
210 m_ui->
statusBar->setStyleSheet(
"QLabel { background-color : lightgreen }");
214 m_ui->
statusBar->setStyleSheet(
"QLabel { background-color : orange }");
218 m_ui->
statusBar->setStyleSheet(
"QLabel { background-color : red }");
240 switch (analysis.
next) {
246 QString need_sig_text = tr(
"Transaction still needs signature(s).");
249 need_sig_text +=
" " + tr(
"(But this wallet cannot sign transactions.)");
251 }
else if (n_could_sign < 1) {
252 need_sig_text +=
" " + tr(
"(But this wallet does not have the right keys.)");
std::shared_ptr< const CTransaction > CTransactionRef
virtual bool privateKeysDisabled()=0
interfaces::Wallet & wallet() const
std::string renderTransaction(const PartiallySignedTransaction &psbtx)
QPushButton * broadcastTransactionButton
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a standard scriptPubKey for the destination address.
void setupUi(QDialog *PSBTOperationsDialog)
Dialog showing transaction details.
PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx)
Provides helpful miscellaneous information about where a PSBT is in the signing workflow.
void broadcastTransaction()
Optional< CMutableTransaction > tx
static QString format(int unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=SeparatorStyle::STANDARD, bool justify=false)
Format as string.
bool FinalizePSBT(PartiallySignedTransaction &psbtx)
Finalizes a PSBT if possible, combining partial signatures.
static CTransactionRef MakeTransactionRef()
PSBTRole next
Which of the BIP 174 roles needs to handle the transaction next.
Holds the results of AnalyzePSBT (miscellaneous information about a PSBT)
OptionsModel * getOptionsModel()
void updateTransactionDisplay()
bilingual_str TransactionErrorString(const TransactionError err)
A version of CTransaction with the PSBT format.
Double ended buffer combining vector and stream-like interfaces.
ClientModel * m_client_model
Ui::PSBTOperationsDialog * m_ui
void openWithPSBT(PartiallySignedTransaction psbtx)
bool FinalizeAndExtractPSBT(PartiallySignedTransaction &psbtx, CMutableTransaction &result)
Finalizes a PSBT if possible, and extracts it to a CMutableTransaction if it could be finalized...
int getDisplayUnit() const
int64_t CAmount
Amount in satoshis (Can be negative)
size_t couldSignInputs(const PartiallySignedTransaction &psbtx)
Optional< CAmount > fee
Amount of fee being paid by the transaction.
std::string EncodeBase64(Span< const unsigned char > input)
void setClipboard(const QString &str)
static QString formatHtmlWithUnit(int unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=SeparatorStyle::STANDARD)
Format as HTML string (with unit)
static const CFeeRate DEFAULT_MAX_RAW_TX_FEE_RATE
Maximum fee rate for sendrawtransaction and testmempoolaccept RPC calls.
QPushButton * copyToClipboardButton
QTextEdit * transactionDescription
PartiallySignedTransaction m_transaction_data
interfaces::Node & node() const
static QString formatWithUnit(int unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=SeparatorStyle::STANDARD)
Format as string (with unit)
void showTransactionStatus(const PartiallySignedTransaction &psbtx)
An output of a transaction.
Model for Bitcoin network client.
QPushButton * signTransactionButton
virtual TransactionError fillPSBT(int sighash_type, bool sign, bool bip32derivs, PartiallySignedTransaction &psbtx, bool &complete, size_t *n_signed)=0
Fill PSBT.
static QList< Unit > availableUnits()
Get list of units, for drop-down box.
size_t CountPSBTUnsignedInputs(const PartiallySignedTransaction &psbt)
Counts the unsigned inputs of a PSBT.
PSBTOperationsDialog(QWidget *parent, WalletModel *walletModel, ClientModel *clientModel)
TransactionError BroadcastTransaction(NodeContext &node, const CTransactionRef tx, std::string &err_string, const CAmount &max_tx_fee, bool relay, bool wait_callback)
Submit a transaction to the mempool and (optionally) relay it to all P2P peers.
void showStatus(const QString &msg, StatusLevel level)
Interface to Bitcoin wallet from Qt view code.
static const int PROTOCOL_VERSION
network protocol versioning
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedSuffixOut)
Get save filename, mimics QFileDialog::getSaveFileName, except that it appends a default suffix when ...
virtual NodeContext * context()
Get and set internal node context.
std::string EncodeDestination(const CTxDestination &dest)
A mutable version of CTransaction.
QPushButton * closeButton
boost::variant< CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessUnknown > CTxDestination
A txout script template with a specific destination.
bool error(const char *fmt, const Args &... args)
CAmount GetFeePerK() const
Return the fee in satoshis for a size of 1000 bytes.
WalletModel * m_wallet_model
OptionsModel * getOptionsModel()