Skip to content

Commit 768f771

Browse files
committed
implement datum roundtrip
1 parent dcf43dd commit 768f771

File tree

5 files changed

+85
-50
lines changed

5 files changed

+85
-50
lines changed

cardano-rpc/gen/Proto/Utxorpc/V1alpha/Cardano/Cardano.hs

Lines changed: 54 additions & 38 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cardano-rpc/gen/Proto/Utxorpc/V1alpha/Cardano/Cardano_Fields.hs

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cardano-rpc/proto/utxorpc/v1alpha/cardano/cardano.proto

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ message AddressArray {
1818

1919
message Datum {
2020
bytes hash = 1; // Hash of this datum as seen on-chain
21-
PlutusData payload = 2; // Parsed Plutus data payload
22-
bytes original_cbor = 3; // Original cbor-encoded data as seen on-chain
21+
optional PlutusData payload = 2; // Parsed Plutus data payload
22+
optional bytes original_cbor = 3; // Original cbor-encoded data as seen on-chain
2323
}
2424

2525
// Represents a custom asset in the Cardano blockchain.

cardano-rpc/src/Cardano/Rpc/Server/Internal/UtxoRpc/Query.hs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
{-# LANGUAGE QuantifiedConstraints #-}
99
{-# LANGUAGE RankNTypes #-}
1010
{-# LANGUAGE ScopedTypeVariables #-}
11+
{-# LANGUAGE TypeApplications #-}
1112

1213
module Cardano.Rpc.Server.Internal.UtxoRpc.Query
1314
( readParamsMethod
@@ -16,6 +17,7 @@ module Cardano.Rpc.Server.Internal.UtxoRpc.Query
1617
where
1718

1819
import Cardano.Api
20+
import Cardano.Api.Experimental.Era
1921
import Cardano.Api.Parser.Text qualified as P
2022
import Cardano.Rpc.Proto.Api.UtxoRpc.Query qualified as UtxoRpc
2123
import Cardano.Rpc.Server.Internal.Error
@@ -71,19 +73,19 @@ readUtxosMethod req = do
7173

7274
nodeConnInfo <- grab
7375
AnyCardanoEra era <- liftIO . throwExceptT $ determineEra nodeConnInfo
74-
eon <- forEraInEon era (error "Minimum Shelley era required") pure
76+
eon <- forEraInEon @Era era (error "Minimum Conway era required") pure
7577

7678
let target = VolatileTip
7779
(utxo, chainPoint, blockNo) <- liftIO . (throwEither =<<) $ executeLocalStateQueryExpr nodeConnInfo target $ do
78-
utxo <- throwEither =<< throwEither =<< queryUtxo eon utxoFilter
80+
utxo <- throwEither =<< throwEither =<< queryUtxo (convert eon) utxoFilter
7981
chainPoint <- throwEither =<< queryChainPoint
8082
blockNo <- throwEither =<< queryChainBlockNo
8183
pure (utxo, chainPoint, blockNo)
8284

8385
pure $
8486
defMessage
8587
& #ledgerTip .~ mkChainPointMsg chainPoint blockNo
86-
& #items .~ cardanoEraConstraints era (utxoToUtxoRpcAnyUtxoData utxo)
88+
& #items .~ obtainCommonConstraints eon (utxoToUtxoRpcAnyUtxoData utxo)
8789
where
8890
txoRefToTxIn :: MonadRpc e m => Proto UtxoRpc.TxoRef -> m TxIn
8991
txoRefToTxIn r = do

cardano-rpc/src/Cardano/Rpc/Server/Internal/UtxoRpc/Type.hs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ scriptDataToUtxoRpcPlutusData = \case
328328
& #fields .~ map scriptDataToUtxoRpcPlutusData args
329329
defMessage & #constr .~ constr
330330

331-
utxoToUtxoRpcAnyUtxoData :: forall era. IsCardanoEra era => UTxO era -> [Proto UtxoRpc.AnyUtxoData]
331+
utxoToUtxoRpcAnyUtxoData :: forall era. IsEra era => UTxO era -> [Proto UtxoRpc.AnyUtxoData]
332332
utxoToUtxoRpcAnyUtxoData utxo =
333333
toList utxo <&> \(txIn, txOut) -> do
334334
defMessage
@@ -337,7 +337,7 @@ utxoToUtxoRpcAnyUtxoData utxo =
337337
& #cardano .~ (txOutToUtxoRpcTxOutput txOut)
338338

339339
txOutToUtxoRpcTxOutput
340-
:: forall era. IsCardanoEra era => TxOut CtxUTxO era -> Proto UtxoRpc.TxOutput
340+
:: forall era. IsEra era => TxOut CtxUTxO era -> Proto UtxoRpc.TxOutput
341341
txOutToUtxoRpcTxOutput (TxOut addressInEra txOutValue datum script) = do
342342
let multiAsset =
343343
fromList $
@@ -363,29 +363,39 @@ txOutToUtxoRpcTxOutput (TxOut addressInEra txOutValue datum script) = do
363363
& #originalCbor .~ mempty -- we don't have it
364364
TxOutDatumInline _ hashableScriptData ->
365365
defMessage
366-
& #hash .~ serialiseToRawBytes (hashScriptDataBytes hashableScriptData)
366+
& #hash .~ serialiseToCBOR hashableScriptData
367367
& #payload .~ scriptDataToUtxoRpcPlutusData (getScriptData hashableScriptData)
368368
& #originalCbor .~ getOriginalScriptDataBytes hashableScriptData
369369

370370
defMessage
371371
-- TODO we don't have serialiseToRawBytes for AddressInEra, so perhaps this is wrong, because 'address'
372372
-- has type bytes, but we're putting text there
373-
& #address .~ T.encodeUtf8 (cardanoEraConstraints (cardanoEra @era) $ serialiseAddress addressInEra)
373+
& #address .~ T.encodeUtf8 (obtainCommonConstraints (useEra @era) $ serialiseAddress addressInEra)
374374
& #coin .~ fromIntegral (L.unCoin (txOutValueToLovelace txOutValue))
375375
& #assets .~ multiAsset
376376
& #datum .~ datumRpc
377377
& #script .~ referenceScriptToUtxoRpcScript script
378378

379379
utxoRpcTxOutputToTxOut
380-
:: forall era. IsShelleyBasedEra era => Proto UtxoRpc.TxOutput -> Either String (TxOut CtxUTxO era)
380+
:: forall era. IsEra era => Proto UtxoRpc.TxOutput -> Either String (TxOut CtxUTxO era)
381381
utxoRpcTxOutputToTxOut txOutput = do
382+
let era = useEra @era
382383
addrUtf8 <- T.decodeUtf8' (txOutput ^. #address) ?!& displayError
383384
address <-
384385
deserialiseAddress (AsAddress AsShelleyAddr) addrUtf8
385386
?! ("Cannot decode address: " <> T.unpack addrUtf8)
387+
datum <-
388+
case txOutput ^. #maybe'datum of
389+
Just datumRpc ->
390+
case datumRpc ^. #maybe'originalCbor of
391+
Just cbor ->
392+
TxOutDatumInline (convert era) <$> deserialiseFromCBOR asType cbor ?!& displayError
393+
Nothing ->
394+
TxOutDatumHash (convert era) <$> deserialiseFromRawBytes asType (datumRpc ^. #hash) ?!& displayError
395+
Nothing -> pure TxOutDatumNone
386396
pure $
387397
TxOut
388-
(AddressInEra (ShelleyAddressInEra (shelleyBasedEra @era)) address)
389-
undefined
398+
(AddressInEra (ShelleyAddressInEra (convert era)) address)
390399
undefined
400+
datum
391401
undefined

0 commit comments

Comments
 (0)