From aa50883217a25c14e4666c0a81672eea703a1138 Mon Sep 17 00:00:00 2001
From: Hans Moog <3293976+hmoog@users.noreply.github.com>
Date: Thu, 11 Jun 2020 20:57:47 +0200
Subject: [PATCH] Feat: added support for colored coins (#466)

Co-authored-by: Hans Moog <hm@mkjc.net>
---
 .../valuetransfers/packages/tangle/tangle.go  | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/dapps/valuetransfers/packages/tangle/tangle.go b/dapps/valuetransfers/packages/tangle/tangle.go
index f584138a..aed986e4 100644
--- a/dapps/valuetransfers/packages/tangle/tangle.go
+++ b/dapps/valuetransfers/packages/tangle/tangle.go
@@ -1134,9 +1134,26 @@ func (tangle *Tangle) bookTransaction(cachedTransaction *transaction.CachedTrans
 	// book transaction into target branch
 	transactionMetadata.SetBranchID(targetBranch.ID())
 
+	// create color for newly minted coins
+	mintedColor, _, err := balance.ColorFromBytes(transactionToBook.ID().Bytes())
+	if err != nil {
+		panic(err) // this should never happen (a transaction id is always a valid color)
+	}
+
 	// book outputs into the target branch
 	transactionToBook.Outputs().ForEach(func(address address.Address, balances []*balance.Balance) bool {
-		newOutput := NewOutput(address, transactionToBook.ID(), targetBranch.ID(), balances)
+		// create correctly colored balances (replacing color of newly minted coins with color of transaction id)
+		coloredBalances := make([]*balance.Balance, len(balances))
+		for i, currentBalance := range balances {
+			if currentBalance.Color() == balance.ColorNew {
+				coloredBalances[i] = balance.New(mintedColor, currentBalance.Value())
+			} else {
+				coloredBalances[i] = currentBalance
+			}
+		}
+
+		// store output
+		newOutput := NewOutput(address, transactionToBook.ID(), targetBranch.ID(), coloredBalances)
 		newOutput.setSolid(true)
 		tangle.outputStorage.Store(newOutput).Release()
 
-- 
GitLab