From 5f2212da202ed2d4221b94b5f3954f1aa700ef7d Mon Sep 17 00:00:00 2001
From: Hans Moog <hm@mkjc.net>
Date: Mon, 3 Feb 2020 17:11:49 +0100
Subject: [PATCH] Refactor: changed package structure

---
 go.mod                                        |   4 +-
 go.sum                                        |  29 ++++
 packages/binary/tangle/events.go              |  10 +-
 .../tangle/{ => model}/approvers/approvers.go |   2 +-
 .../{ => model}/approvers/cached_approvers.go |   2 +-
 .../cached_missingtransaction.go              |   2 +-
 .../missingtransaction/missingtransaction.go  |   3 +-
 .../model}/transaction/cached_transaction.go  |   6 +-
 .../{ => tangle/model}/transaction/id.go      |   2 +-
 .../binary/tangle/model/transaction/init.go   |  10 ++
 .../model}/transaction/payload/data/data.go   |   2 +-
 .../model}/transaction/payload/data/init.go   |   2 +-
 .../model}/transaction/payload/id.go          |   0
 .../model}/transaction/payload/payload.go     |   0
 .../model}/transaction/payload/type.go        |   0
 .../transaction/payload/type_register.go      |   0
 .../payload/valuetransfer/valuetransfer.go    |   9 +-
 .../transaction/test/transaction_test.go      |  16 +-
 .../model}/transaction/transaction.go         |   2 +-
 .../cached_transactionmetadata.go             |   6 +-
 .../transactionmetadata.go                    |   3 +-
 packages/binary/tangle/snapshot.go            |   4 +-
 packages/binary/tangle/tangle.go              |  14 +-
 packages/binary/tangle/tangle_test.go         |   4 +-
 packages/binary/transaction/init.go           |  10 --
 .../transaction_signature_filter.go           |   3 +-
 .../value_transaction_signature_filter.go     |   6 +-
 .../transactionparser/transaction_filter.go   |   2 +-
 .../transactionparser/transactionparser.go    |   3 +-
 .../transactionparser_test.go                 |   4 +-
 .../model}/address/address.go                 |   0
 .../valuetangle/model/cached_consumers.go     |   2 +-
 .../model/cached_missing_transfer.go          |   2 +-
 .../model/cached_transfermetadata.go          |   2 +-
 .../valuetangle/model/cached_valuetransfer.go |   4 +-
 .../valuetangle/model/consumer/consumer.go    |  31 ++++
 .../valuetangle/model/transferoutput/id.go    |  46 +++++
 .../model/transferoutput/transferoutput.go    | 161 ++----------------
 .../binary/valuetangle/model/valuetransfer.go |   4 +-
 packages/binary/valuetangle/valuetangle.go    |  38 +++--
 .../binary/valuetangle/valuetangle_test.go    |  17 +-
 packages/ledgerstate/transfer/constants.go    |   2 +-
 packages/ledgerstate/transfer/output.go       |   2 +-
 .../ledgerstate/transfer/output_booking.go    |   3 +-
 .../ledgerstate/transfer/output_reference.go  |   2 +-
 packages/ledgerstate/transfer/transfer.go     |   2 +-
 .../transfer/transfer_output_booking.go       |   3 +-
 plugins/tangle/solidifier.go                  |   3 +-
 48 files changed, 238 insertions(+), 246 deletions(-)
 rename packages/binary/tangle/{ => model}/approvers/approvers.go (98%)
 rename packages/binary/tangle/{ => model}/approvers/cached_approvers.go (93%)
 rename packages/binary/tangle/{ => model}/missingtransaction/cached_missingtransaction.go (93%)
 rename packages/binary/tangle/{ => model}/missingtransaction/missingtransaction.go (94%)
 rename packages/binary/{ => tangle/model}/transaction/cached_transaction.go (72%)
 rename packages/binary/{ => tangle/model}/transaction/id.go (93%)
 create mode 100644 packages/binary/tangle/model/transaction/init.go
 rename packages/binary/{ => tangle/model}/transaction/payload/data/data.go (91%)
 rename packages/binary/{ => tangle/model}/transaction/payload/data/init.go (56%)
 rename packages/binary/{ => tangle/model}/transaction/payload/id.go (100%)
 rename packages/binary/{ => tangle/model}/transaction/payload/payload.go (100%)
 rename packages/binary/{ => tangle/model}/transaction/payload/type.go (100%)
 rename packages/binary/{ => tangle/model}/transaction/payload/type_register.go (100%)
 rename packages/binary/{ => tangle/model}/transaction/payload/valuetransfer/valuetransfer.go (98%)
 rename packages/binary/{ => tangle/model}/transaction/test/transaction_test.go (94%)
 rename packages/binary/{ => tangle/model}/transaction/transaction.go (98%)
 rename packages/binary/{ => tangle/model}/transactionmetadata/cached_transactionmetadata.go (73%)
 rename packages/binary/{ => tangle/model}/transactionmetadata/transactionmetadata.go (95%)
 delete mode 100644 packages/binary/transaction/init.go
 rename packages/binary/{ => valuetangle/model}/address/address.go (100%)
 create mode 100644 packages/binary/valuetangle/model/consumer/consumer.go
 create mode 100644 packages/binary/valuetangle/model/transferoutput/id.go

diff --git a/go.mod b/go.mod
index 8b68a9a7..afa2906d 100644
--- a/go.mod
+++ b/go.mod
@@ -5,7 +5,7 @@ go 1.13
 require (
 	github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect
 	github.com/dgraph-io/badger v1.6.0
-	github.com/dgraph-io/badger/v2 v2.0.0
+	github.com/dgraph-io/badger/v2 v2.0.1
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/emicklei/dot v0.10.1
 	github.com/ethereum/go-ethereum v1.9.3
@@ -15,7 +15,7 @@ require (
 	github.com/golang/protobuf v1.3.2 // indirect
 	github.com/google/open-location-code/go v0.0.0-20190903173953-119bc96a3a51
 	github.com/gorilla/websocket v1.4.1
-	github.com/iotaledger/hive.go v0.0.0-20200107105553-d35f44074aa2
+	github.com/iotaledger/hive.go v0.0.0-20200131164002-e50853dd9172
 	github.com/iotaledger/iota.go v1.0.0-beta.9
 	github.com/kr/text v0.1.0
 	github.com/labstack/echo v3.3.10+incompatible
diff --git a/go.sum b/go.sum
index 867562cd..ab78d117 100644
--- a/go.sum
+++ b/go.sum
@@ -33,6 +33,8 @@ github.com/dgraph-io/badger v1.6.0 h1:DshxFxZWXUcO0xX476VJC07Xsr6ZCBVRHKZ93Oh7Ev
 github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4=
 github.com/dgraph-io/badger/v2 v2.0.0 h1:Cr05o2TUd2IcLbEY0aGd8mbjm1YyQpy+dswo3BcDXrE=
 github.com/dgraph-io/badger/v2 v2.0.0/go.mod h1:YoRSIp1LmAJ7zH7tZwRvjNMUYLxB4wl3ebYkaIruZ04=
+github.com/dgraph-io/badger/v2 v2.0.1 h1:+D6dhIqC6jIeCclnxMHqk4HPuXgrRN5UfBsLR4dNQ3A=
+github.com/dgraph-io/badger/v2 v2.0.1/go.mod h1:YoRSIp1LmAJ7zH7tZwRvjNMUYLxB4wl3ebYkaIruZ04=
 github.com/dgraph-io/ristretto v0.0.0-20191025175511-c1f00be0418e h1:aeUNgwup7PnDOBAD1BOKAqzb/W/NksOj6r3dwKKuqfg=
 github.com/dgraph-io/ristretto v0.0.0-20191025175511-c1f00be0418e/go.mod h1:edzKIzGvqUCMzhTVWbiTSe75zD9Xxq0GtSBtFmaUTZs=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
@@ -77,6 +79,7 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/open-location-code/go v0.0.0-20190903173953-119bc96a3a51 h1:OdVal38kmXn0U3M3CYmPF4cpMLLvD4ioshwrooNfmxs=
 github.com/google/open-location-code/go v0.0.0-20190903173953-119bc96a3a51/go.mod h1:eJfRN6aj+kR/rnua/rw9jAgYhqoMHldQkdTi+sePRKk=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
 github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
@@ -107,6 +110,10 @@ github.com/iotaledger/hive.go v0.0.0-20200106003337-d78637b86bf2 h1:HBQKEP6PnaEh
 github.com/iotaledger/hive.go v0.0.0-20200106003337-d78637b86bf2/go.mod h1:vrZrvGaWT1o5kz3Jj2B/PcUtqsFzZnLWrO3zEsGSuwk=
 github.com/iotaledger/hive.go v0.0.0-20200107105553-d35f44074aa2 h1:o4jOpCuNXSRhbiSJHPR2SuN/qGkKt/LpX+DIQ0rUMSY=
 github.com/iotaledger/hive.go v0.0.0-20200107105553-d35f44074aa2/go.mod h1:vrZrvGaWT1o5kz3Jj2B/PcUtqsFzZnLWrO3zEsGSuwk=
+github.com/iotaledger/hive.go v0.0.0-20200131142821-bdca7883742d h1:3uYitVVvpt/vW1XRLxodkvsiNMjxHHz5HbSkvuqaOoU=
+github.com/iotaledger/hive.go v0.0.0-20200131142821-bdca7883742d/go.mod h1:wj3bFHlcX0NiEOWu5+WOg/MI/5N7PKCFnyaziaylB64=
+github.com/iotaledger/hive.go v0.0.0-20200131164002-e50853dd9172 h1:QuckesiAtCzfxkxndNaerpeW0AKmxciZtApyjNwe7s4=
+github.com/iotaledger/hive.go v0.0.0-20200131164002-e50853dd9172/go.mod h1:wj3bFHlcX0NiEOWu5+WOg/MI/5N7PKCFnyaziaylB64=
 github.com/iotaledger/iota.go v1.0.0-beta.9 h1:c654s9pkdhMBkABUvWg+6k91MEBbdtmZXP1xDfQpajg=
 github.com/iotaledger/iota.go v1.0.0-beta.9/go.mod h1:F6WBmYd98mVjAmmPVYhnxg8NNIWCjjH8VWT9qvv3Rc8=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
@@ -178,6 +185,7 @@ github.com/rivo/uniseg v0.0.0-20190513083848-b9f5b9457d44/go.mod h1:J6wj4VEh+S6Z
 github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY=
 github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 github.com/sasha-s/go-deadlock v0.2.0 h1:lMqc+fUb7RrFS3gQLtoQsJ7/6TV/pAIFvBsqX73DK8Y=
 github.com/sasha-s/go-deadlock v0.2.0/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10=
@@ -223,16 +231,28 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.mongodb.org/mongo-driver v1.0.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba h1:9bFeDpN3gTqNanMVqNcoR/pJQuP5uroC3t1D7eXozTE=
 golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -272,6 +292,13 @@ golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGm
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
@@ -281,6 +308,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/h2non/gock.v1 v1.0.14/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE=
@@ -296,3 +324,4 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/zeromq/goczmq.v4 v4.1.0 h1:CE+FE81mGVs2aSlnbfLuS1oAwdcVywyMM2AC1g33imI=
 gopkg.in/zeromq/goczmq.v4 v4.1.0/go.mod h1:h4IlfePEYMpFdywGr5gAwKhBBj+hiBl/nF4VoSE4k+0=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
diff --git a/packages/binary/tangle/events.go b/packages/binary/tangle/events.go
index 23df1365..00f33b48 100644
--- a/packages/binary/tangle/events.go
+++ b/packages/binary/tangle/events.go
@@ -1,9 +1,10 @@
 package tangle
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transactionmetadata"
 	"github.com/iotaledger/hive.go/events"
+
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transactionmetadata"
 )
 
 type Events struct {
@@ -34,8 +35,5 @@ func cachedTransactionEvent(handler interface{}, params ...interface{}) {
 	cachedTransaction := params[0].(*transaction.CachedTransaction)
 	cachedTransactionMetadata := params[1].(*transactionmetadata.CachedTransactionMetadata)
 
-	cachedTransaction.RegisterConsumer()
-	cachedTransactionMetadata.RegisterConsumer()
-
-	handler.(func(*transaction.CachedTransaction, *transactionmetadata.CachedTransactionMetadata))(cachedTransaction, cachedTransactionMetadata)
+	handler.(func(*transaction.CachedTransaction, *transactionmetadata.CachedTransactionMetadata))(cachedTransaction.Retain().(*transaction.CachedTransaction), cachedTransactionMetadata.Retain().(*transactionmetadata.CachedTransactionMetadata))
 }
diff --git a/packages/binary/tangle/approvers/approvers.go b/packages/binary/tangle/model/approvers/approvers.go
similarity index 98%
rename from packages/binary/tangle/approvers/approvers.go
rename to packages/binary/tangle/model/approvers/approvers.go
index 90014e14..178faf91 100644
--- a/packages/binary/tangle/approvers/approvers.go
+++ b/packages/binary/tangle/model/approvers/approvers.go
@@ -4,9 +4,9 @@ import (
 	"encoding/binary"
 	"sync"
 
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
 	"github.com/iotaledger/goshimmer/packages/binary/types"
 
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
 	"github.com/iotaledger/hive.go/objectstorage"
 )
 
diff --git a/packages/binary/tangle/approvers/cached_approvers.go b/packages/binary/tangle/model/approvers/cached_approvers.go
similarity index 93%
rename from packages/binary/tangle/approvers/cached_approvers.go
rename to packages/binary/tangle/model/approvers/cached_approvers.go
index 99ed8ad0..55e225ba 100644
--- a/packages/binary/tangle/approvers/cached_approvers.go
+++ b/packages/binary/tangle/model/approvers/cached_approvers.go
@@ -5,7 +5,7 @@ import (
 )
 
 type CachedApprovers struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
 }
 
 func (cachedObject *CachedApprovers) Unwrap() *Approvers {
diff --git a/packages/binary/tangle/missingtransaction/cached_missingtransaction.go b/packages/binary/tangle/model/missingtransaction/cached_missingtransaction.go
similarity index 93%
rename from packages/binary/tangle/missingtransaction/cached_missingtransaction.go
rename to packages/binary/tangle/model/missingtransaction/cached_missingtransaction.go
index c64e3df3..f50f5321 100644
--- a/packages/binary/tangle/missingtransaction/cached_missingtransaction.go
+++ b/packages/binary/tangle/model/missingtransaction/cached_missingtransaction.go
@@ -5,7 +5,7 @@ import (
 )
 
 type CachedMissingTransaction struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
 }
 
 func (cachedObject *CachedMissingTransaction) Unwrap() *MissingTransaction {
diff --git a/packages/binary/tangle/missingtransaction/missingtransaction.go b/packages/binary/tangle/model/missingtransaction/missingtransaction.go
similarity index 94%
rename from packages/binary/tangle/missingtransaction/missingtransaction.go
rename to packages/binary/tangle/model/missingtransaction/missingtransaction.go
index 8ab08631..ea1715c8 100644
--- a/packages/binary/tangle/missingtransaction/missingtransaction.go
+++ b/packages/binary/tangle/model/missingtransaction/missingtransaction.go
@@ -3,8 +3,7 @@ package missingtransaction
 import (
 	"time"
 
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
 	"github.com/iotaledger/hive.go/objectstorage"
 )
 
diff --git a/packages/binary/transaction/cached_transaction.go b/packages/binary/tangle/model/transaction/cached_transaction.go
similarity index 72%
rename from packages/binary/transaction/cached_transaction.go
rename to packages/binary/tangle/model/transaction/cached_transaction.go
index 63a61f7e..5b9bc6a2 100644
--- a/packages/binary/transaction/cached_transaction.go
+++ b/packages/binary/tangle/model/transaction/cached_transaction.go
@@ -5,7 +5,11 @@ import (
 )
 
 type CachedTransaction struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
+}
+
+func (cachedTransaction *CachedTransaction) Retain() objectstorage.CachedObject {
+	return &CachedTransaction{cachedTransaction.CachedObject.Retain()}
 }
 
 func (cachedTransaction *CachedTransaction) Unwrap() *Transaction {
diff --git a/packages/binary/transaction/id.go b/packages/binary/tangle/model/transaction/id.go
similarity index 93%
rename from packages/binary/transaction/id.go
rename to packages/binary/tangle/model/transaction/id.go
index 1c0c5165..dd5ca154 100644
--- a/packages/binary/transaction/id.go
+++ b/packages/binary/tangle/model/transaction/id.go
@@ -25,7 +25,7 @@ func (id *Id) UnmarshalBinary(data []byte) (err error) {
 	return
 }
 
-func (id *Id) String() string {
+func (id Id) String() string {
 	return base58.Encode(id[:])
 }
 
diff --git a/packages/binary/tangle/model/transaction/init.go b/packages/binary/tangle/model/transaction/init.go
new file mode 100644
index 00000000..5805588c
--- /dev/null
+++ b/packages/binary/tangle/model/transaction/init.go
@@ -0,0 +1,10 @@
+package transaction
+
+import (
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/data"
+)
+
+func init() {
+	payload.SetGenericUnmarshalerFactory(data.GenericPayloadUnmarshalerFactory)
+}
diff --git a/packages/binary/transaction/payload/data/data.go b/packages/binary/tangle/model/transaction/payload/data/data.go
similarity index 91%
rename from packages/binary/transaction/payload/data/data.go
rename to packages/binary/tangle/model/transaction/payload/data/data.go
index a701c641..8b41b99c 100644
--- a/packages/binary/transaction/payload/data/data.go
+++ b/packages/binary/tangle/model/transaction/payload/data/data.go
@@ -1,7 +1,7 @@
 package data
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload"
 )
 
 type Data struct {
diff --git a/packages/binary/transaction/payload/data/init.go b/packages/binary/tangle/model/transaction/payload/data/init.go
similarity index 56%
rename from packages/binary/transaction/payload/data/init.go
rename to packages/binary/tangle/model/transaction/payload/data/init.go
index 4f403d29..547bca2c 100644
--- a/packages/binary/transaction/payload/data/init.go
+++ b/packages/binary/tangle/model/transaction/payload/data/init.go
@@ -1,7 +1,7 @@
 package data
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload"
 )
 
 func init() {
diff --git a/packages/binary/transaction/payload/id.go b/packages/binary/tangle/model/transaction/payload/id.go
similarity index 100%
rename from packages/binary/transaction/payload/id.go
rename to packages/binary/tangle/model/transaction/payload/id.go
diff --git a/packages/binary/transaction/payload/payload.go b/packages/binary/tangle/model/transaction/payload/payload.go
similarity index 100%
rename from packages/binary/transaction/payload/payload.go
rename to packages/binary/tangle/model/transaction/payload/payload.go
diff --git a/packages/binary/transaction/payload/type.go b/packages/binary/tangle/model/transaction/payload/type.go
similarity index 100%
rename from packages/binary/transaction/payload/type.go
rename to packages/binary/tangle/model/transaction/payload/type.go
diff --git a/packages/binary/transaction/payload/type_register.go b/packages/binary/tangle/model/transaction/payload/type_register.go
similarity index 100%
rename from packages/binary/transaction/payload/type_register.go
rename to packages/binary/tangle/model/transaction/payload/type_register.go
diff --git a/packages/binary/transaction/payload/valuetransfer/valuetransfer.go b/packages/binary/tangle/model/transaction/payload/valuetransfer/valuetransfer.go
similarity index 98%
rename from packages/binary/transaction/payload/valuetransfer/valuetransfer.go
rename to packages/binary/tangle/model/transaction/payload/valuetransfer/valuetransfer.go
index d9fa48ce..b50fc602 100644
--- a/packages/binary/transaction/payload/valuetransfer/valuetransfer.go
+++ b/packages/binary/tangle/model/transaction/payload/valuetransfer/valuetransfer.go
@@ -4,14 +4,11 @@ import (
 	"encoding/binary"
 	"sync"
 
-	"github.com/iotaledger/goshimmer/packages/binary/types"
-
 	"github.com/iotaledger/goshimmer/packages/binary/signature/ed25119"
-
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload"
+	"github.com/iotaledger/goshimmer/packages/binary/types"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
-
-	"github.com/iotaledger/goshimmer/packages/binary/address"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
 )
 
diff --git a/packages/binary/transaction/test/transaction_test.go b/packages/binary/tangle/model/transaction/test/transaction_test.go
similarity index 94%
rename from packages/binary/transaction/test/transaction_test.go
rename to packages/binary/tangle/model/transaction/test/transaction_test.go
index d94c14b0..3cfd978d 100644
--- a/packages/binary/transaction/test/transaction_test.go
+++ b/packages/binary/tangle/model/transaction/test/transaction_test.go
@@ -6,21 +6,19 @@ import (
 	"sync"
 	"testing"
 
-	"github.com/iotaledger/goshimmer/packages/binary/signature/ed25119"
 	"github.com/iotaledger/hive.go/async"
 
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
-
 	"github.com/panjf2000/ants/v2"
 
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
-
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-
 	"github.com/iotaledger/goshimmer/packages/binary/address"
 	"github.com/iotaledger/goshimmer/packages/binary/identity"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/data"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/valuetransfer"
+	"github.com/iotaledger/goshimmer/packages/binary/signature/ed25119"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/data"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/valuetransfer"
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
+
 	"github.com/stretchr/testify/assert"
 )
 
diff --git a/packages/binary/transaction/transaction.go b/packages/binary/tangle/model/transaction/transaction.go
similarity index 98%
rename from packages/binary/transaction/transaction.go
rename to packages/binary/tangle/model/transaction/transaction.go
index 5b36af58..98893ffc 100644
--- a/packages/binary/transaction/transaction.go
+++ b/packages/binary/tangle/model/transaction/transaction.go
@@ -5,7 +5,7 @@ import (
 	"sync"
 
 	"github.com/iotaledger/goshimmer/packages/binary/identity"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload"
 	"github.com/iotaledger/goshimmer/packages/stringify"
 
 	"github.com/iotaledger/hive.go/objectstorage"
diff --git a/packages/binary/transactionmetadata/cached_transactionmetadata.go b/packages/binary/tangle/model/transactionmetadata/cached_transactionmetadata.go
similarity index 73%
rename from packages/binary/transactionmetadata/cached_transactionmetadata.go
rename to packages/binary/tangle/model/transactionmetadata/cached_transactionmetadata.go
index 83912b7c..8b327806 100644
--- a/packages/binary/transactionmetadata/cached_transactionmetadata.go
+++ b/packages/binary/tangle/model/transactionmetadata/cached_transactionmetadata.go
@@ -5,7 +5,11 @@ import (
 )
 
 type CachedTransactionMetadata struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
+}
+
+func (cachedObject *CachedTransactionMetadata) Retain() objectstorage.CachedObject {
+	return &CachedTransactionMetadata{cachedObject}
 }
 
 func (cachedObject *CachedTransactionMetadata) Unwrap() *TransactionMetadata {
diff --git a/packages/binary/transactionmetadata/transactionmetadata.go b/packages/binary/tangle/model/transactionmetadata/transactionmetadata.go
similarity index 95%
rename from packages/binary/transactionmetadata/transactionmetadata.go
rename to packages/binary/tangle/model/transactionmetadata/transactionmetadata.go
index 5ef63dbe..7c1728da 100644
--- a/packages/binary/transactionmetadata/transactionmetadata.go
+++ b/packages/binary/tangle/model/transactionmetadata/transactionmetadata.go
@@ -4,8 +4,9 @@ import (
 	"sync"
 	"time"
 
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
 	"github.com/iotaledger/hive.go/objectstorage"
+
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
 )
 
 type TransactionMetadata struct {
diff --git a/packages/binary/tangle/snapshot.go b/packages/binary/tangle/snapshot.go
index 1c1d5609..8f1babe4 100644
--- a/packages/binary/tangle/snapshot.go
+++ b/packages/binary/tangle/snapshot.go
@@ -1,8 +1,8 @@
 package tangle
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/address"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
 )
 
diff --git a/packages/binary/tangle/tangle.go b/packages/binary/tangle/tangle.go
index 0e8d062b..b1941ce2 100644
--- a/packages/binary/tangle/tangle.go
+++ b/packages/binary/tangle/tangle.go
@@ -4,14 +4,14 @@ import (
 	"container/list"
 	"time"
 
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/valuetransfer"
-
-	"github.com/iotaledger/goshimmer/packages/binary/tangle/approvers"
-	"github.com/iotaledger/goshimmer/packages/binary/tangle/missingtransaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/data"
-	"github.com/iotaledger/goshimmer/packages/binary/transactionmetadata"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/approvers"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/missingtransaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/data"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/valuetransfer"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transactionmetadata"
 	"github.com/iotaledger/goshimmer/packages/storageprefix"
+
 	"github.com/iotaledger/hive.go/async"
 	"github.com/iotaledger/hive.go/objectstorage"
 )
diff --git a/packages/binary/tangle/tangle_test.go b/packages/binary/tangle/tangle_test.go
index bdeeaa40..5b629ceb 100644
--- a/packages/binary/tangle/tangle_test.go
+++ b/packages/binary/tangle/tangle_test.go
@@ -8,8 +8,8 @@ import (
 	"github.com/iotaledger/hive.go/events"
 
 	"github.com/iotaledger/goshimmer/packages/binary/identity"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/data"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/data"
 )
 
 func BenchmarkTangle_AttachTransaction(b *testing.B) {
diff --git a/packages/binary/transaction/init.go b/packages/binary/transaction/init.go
deleted file mode 100644
index 36b74b8e..00000000
--- a/packages/binary/transaction/init.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package transaction
-
-import (
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/data"
-)
-
-func init() {
-	payload.SetGenericUnmarshalerFactory(data.GenericPayloadUnmarshalerFactory)
-}
diff --git a/packages/binary/transactionparser/builtinfilters/transaction_signature_filter.go b/packages/binary/transactionparser/builtinfilters/transaction_signature_filter.go
index 6862426c..b3ae8999 100644
--- a/packages/binary/transactionparser/builtinfilters/transaction_signature_filter.go
+++ b/packages/binary/transactionparser/builtinfilters/transaction_signature_filter.go
@@ -3,8 +3,7 @@ package builtinfilters
 import (
 	"sync"
 
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
 	"github.com/iotaledger/hive.go/async"
 )
 
diff --git a/packages/binary/transactionparser/builtinfilters/value_transaction_signature_filter.go b/packages/binary/transactionparser/builtinfilters/value_transaction_signature_filter.go
index 5c8cc14c..10e4dbeb 100644
--- a/packages/binary/transactionparser/builtinfilters/value_transaction_signature_filter.go
+++ b/packages/binary/transactionparser/builtinfilters/value_transaction_signature_filter.go
@@ -3,10 +3,10 @@ package builtinfilters
 import (
 	"sync"
 
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/valuetransfer"
-
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
 	"github.com/iotaledger/hive.go/async"
+
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/valuetransfer"
 )
 
 type ValueTransferSignatureFilter struct {
diff --git a/packages/binary/transactionparser/transaction_filter.go b/packages/binary/transactionparser/transaction_filter.go
index 39f15788..39dfc277 100644
--- a/packages/binary/transactionparser/transaction_filter.go
+++ b/packages/binary/transactionparser/transaction_filter.go
@@ -1,7 +1,7 @@
 package transactionparser
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
 )
 
 type TransactionFilter interface {
diff --git a/packages/binary/transactionparser/transactionparser.go b/packages/binary/transactionparser/transactionparser.go
index 66e3bb3a..7632506d 100644
--- a/packages/binary/transactionparser/transactionparser.go
+++ b/packages/binary/transactionparser/transactionparser.go
@@ -3,12 +3,11 @@ package transactionparser
 import (
 	"sync"
 
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
 	"github.com/iotaledger/goshimmer/packages/binary/transactionparser/builtinfilters"
 
 	"github.com/iotaledger/hive.go/events"
 	"github.com/iotaledger/hive.go/typeutils"
-
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
 )
 
 type TransactionParser struct {
diff --git a/packages/binary/transactionparser/transactionparser_test.go b/packages/binary/transactionparser/transactionparser_test.go
index 8043fc59..c7dc3b18 100644
--- a/packages/binary/transactionparser/transactionparser_test.go
+++ b/packages/binary/transactionparser/transactionparser_test.go
@@ -8,8 +8,8 @@ import (
 	"github.com/iotaledger/hive.go/events"
 
 	"github.com/iotaledger/goshimmer/packages/binary/identity"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/data"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/data"
 )
 
 func BenchmarkTransactionParser_ParseBytesSame(b *testing.B) {
diff --git a/packages/binary/address/address.go b/packages/binary/valuetangle/model/address/address.go
similarity index 100%
rename from packages/binary/address/address.go
rename to packages/binary/valuetangle/model/address/address.go
diff --git a/packages/binary/valuetangle/model/cached_consumers.go b/packages/binary/valuetangle/model/cached_consumers.go
index c570571a..7bff29ee 100644
--- a/packages/binary/valuetangle/model/cached_consumers.go
+++ b/packages/binary/valuetangle/model/cached_consumers.go
@@ -5,7 +5,7 @@ import (
 )
 
 type CachedConsumers struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
 }
 
 func (cachedObject *CachedConsumers) Unwrap() *Consumers {
diff --git a/packages/binary/valuetangle/model/cached_missing_transfer.go b/packages/binary/valuetangle/model/cached_missing_transfer.go
index 6e885c2b..a91c80e5 100644
--- a/packages/binary/valuetangle/model/cached_missing_transfer.go
+++ b/packages/binary/valuetangle/model/cached_missing_transfer.go
@@ -5,7 +5,7 @@ import (
 )
 
 type CachedMissingTransfer struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
 }
 
 func (cachedObject *CachedMissingTransfer) Unwrap() *MissingTransfer {
diff --git a/packages/binary/valuetangle/model/cached_transfermetadata.go b/packages/binary/valuetangle/model/cached_transfermetadata.go
index bce48511..96852332 100644
--- a/packages/binary/valuetangle/model/cached_transfermetadata.go
+++ b/packages/binary/valuetangle/model/cached_transfermetadata.go
@@ -5,7 +5,7 @@ import (
 )
 
 type CachedTransferMetadata struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
 }
 
 func (cachedObject *CachedTransferMetadata) Unwrap() *TransferMetadata {
diff --git a/packages/binary/valuetangle/model/cached_valuetransfer.go b/packages/binary/valuetangle/model/cached_valuetransfer.go
index 7a6ade84..9cc50c0a 100644
--- a/packages/binary/valuetangle/model/cached_valuetransfer.go
+++ b/packages/binary/valuetangle/model/cached_valuetransfer.go
@@ -1,8 +1,8 @@
 package model
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/valuetransfer"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/valuetransfer"
 )
 
 type CachedValueTransfer struct {
diff --git a/packages/binary/valuetangle/model/consumer/consumer.go b/packages/binary/valuetangle/model/consumer/consumer.go
new file mode 100644
index 00000000..58f850ae
--- /dev/null
+++ b/packages/binary/valuetangle/model/consumer/consumer.go
@@ -0,0 +1,31 @@
+package consumer
+
+import (
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/transferoutput"
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
+	"github.com/iotaledger/hive.go/objectstorage"
+)
+
+type Consumer struct {
+	objectstorage.StorableObjectFlags
+
+	transferOutputId   transferoutput.Id
+	consumerTransferId transfer.Id
+}
+
+func New(transferOutput transferoutput.Id, consumerTransfer transfer.Id) *Consumer {
+	return &Consumer{
+		transferOutputId:   transferOutput,
+		consumerTransferId: consumerTransfer,
+	}
+}
+
+func (consumer *Consumer) GetTransferOutputId() transferoutput.Id {
+	return consumer.transferOutputId
+}
+
+func (consumer *Consumer) GetConsumerTransferId() transfer.Id {
+	return consumer.consumerTransferId
+}
+
+var _ objectstorage.StorableObject = &Consumer{}
diff --git a/packages/binary/valuetangle/model/transferoutput/id.go b/packages/binary/valuetangle/model/transferoutput/id.go
new file mode 100644
index 00000000..01e4de3f
--- /dev/null
+++ b/packages/binary/valuetangle/model/transferoutput/id.go
@@ -0,0 +1,46 @@
+package transferoutput
+
+import (
+	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
+)
+
+type Id [transfer.IdLength + address.Length]byte
+
+func NewId(addr address.Address, transferId transfer.Id) (result Id) {
+	copy(result[:address.Length], addr[:])
+	copy(result[address.Length:], transferId[:])
+
+	return
+}
+
+func (id Id) GetAddress() (result address.Address) {
+	copy(result[:], id[:address.Length])
+
+	return
+}
+
+func (id Id) GetTransferId() (result transfer.Id) {
+	copy(result[:], id[address.Length:])
+
+	return
+}
+
+func (id *Id) UnmarshalBinary(data []byte) error {
+	copy(id[:], data[:IdLength])
+
+	return nil
+}
+
+func (id *Id) MarshalBinary() (data []byte, err error) {
+	data = make([]byte, IdLength)
+	copy(data[:], id[:])
+
+	return
+}
+
+func (id Id) String() string {
+	return id.GetAddress().String() + " :: " + id.GetTransferId().String()
+}
+
+const IdLength = address.Length + transfer.IdLength
diff --git a/packages/binary/valuetangle/model/transferoutput/transferoutput.go b/packages/binary/valuetangle/model/transferoutput/transferoutput.go
index ae825b77..1bf34bc5 100644
--- a/packages/binary/valuetangle/model/transferoutput/transferoutput.go
+++ b/packages/binary/valuetangle/model/transferoutput/transferoutput.go
@@ -4,11 +4,7 @@ import (
 	"encoding/binary"
 	"sync"
 
-	"github.com/iotaledger/goshimmer/packages/binary/address"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/types"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
 	"github.com/iotaledger/goshimmer/packages/stringify"
 	"github.com/iotaledger/hive.go/objectstorage"
 )
@@ -16,23 +12,17 @@ import (
 type TransferOutput struct {
 	objectstorage.StorableObjectFlags
 
-	transactionId transaction.Id
-	address       address.Address
-	realityId     reality.Id
-	balances      []*coloredcoins.ColoredBalance
-	consumers     map[transaction.Id]types.Empty
+	id       Id
+	spent    bool
+	balances []*coloredcoins.ColoredBalance
 
 	realityIdMutex sync.RWMutex
-	consumersMutex sync.RWMutex
 }
 
-func NewTransferOutput(transactionId transaction.Id, address address.Address, balances ...*coloredcoins.ColoredBalance) *TransferOutput {
+func New(id Id, balances ...*coloredcoins.ColoredBalance) *TransferOutput {
 	return &TransferOutput{
-		transactionId: transactionId,
-		address:       address,
-		balances:      balances,
-		realityId:     reality.EmptyId,
-		consumers:     make(map[transaction.Id]types.Empty),
+		id:       id,
+		balances: balances,
 	}
 }
 
@@ -40,117 +30,37 @@ func FromStorage(key []byte) objectstorage.StorableObject {
 	result := &TransferOutput{}
 	offset := 0
 
-	if err := result.transactionId.UnmarshalBinary(key[offset:]); err != nil {
-		panic(err)
-	}
-	offset += transaction.IdLength
-
-	if err := result.address.UnmarshalBinary(key[offset:]); err != nil {
+	if err := result.id.UnmarshalBinary(key[offset:]); err != nil {
 		panic(err)
 	}
 
 	return result
 }
 
-func (transferOutput *TransferOutput) GetTransactionId() (transactionId transaction.Id) {
-	transactionId = transferOutput.transactionId
-
-	return
-}
-
-func (transferOutput *TransferOutput) GetAddress() (address address.Address) {
-	return transferOutput.address
-}
-
-func (transferOutput *TransferOutput) GetRealityId() (realityId reality.Id) {
-	transferOutput.realityIdMutex.RLock()
-	realityId = transferOutput.realityId
-	transferOutput.realityIdMutex.RUnlock()
-
-	return
-}
-
-func (transferOutput *TransferOutput) SetRealityId(realityId reality.Id) (modified bool) {
-	transferOutput.realityIdMutex.RLock()
-	if transferOutput.realityId != realityId {
-		transferOutput.realityIdMutex.RUnlock()
-
-		transferOutput.realityIdMutex.Lock()
-		if transferOutput.realityId != realityId {
-			transferOutput.realityId = realityId
-
-			transferOutput.SetModified()
-
-			modified = true
-		}
-		transferOutput.realityIdMutex.Unlock()
-	} else {
-		transferOutput.realityIdMutex.RUnlock()
-	}
-
-	return
+func (transferOutput *TransferOutput) GetId() Id {
+	return transferOutput.id
 }
 
 func (transferOutput *TransferOutput) GetBalances() []*coloredcoins.ColoredBalance {
 	return transferOutput.balances
 }
 
-func (transferOutput *TransferOutput) GetConsumers() (consumers map[transaction.Id]types.Empty) {
-	consumers = make(map[transaction.Id]types.Empty)
-
-	transferOutput.consumersMutex.RLock()
-	for transferHash := range transferOutput.consumers {
-		consumers[transferHash] = types.Void
-	}
-	transferOutput.consumersMutex.RUnlock()
-
-	return
-}
-
 func (transferOutput *TransferOutput) IsSpent() (result bool) {
-	transferOutput.consumersMutex.RLock()
-	result = len(transferOutput.consumers) >= 1
-	transferOutput.consumersMutex.RUnlock()
-
-	return
-}
-
-func (transferOutput *TransferOutput) AddConsumer(consumer transaction.Id) (previousConsumers map[transaction.Id]types.Empty) {
-	transferOutput.consumersMutex.RLock()
-	if _, exist := transferOutput.consumers[consumer]; !exist {
-		transferOutput.consumersMutex.RUnlock()
-
-		transferOutput.consumersMutex.Lock()
-		if _, exist := transferOutput.consumers[consumer]; !exist {
-			previousConsumers = make(map[transaction.Id]types.Empty)
-			for transactionId := range transferOutput.consumers {
-				previousConsumers[transactionId] = types.Void
-			}
-
-			transferOutput.consumers[consumer] = types.Void
-
-			transferOutput.SetModified()
-		}
-		transferOutput.consumersMutex.Unlock()
-	} else {
-		transferOutput.consumersMutex.RUnlock()
-	}
+	// TODO: IMPLEMENT
 
 	return
 }
 
 func (transferOutput *TransferOutput) String() string {
 	return stringify.Struct("TransferOutput",
-		stringify.StructField("transactionId", transferOutput.GetTransactionId().String()),
-		stringify.StructField("address", transferOutput.GetAddress().String()),
-		stringify.StructField("realityId", transferOutput.GetRealityId().String()),
+		stringify.StructField("id", transferOutput.GetId().String()),
 		stringify.StructField("balances", transferOutput.GetBalances()),
-		stringify.StructField("spent", len(transferOutput.GetConsumers()) >= 1),
+		// TODO: IS SPENT
 	)
 }
 
 func (transferOutput *TransferOutput) GetStorageKey() []byte {
-	return append(transferOutput.transactionId[:], transferOutput.address[:]...)
+	return transferOutput.id[:]
 }
 
 func (transferOutput *TransferOutput) Update(other objectstorage.StorableObject) {
@@ -159,17 +69,12 @@ func (transferOutput *TransferOutput) Update(other objectstorage.StorableObject)
 
 func (transferOutput *TransferOutput) MarshalBinary() ([]byte, error) {
 	transferOutput.realityIdMutex.RLock()
-	transferOutput.consumersMutex.RLock()
 
 	balanceCount := len(transferOutput.balances)
-	consumerCount := len(transferOutput.consumers)
 
-	result := make([]byte, reality.IdLength+4+balanceCount*coloredcoins.BalanceLength+4+consumerCount*transaction.IdLength)
+	result := make([]byte, 4+balanceCount*coloredcoins.BalanceLength)
 	offset := 0
 
-	copy(result[0:], transferOutput.realityId[:])
-	offset += reality.IdLength
-
 	binary.LittleEndian.PutUint32(result[offset:], uint32(balanceCount))
 	offset += 4
 
@@ -182,15 +87,6 @@ func (transferOutput *TransferOutput) MarshalBinary() ([]byte, error) {
 		}
 	}
 
-	binary.LittleEndian.PutUint32(result[offset:], uint32(consumerCount))
-	offset += 4
-
-	for transactionId := range transferOutput.consumers {
-		copy(result[offset:], transactionId[:])
-		offset += transaction.IdLength
-	}
-
-	transferOutput.consumersMutex.RUnlock()
 	transferOutput.realityIdMutex.RUnlock()
 
 	return result, nil
@@ -199,23 +95,12 @@ func (transferOutput *TransferOutput) MarshalBinary() ([]byte, error) {
 func (transferOutput *TransferOutput) UnmarshalBinary(serializedObject []byte) error {
 	offset := 0
 
-	if err := transferOutput.realityId.UnmarshalBinary(serializedObject[offset:]); err != nil {
-		return err
-	}
-	offset += reality.IdLength
-
 	if balances, err := transferOutput.unmarshalBalances(serializedObject, &offset); err != nil {
 		return err
 	} else {
 		transferOutput.balances = balances
 	}
 
-	if consumers, err := transferOutput.unmarshalConsumers(serializedObject, &offset); err != nil {
-		return err
-	} else {
-		transferOutput.consumers = consumers
-	}
-
 	return nil
 }
 
@@ -237,24 +122,8 @@ func (transferOutput *TransferOutput) unmarshalBalances(serializedBalances []byt
 	return balances, nil
 }
 
-func (transferOutput *TransferOutput) unmarshalConsumers(serializedConsumers []byte, offset *int) (map[transaction.Id]types.Empty, error) {
-	consumerCount := int(binary.LittleEndian.Uint32(serializedConsumers[*offset:]))
-	*offset += 4
-
-	consumers := make(map[transaction.Id]types.Empty, consumerCount)
-	for i := 0; i < consumerCount; i++ {
-		var transactionId transaction.Id
-		if err := transactionId.UnmarshalBinary(serializedConsumers[*offset:]); err != nil {
-			return nil, err
-		}
-		*offset += transaction.IdLength
-	}
-
-	return consumers, nil
-}
-
 type CachedTransferOutput struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
 }
 
 func (cachedObject *CachedTransferOutput) Unwrap() *TransferOutput {
diff --git a/packages/binary/valuetangle/model/valuetransfer.go b/packages/binary/valuetangle/model/valuetransfer.go
index fa614d48..ef2fa722 100644
--- a/packages/binary/valuetangle/model/valuetransfer.go
+++ b/packages/binary/valuetangle/model/valuetransfer.go
@@ -4,8 +4,8 @@ import (
 	"sync"
 
 	"github.com/iotaledger/goshimmer/packages/binary/address"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/valuetransfer"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/valuetransfer"
 	"github.com/iotaledger/goshimmer/packages/binary/types"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
 )
diff --git a/packages/binary/valuetangle/valuetangle.go b/packages/binary/valuetangle/valuetangle.go
index e8e16a9a..faf76f22 100644
--- a/packages/binary/valuetangle/valuetangle.go
+++ b/packages/binary/valuetangle/valuetangle.go
@@ -5,18 +5,21 @@ import (
 	"fmt"
 	"time"
 
-	"github.com/iotaledger/goshimmer/packages/binary/address"
-
-	"github.com/iotaledger/goshimmer/packages/binary/types"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/transferoutput"
 
-	"github.com/iotaledger/goshimmer/packages/storageprefix"
+	"github.com/iotaledger/hive.go/syncutils"
 
+	"github.com/iotaledger/goshimmer/packages/binary/address"
 	"github.com/iotaledger/goshimmer/packages/binary/tangle"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/valuetransfer"
-	"github.com/iotaledger/goshimmer/packages/binary/transactionmetadata"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/valuetransfer"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transactionmetadata"
+	"github.com/iotaledger/goshimmer/packages/binary/types"
 	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/consumer"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
+	"github.com/iotaledger/goshimmer/packages/storageprefix"
+
 	"github.com/iotaledger/hive.go/async"
 	"github.com/iotaledger/hive.go/events"
 	"github.com/iotaledger/hive.go/objectstorage"
@@ -40,6 +43,8 @@ type ValueTangle struct {
 	solidifierWorkerPool        async.WorkerPool
 	cleanupWorkerPool           async.WorkerPool
 
+	tangleMutex syncutils.MultiMutex
+
 	Events Events
 }
 
@@ -157,11 +162,24 @@ func (valueTangle *ValueTangle) storeTransactionWorker(cachedTx *transaction.Cac
 
 	transferId := valueTransfer.GetId()
 
-	cachedTransferMetadata := &model.CachedTransferMetadata{CachedObject: valueTangle.transferMetadataStorage.Store(model.NewTransferMetadata(transferId))}
-	for referencedTransferId := range valueTransfer.GetInputs() {
-		addTransferToConsumers(transferId, referencedTransferId)
+	lockBuilder := syncutils.MultiMutexLockBuilder{}.AddLock(transferId)
+	consumers := make(map[transferoutput.Id]*consumer.Consumer)
+	for referencedTransferId, referencedAddresses := range valueTransfer.GetInputs() {
+		for referencedAddress := range referencedAddresses {
+			transferOutputId := transferoutput.NewId(referencedAddress, referencedTransferId)
+
+			lockBuilder.AddLock(transferOutputId)
+			consumers[transferOutputId] = consumer.New(transferOutputId, transferId)
+		}
 	}
 
+	// lock: own transfer outputs, consumers of inputs,
+	valueTangle.tangleMutex.Lock(lockBuilder.Build()...)
+
+	valueTangle.tangleMutex.Unlock(lockBuilder.Build()...)
+
+	cachedTransferMetadata := &model.CachedTransferMetadata{CachedObject: valueTangle.transferMetadataStorage.Store(model.NewTransferMetadata(transferId))}
+
 	if valueTangle.missingTransferStorage.DeleteIfPresent(transferId[:]) {
 		valueTangle.Events.MissingTransferReceived.Trigger(transferId)
 	}
diff --git a/packages/binary/valuetangle/valuetangle_test.go b/packages/binary/valuetangle/valuetangle_test.go
index d4e954bb..0ce26700 100644
--- a/packages/binary/valuetangle/valuetangle_test.go
+++ b/packages/binary/valuetangle/valuetangle_test.go
@@ -8,19 +8,16 @@ import (
 	"github.com/mr-tron/base58"
 
 	"github.com/iotaledger/goshimmer/packages/binary/address"
-	"github.com/iotaledger/goshimmer/packages/binary/transactionmetadata"
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
-
-	"github.com/iotaledger/goshimmer/packages/binary/signature/ed25119"
-
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/valuetransfer"
-
 	"github.com/iotaledger/goshimmer/packages/binary/identity"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-
+	"github.com/iotaledger/goshimmer/packages/binary/signature/ed25119"
 	"github.com/iotaledger/goshimmer/packages/binary/tangle"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/valuetransfer"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transactionmetadata"
 	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model"
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
+
 	"github.com/iotaledger/hive.go/events"
 )
 
diff --git a/packages/ledgerstate/transfer/constants.go b/packages/ledgerstate/transfer/constants.go
index c3a690bd..d98cdb15 100644
--- a/packages/ledgerstate/transfer/constants.go
+++ b/packages/ledgerstate/transfer/constants.go
@@ -1,7 +1,7 @@
 package transfer
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
 )
 
diff --git a/packages/ledgerstate/transfer/output.go b/packages/ledgerstate/transfer/output.go
index 8c7f5b06..fd59934f 100644
--- a/packages/ledgerstate/transfer/output.go
+++ b/packages/ledgerstate/transfer/output.go
@@ -4,7 +4,7 @@ import (
 	"encoding/binary"
 	"sync"
 
-	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
 	"github.com/iotaledger/goshimmer/packages/stringify"
diff --git a/packages/ledgerstate/transfer/output_booking.go b/packages/ledgerstate/transfer/output_booking.go
index e2680151..7a387c23 100644
--- a/packages/ledgerstate/transfer/output_booking.go
+++ b/packages/ledgerstate/transfer/output_booking.go
@@ -1,8 +1,9 @@
 package transfer
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
+
 	"github.com/iotaledger/hive.go/objectstorage"
 )
 
diff --git a/packages/ledgerstate/transfer/output_reference.go b/packages/ledgerstate/transfer/output_reference.go
index d990f7be..70b3b11a 100644
--- a/packages/ledgerstate/transfer/output_reference.go
+++ b/packages/ledgerstate/transfer/output_reference.go
@@ -1,7 +1,7 @@
 package transfer
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/stringify"
 )
 
diff --git a/packages/ledgerstate/transfer/transfer.go b/packages/ledgerstate/transfer/transfer.go
index 70c27381..6d6392b4 100644
--- a/packages/ledgerstate/transfer/transfer.go
+++ b/packages/ledgerstate/transfer/transfer.go
@@ -1,7 +1,7 @@
 package transfer
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
 )
 
diff --git a/packages/ledgerstate/transfer/transfer_output_booking.go b/packages/ledgerstate/transfer/transfer_output_booking.go
index 01238c13..7e872b43 100644
--- a/packages/ledgerstate/transfer/transfer_output_booking.go
+++ b/packages/ledgerstate/transfer/transfer_output_booking.go
@@ -1,10 +1,11 @@
 package transfer
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/errors"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
 	"github.com/iotaledger/goshimmer/packages/stringify"
+
 	"github.com/iotaledger/hive.go/objectstorage"
 )
 
diff --git a/plugins/tangle/solidifier.go b/plugins/tangle/solidifier.go
index e0408a95..13b6fc7b 100644
--- a/plugins/tangle/solidifier.go
+++ b/plugins/tangle/solidifier.go
@@ -3,6 +3,8 @@ package tangle
 import (
 	"runtime"
 
+	"github.com/iotaledger/iota.go/trinary"
+
 	"github.com/iotaledger/goshimmer/packages/daemon"
 	"github.com/iotaledger/goshimmer/packages/errors"
 	"github.com/iotaledger/goshimmer/packages/events"
@@ -13,7 +15,6 @@ import (
 	"github.com/iotaledger/goshimmer/packages/node"
 	"github.com/iotaledger/goshimmer/packages/workerpool"
 	"github.com/iotaledger/goshimmer/plugins/gossip"
-	"github.com/iotaledger/iota.go/trinary"
 )
 
 // region plugin module setup //////////////////////////////////////////////////////////////////////////////////////////
-- 
GitLab