diff --git a/src/interfaces/wallet.cpp b/src/interfaces/wallet.cpp index 496d83f435..33185c297d 100644 --- a/src/interfaces/wallet.cpp +++ b/src/interfaces/wallet.cpp @@ -61,8 +61,14 @@ static WalletTx MakeWalletTx(CWallet& wallet, const CWalletTx& wtx) EXCLUSIVE_LO WalletTx result; result.tx = wtx.tx; result.txin_is_mine.reserve(wtx.tx->vin.size()); - for (const auto& txin : wtx.tx->vin) { + result.txin_issuance_asset.resize(wtx.tx->vin.size()); + result.txin_issuance_token.resize(wtx.tx->vin.size()); + for (unsigned int i = 0; i < wtx.tx->vin.size(); ++i) { + const auto& txin = wtx.tx->vin[i]; result.txin_is_mine.emplace_back(wallet.IsMine(txin)); + wtx.GetIssuanceAssets(i, &result.txin_issuance_asset[i], &result.txin_issuance_token[i]); + result.txin_issuance_asset_amount.emplace_back(wtx.GetIssuanceAmount(i, false)); + result.txin_issuance_token_amount.emplace_back(wtx.GetIssuanceAmount(i, true)); } result.txout_is_mine.reserve(wtx.tx->vout.size()); result.txout_address.reserve(wtx.tx->vout.size()); diff --git a/src/interfaces/wallet.h b/src/interfaces/wallet.h index ca7c104c93..87d1891863 100644 --- a/src/interfaces/wallet.h +++ b/src/interfaces/wallet.h @@ -337,6 +337,10 @@ struct WalletTx std::vector txout_address_is_mine; std::vector txout_amounts; std::vector txout_assets; + std::vector txin_issuance_asset_amount; + std::vector txin_issuance_asset; + std::vector txin_issuance_token_amount; + std::vector txin_issuance_token; CAmountMap credit; CAmountMap debit; CAmountMap change; diff --git a/src/qt/transactionrecord.cpp b/src/qt/transactionrecord.cpp index 9663c72bbd..51365d16d1 100644 --- a/src/qt/transactionrecord.cpp +++ b/src/qt/transactionrecord.cpp @@ -80,10 +80,27 @@ QList TransactionRecord::decomposeTransaction(const interface { bool involvesWatchAddress = false; isminetype fAllFromMe = ISMINE_SPENDABLE; - for (const isminetype mine : wtx.txin_is_mine) + for (size_t i = 0; i < wtx.tx->vin.size(); ++i) { + isminetype mine = wtx.txin_is_mine[i]; if(mine & ISMINE_WATCH_ONLY) involvesWatchAddress = true; if(fAllFromMe > mine) fAllFromMe = mine; + if (!wtx.txin_issuance_asset[i].IsNull()) { + TransactionRecord sub(hash, nTime); + sub.involvesWatchAddress = involvesWatchAddress; + sub.asset = wtx.txin_issuance_asset[i]; + sub.amount = wtx.txin_issuance_asset_amount[i]; + sub.type = TransactionRecord::IssuedAsset; + parts.append(sub); + } + if (!wtx.txin_issuance_token[i].IsNull()) { + TransactionRecord sub(hash, nTime); + sub.involvesWatchAddress = involvesWatchAddress; + sub.asset = wtx.txin_issuance_token[i]; + sub.amount = wtx.txin_issuance_token_amount[i]; + sub.type = TransactionRecord::IssuedAsset; + parts.append(sub); + } } isminetype fAllToMe = ISMINE_SPENDABLE; diff --git a/src/qt/transactionrecord.h b/src/qt/transactionrecord.h index ee087e5b11..9fdb5b6a65 100644 --- a/src/qt/transactionrecord.h +++ b/src/qt/transactionrecord.h @@ -83,7 +83,8 @@ public: RecvWithAddress, RecvFromOther, SendToSelf, - Fee + Fee, + IssuedAsset, }; /** Number of confirmation recommended for accepting a transaction */ diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp index f09c0864d9..c538f6c25e 100644 --- a/src/qt/transactiontablemodel.cpp +++ b/src/qt/transactiontablemodel.cpp @@ -354,6 +354,8 @@ QString TransactionTableModel::formatTxType(const TransactionRecord *wtx) const return tr("Mined"); case TransactionRecord::Fee: return tr("Fee"); + case TransactionRecord::IssuedAsset: + return tr("Issuance"); default: return QString(); } @@ -364,6 +366,7 @@ QVariant TransactionTableModel::txAddressDecoration(const TransactionRecord *wtx switch(wtx->type) { case TransactionRecord::Generated: + case TransactionRecord::IssuedAsset: return QIcon(":/icons/tx_mined"); case TransactionRecord::RecvWithAddress: case TransactionRecord::RecvFromOther: @@ -392,6 +395,7 @@ QString TransactionTableModel::formatTxToAddress(const TransactionRecord *wtx, b case TransactionRecord::RecvWithAddress: case TransactionRecord::SendToAddress: case TransactionRecord::Generated: + case TransactionRecord::IssuedAsset: return lookupAddress(wtx->address, tooltip) + watchAddress; case TransactionRecord::SendToOther: return QString::fromStdString(wtx->address) + watchAddress; @@ -409,6 +413,7 @@ QVariant TransactionTableModel::addressColor(const TransactionRecord *wtx) const case TransactionRecord::RecvWithAddress: case TransactionRecord::SendToAddress: case TransactionRecord::Generated: + case TransactionRecord::IssuedAsset: { QString label = walletModel->getAddressTableModel()->labelForAddress(QString::fromStdString(wtx->address)); if(label.isEmpty()) diff --git a/src/qt/transactionview.cpp b/src/qt/transactionview.cpp index ea8883e6ce..b67cfe7f73 100644 --- a/src/qt/transactionview.cpp +++ b/src/qt/transactionview.cpp @@ -125,6 +125,7 @@ TransactionView::TransactionView(const PlatformStyle *platformStyle, QWidget *pa typeWidget->addItem(tr("To yourself"), TransactionFilterProxy::TYPE(TransactionRecord::SendToSelf)); typeWidget->addItem(tr("Mined"), TransactionFilterProxy::TYPE(TransactionRecord::Generated)); typeWidget->addItem(tr("Fee"), TransactionFilterProxy::TYPE(TransactionRecord::Fee)); + typeWidget->addItem(tr("Issuance"), TransactionFilterProxy::TYPE(TransactionRecord::IssuedAsset)); typeWidget->addItem(tr("Other"), TransactionFilterProxy::TYPE(TransactionRecord::Other)); hlayout->addWidget(typeWidget);