@@ -7,6 +7,8 @@ SPDX-License-Identifier: Apache-2.0
77package token
88
99import (
10+ "slices"
11+
1012 "github.com/hyperledger-labs/fabric-smart-client/platform/common/utils/collections"
1113 "github.com/hyperledger-labs/fabric-token-sdk/token/driver"
1214 "github.com/hyperledger-labs/fabric-token-sdk/token/services/logging"
@@ -52,14 +54,38 @@ func (m *Metadata) FilterBy(eIDs ...string) (*Metadata, error) {
5254 return m , nil
5355 }
5456
55- clonedMetadata := & Metadata {
56- TokenService : m .TokenService ,
57- WalletService : m .WalletService ,
58- TokenRequestMetadata : & driver.TokenRequestMetadata {},
59- Logger : m .Logger ,
60- }
6157 eIDSet := collections .NewSet (eIDs ... )
62- // filter issues
58+
59+ issues , err := m .filterIssues (m .TokenRequestMetadata .Issues , eIDSet )
60+ if err != nil {
61+ return nil , errors .WithMessagef (err , "failed filtering issues" )
62+ }
63+ transfers , err := m .filterTransfers (m .TokenRequestMetadata .Transfers , eIDSet )
64+ if err != nil {
65+ return nil , errors .WithMessagef (err , "failed filtering transfers" )
66+ }
67+ clone := & Metadata {
68+ TokenService : m .TokenService ,
69+ WalletService : m .WalletService ,
70+ TokenRequestMetadata : & driver.TokenRequestMetadata {
71+ Issues : issues ,
72+ Transfers : transfers ,
73+ Application : m .TokenRequestMetadata .Application ,
74+ },
75+ Logger : m .Logger ,
76+ }
77+
78+ // TODO: update this log
79+ m .Logger .Debugf ("filtered metadata for [% x] from [%d:%d] to [%d:%d]" ,
80+ eIDs ,
81+ len (m .TokenRequestMetadata .Issues ), len (m .TokenRequestMetadata .Transfers ),
82+ len (clone .TokenRequestMetadata .Issues ), len (clone .TokenRequestMetadata .Transfers ))
83+
84+ return clone , nil
85+ }
86+
87+ func (m * Metadata ) filterIssues (issues []* driver.IssueMetadata , eIDSet collections.Set [string ]) ([]* driver.IssueMetadata , error ) {
88+ cloned := make ([]* driver.IssueMetadata , 0 , len (issues ))
6389 for _ , issue := range m .TokenRequestMetadata .Issues {
6490 clone := & driver.IssueMetadata {
6591 Issuer : issue .Issuer ,
@@ -70,19 +96,9 @@ func (m *Metadata) FilterBy(eIDs ...string) (*Metadata, error) {
7096
7197 counter := 0
7298 for _ , output := range issue .Outputs {
73- found := false
74- for _ , receiver := range output .Receivers {
75- // If the receiver has the given enrollment ID, add it
76- recipientEID , err := m .WalletService .GetEnrollmentID (receiver .Identity , receiver .AuditInfo )
77- if err != nil {
78- return nil , errors .Wrap (err , "failed getting enrollment ID" )
79- }
80- if eIDSet .Contains (recipientEID ) {
81- found = true
82- break
83- }
84- }
85- if found {
99+ if found , err := m .contains (output .Receivers , eIDSet ); err != nil {
100+ return nil , errors .WithMessagef (err , "failed checking receivers" )
101+ } else if found {
86102 clone .Outputs = append (clone .Outputs , output )
87103 counter ++
88104 } else {
@@ -91,10 +107,13 @@ func (m *Metadata) FilterBy(eIDs ...string) (*Metadata, error) {
91107 }
92108
93109 m .Logger .Debugf ("keeping issue with [%d] out of [%d] outputs" , counter , len (issue .Outputs ))
94- clonedMetadata . TokenRequestMetadata . Issues = append (clonedMetadata . TokenRequestMetadata . Issues , clone )
110+ cloned = append (cloned , clone )
95111 }
112+ return cloned , nil
113+ }
96114
97- // filter transfers
115+ func (m * Metadata ) filterTransfers (issues []* driver.TransferMetadata , eIDSet collections.Set [string ]) ([]* driver.TransferMetadata , error ) {
116+ cloned := make ([]* driver.TransferMetadata , 0 , len (issues ))
98117 for _ , transfer := range m .TokenRequestMetadata .Transfers {
99118 clone := & driver.TransferMetadata {
100119 Inputs : nil ,
@@ -104,63 +123,52 @@ func (m *Metadata) FilterBy(eIDs ...string) (*Metadata, error) {
104123
105124 // Filter outputs
106125 // if the receiver has the given enrollment ID, add it. Otherwise, add empty entries
107- skip := true
108126 counter := 0
109127 for _ , output := range transfer .Outputs {
110- found := false
111- for _ , receiver := range output .Receivers {
112- // If the receiver has the given enrollment ID, add it
113- recipientEID , err := m .WalletService .GetEnrollmentID (receiver .Identity , receiver .AuditInfo )
114- if err != nil {
115- return nil , errors .Wrap (err , "failed getting enrollment ID" )
116- }
117- if eIDSet .Contains (recipientEID ) {
118- logger .Debugf ("eid [%s] found in list [%v]" , recipientEID , eIDs )
119- skip = false
120- found = true
121- break
122- } else {
123- logger .Debugf ("eid [%s] not found in list [%v]" , recipientEID , eIDs )
124- }
125- }
126- if found {
128+ if found , err := m .contains (output .Receivers , eIDSet ); err != nil {
129+ return nil , errors .WithMessagef (err , "failed checking receivers" )
130+ } else if found {
127131 clone .Outputs = append (clone .Outputs , output )
128132 counter ++
129133 } else {
130134 clone .Outputs = append (clone .Outputs , nil )
131135 }
132136 }
133137
134- // if skip = true , it means that this transfer does not contain any output for the given enrollment IDs.
138+ // if counter == 0 , it means that this transfer does not contain any output for the given enrollment IDs.
135139 // Therefore, no metadata should be given to the passed enrollment IDs.
136- // if skip = false , it means that this transfer contains at least one output for the given enrollment IDs.
140+ // if counter > 0 , it means that this transfer contains at least one output for the given enrollment IDs.
137141 // Append the senders to the transfer metadata.
138142 for range transfer .Inputs {
139- clone .Inputs = append (clone .Inputs , & driver.TransferInputMetadata {
140- TokenID : nil ,
141- Senders : nil ,
142- })
143+ clone .Inputs = append (clone .Inputs , & driver.TransferInputMetadata {})
143144 }
144- if ! skip {
145+ if counter > 0 {
145146 for i , input := range transfer .Inputs {
146147 clone .Inputs [i ].Senders = input .Senders
147148 }
148149 }
149150
150151 m .Logger .Debugf ("keeping transfer with [%d] out of [%d] outputs" , counter , len (transfer .Outputs ))
151- clonedMetadata . TokenRequestMetadata . Transfers = append (clonedMetadata . TokenRequestMetadata . Transfers , clone )
152+ cloned = append (cloned , clone )
152153 }
154+ return cloned , nil
155+ }
153156
154- // application
155- clonedMetadata .TokenRequestMetadata .Application = m .TokenRequestMetadata .Application
156-
157- // TODO: update this log
158- m .Logger .Debugf ("filtered metadata for [% x] from [%d:%d] to [%d:%d]" ,
159- eIDs ,
160- len (m .TokenRequestMetadata .Issues ), len (m .TokenRequestMetadata .Transfers ),
161- len (clonedMetadata .TokenRequestMetadata .Issues ), len (clonedMetadata .TokenRequestMetadata .Transfers ))
162-
163- return clonedMetadata , nil
157+ func (m * Metadata ) contains (receivers []* driver.AuditableIdentity , eIDSet collections.Set [string ]) (bool , error ) {
158+ for _ , receiver := range receivers {
159+ // If the receiver has the given enrollment ID, add it
160+ recipientEID , err := m .WalletService .GetEnrollmentID (receiver .Identity , receiver .AuditInfo )
161+ if err != nil {
162+ return false , errors .Wrap (err , "failed getting enrollment ID" )
163+ }
164+ if eIDSet .Contains (recipientEID ) {
165+ logger .Debugf ("eid [%s] found in list [%v]" , recipientEID , eIDSet )
166+ return true , nil
167+ } else {
168+ logger .Debugf ("eid [%s] not found in list [%v]" , recipientEID , eIDSet )
169+ }
170+ }
171+ return false , nil
164172}
165173
166174// Issue returns the i-th issue metadata, if present
@@ -212,7 +220,7 @@ func (m *IssueMetadata) Match(action *IssueAction) error {
212220 }
213221 // check that the extra signers are the same
214222 for i , signer := range extraSigner {
215- if ! signer . Equal (m .ExtraSigners [ i ] ) {
223+ if ! slices . ContainsFunc (m .ExtraSigners , signer . Equal ) {
216224 return errors .Errorf ("expected extra signer [%s] but got [%s]" , signer , m .ExtraSigners [i ])
217225 }
218226 }
0 commit comments