Commit d520c752 authored by Jeremy Bokobza's avatar Jeremy Bokobza

Added id of the spending transaction in the TransactionDetails object

parent f2df0413
...@@ -247,6 +247,17 @@ namespace Breeze.Wallet ...@@ -247,6 +247,17 @@ namespace Breeze.Wallet
var index = usedAddresses.Max(a => a.Index); var index = usedAddresses.Max(a => a.Index);
return usedAddresses.Single(a => a.Index == index); return usedAddresses.Single(a => a.Index == index);
} }
/// <summary>
/// Gets a collection of transactions by id.
/// </summary>
/// <param name="id">The identifier.</param>
/// <returns></returns>
public IEnumerable<TransactionData> GetTransactionsById(uint256 id)
{
var addresses = this.ExternalAddresses.Concat(this.InternalAddresses);
return addresses.SelectMany(a => a.Transactions.Where(t => t.Id == id));
}
} }
/// <summary> /// <summary>
...@@ -304,6 +315,13 @@ namespace Breeze.Wallet ...@@ -304,6 +315,13 @@ namespace Breeze.Wallet
[JsonConverter(typeof(UInt256JsonConverter))] [JsonConverter(typeof(UInt256JsonConverter))]
public uint256 Id { get; set; } public uint256 Id { get; set; }
/// <summary>
/// The id of the transaction in which the output referenced in this transaction is spent.
/// </summary>
[JsonProperty(PropertyName = "spentIn", NullValueHandling = NullValueHandling.Ignore)]
[JsonConverter(typeof(UInt256JsonConverter))]
public uint256 SpentInTransaction { get; set; }
/// <summary> /// <summary>
/// The transaction amount. /// The transaction amount.
/// </summary> /// </summary>
......
...@@ -355,13 +355,13 @@ namespace Breeze.Wallet ...@@ -355,13 +355,13 @@ namespace Breeze.Wallet
{ {
Console.WriteLine($"transaction notification: tx hash {transaction.GetHash()}, coin type: {coinType}"); Console.WriteLine($"transaction notification: tx hash {transaction.GetHash()}, coin type: {coinType}");
foreach (var k in this.PubKeys) foreach (var pubKey in this.PubKeys)
{ {
// check if the outputs contain one of our addresses // check if the outputs contain one of our addresses
var utxo = transaction.Outputs.SingleOrDefault(o => k == o.ScriptPubKey); var utxo = transaction.Outputs.SingleOrDefault(o => pubKey == o.ScriptPubKey);
if (utxo != null) if (utxo != null)
{ {
AddTransactionToWallet(coinType, transaction.GetHash(), transaction.Time, transaction.Outputs.IndexOf(utxo), utxo.Value, k, blockHeight, blockTime); AddTransactionToWallet(coinType, transaction.GetHash(), transaction.Time, transaction.Outputs.IndexOf(utxo), utxo.Value, pubKey, blockHeight, blockTime);
} }
// if the inputs have a reference to a transaction containing one of our scripts // if the inputs have a reference to a transaction containing one of our scripts
...@@ -372,7 +372,7 @@ namespace Breeze.Wallet ...@@ -372,7 +372,7 @@ namespace Breeze.Wallet
// compare the index of the output in its original transaction and the index references in the input // compare the index of the output in its original transaction and the index references in the input
if (input.PrevOut.N == tTx.Index) if (input.PrevOut.N == tTx.Index)
{ {
AddTransactionToWallet(coinType, transaction.GetHash(), transaction.Time, null, -tTx.Amount, k, blockHeight, blockTime); AddTransactionToWallet(coinType, transaction.GetHash(), transaction.Time, null, -tTx.Amount, pubKey, blockHeight, blockTime, tTx.Hash, tTx.Index);
} }
} }
} }
...@@ -389,7 +389,9 @@ namespace Breeze.Wallet ...@@ -389,7 +389,9 @@ namespace Breeze.Wallet
/// <param name="script">The script.</param> /// <param name="script">The script.</param>
/// <param name="blockHeight">Height of the block.</param> /// <param name="blockHeight">Height of the block.</param>
/// <param name="blockTime">The block time.</param> /// <param name="blockTime">The block time.</param>
private void AddTransactionToWallet(CoinType coinType, uint256 transactionHash, uint time, int? index, Money amount, Script script, int? blockHeight = null, uint? blockTime = null) /// <param name="spendingTransactionId">The id of the transaction containing the output being spent, if this is a spending transaction.</param>
/// <param name="spendingTransactionIndex">The index of the output in the transaction being referenced, if this is a spending transaction.</param>
private void AddTransactionToWallet(CoinType coinType, uint256 transactionHash, uint time, int? index, Money amount, Script script, int? blockHeight = null, uint? blockTime = null, uint256 spendingTransactionId = null, int? spendingTransactionIndex = null)
{ {
// selects all the transactions we already have in the wallet // selects all the transactions we already have in the wallet
var txs = this.Wallets. var txs = this.Wallets.
...@@ -407,7 +409,7 @@ namespace Breeze.Wallet ...@@ -407,7 +409,7 @@ namespace Breeze.Wallet
{ {
foreach (var account in accountRoot.Accounts) foreach (var account in accountRoot.Accounts)
{ {
foreach (var address in account.ExternalAddresses.Where(a => a.Address == "1H2jbtknP6jRYx2riaXJf3H9Mb1JC6kcL2")) foreach (var address in account.ExternalAddresses.Where(a => a.ScriptPubKey == script))
{ {
address.Transactions = address.Transactions.Concat(new[] address.Transactions = address.Transactions.Concat(new[]
{ {
...@@ -425,6 +427,16 @@ namespace Breeze.Wallet ...@@ -425,6 +427,16 @@ namespace Breeze.Wallet
// notify a transaction has been found // notify a transaction has been found
this.TransactionFound?.Invoke(this, new TransactionFoundEventArgs(wallet, accountRoot.CoinType, account, address, false)); this.TransactionFound?.Invoke(this, new TransactionFoundEventArgs(wallet, accountRoot.CoinType, account, address, false));
} }
// if this is a spending transaction, mark the spent transaction as such
if (spendingTransactionId != null)
{
var transactions = account.GetTransactionsById(spendingTransactionId);
if (transactions.Any())
{
transactions.Single(t => t.Index == spendingTransactionIndex).SpentInTransaction = transactionHash;
}
}
} }
} }
} }
...@@ -612,9 +624,9 @@ namespace Breeze.Wallet ...@@ -612,9 +624,9 @@ namespace Breeze.Wallet
SelectMany(w => w.AccountsRoot.Where(a => a.CoinType == coinType)). SelectMany(w => w.AccountsRoot.Where(a => a.CoinType == coinType)).
SelectMany(a => a.Accounts). SelectMany(a => a.Accounts).
SelectMany(a => a.ExternalAddresses). SelectMany(a => a.ExternalAddresses).
//Select(s => s.ScriptPubKey)); Select(s => s.ScriptPubKey));
// uncomment the following for testing on a random address // uncomment the following for testing on a random address
Select(t => (new BitcoinPubKeyAddress(t.Address, Network.Main)).ScriptPubKey)); //Select(t => (new BitcoinPubKeyAddress(t.Address, Network.Main)).ScriptPubKey));
} }
/// <summary> /// <summary>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment