@@ -15,7 +15,9 @@ import (
1515 "github.com/hyperledger-labs/fabric-token-sdk/token/core/fabtoken/v1/actions"
1616 "github.com/hyperledger-labs/fabric-token-sdk/token/driver"
1717 "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity"
18+ hashescrow2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/interop/hashescrow"
1819 htlc2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/interop/htlc"
20+ "github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/hashescrow"
1921 "github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/htlc"
2022 "github.com/hyperledger-labs/fabric-token-sdk/token/token"
2123)
@@ -183,6 +185,38 @@ func TransferHTLCValidate(c context.Context, ctx *Context) error {
183185 ctx .CountMetadataKey (metadataKey )
184186 }
185187 }
188+ if owner .Type == hashescrow .ScriptType {
189+ if len (ctx .TransferAction .GetOutputs ()) != 1 {
190+ return errors .New ("invalid transfer action: a hash escrow script only transfers the ownership of a token" )
191+ }
192+
193+ // check type and quantity
194+ output := ctx .TransferAction .GetOutputs ()[0 ].(* actions.Output )
195+ tok := output
196+ if ctx .InputTokens [0 ].Type != tok .Type {
197+ return errors .New ("invalid transfer action: type of input does not match type of output" )
198+ }
199+ if ctx .InputTokens [0 ].Quantity != tok .Quantity {
200+ return errors .New ("invalid transfer action: quantity of input does not match quantity of output" )
201+ }
202+ if output .IsRedeem () {
203+ return errors .New ("invalid transfer action: the output corresponding to a hash escrow spending should not be a redeem" )
204+ }
205+
206+ // check owner field
207+ script , err := hashescrow2 .VerifyOwner (ctx .InputTokens [0 ].GetOwner (), tok .Owner )
208+ if err != nil {
209+ return errors .Wrap (err , "failed to verify transfer from hash escrow script" )
210+ }
211+
212+ // check metadata
213+ sigma := ctx .Signatures [i ]
214+ metadataKey , err := hashescrow2 .MetadataClaimKeyCheck (ctx .TransferAction , script , sigma )
215+ if err != nil {
216+ return errors .WithMessagef (err , "failed to check hash escrow metadata" )
217+ }
218+ ctx .CountMetadataKey (metadataKey )
219+ }
186220 }
187221
188222 for _ , o := range ctx .TransferAction .GetOutputs () {
@@ -214,6 +248,23 @@ func TransferHTLCValidate(c context.Context, ctx *Context) error {
214248 }
215249 ctx .CountMetadataKey (metadataKey )
216250
251+ continue
252+ }
253+ if owner .Type == hashescrow .ScriptType {
254+ script := & hashescrow.Script {}
255+ err = json .Unmarshal (owner .Identity , script )
256+ if err != nil {
257+ return err
258+ }
259+ if err := script .Validate (); err != nil {
260+ return errors .WithMessagef (err , "hash escrow script invalid" )
261+ }
262+ metadataKey , err := hashescrow2 .MetadataLockKeyCheck (ctx .TransferAction , script )
263+ if err != nil {
264+ return errors .WithMessagef (err , "failed to check hash escrow metadata" )
265+ }
266+ ctx .CountMetadataKey (metadataKey )
267+
217268 continue
218269 }
219270 }
0 commit comments