From 1beed97032a8613c20830bd5072248c8d1eb6200 Mon Sep 17 00:00:00 2001 From: Alexey Kuleshevich Date: Wed, 6 Jul 2022 19:55:31 +0300 Subject: [PATCH] Ensure Babbage TxOut decoder can't fail due to malformed Ptr It was only intended for TxBody to be causing a deserialization error on malformed Ptr, not the TxOut in the LedgerState or TxBody in eras prior to Babbage. --- .../impl/src/Cardano/Ledger/Babbage/TxBody.hs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/eras/babbage/impl/src/Cardano/Ledger/Babbage/TxBody.hs b/eras/babbage/impl/src/Cardano/Ledger/Babbage/TxBody.hs index 4245e5a3693..6dd14bdb9bf 100644 --- a/eras/babbage/impl/src/Cardano/Ledger/Babbage/TxBody.hs +++ b/eras/babbage/impl/src/Cardano/Ledger/Babbage/TxBody.hs @@ -11,6 +11,7 @@ {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PatternSynonyms #-} +{-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TypeApplications #-} @@ -662,8 +663,9 @@ decodeTxOut :: FromCBOR (Annotator (Core.Script era)), DecodeNonNegative (Core.Value era) ) => + (forall s'. Decoder s' (Addr (Crypto era), CompactAddr (Crypto era))) -> Decoder s (TxOut era) -decodeTxOut = do +decodeTxOut decAddr = do dtxo <- decode $ SparseKeyed "TxOut" initial bodyFields requiredFields case dtxo of DecodingTxOut SNothing _ _ _ -> cborError $ DecoderErrorCustom "TxOut" "Impossible: no Addr" @@ -676,7 +678,7 @@ decodeTxOut = do bodyFields 0 = field (\x txo -> txo {decodingTxOutAddr = SJust x}) - (D fromCborBothAddr) + (D decAddr) bodyFields 1 = field (\x txo -> txo {decodingTxOutVal = x}) @@ -759,12 +761,12 @@ fromCborTxOutWithAddr :: FromCBOR (Annotator (Core.Script era)), DecodeNonNegative (Core.Value era) ) => - Decoder s (Addr (Crypto era), CompactAddr (Crypto era)) -> + (forall s'. Decoder s' (Addr (Crypto era), CompactAddr (Crypto era))) -> Decoder s (TxOut era) fromCborTxOutWithAddr decAddr = do peekTokenType >>= \case - TypeMapLenIndef -> decodeTxOut - TypeMapLen -> decodeTxOut + TypeMapLenIndef -> decodeTxOut decAddr + TypeMapLen -> decodeTxOut decAddr _ -> oldTxOut where oldTxOut = do