From 99941cca3202db21a82728626fe7da323760e936 Mon Sep 17 00:00:00 2001
From: Hans Moog <hm@mkjc.net>
Date: Wed, 17 Jun 2020 11:58:58 +0200
Subject: [PATCH] Fix: fixed decision pending

---
 .../valuetransfers/packages/tangle/tangle.go  | 30 ++++++++++++++-----
 .../packages/tangle/tangle_test.go            |  2 +-
 2 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/dapps/valuetransfers/packages/tangle/tangle.go b/dapps/valuetransfers/packages/tangle/tangle.go
index 95aa24d7..b28aec89 100644
--- a/dapps/valuetransfers/packages/tangle/tangle.go
+++ b/dapps/valuetransfers/packages/tangle/tangle.go
@@ -1264,6 +1264,7 @@ func (tangle *Tangle) bookTransaction(cachedTransaction *transaction.CachedTrans
 	conflictingInputs := make([]transaction.OutputID, 0)
 	conflictingInputsOfFirstConsumers := make(map[transaction.ID][]transaction.OutputID)
 
+	finalizedConflictingSpenderFound := false
 	if !transactionToBook.Inputs().ForEach(func(outputID transaction.OutputID) bool {
 		cachedOutput := tangle.TransactionOutput(outputID)
 		defer cachedOutput.Release()
@@ -1294,6 +1295,17 @@ func (tangle *Tangle) bookTransaction(cachedTransaction *transaction.CachedTrans
 			conflictingInputsOfFirstConsumers[firstConsumerID] = append(conflictingInputsOfFirstConsumers[firstConsumerID], outputID)
 		}
 
+		// check if any of the consumers were finalized already
+		if !finalizedConflictingSpenderFound {
+			tangle.Consumers(outputID).Consume(func(consumer *Consumer) {
+				if !finalizedConflictingSpenderFound {
+					tangle.TransactionMetadata(consumer.TransactionID()).Consume(func(metadata *TransactionMetadata) {
+						finalizedConflictingSpenderFound = metadata.Preferred() && metadata.Finalized()
+					})
+				}
+			})
+		}
+
 		// mark input as conflicting
 		conflictingInputs = append(conflictingInputs, outputID)
 
@@ -1357,16 +1369,18 @@ func (tangle *Tangle) bookTransaction(cachedTransaction *transaction.CachedTrans
 		return true
 	})
 
-	// fork the conflicting transactions into their own branch
-	for consumerID, conflictingInputs := range conflictingInputsOfFirstConsumers {
-		_, decisionFinalized, forkedErr := tangle.Fork(consumerID, conflictingInputs)
-		if forkedErr != nil {
-			err = forkedErr
+	// fork the conflicting transactions into their own branch if a decision is still pending
+	if decisionPending = !finalizedConflictingSpenderFound; decisionPending {
+		for consumerID, conflictingInputs := range conflictingInputsOfFirstConsumers {
+			_, decisionFinalized, forkedErr := tangle.Fork(consumerID, conflictingInputs)
+			if forkedErr != nil {
+				err = forkedErr
 
-			return
-		}
+				return
+			}
 
-		decisionPending = decisionPending || !decisionFinalized
+			decisionPending = decisionPending || !decisionFinalized
+		}
 	}
 	transactionBooked = true
 
diff --git a/dapps/valuetransfers/packages/tangle/tangle_test.go b/dapps/valuetransfers/packages/tangle/tangle_test.go
index dab6589c..c3f897ee 100644
--- a/dapps/valuetransfers/packages/tangle/tangle_test.go
+++ b/dapps/valuetransfers/packages/tangle/tangle_test.go
@@ -106,7 +106,7 @@ func TestBookTransaction(t *testing.T) {
 		transactionBooked, decisionPending, err := tangle.bookTransaction(cachedTransaction, cachedTransactionMetadata)
 		require.NoError(t, err)
 		assert.True(t, transactionBooked, "transactionBooked")
-		assert.False(t, decisionPending, "decisionPending")
+		assert.True(t, decisionPending, "decisionPending")
 
 		// assert that branchID is the same as the MasterBranchID
 		assert.Equal(t, branchmanager.MasterBranchID, txMetadata.BranchID())
-- 
GitLab