@@ -1035,7 +1035,7 @@ func (r *rpcServer) fetchRpcAssets(ctx context.Context, withWitness,
1035
1035
rpcAssets := make ([]* taprpc.Asset , len (assets ))
1036
1036
for i , a := range assets {
1037
1037
rpcAssets [i ], err = r .MarshalChainAsset (
1038
- ctx , a , withWitness , r .cfg .AddrBook ,
1038
+ ctx , a , nil , withWitness , r .cfg .AddrBook ,
1039
1039
)
1040
1040
if err != nil {
1041
1041
return nil , fmt .Errorf ("unable to marshal asset: %w" ,
@@ -1048,16 +1048,28 @@ func (r *rpcServer) fetchRpcAssets(ctx context.Context, withWitness,
1048
1048
1049
1049
// MarshalChainAsset marshals the given chain asset into an RPC asset.
1050
1050
func (r * rpcServer ) MarshalChainAsset (ctx context.Context , a * asset.ChainAsset ,
1051
- withWitness bool , keyRing taprpc.KeyLookup ) (* taprpc.Asset , error ) {
1051
+ meta * proof.MetaReveal , withWitness bool ,
1052
+ keyRing taprpc.KeyLookup ) (* taprpc.Asset , error ) {
1052
1053
1053
- decDisplay , err := r .DecDisplayForAssetID (ctx , a .ID ())
1054
+ var (
1055
+ decDisplay fn.Option [uint32 ]
1056
+ err error
1057
+ )
1058
+
1059
+ // If the asset metadata is provided, we don't need to look it up from
1060
+ // the database when decoding a decimal display value.
1061
+ switch {
1062
+ case meta != nil :
1063
+ decDisplay , err = getDecimalDisplayNonStrict (meta )
1064
+ default :
1065
+ decDisplay , err = r .DecDisplayForAssetID (ctx , a .ID ())
1066
+ }
1054
1067
if err != nil {
1055
1068
return nil , err
1056
1069
}
1057
1070
1058
1071
rpcAsset , err := taprpc .MarshalAsset (
1059
- ctx , a .Asset , a .IsSpent , withWitness , keyRing ,
1060
- fn .Some (decDisplay ),
1072
+ ctx , a .Asset , a .IsSpent , withWitness , keyRing , decDisplay ,
1061
1073
)
1062
1074
if err != nil {
1063
1075
return nil , err
@@ -1748,7 +1760,7 @@ func (r *rpcServer) marshalProof(ctx context.Context, p *proof.Proof,
1748
1760
AnchorInternalKey : p .InclusionProof .InternalKey ,
1749
1761
AnchorMerkleRoot : merkleRoot [:],
1750
1762
AnchorTapscriptSibling : tsSibling ,
1751
- }, withPrevWitnesses , r .cfg .AddrBook )
1763
+ }, p . MetaReveal , withPrevWitnesses , r .cfg .AddrBook )
1752
1764
if err != nil {
1753
1765
return nil , err
1754
1766
}
@@ -4997,7 +5009,7 @@ func (r *rpcServer) AssetLeaves(ctx context.Context,
4997
5009
}
4998
5010
4999
5011
resp .Leaves [i ], err = r .marshalAssetLeaf (
5000
- ctx , & assetLeaf , fn . Some ( decDisplay ) ,
5012
+ ctx , & assetLeaf , decDisplay ,
5001
5013
)
5002
5014
if err != nil {
5003
5015
return nil , err
@@ -5100,9 +5112,7 @@ func (r *rpcServer) marshalUniverseProofLeaf(ctx context.Context,
5100
5112
return nil , err
5101
5113
}
5102
5114
5103
- assetLeaf , err := r .marshalAssetLeaf (
5104
- ctx , proof .Leaf , fn .Some (decDisplay ),
5105
- )
5115
+ assetLeaf , err := r .marshalAssetLeaf (ctx , proof .Leaf , decDisplay )
5106
5116
if err != nil {
5107
5117
return nil , err
5108
5118
}
@@ -5519,7 +5529,7 @@ func (r *rpcServer) marshalUniverseDiff(ctx context.Context,
5519
5529
}
5520
5530
5521
5531
leaves [i ], err = r .marshalAssetLeaf (
5522
- ctx , leaf , fn . Some ( decDisplay ) ,
5532
+ ctx , leaf , decDisplay ,
5523
5533
)
5524
5534
if err != nil {
5525
5535
return err
@@ -5603,8 +5613,8 @@ func marshalUniverseServer(
5603
5613
// of the local Universe server. These servers are used to push out new proofs,
5604
5614
// and also periodically call sync new proofs from the remote server.
5605
5615
func (r * rpcServer ) ListFederationServers (ctx context.Context ,
5606
- _ * unirpc.ListFederationServersRequest ,
5607
- ) ( * unirpc.ListFederationServersResponse , error ) {
5616
+ _ * unirpc.ListFederationServersRequest ) (
5617
+ * unirpc.ListFederationServersResponse , error ) {
5608
5618
5609
5619
uniServers , err := r .cfg .FederationDB .UniverseServers (ctx )
5610
5620
if err != nil {
@@ -6791,30 +6801,43 @@ func encodeVirtualPackets(packets []*tappsbt.VPacket) ([][]byte, error) {
6791
6801
// DecDisplayForAssetID attempts to fetch the meta reveal for a specific asset
6792
6802
// ID and extract the decimal display value from it.
6793
6803
func (r * rpcServer ) DecDisplayForAssetID (ctx context.Context ,
6794
- id asset.ID ) (uint32 , error ) {
6804
+ id asset.ID ) (fn. Option [ uint32 ] , error ) {
6795
6805
6796
6806
meta , err := r .cfg .AssetStore .FetchAssetMetaForAsset (
6797
6807
ctx , id ,
6798
6808
)
6799
6809
if err != nil {
6800
- return 0 , fmt .Errorf ("unable to fetch asset meta " +
6801
- "for asset_id=%v :%v" , id , err )
6810
+ return fn . None [ uint32 ]() , fmt .Errorf ("unable to fetch asset " +
6811
+ "meta for asset_id=%v :%v" , id , err )
6802
6812
}
6803
6813
6814
+ return getDecimalDisplayNonStrict (meta )
6815
+ }
6816
+
6817
+ // getDecimalDisplayNonStrict attempts to decode a decimal display value from
6818
+ // metadata. If no custom decimal display value is decoded, the default value of
6819
+ // 0 is returned without error.
6820
+ func getDecimalDisplayNonStrict (
6821
+ meta * proof.MetaReveal ) (fn.Option [uint32 ], error ) {
6822
+
6804
6823
_ , decDisplay , err := meta .GetDecDisplay ()
6805
6824
switch {
6806
6825
// If it isn't JSON, or doesn't have a dec display, we'll just return 0
6807
6826
// below.
6808
6827
case errors .Is (err , proof .ErrNotJSON ):
6809
6828
fallthrough
6829
+ case errors .Is (err , proof .ErrInvalidJSON ):
6830
+ fallthrough
6810
6831
case errors .Is (err , proof .ErrDecDisplayMissing ):
6811
6832
fallthrough
6812
6833
case errors .Is (err , proof .ErrDecDisplayInvalidType ):
6813
- break
6834
+ // We can't determine if there is a decimal display value set.
6835
+ return fn .None [uint32 ](), nil
6836
+
6814
6837
case err != nil :
6815
- return 0 , fmt .Errorf ("unable to extract decimal " +
6816
- "display for asset_id=%v :%v" , id , err )
6838
+ return fn . None [ uint32 ]() , fmt .Errorf ("unable to extract " +
6839
+ "decimal display: %v" , err )
6817
6840
}
6818
6841
6819
- return decDisplay , nil
6842
+ return fn . Some ( decDisplay ) , nil
6820
6843
}
0 commit comments