|
1 | 1 | {-# LANGUAGE DerivingStrategies #-} |
2 | 2 | {-# LANGUAGE FlexibleContexts #-} |
3 | 3 | {-# LANGUAGE FlexibleInstances #-} |
| 4 | +{-# LANGUAGE GADTs #-} |
4 | 5 | {-# LANGUAGE LambdaCase #-} |
5 | 6 | {-# LANGUAGE MultiParamTypeClasses #-} |
6 | 7 | {-# LANGUAGE OverloadedLabels #-} |
@@ -268,6 +269,40 @@ referenceScriptToUtxoRpcScript (ReferenceScript _ (ScriptInAnyLang _ script)) = |
268 | 269 | PlutusScript PlutusScriptV3 ps -> |
269 | 270 | defMessage & #plutusV3 .~ serialiseToRawBytes ps |
270 | 271 |
|
| 272 | +scriptDataToUtxoRpcPlutusData :: ScriptData -> Proto UtxoRpc.PlutusData |
| 273 | +scriptDataToUtxoRpcPlutusData = \case |
| 274 | + ScriptDataBytes bs -> |
| 275 | + defMessage & #boundedBytes .~ bs |
| 276 | + ScriptDataNumber int |
| 277 | + | int <= fromIntegral (maxBound @Int64) |
| 278 | + && int >= fromIntegral (minBound @Int64) -> |
| 279 | + defMessage & #bigInt . #int .~ fromIntegral int |
| 280 | + | int < 0 -> |
| 281 | + -- https://www.rfc-editor.org/rfc/rfc8949.html#name-bignums see 3.4.3 for negative integers |
| 282 | + defMessage & #bigInt . #bigNInt .~ serialiseToRawBytes (fromIntegral @_ @Natural (-1 - int)) |
| 283 | + | otherwise -> |
| 284 | + defMessage & #bigInt . #bigUInt .~ serialiseToRawBytes (fromIntegral @_ @Natural int) |
| 285 | + ScriptDataList sds -> |
| 286 | + defMessage & #array . #items .~ map scriptDataToUtxoRpcPlutusData sds |
| 287 | + ScriptDataMap elements -> do |
| 288 | + let pairs = |
| 289 | + elements <&> \(k, v) -> |
| 290 | + defMessage |
| 291 | + & #key .~ scriptDataToUtxoRpcPlutusData k |
| 292 | + & #value .~ scriptDataToUtxoRpcPlutusData v |
| 293 | + defMessage & #map . #pairs .~ pairs |
| 294 | + ScriptDataConstructor tag args -> do |
| 295 | + -- Details of plutus tag serialisation: |
| 296 | + -- https://github.com/IntersectMBO/plutus/blob/fc78c36b545ee287ae8796a0c1a7d04cf31f4cee/plutus-core/plutus-core/src/PlutusCore/Data.hs#L72 |
| 297 | + let constr = |
| 298 | + defMessage |
| 299 | + & ( if tag <= fromIntegral (maxBound @Word32) |
| 300 | + then #tag .~ fromIntegral tag |
| 301 | + else (#tag .~ 102) . (#anyConstructor .~ fromIntegral @_ @Word64 tag) |
| 302 | + ) |
| 303 | + & #fields .~ map scriptDataToUtxoRpcPlutusData args |
| 304 | + defMessage & #constr .~ constr |
| 305 | + |
271 | 306 | utxoToUtxoRpcAnyUtxoData :: forall era. IsCardanoEra era => UTxO era -> [Proto UtxoRpc.AnyUtxoData] |
272 | 307 | utxoToUtxoRpcAnyUtxoData utxo = |
273 | 308 | toList utxo <&> \(txIn, TxOut addressInEra txOutValue datum script) -> do |
@@ -296,7 +331,7 @@ utxoToUtxoRpcAnyUtxoData utxo = |
296 | 331 | TxOutDatumInline _ hashableScriptData -> |
297 | 332 | defMessage |
298 | 333 | & #hash .~ serialiseToRawBytes (hashScriptDataBytes hashableScriptData) |
299 | | - & #payload .~ inject (getScriptData hashableScriptData) |
| 334 | + & #payload .~ scriptDataToUtxoRpcPlutusData (getScriptData hashableScriptData) |
300 | 335 | & #originalCbor .~ getOriginalScriptDataBytes hashableScriptData |
301 | 336 |
|
302 | 337 | protoTxOut = |
|
0 commit comments