Skip to content

Commit 5b3d49b

Browse files
authored
Merge pull request #79 from sourabhxyz/78-native-asset-utxos
feat(#78): add `assetUTxOs`
2 parents bdde1bf + 1e84ccb commit 5b3d49b

File tree

5 files changed

+90
-29
lines changed

5 files changed

+90
-29
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Revision history for `maestro-sdk`
22

3+
## [1.7.6](https://github.com/maestro-org/haskell-sdk/compare/v1.7.6..v1.7.5)
4+
5+
* Added `assetUTxOs` to query for UTxOs containing a particular asset.
6+
37
## [1.7.3](https://github.com/maestro-org/haskell-sdk/compare/v1.7.2..v1.7.3) -- 2024-09-06
48

59
* Add Conway related fields to protocol parameters endpoint.

maestro-sdk.cabal

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cabal-version: 3.0
22
name: maestro-sdk
3-
version: 1.7.5
3+
version: 1.7.6
44
synopsis: Maestro Blockchain Indexer SDK
55
description:
66
Maestro provides blockchain indexers, APIs and event management systems for the Cardano blockchain.
@@ -92,7 +92,7 @@ library
9292
base >=4.9 && <5,
9393
bytestring >=0.10 && <0.13,
9494
containers ^>=0.6,
95-
data-default-class ^>=0.1,
95+
data-default-class >=0.1 && <0.3,
9696
deriving-aeson ^>=0.2,
9797
http-api-data >=0.5 && <0.7,
9898
http-client >=0.7 && <0.8,

src/Maestro/API/V1/Assets.hs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
module Maestro.API.V1.Assets where
22

3-
import Maestro.Types.V1
4-
import Servant.API
5-
import Servant.API.Generic
3+
import Maestro.Client.V1.Core.Pagination
4+
import Maestro.Types.V1
5+
import Servant.API
6+
import Servant.API.Generic
67

78
data AssetsAPI route = AssetsAPI
89
{ assetInfo ::
910
route
1011
:- Capture "asset" NonAdaNativeToken
1112
:> Get '[JSON] TimestampedAssetInfo
1213
-- ^ Native asset information.
14+
, assetUTxOs ::
15+
route
16+
:- Capture "asset" NonAdaNativeToken
17+
:> "utxos"
18+
:> Pagination
19+
:> Get '[JSON] TimestampedAssetUTxOs
20+
-- ^ UTxOs that contain a specific asset.
1321
}
1422
deriving (Generic)

src/Maestro/Client/V1/Assets.hs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
-- | Module to query for /\"Assets\"/ category of endpoints defined at [docs.gomaestro.org](https://docs.gomaestro.org/Indexer-API/Assets/asset-addresses).
22
module Maestro.Client.V1.Assets (
33
assetInfo,
4+
assetUTxOs,
45
) where
56

6-
import Maestro.API.V1 (assets)
7-
import qualified Maestro.API.V1.Assets as Mapi
8-
import Maestro.Client.Env
9-
import Maestro.Client.V1.Core
10-
import Maestro.Types.V1
11-
import Servant.API.Generic
12-
import Servant.Client
7+
import Maestro.API.V1 (assets)
8+
import qualified Maestro.API.V1.Assets as Mapi
9+
import Maestro.Client.Env
10+
import Maestro.Client.V1.Core
11+
import Maestro.Types.V1
12+
import Servant.API.Generic
13+
import Servant.Client
1314

1415
txClient :: MaestroEnv 'V1 -> Mapi.AssetsAPI (AsClientT IO)
1516
txClient = fromServant . assets . apiV1Client
@@ -22,3 +23,14 @@ assetInfo ::
2223
NonAdaNativeToken ->
2324
IO TimestampedAssetInfo
2425
assetInfo = Mapi.assetInfo . txClient
26+
27+
-- | UTxOs that contain a specific asset.
28+
assetUTxOs ::
29+
-- | The Maestro Environment.
30+
MaestroEnv 'V1 ->
31+
-- | `NonAdaNativeToken` to query.
32+
NonAdaNativeToken ->
33+
-- | The pagination attributes.
34+
Cursor ->
35+
IO TimestampedAssetUTxOs
36+
assetUTxOs = Mapi.assetUTxOs . txClient

src/Maestro/Types/V1/Assets.hs

Lines changed: 54 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,30 @@ module Maestro.Types.V1.Assets (
33
TokenRegistryMetadata (..),
44
AssetInfo (..),
55
TimestampedAssetInfo (..),
6+
AssetUTxOs (..),
7+
TimestampedAssetUTxOs (..),
68
) where
79

8-
import Data.Aeson (Value)
9-
import Data.Text (Text)
10-
import Data.Word (Word64)
11-
import Deriving.Aeson
12-
import Maestro.Types.V1.Common
10+
import Data.Aeson (Value)
11+
import Data.Text (Text)
12+
import Data.Word (Word64)
13+
import Deriving.Aeson
14+
import GHC.Natural (Natural)
15+
import Maestro.Types.V1.Common
1316

1417
-- | Token registry metadata
1518
data TokenRegistryMetadata = TokenRegistryMetadata
16-
{ tokenRegistryMetadataName :: !Text
19+
{ tokenRegistryMetadataName :: !Text
1720
-- ^ Asset name.
1821
, tokenRegistryMetadataDescription :: !Text
1922
-- ^ Asset description.
20-
, tokenRegistryMetadataDecimals :: !(Maybe Word64)
23+
, tokenRegistryMetadataDecimals :: !(Maybe Word64)
2124
-- ^ Recommended value for decimal places.
22-
, tokenRegistryMetadataLogo :: !(Maybe Text)
25+
, tokenRegistryMetadataLogo :: !(Maybe Text)
2326
-- ^ Base64 encoded logo PNG associated with the asset.
24-
, tokenRegistryMetadataUrl :: !(Maybe Text)
27+
, tokenRegistryMetadataUrl :: !(Maybe Text)
2528
-- ^ URL associated with the asset.
26-
, tokenRegistryMetadataTicker :: !(Maybe Text)
29+
, tokenRegistryMetadataTicker :: !(Maybe Text)
2730
-- ^ Asset ticker.
2831
}
2932
deriving stock (Eq, Show, Generic)
@@ -34,13 +37,13 @@ data Cip68AssetType = CIP68ATReferenceNft | CIP68ATUserNft | CIP68ATUserFt
3437
deriving (FromJSON, ToJSON) via CustomJSON '[ConstructorTagModifier '[StripPrefix "CIP68AT", CamelToSnake]] Cip68AssetType
3538

3639
data Cip68Metadata = Cip68Metadata
37-
{ cip68MetadataExtra :: !(Maybe Text)
40+
{ cip68MetadataExtra :: !(Maybe Text)
3841
-- ^ Custom user defined Plutus data CBOR bytes.
3942
, cip68MetadataMetadata :: !Value
4043
-- ^ Asset CIP-68 metadata.
41-
, cip68MetadataPurpose :: !Cip68AssetType
44+
, cip68MetadataPurpose :: !Cip68AssetType
4245
-- ^ Purpose.
43-
, cip68MetadataVersion :: !Word64
46+
, cip68MetadataVersion :: !Word64
4447
-- ^ CIP-68 version.
4548
}
4649
deriving stock (Eq, Show, Generic)
@@ -57,11 +60,11 @@ data AssetStandards = AssetStandards
5760

5861
-- | Information about a specific Cardano native-asset.
5962
data AssetInfo = AssetInfo
60-
{ assetInfoAssetName :: !TokenName
63+
{ assetInfoAssetName :: !TokenName
6164
-- ^ Hex encoding of the asset name.
62-
, assetInfoAssetStandards :: !AssetStandards
65+
, assetInfoAssetStandards :: !AssetStandards
6366
-- ^ Asset information corresponding to popular standards.
64-
, assetInfoLatestMintTxMetadata :: !(Maybe Value)
67+
, assetInfoLatestMintTxMetadata :: !(Maybe Value)
6568
-- ^ Metadata of the most recent transaction which minted or burned the asset.
6669
, assetInfoTokenRegistryMetadata :: !(Maybe TokenRegistryMetadata)
6770
-- ^ See `TokenRegistryMetadata`.
@@ -71,7 +74,7 @@ data AssetInfo = AssetInfo
7174

7275
-- | Timestamped `AssetInfo` response.
7376
data TimestampedAssetInfo = TimestampedAssetInfo
74-
{ timestampedAssetInfoData :: !AssetInfo
77+
{ timestampedAssetInfoData :: !AssetInfo
7578
-- ^ See `AssetInfo`.
7679
, timestampedAssetInfoLastUpdated :: !LastUpdated
7780
-- ^ See `LastUpdated`.
@@ -83,3 +86,37 @@ instance IsTimestamped TimestampedAssetInfo where
8386
type TimestampedData TimestampedAssetInfo = AssetInfo
8487
getTimestampedData = timestampedAssetInfoData
8588
getTimestamp = timestampedAssetInfoLastUpdated
89+
90+
-- | UTxOs that contain a specific asset.
91+
data AssetUTxOs = AssetUTxOs
92+
{ assetUTxOsTxHash :: !TxHash
93+
-- ^ Transaction hash.
94+
, assetUTxOsIndex :: !TxIndex
95+
-- ^ Transaction index.
96+
, assetUTxOsAddress :: !(Bech32StringOf Address)
97+
-- ^ Address.
98+
, assetUTxOsAmount :: !Natural
99+
-- ^ Amount.
100+
}
101+
deriving stock (Eq, Show, Generic)
102+
deriving (FromJSON, ToJSON) via CustomJSON '[FieldLabelModifier '[StripPrefix "assetUTxOs", CamelToSnake]] AssetUTxOs
103+
104+
-- | Timestamped `AssetUTxOs` response.
105+
data TimestampedAssetUTxOs = TimestampedAssetUTxOs
106+
{ timestampedAssetUTxOsData :: ![AssetUTxOs]
107+
-- ^ See `AssetUTxOs`.
108+
, timestampedAssetUTxOsLastUpdated :: !LastUpdated
109+
-- ^ See `LastUpdated`.
110+
, timestampedAssetUTxOsNextCursor :: !(Maybe NextCursor)
111+
-- ^ See `NextCursor`.
112+
}
113+
deriving stock (Eq, Show, Generic)
114+
deriving (FromJSON, ToJSON) via CustomJSON '[FieldLabelModifier '[StripPrefix "timestampedAssetUTxOs", CamelToSnake]] TimestampedAssetUTxOs
115+
116+
instance IsTimestamped TimestampedAssetUTxOs where
117+
type TimestampedData TimestampedAssetUTxOs = [AssetUTxOs]
118+
getTimestampedData = timestampedAssetUTxOsData
119+
getTimestamp = timestampedAssetUTxOsLastUpdated
120+
121+
instance HasCursor TimestampedAssetUTxOs where
122+
getNextCursor = timestampedAssetUTxOsNextCursor

0 commit comments

Comments
 (0)