@@ -17,6 +17,7 @@ import (
1717 "google.golang.org/protobuf/encoding/protojson"
1818 "google.golang.org/protobuf/types/known/emptypb"
1919 "io"
20+ "math"
2021 "net"
2122
2223 qubic "github.com/qubic/go-node-connector"
@@ -484,6 +485,199 @@ func (s *Server) GetPossessedAssets(ctx context.Context, req *protobuff.Possesse
484485 return & protobuff.PossessedAssetsResponse {PossessedAssets : possessedAssets }, nil
485486}
486487
488+ func (s * Server ) GetIssuedAssetByUniverseIndex (ctx context.Context , request * protobuff.GetIssuedAssetByUniverseIndexRequest ) (* protobuff.AssetIssuance , error ) {
489+ client , err := s .qPool .Get ()
490+ if err != nil {
491+ return nil , status .Errorf (codes .Internal , "getting pool connection :%v" , err )
492+ }
493+
494+ assets , err := client .GetAssetsByUniverseIndex (ctx , request .Index )
495+ if err != nil {
496+ s .qPool .Close (client )
497+ return nil , status .Errorf (codes .Internal , "getting assets by universe index %v" , err )
498+ }
499+ s .qPool .Put (client )
500+
501+ if len (assets ) > 0 && assets [0 ].Asset != (types.AssetIssuanceData {}) { // don't return empty issuance data
502+
503+ var issuerIdentity types.Identity
504+ issuerIdentity , err = issuerIdentity .FromPubKey (assets [0 ].Asset .PublicKey , false )
505+ if err != nil {
506+ return nil , errors .Wrap (err , "failed to get identity for issued asset public key" )
507+ }
508+
509+ issuedAsset := protobuff.AssetIssuanceData {
510+ IssuerIdentity : issuerIdentity .String (),
511+ Type : uint32 (assets [0 ].Asset .Type ),
512+ Name : int8ArrayToString (assets [0 ].Asset .Name [:]),
513+ NumberOfDecimalPlaces : int32 (assets [0 ].Asset .NumberOfDecimalPlaces ),
514+ UnitOfMeasurement : int8ArrayToInt32Array (assets [0 ].Asset .UnitOfMeasurement [:]),
515+ }
516+
517+ asset := protobuff.AssetIssuance {
518+ Data : & issuedAsset ,
519+ Tick : assets [0 ].Tick ,
520+ UniverseIndex : assets [0 ].UniverseIndex ,
521+ }
522+
523+ return & asset , nil
524+ } else {
525+ log .Printf ("asset with universe index [%d] not found" , request .Index )
526+ return nil , status .Error (codes .NotFound , "asset not found" )
527+ }
528+
529+ }
530+
531+ func (s * Server ) GetIssuedAssetsByFilter (ctx context.Context , request * protobuff.GetIssuedAssetsByFilterRequest ) (* protobuff.AssetIssuances , error ) {
532+
533+ client , err := s .qPool .Get ()
534+ if err != nil {
535+ return nil , status .Errorf (codes .Internal , "getting pool connection :%v" , err )
536+ }
537+
538+ assets , err := client .GetAssetIssuancesByFilter (ctx , request .GetIssuerIdentity (), request .GetAssetName ())
539+ if err != nil {
540+ s .qPool .Close (client )
541+ return nil , status .Errorf (codes .Internal , "getting issued assets by filter %v" , err )
542+ }
543+ s .qPool .Put (client )
544+
545+ assetIssuances := make ([]* protobuff.AssetIssuance , 0 )
546+
547+ for _ , asset := range assets {
548+
549+ var issuerIdentity types.Identity
550+ issuerIdentity , err = issuerIdentity .FromPubKey (asset .Asset .PublicKey , false )
551+ if err != nil {
552+ return nil , errors .Wrap (err , "failed to get identity for issued asset public key" )
553+ }
554+
555+ issuedAsset := protobuff.AssetIssuanceData {
556+ IssuerIdentity : issuerIdentity .String (),
557+ Type : uint32 (asset .Asset .Type ),
558+ Name : int8ArrayToString (asset .Asset .Name [:]),
559+ NumberOfDecimalPlaces : int32 (asset .Asset .NumberOfDecimalPlaces ),
560+ UnitOfMeasurement : int8ArrayToInt32Array (asset .Asset .UnitOfMeasurement [:]),
561+ }
562+
563+ assetIssuance := protobuff.AssetIssuance {
564+ Data : & issuedAsset ,
565+ Tick : asset .Tick ,
566+ UniverseIndex : asset .UniverseIndex ,
567+ }
568+
569+ assetIssuances = append (assetIssuances , & assetIssuance )
570+
571+ }
572+
573+ return & protobuff.AssetIssuances {Assets : assetIssuances }, nil
574+ }
575+
576+ func (s * Server ) GetOwnedAssetsByFilter (ctx context.Context , request * protobuff.GetOwnedAssetsByFilterRequest ) (* protobuff.AssetOwnerships , error ) {
577+
578+ if request .GetOwnershipManagingContract () > math .MaxUint16 {
579+ return nil , status .Errorf (codes .InvalidArgument , "ownership managing contract value out of range" )
580+ }
581+ contract := uint16 (request .GetOwnershipManagingContract ())
582+
583+ client , err := s .qPool .Get ()
584+ if err != nil {
585+ return nil , status .Errorf (codes .Internal , "getting pool connection :%v" , err )
586+ }
587+
588+ assets , err := client .GetAssetOwnershipsByFilter (ctx , request .GetIssuerIdentity (), request .GetAssetName (), request .GetOwnerIdentity (), contract )
589+ if err != nil {
590+ s .qPool .Close (client )
591+ return nil , status .Errorf (codes .Internal , "getting asset owners by filter %v" , err )
592+ }
593+ s .qPool .Put (client )
594+
595+ assetOwnerships := make ([]* protobuff.AssetOwnership , 0 )
596+
597+ for _ , asset := range assets {
598+
599+ var owner types.Identity
600+ owner , err = owner .FromPubKey (asset .Asset .PublicKey , false )
601+ if err != nil {
602+ return nil , errors .Wrap (err , "failed to get identity for owner public key" )
603+ }
604+
605+ ownedAsset := protobuff.AssetOwnershipData {
606+ OwnerIdentity : owner .String (),
607+ Type : uint32 (asset .Asset .Type ),
608+ ManagingContractIndex : uint32 (asset .Asset .ManagingContractIndex ),
609+ IssuanceIndex : asset .Asset .IssuanceIndex ,
610+ NumberOfUnits : asset .Asset .NumberOfUnits ,
611+ }
612+
613+ assetOwnership := protobuff.AssetOwnership {
614+ Data : & ownedAsset ,
615+ Tick : asset .Tick ,
616+ UniverseIndex : asset .UniverseIndex ,
617+ }
618+
619+ assetOwnerships = append (assetOwnerships , & assetOwnership )
620+
621+ }
622+
623+ return & protobuff.AssetOwnerships {Assets : assetOwnerships }, nil
624+
625+ }
626+
627+ func (s * Server ) GetPossessedAssetsByFilter (ctx context.Context , request * protobuff.GetPossessedAssetsByFilterRequest ) (* protobuff.AssetPossessions , error ) {
628+ if request .GetOwnershipManagingContract () > math .MaxUint16 {
629+ return nil , status .Errorf (codes .InvalidArgument , "ownership managing contract value out of range" )
630+ }
631+ ownerContract := uint16 (request .GetOwnershipManagingContract ())
632+
633+ if request .GetPossessionManagingContract () > math .MaxUint16 {
634+ return nil , status .Errorf (codes .InvalidArgument , "possession managing contract value out of range" )
635+ }
636+ possessorContract := uint16 (request .GetPossessionManagingContract ())
637+
638+ client , err := s .qPool .Get ()
639+ if err != nil {
640+ return nil , status .Errorf (codes .Internal , "getting pool connection :%v" , err )
641+ }
642+
643+ assets , err := client .GetAssetPossessionsByFilter (ctx , request .GetIssuerIdentity (), request .GetAssetName (), request .GetOwnerIdentity (), request .GetPossessorIdentity (), ownerContract , possessorContract )
644+ if err != nil {
645+ s .qPool .Close (client )
646+ return nil , status .Errorf (codes .Internal , "getting asset possessions by filter %v" , err )
647+ }
648+ s .qPool .Put (client )
649+
650+ assetPossessions := make ([]* protobuff.AssetPossession , 0 )
651+
652+ for _ , asset := range assets {
653+
654+ var possessor types.Identity
655+ possessor , err = possessor .FromPubKey (asset .Asset .PublicKey , false )
656+ if err != nil {
657+ return nil , errors .Wrap (err , "failed to get identity for possessor public key" )
658+ }
659+
660+ possessedAsset := protobuff.AssetPossessionData {
661+ PossessorIdentity : possessor .String (),
662+ Type : uint32 (asset .Asset .Type ),
663+ ManagingContractIndex : uint32 (asset .Asset .ManagingContractIndex ),
664+ OwnershipIndex : asset .Asset .OwnershipIndex ,
665+ NumberOfUnits : asset .Asset .NumberOfUnits ,
666+ }
667+
668+ assetPossession := protobuff.AssetPossession {
669+ Data : & possessedAsset ,
670+ Tick : asset .Tick ,
671+ UniverseIndex : asset .UniverseIndex ,
672+ }
673+
674+ assetPossessions = append (assetPossessions , & assetPossession )
675+
676+ }
677+
678+ return & protobuff.AssetPossessions {Assets : assetPossessions }, nil
679+ }
680+
487681func (s * Server ) Start () error {
488682 srv := grpc .NewServer (
489683 grpc .MaxRecvMsgSize (600 * 1024 * 1024 ),
0 commit comments