feat(spv): per-address balance and tx count in sync result
This commit is contained in:
@@ -24,6 +24,7 @@ public sealed class SyncResult
|
|||||||
public required IReadOnlyList<CachedTx> History { get; init; }
|
public required IReadOnlyList<CachedTx> History { get; init; }
|
||||||
public required IReadOnlyList<CachedUtxo> Utxos { get; init; }
|
public required IReadOnlyList<CachedUtxo> Utxos { get; init; }
|
||||||
public required IReadOnlyList<TrackedAddress> Addresses { get; init; }
|
public required IReadOnlyList<TrackedAddress> Addresses { get; init; }
|
||||||
|
public required IReadOnlyList<CachedAddress> AddressRows { get; init; }
|
||||||
public required IReadOnlyDictionary<string, Transaction> Transactions { get; init; }
|
public required IReadOnlyDictionary<string, Transaction> Transactions { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,6 +146,22 @@ public sealed class WalletSynchronizer(HdAccount account, ElectrumClient client,
|
|||||||
return hb.CompareTo(ha);
|
return hb.CompareTo(ha);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Saldo e numero di transazioni per singolo indirizzo (vista indirizzi).
|
||||||
|
var balanceByAddress = utxos
|
||||||
|
.GroupBy(u => u.Address)
|
||||||
|
.ToDictionary(g => g.Key, g => g.Sum(u => u.ValueSats));
|
||||||
|
var addressRows = tracked
|
||||||
|
.OrderBy(t => t.IsChange).ThenBy(t => t.Index)
|
||||||
|
.Select(t => new CachedAddress
|
||||||
|
{
|
||||||
|
Address = t.Address.ToString(),
|
||||||
|
IsChange = t.IsChange,
|
||||||
|
Index = t.Index,
|
||||||
|
BalanceSats = balanceByAddress.GetValueOrDefault(t.Address.ToString()),
|
||||||
|
TxCount = historyByAddress.TryGetValue(t.ScriptHash, out var h) ? h.Count : 0,
|
||||||
|
})
|
||||||
|
.ToList();
|
||||||
|
|
||||||
return new SyncResult
|
return new SyncResult
|
||||||
{
|
{
|
||||||
TipHeight = tip.Height,
|
TipHeight = tip.Height,
|
||||||
@@ -155,6 +172,7 @@ public sealed class WalletSynchronizer(HdAccount account, ElectrumClient client,
|
|||||||
History = history,
|
History = history,
|
||||||
Utxos = utxos,
|
Utxos = utxos,
|
||||||
Addresses = tracked,
|
Addresses = tracked,
|
||||||
|
AddressRows = addressRows,
|
||||||
Transactions = transactions,
|
Transactions = transactions,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,6 +79,17 @@ public sealed class SyncCache
|
|||||||
public int NextChangeIndex { get; set; }
|
public int NextChangeIndex { get; set; }
|
||||||
public List<CachedTx> History { get; set; } = [];
|
public List<CachedTx> History { get; set; } = [];
|
||||||
public List<CachedUtxo> Utxos { get; set; } = [];
|
public List<CachedUtxo> Utxos { get; set; } = [];
|
||||||
|
public List<CachedAddress> Addresses { get; set; } = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Indirizzo scansionato con saldo proprio e numero di transazioni (vista indirizzi).</summary>
|
||||||
|
public sealed class CachedAddress
|
||||||
|
{
|
||||||
|
public required string Address { get; set; }
|
||||||
|
public bool IsChange { get; set; }
|
||||||
|
public int Index { get; set; }
|
||||||
|
public long BalanceSats { get; set; }
|
||||||
|
public int TxCount { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class CachedTx
|
public sealed class CachedTx
|
||||||
|
|||||||
Reference in New Issue
Block a user