mirror of
https://github.com/ElementsProject/elements.git
synced 2026-08-19 13:27:35 +02:00
GUI: TransactionRecord: Special-case the common scenario where assets are simply issued to myself
This commit is contained in:
parent
906cc4c40b
commit
89275ebf21
1 changed files with 63 additions and 4 deletions
|
|
@ -80,19 +80,67 @@ QList<TransactionRecord> TransactionRecord::decomposeTransaction(const interface
|
||||||
{
|
{
|
||||||
bool involvesWatchAddress = false;
|
bool involvesWatchAddress = false;
|
||||||
isminetype fAllFromMe = ISMINE_SPENDABLE;
|
isminetype fAllFromMe = ISMINE_SPENDABLE;
|
||||||
|
std::set<CAsset> assets_issued_to_me_only;
|
||||||
|
CAmountMap assets_received_by_me_only;
|
||||||
|
for (unsigned int i = 0; i < wtx.tx->vout.size(); i++)
|
||||||
|
{
|
||||||
|
const CAsset& asset = wtx.txout_assets[i];
|
||||||
|
if (assets_received_by_me_only.count(asset) && assets_received_by_me_only.at(asset) < 0) {
|
||||||
|
// Already known to be received by not-me
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
isminetype mine = wtx.txout_address_is_mine[i];
|
||||||
|
if (!mine) {
|
||||||
|
assets_received_by_me_only[asset] = -1;
|
||||||
|
} else {
|
||||||
|
assets_received_by_me_only[asset] += wtx.txout_amounts[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < wtx.tx->vin.size(); ++i)
|
for (size_t i = 0; i < wtx.tx->vin.size(); ++i)
|
||||||
{
|
{
|
||||||
isminetype mine = wtx.txin_is_mine[i];
|
isminetype mine = wtx.txin_is_mine[i];
|
||||||
if(mine & ISMINE_WATCH_ONLY) involvesWatchAddress = true;
|
if(mine & ISMINE_WATCH_ONLY) involvesWatchAddress = true;
|
||||||
if(fAllFromMe > mine) fAllFromMe = mine;
|
if(fAllFromMe > mine) fAllFromMe = mine;
|
||||||
if (!wtx.txin_issuance_asset[i].IsNull()) {
|
const CAsset& asset = wtx.txin_issuance_asset[i];
|
||||||
|
const CAmount& asset_amount = wtx.txin_issuance_asset_amount[i];
|
||||||
|
const CAsset& token = wtx.txin_issuance_token[i];
|
||||||
|
const CAmount& token_amount = wtx.txin_issuance_token_amount[i];
|
||||||
|
if (!asset.IsNull()) {
|
||||||
|
if (assets_received_by_me_only.count(asset) == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (asset_amount == assets_received_by_me_only.at(asset)) {
|
||||||
|
// Special case: collapse the chain of issue, send, receive to just an issue
|
||||||
|
assets_issued_to_me_only.insert(asset);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
TransactionRecord sub(hash, nTime);
|
TransactionRecord sub(hash, nTime);
|
||||||
sub.involvesWatchAddress = involvesWatchAddress;
|
sub.involvesWatchAddress = involvesWatchAddress;
|
||||||
sub.asset = wtx.txin_issuance_asset[i];
|
sub.asset = asset;
|
||||||
sub.amount = wtx.txin_issuance_asset_amount[i];
|
sub.amount = asset_amount;
|
||||||
sub.type = TransactionRecord::IssuedAsset;
|
sub.type = TransactionRecord::IssuedAsset;
|
||||||
parts.append(sub);
|
parts.append(sub);
|
||||||
}
|
}
|
||||||
|
if (!token.IsNull()) {
|
||||||
|
if (assets_received_by_me_only.count(token) == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (token_amount == assets_received_by_me_only.at(asset)) {
|
||||||
|
// Special case: collapse the chain of issue, send, receive to just an issue
|
||||||
|
assets_issued_to_me_only.insert(asset);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
TransactionRecord sub(hash, nTime);
|
||||||
|
sub.involvesWatchAddress = involvesWatchAddress;
|
||||||
|
sub.asset = token;
|
||||||
|
sub.amount = token_amount;
|
||||||
|
sub.type = TransactionRecord::IssuedAsset;
|
||||||
|
parts.append(sub);
|
||||||
|
}
|
||||||
|
|
||||||
if (!wtx.txin_issuance_token[i].IsNull()) {
|
if (!wtx.txin_issuance_token[i].IsNull()) {
|
||||||
TransactionRecord sub(hash, nTime);
|
TransactionRecord sub(hash, nTime);
|
||||||
sub.involvesWatchAddress = involvesWatchAddress;
|
sub.involvesWatchAddress = involvesWatchAddress;
|
||||||
|
|
@ -126,13 +174,16 @@ QList<TransactionRecord> TransactionRecord::decomposeTransaction(const interface
|
||||||
}
|
}
|
||||||
else if (fAllFromMe)
|
else if (fAllFromMe)
|
||||||
{
|
{
|
||||||
|
|
||||||
//
|
//
|
||||||
// Debit
|
// Debit
|
||||||
//
|
//
|
||||||
|
|
||||||
for (unsigned int nOut = 0; nOut < wtx.tx->vout.size(); nOut++)
|
for (unsigned int nOut = 0; nOut < wtx.tx->vout.size(); nOut++)
|
||||||
{
|
{
|
||||||
|
|
||||||
const CTxOut& txout = wtx.tx->vout[nOut];
|
const CTxOut& txout = wtx.tx->vout[nOut];
|
||||||
|
const CAsset& asset = wtx.txout_assets[nOut];
|
||||||
|
|
||||||
if(wtx.txout_is_mine[nOut] || txout.IsFee())
|
if(wtx.txout_is_mine[nOut] || txout.IsFee())
|
||||||
{
|
{
|
||||||
|
|
@ -141,11 +192,16 @@ QList<TransactionRecord> TransactionRecord::decomposeTransaction(const interface
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Short-circuit when it's an issuance to self
|
||||||
|
if (assets_issued_to_me_only.count(asset) == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
TransactionRecord sub(hash, nTime);
|
TransactionRecord sub(hash, nTime);
|
||||||
sub.idx = nOut;
|
sub.idx = nOut;
|
||||||
sub.involvesWatchAddress = involvesWatchAddress;
|
sub.involvesWatchAddress = involvesWatchAddress;
|
||||||
sub.amount = -wtx.txout_amounts[nOut];
|
sub.amount = -wtx.txout_amounts[nOut];
|
||||||
sub.asset = wtx.txout_assets[nOut];
|
sub.asset = asset;
|
||||||
|
|
||||||
if (!boost::get<CNoDestination>(&wtx.txout_address[nOut]))
|
if (!boost::get<CNoDestination>(&wtx.txout_address[nOut]))
|
||||||
{
|
{
|
||||||
|
|
@ -159,6 +215,9 @@ QList<TransactionRecord> TransactionRecord::decomposeTransaction(const interface
|
||||||
sub.type = TransactionRecord::SendToOther;
|
sub.type = TransactionRecord::SendToOther;
|
||||||
sub.address = mapValue["to"];
|
sub.address = mapValue["to"];
|
||||||
}
|
}
|
||||||
|
if (assets_issued_to_me_only.count(asset)) {
|
||||||
|
sub.type = TransactionRecord::IssuedAsset;
|
||||||
|
}
|
||||||
parts.append(sub);
|
parts.append(sub);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue