diff --git a/dapps/valuetransfers/packages/tangle/tangle.go b/dapps/valuetransfers/packages/tangle/tangle.go index dae0647a4ccb7d778e5ddccf6d52d60cdc01e2d0..9657b8e8c088327e6fa0b08e87aebd2d522d4888 100644 --- a/dapps/valuetransfers/packages/tangle/tangle.go +++ b/dapps/valuetransfers/packages/tangle/tangle.go @@ -1164,7 +1164,7 @@ func (tangle *Tangle) processSolidificationStackEntry(solidificationStack *list. } // book the solid entities - transactionBooked, _, decisionPending, bookingErr := tangle.book(solidificationStackEntry.Retain()) + transactionBooked, payloadBooked, decisionPending, bookingErr := tangle.book(solidificationStackEntry.Retain()) if bookingErr != nil { tangle.Events.Error.Trigger(bookingErr) @@ -1177,9 +1177,12 @@ func (tangle *Tangle) processSolidificationStackEntry(solidificationStack *list. // trigger events and schedule check of approvers / consumers if transactionBooked { tangle.Events.TransactionBooked.Trigger(solidificationStackEntry.CachedTransaction, solidificationStackEntry.CachedTransactionMetadata, decisionPending) + + tangle.ForEachConsumers(currentTransaction, tangle.createValuePayloadFutureConeIterator(solidificationStack, processedPayloads)) + } + if payloadBooked { + tangle.ForeachApprovers(currentPayload.ID(), tangle.createValuePayloadFutureConeIterator(solidificationStack, processedPayloads)) } - tangle.ForEachConsumers(currentTransaction, tangle.createValuePayloadFutureConeIterator(solidificationStack, processedPayloads)) - tangle.ForeachApprovers(currentPayload.ID(), tangle.createValuePayloadFutureConeIterator(solidificationStack, processedPayloads)) } func (tangle *Tangle) book(entitiesToBook *valuePayloadPropagationStackEntry) (transactionBooked bool, payloadBooked bool, decisionPending bool, err error) { @@ -1333,6 +1336,14 @@ func (tangle *Tangle) bookPayload(cachedPayload *payload.CachedPayload, cachedPa return } + branchBranchID := tangle.payloadBranchID(valueObject.BranchID()) + trunkBranchID := tangle.payloadBranchID(valueObject.TrunkID()) + transactionBranchID := transactionMetadata.BranchID() + + if branchBranchID == branchmanager.UndefinedBranchID || trunkBranchID == branchmanager.UndefinedBranchID || transactionBranchID == branchmanager.UndefinedBranchID { + return + } + // abort if the payload has been marked as solid before if !valueObjectMetadata.setSolid(true) { return @@ -1341,16 +1352,6 @@ func (tangle *Tangle) bookPayload(cachedPayload *payload.CachedPayload, cachedPa // trigger event if payload became solid tangle.Events.PayloadSolid.Trigger(cachedPayload, cachedPayloadMetadata) - branchBranchID := tangle.payloadBranchID(valueObject.BranchID()) - trunkBranchID := tangle.payloadBranchID(valueObject.TrunkID()) - transactionBranchID := transactionMetadata.BranchID() - - if branchBranchID == branchmanager.UndefinedBranchID || - trunkBranchID == branchmanager.UndefinedBranchID || - transactionBranchID == branchmanager.UndefinedBranchID { - return - } - cachedAggregatedBranch, err := tangle.BranchManager().AggregateBranches([]branchmanager.BranchID{branchBranchID, trunkBranchID, transactionBranchID}...) if err != nil { return diff --git a/dapps/valuetransfers/packages/tangle/tangle_concurrency_test.go b/dapps/valuetransfers/packages/tangle/tangle_concurrency_test.go index 3155f447ccac15411898b463a255e7ee13204c28..34ec76e2ed9a5e3ccb11ef6cada24dd2f6ddb7b6 100644 --- a/dapps/valuetransfers/packages/tangle/tangle_concurrency_test.go +++ b/dapps/valuetransfers/packages/tangle/tangle_concurrency_test.go @@ -341,16 +341,16 @@ func TestReverseTransactionSolidification(t *testing.T) { // check if outputs are found in database transactions[i].Outputs().ForEach(func(address address.Address, balances []*balance.Balance) bool { cachedOutput := tangle.TransactionOutput(transaction.NewOutputID(address, transactions[i].ID())) - assert.Truef(t, cachedOutput.Consume(func(output *Output) { + require.Truef(t, cachedOutput.Consume(func(output *Output) { // only the last outputs in chain should not be spent if i+txChains >= countTotal { - assert.Equalf(t, 0, output.ConsumerCount(), "the output should not be spent") + require.Equalf(t, 0, output.ConsumerCount(), "the output should not be spent") } else { - assert.Equalf(t, 1, output.ConsumerCount(), "the output should be spent") + require.Equalf(t, 1, output.ConsumerCount(), "the output should be spent") } - assert.Equal(t, []*balance.Balance{balance.New(balance.ColorIOTA, 1)}, output.Balances()) - assert.Equalf(t, branchmanager.MasterBranchID, output.BranchID(), "the output was booked into the wrong branch") - assert.Truef(t, output.Solid(), "the output is not solid") + require.Equal(t, []*balance.Balance{balance.New(balance.ColorIOTA, 1)}, output.Balances()) + require.Equalf(t, branchmanager.MasterBranchID, output.BranchID(), "the output was booked into the wrong branch") + require.Truef(t, output.Solid(), "the output is not solid") }), "output not found in database for tx %s", transactions[i]) return true })