@@ -375,7 +375,6 @@ type ListingMetadata struct {
375
375
// UnmarshalJSONSignedListing - unmarshal signed listing
376
376
func UnmarshalJSONSignedListing (data []byte ) (SignedListing , error ) {
377
377
378
- retSL := SignedListing {}
379
378
var err error
380
379
381
380
var objmap map [string ]* json.RawMessage
@@ -399,126 +398,95 @@ func UnmarshalJSONSignedListing(data []byte) (SignedListing, error) {
399
398
400
399
vendorID , err := ExtractIDFromSignedListing (data )
401
400
if err != nil {
402
- return retSL , err
401
+ return SignedListing {} , err
403
402
}
404
403
405
404
peerInfo , err := NewPeerInfoFromProtobuf (vendorID )
406
405
if err != nil {
407
- return retSL , err
406
+ return SignedListing {} , err
408
407
}
409
408
410
409
version , err := ExtractVersionFromSignedListing (data )
411
410
if err != nil {
412
- return retSL , err
411
+ return SignedListing {} , err
413
412
}
414
413
415
414
if version == 5 {
416
415
sl := new (pb.SignedListing )
417
416
err = jsonpb .UnmarshalString (string (data ), sl )
418
417
if err != nil {
419
- return retSL , err
418
+ return SignedListing {} , err
420
419
}
421
420
b0 , err := m1 .MarshalToString (sl .Listing )
422
421
if err != nil {
423
- return retSL , err
424
- }
425
- retSL .Hash = sl .Hash
426
- retSL .ProtoListing = sl .Listing
427
- retSL .RListing = Listing {
428
- Slug : sl .Listing .Slug ,
429
- Metadata : ListingMetadata {
430
- Version : 5 ,
422
+ return SignedListing {}, err
423
+ }
424
+ return SignedListing {
425
+ Hash : sl .Hash ,
426
+ ProtoListing : sl .Listing ,
427
+ RListing : Listing {
428
+ Slug : sl .Listing .Slug ,
429
+ Metadata : ListingMetadata {
430
+ Version : 5 ,
431
+ },
432
+ ListingVersion : 5 ,
433
+ ListingBytes : []byte (b0 ),
434
+ ProtoListing : sl .Listing ,
435
+ Vendor : peerInfo ,
431
436
},
432
- ListingVersion : 5 ,
433
- ListingBytes : []byte (b0 ),
434
- OrigListingBytes : * lbytes ,
435
- ProtoListing : sl .Listing ,
436
- Vendor : peerInfo ,
437
- }
438
- retSL .Signature = sl .Signature
439
- retSL .ProtoSignedListing = sl
440
- return retSL , nil
437
+ Signature : sl .Signature ,
438
+ ProtoSignedListing : sl ,
439
+ }, nil
441
440
}
442
441
443
442
listing0 := Listing {
444
- ListingBytes : * lbytes ,
445
- OrigListingBytes : * lbytes ,
443
+ ListingBytes : * lbytes ,
446
444
Metadata : ListingMetadata {
447
445
Version : version ,
448
446
},
449
447
ListingVersion : uint32 (version ),
450
448
Vendor : peerInfo ,
451
449
}
452
450
453
- type slisting struct {
451
+ var s1 struct {
454
452
Hash string `json:"hash"`
455
453
Signature []byte `json:"signature"`
456
454
Listing json.RawMessage `json:"listing"`
457
455
}
458
- var s1 slisting
459
456
err = json .Unmarshal (data , & s1 )
460
457
if err != nil {
461
- return retSL , err
462
- }
463
-
464
- proto0 , err := listing0 .GetProtoListing ()
465
- if err != nil {
466
- return retSL , err
467
- }
468
-
469
- proto0 .VendorID = vendorID
470
-
471
- listing0 .ProtoListing = proto0
472
-
473
- retSL .Signature = s1 .Signature
474
- retSL .Hash = s1 .Hash
475
- retSL .RListing = listing0
476
-
477
- retSL .ProtoListing = proto0
478
- retSL .ProtoSignedListing = & pb.SignedListing {
479
- Listing : proto0 ,
480
- Hash : s1 .Hash ,
481
- Signature : s1 .Signature ,
458
+ return SignedListing {}, err
482
459
}
483
460
484
- out0 , err := m1 .MarshalToString (proto0 )
485
- if err != nil {
486
- //return ret, err
487
- log .Info (err )
461
+ // GetProtoListing generates listing0.ProtoListing (mutation is evil)
462
+ if _ , err = listing0 .GetProtoListing (); err != nil {
463
+ return SignedListing {}, err
488
464
}
489
-
490
- log .Info (len (out0 ))
465
+ listing0 .ProtoListing .VendorID = vendorID
491
466
492
467
m := jsonpb.Marshaler {
493
468
EnumsAsInts : false ,
494
469
EmitDefaults : false ,
495
470
Indent : " " ,
496
471
OrigName : false ,
497
472
}
498
-
499
- outSL , err := m .MarshalToString (retSL .RListing .ProtoListing )
473
+ outSL , err := m .MarshalToString (listing0 .ProtoListing )
500
474
if err != nil {
501
- return retSL , err
502
- }
503
- retSL .RListing .ListingBytes = []byte (outSL )
504
-
505
- proto1 := & pb.Listing {
506
- Slug : proto0 .Slug ,
507
- VendorID : vendorID ,
508
- Metadata : proto0 .Metadata ,
509
- Item : proto0 .Item ,
510
- ShippingOptions : proto0 .ShippingOptions ,
511
- Taxes : proto0 .Taxes ,
512
- Coupons : proto0 .Coupons ,
513
- Moderators : proto0 .Moderators ,
514
- TermsAndConditions : proto0 .TermsAndConditions ,
515
- RefundPolicy : proto0 .RefundPolicy ,
475
+ return SignedListing {}, err
516
476
}
517
-
518
- log .Info (proto1 .Slug )
519
-
520
- return retSL , nil
521
-
477
+ listing0 .ListingBytes = []byte (outSL )
478
+
479
+ return SignedListing {
480
+ Signature : s1 .Signature ,
481
+ Hash : s1 .Hash ,
482
+ RListing : listing0 ,
483
+ ProtoListing : listing0 .ProtoListing ,
484
+ ProtoSignedListing : & pb.SignedListing {
485
+ Listing : listing0 .ProtoListing ,
486
+ Hash : s1 .Hash ,
487
+ Signature : s1 .Signature ,
488
+ },
489
+ }, nil
522
490
}
523
491
524
492
// UnmarshalJSONListing - unmarshal listing
@@ -609,6 +577,51 @@ func ExtractIDFromListing(data []byte) (*pb.ID, error) {
609
577
return vendorPlay , nil
610
578
}
611
579
580
+ // GetCryptoDivisibility returns the listing crypto divisibility
581
+ func (l * Listing ) GetCryptoDivisibility () uint32 {
582
+ ct , err := l .GetContractType ()
583
+ if err == nil && ct != pb .Listing_Metadata_CRYPTOCURRENCY .String () {
584
+ return 0
585
+ }
586
+ div := parseProtoCryptoDivisibility (l .ListingBytes )
587
+ switch l .ListingVersion {
588
+ case 5 :
589
+ return div
590
+ default : // version <4
591
+ if div != 0 {
592
+ return uint32 (math .Log10 (float64 (div )))
593
+ }
594
+ }
595
+ return 0
596
+ }
597
+
598
+ func parseProtoCryptoDivisibility (listing []byte ) uint32 {
599
+ var listingT struct {
600
+ Metadata struct {
601
+ CryptoDivisibility uint32 `json:"coinDivisibility"`
602
+ } `json:"metadata"`
603
+ }
604
+ err := json .Unmarshal (listing , & listingT )
605
+ if err != nil {
606
+ return 0
607
+ }
608
+ return listingT .Metadata .CryptoDivisibility
609
+ }
610
+
611
+ // GetCryptoCurrencyCode returns the listing crypto currency code
612
+ func (l * Listing ) GetCryptoCurrencyCode () string {
613
+ var listingT struct {
614
+ Metadata struct {
615
+ CryptoCurrencyCode string `json:"coinType"`
616
+ } `json:"metadata"`
617
+ }
618
+ err := json .Unmarshal (l .ListingBytes , & listingT )
619
+ if err != nil {
620
+ return ""
621
+ }
622
+ return listingT .Metadata .CryptoCurrencyCode
623
+ }
624
+
612
625
// GetTitle - return listing title
613
626
func (l * Listing ) GetTitle () (string , error ) {
614
627
type title struct {
@@ -1333,6 +1346,8 @@ func (l *Listing) GetMetadata() (*pb.Listing_Metadata, error) {
1333
1346
Language : lang ,
1334
1347
EscrowTimeoutHours : l .GetEscrowTimeout (),
1335
1348
PriceModifier : priceMod ,
1349
+ CryptoDivisibility : parseProtoCryptoDivisibility (l .ListingBytes ),
1350
+ CryptoCurrencyCode : l .GetCryptoCurrencyCode (),
1336
1351
}
1337
1352
return & m , nil
1338
1353
}
@@ -1615,11 +1630,7 @@ func (l *Listing) Sign(n *core.IpfsNode, timeout uint32,
1615
1630
1616
1631
// ValidateCryptoListing - check cryptolisting
1617
1632
func (l * Listing ) ValidateCryptoListing () error {
1618
- listing , err := l .GetProtoListing ()
1619
- if err != nil {
1620
- return err
1621
- }
1622
- return validateCryptocurrencyListing (listing )
1633
+ return l .validateCryptocurrencyListing ()
1623
1634
}
1624
1635
1625
1636
// ValidateSkus - check listing skus
@@ -1967,12 +1978,12 @@ func ValidateListing(l *Listing, testnet bool) (err error) {
1967
1978
1968
1979
// Type-specific validations
1969
1980
if listing .Metadata .ContractType == pb .Listing_Metadata_PHYSICAL_GOOD {
1970
- err := validatePhysicalListing (listing )
1981
+ err := l . validatePhysicalListing ()
1971
1982
if err != nil {
1972
1983
return err
1973
1984
}
1974
1985
} else if listing .Metadata .ContractType == pb .Listing_Metadata_CRYPTOCURRENCY {
1975
- err := validateCryptocurrencyListing (listing )
1986
+ err := l . validateCryptocurrencyListing ()
1976
1987
if err != nil {
1977
1988
return err
1978
1989
}
@@ -1989,7 +2000,11 @@ func ValidateListing(l *Listing, testnet bool) (err error) {
1989
2000
return nil
1990
2001
}
1991
2002
1992
- func validatePhysicalListing (listing * pb.Listing ) error {
2003
+ func (l * Listing ) validatePhysicalListing () error {
2004
+ listing , err := l .GetProtoListing ()
2005
+ if err != nil {
2006
+ return fmt .Errorf ("producing listing protobuf: %s" , err )
2007
+ }
1993
2008
if listing .Item .PriceCurrency .Code == "" {
1994
2009
return errors .New ("listing pricing currency code must not be empty" )
1995
2010
}
@@ -2068,19 +2083,29 @@ func validatePhysicalListing(listing *pb.Listing) error {
2068
2083
return nil
2069
2084
}
2070
2085
2071
- func validateCryptocurrencyListing (listing * pb.Listing ) error {
2072
- switch {
2073
- case len (listing .Coupons ) > 0 :
2086
+ func (l * Listing ) validateCryptocurrencyListing () error {
2087
+ listing , err := l .GetProtoListing ()
2088
+ if err != nil {
2089
+ return fmt .Errorf ("producing listing protobuf: %s" , err )
2090
+ }
2091
+
2092
+ if len (listing .Coupons ) > 0 {
2074
2093
return ErrCryptocurrencyListingIllegalField ("coupons" )
2075
- case len (listing .Item .Options ) > 0 :
2094
+ }
2095
+ if len (listing .Item .Options ) > 0 {
2076
2096
return ErrCryptocurrencyListingIllegalField ("item.options" )
2077
- case len (listing .ShippingOptions ) > 0 :
2097
+ }
2098
+ if len (listing .ShippingOptions ) > 0 {
2078
2099
return ErrCryptocurrencyListingIllegalField ("shippingOptions" )
2079
- case len (listing .Item .Condition ) > 0 :
2100
+ }
2101
+ if len (listing .Item .Condition ) > 0 {
2080
2102
return ErrCryptocurrencyListingIllegalField ("item.condition" )
2081
- //case len(listing.Metadata.PricingCurrency.Code) > 0:
2082
- //return ErrCryptocurrencyListingIllegalField("metadata.pricingCurrency")
2083
- case len (listing .Metadata .CryptoCurrencyCode ) == 0 :
2103
+ }
2104
+ if listing .Item .PriceCurrency != nil &&
2105
+ len (listing .Item .PriceCurrency .Code ) > 0 {
2106
+ return ErrCryptocurrencyListingIllegalField ("metadata.pricingCurrency" )
2107
+ }
2108
+ if len (listing .Metadata .CryptoCurrencyCode ) == 0 {
2084
2109
return ErrListingCryptoCurrencyCodeInvalid
2085
2110
}
2086
2111
0 commit comments