{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Cardano.Ledger.Conway.Tx (
module BabbageTxReExport,
tierRefScriptFee,
getConwayMinFeeTx,
Tx (..),
) where
import Cardano.Ledger.Allegra.Tx (validateTimelock)
import Cardano.Ledger.Alonzo.Core (AlonzoEraTxWits)
import Cardano.Ledger.Alonzo.Tx (
alonzoMinFeeTx,
alonzoTxEqRaw,
auxDataAlonzoTxL,
bodyAlonzoTxL,
isValidAlonzoTxL,
mkBasicAlonzoTx,
sizeAlonzoTxF,
witsAlonzoTxL,
)
import Cardano.Ledger.Babbage.Tx as BabbageTxReExport (
AlonzoEraTx (..),
AlonzoTx (..),
Tx (..),
)
import Cardano.Ledger.BaseTypes (NonZero (..), unboundRational)
import Cardano.Ledger.Binary (Annotator, DecCBOR (..), EncCBOR, ToCBOR)
import Cardano.Ledger.Coin (Coin (Coin))
import Cardano.Ledger.Conway.Era (ConwayEra)
import Cardano.Ledger.Conway.PParams (ConwayEraPParams (..), ppMinFeeRefScriptCostPerByteL)
import Cardano.Ledger.Conway.TxAuxData ()
import Cardano.Ledger.Conway.TxBody ()
import Cardano.Ledger.Conway.TxWits ()
import Cardano.Ledger.Core
import Cardano.Ledger.MemoBytes (EqRaw (..))
import Cardano.Ledger.Val (Val (..))
import Control.DeepSeq (NFData)
import Data.Word (Word32)
import GHC.Generics (Generic)
import GHC.Stack
import Lens.Micro (Lens', lens, (^.))
import NoThunks.Class (NoThunks)
instance EraTx ConwayEra where
newtype Tx ConwayEra = MkConwayTx {Tx ConwayEra -> AlonzoTx ConwayEra
unConwayTx :: AlonzoTx ConwayEra}
deriving newtype (Tx ConwayEra -> Tx ConwayEra -> Bool
(Tx ConwayEra -> Tx ConwayEra -> Bool)
-> (Tx ConwayEra -> Tx ConwayEra -> Bool) -> Eq (Tx ConwayEra)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Tx ConwayEra -> Tx ConwayEra -> Bool
== :: Tx ConwayEra -> Tx ConwayEra -> Bool
$c/= :: Tx ConwayEra -> Tx ConwayEra -> Bool
/= :: Tx ConwayEra -> Tx ConwayEra -> Bool
Eq, Int -> Tx ConwayEra -> ShowS
[Tx ConwayEra] -> ShowS
Tx ConwayEra -> String
(Int -> Tx ConwayEra -> ShowS)
-> (Tx ConwayEra -> String)
-> ([Tx ConwayEra] -> ShowS)
-> Show (Tx ConwayEra)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Tx ConwayEra -> ShowS
showsPrec :: Int -> Tx ConwayEra -> ShowS
$cshow :: Tx ConwayEra -> String
show :: Tx ConwayEra -> String
$cshowList :: [Tx ConwayEra] -> ShowS
showList :: [Tx ConwayEra] -> ShowS
Show, Tx ConwayEra -> ()
(Tx ConwayEra -> ()) -> NFData (Tx ConwayEra)
forall a. (a -> ()) -> NFData a
$crnf :: Tx ConwayEra -> ()
rnf :: Tx ConwayEra -> ()
NFData, Context -> Tx ConwayEra -> IO (Maybe ThunkInfo)
Proxy (Tx ConwayEra) -> String
(Context -> Tx ConwayEra -> IO (Maybe ThunkInfo))
-> (Context -> Tx ConwayEra -> IO (Maybe ThunkInfo))
-> (Proxy (Tx ConwayEra) -> String)
-> NoThunks (Tx ConwayEra)
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
$cnoThunks :: Context -> Tx ConwayEra -> IO (Maybe ThunkInfo)
noThunks :: Context -> Tx ConwayEra -> IO (Maybe ThunkInfo)
$cwNoThunks :: Context -> Tx ConwayEra -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> Tx ConwayEra -> IO (Maybe ThunkInfo)
$cshowTypeOf :: Proxy (Tx ConwayEra) -> String
showTypeOf :: Proxy (Tx ConwayEra) -> String
NoThunks, Typeable (Tx ConwayEra)
Typeable (Tx ConwayEra) =>
(Tx ConwayEra -> Encoding)
-> ((forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx ConwayEra) -> Size)
-> ((forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx ConwayEra] -> Size)
-> ToCBOR (Tx ConwayEra)
Tx ConwayEra -> Encoding
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx ConwayEra] -> Size
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx ConwayEra) -> Size
forall a.
Typeable a =>
(a -> Encoding)
-> ((forall t. ToCBOR t => Proxy t -> Size) -> Proxy a -> Size)
-> ((forall t. ToCBOR t => Proxy t -> Size) -> Proxy [a] -> Size)
-> ToCBOR a
$ctoCBOR :: Tx ConwayEra -> Encoding
toCBOR :: Tx ConwayEra -> Encoding
$cencodedSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx ConwayEra) -> Size
encodedSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx ConwayEra) -> Size
$cencodedListSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx ConwayEra] -> Size
encodedListSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx ConwayEra] -> Size
ToCBOR, Typeable (Tx ConwayEra)
Typeable (Tx ConwayEra) =>
(Tx ConwayEra -> Encoding)
-> ((forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (Tx ConwayEra) -> Size)
-> ((forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [Tx ConwayEra] -> Size)
-> EncCBOR (Tx ConwayEra)
Tx ConwayEra -> Encoding
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [Tx ConwayEra] -> Size
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (Tx ConwayEra) -> Size
forall a.
Typeable a =>
(a -> Encoding)
-> ((forall t. EncCBOR t => Proxy t -> Size) -> Proxy a -> Size)
-> ((forall t. EncCBOR t => Proxy t -> Size) -> Proxy [a] -> Size)
-> EncCBOR a
$cencCBOR :: Tx ConwayEra -> Encoding
encCBOR :: Tx ConwayEra -> Encoding
$cencodedSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (Tx ConwayEra) -> Size
encodedSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (Tx ConwayEra) -> Size
$cencodedListSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [Tx ConwayEra] -> Size
encodedListSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [Tx ConwayEra] -> Size
EncCBOR)
deriving ((forall x. Tx ConwayEra -> Rep (Tx ConwayEra) x)
-> (forall x. Rep (Tx ConwayEra) x -> Tx ConwayEra)
-> Generic (Tx ConwayEra)
forall x. Rep (Tx ConwayEra) x -> Tx ConwayEra
forall x. Tx ConwayEra -> Rep (Tx ConwayEra) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Tx ConwayEra -> Rep (Tx ConwayEra) x
from :: forall x. Tx ConwayEra -> Rep (Tx ConwayEra) x
$cto :: forall x. Rep (Tx ConwayEra) x -> Tx ConwayEra
to :: forall x. Rep (Tx ConwayEra) x -> Tx ConwayEra
Generic)
mkBasicTx :: TxBody ConwayEra -> Tx ConwayEra
mkBasicTx = AlonzoTx ConwayEra -> Tx ConwayEra
MkConwayTx (AlonzoTx ConwayEra -> Tx ConwayEra)
-> (TxBody ConwayEra -> AlonzoTx ConwayEra)
-> TxBody ConwayEra
-> Tx ConwayEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxBody ConwayEra -> AlonzoTx ConwayEra
forall era. Monoid (TxWits era) => TxBody era -> AlonzoTx era
mkBasicAlonzoTx
bodyTxL :: Lens' (Tx ConwayEra) (TxBody ConwayEra)
bodyTxL = (AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra))
-> Tx ConwayEra -> f (Tx ConwayEra)
Lens' (Tx ConwayEra) (AlonzoTx ConwayEra)
conwayTxL ((AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra))
-> Tx ConwayEra -> f (Tx ConwayEra))
-> ((TxBody ConwayEra -> f (TxBody ConwayEra))
-> AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra))
-> (TxBody ConwayEra -> f (TxBody ConwayEra))
-> Tx ConwayEra
-> f (Tx ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxBody ConwayEra -> f (TxBody ConwayEra))
-> AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra)
forall era (f :: * -> *).
Functor f =>
(TxBody era -> f (TxBody era)) -> AlonzoTx era -> f (AlonzoTx era)
bodyAlonzoTxL
{-# INLINE bodyTxL #-}
witsTxL :: Lens' (Tx ConwayEra) (TxWits ConwayEra)
witsTxL = (AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra))
-> Tx ConwayEra -> f (Tx ConwayEra)
Lens' (Tx ConwayEra) (AlonzoTx ConwayEra)
conwayTxL ((AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra))
-> Tx ConwayEra -> f (Tx ConwayEra))
-> ((AlonzoTxWits ConwayEra -> f (AlonzoTxWits ConwayEra))
-> AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra))
-> (AlonzoTxWits ConwayEra -> f (AlonzoTxWits ConwayEra))
-> Tx ConwayEra
-> f (Tx ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxWits ConwayEra -> f (TxWits ConwayEra))
-> AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra)
(AlonzoTxWits ConwayEra -> f (AlonzoTxWits ConwayEra))
-> AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra)
forall era (f :: * -> *).
Functor f =>
(TxWits era -> f (TxWits era)) -> AlonzoTx era -> f (AlonzoTx era)
witsAlonzoTxL
{-# INLINE witsTxL #-}
auxDataTxL :: Lens' (Tx ConwayEra) (StrictMaybe (TxAuxData ConwayEra))
auxDataTxL = (AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra))
-> Tx ConwayEra -> f (Tx ConwayEra)
Lens' (Tx ConwayEra) (AlonzoTx ConwayEra)
conwayTxL ((AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra))
-> Tx ConwayEra -> f (Tx ConwayEra))
-> ((StrictMaybe (AlonzoTxAuxData ConwayEra)
-> f (StrictMaybe (AlonzoTxAuxData ConwayEra)))
-> AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra))
-> (StrictMaybe (AlonzoTxAuxData ConwayEra)
-> f (StrictMaybe (AlonzoTxAuxData ConwayEra)))
-> Tx ConwayEra
-> f (Tx ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StrictMaybe (TxAuxData ConwayEra)
-> f (StrictMaybe (TxAuxData ConwayEra)))
-> AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra)
(StrictMaybe (AlonzoTxAuxData ConwayEra)
-> f (StrictMaybe (AlonzoTxAuxData ConwayEra)))
-> AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra)
forall era (f :: * -> *).
Functor f =>
(StrictMaybe (TxAuxData era) -> f (StrictMaybe (TxAuxData era)))
-> AlonzoTx era -> f (AlonzoTx era)
auxDataAlonzoTxL
{-# INLINE auxDataTxL #-}
sizeTxF :: SimpleGetter (Tx ConwayEra) Integer
sizeTxF = (AlonzoTx ConwayEra -> Const r (AlonzoTx ConwayEra))
-> Tx ConwayEra -> Const r (Tx ConwayEra)
Lens' (Tx ConwayEra) (AlonzoTx ConwayEra)
conwayTxL ((AlonzoTx ConwayEra -> Const r (AlonzoTx ConwayEra))
-> Tx ConwayEra -> Const r (Tx ConwayEra))
-> ((Integer -> Const r Integer)
-> AlonzoTx ConwayEra -> Const r (AlonzoTx ConwayEra))
-> (Integer -> Const r Integer)
-> Tx ConwayEra
-> Const r (Tx ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer -> Const r Integer)
-> AlonzoTx ConwayEra -> Const r (AlonzoTx ConwayEra)
forall era. EraTx era => SimpleGetter (AlonzoTx era) Integer
SimpleGetter (AlonzoTx ConwayEra) Integer
sizeAlonzoTxF
{-# INLINE sizeTxF #-}
validateNativeScript :: Tx ConwayEra -> NativeScript ConwayEra -> Bool
validateNativeScript = Tx ConwayEra -> NativeScript ConwayEra -> Bool
forall era.
(EraTx era, AllegraEraTxBody era, AllegraEraScript era,
NativeScript era ~ Timelock era) =>
Tx era -> NativeScript era -> Bool
validateTimelock
{-# INLINE validateNativeScript #-}
getMinFeeTx :: PParams ConwayEra -> Tx ConwayEra -> Int -> Coin
getMinFeeTx = PParams ConwayEra -> Tx ConwayEra -> Int -> Coin
forall era.
(EraTx era, AlonzoEraTxWits era, ConwayEraPParams era) =>
PParams era -> Tx era -> Int -> Coin
getConwayMinFeeTx
instance EqRaw (Tx ConwayEra) where
eqRaw :: Tx ConwayEra -> Tx ConwayEra -> Bool
eqRaw = Tx ConwayEra -> Tx ConwayEra -> Bool
forall era. AlonzoEraTx era => Tx era -> Tx era -> Bool
alonzoTxEqRaw
conwayTxL :: Lens' (Tx ConwayEra) (AlonzoTx ConwayEra)
conwayTxL :: Lens' (Tx ConwayEra) (AlonzoTx ConwayEra)
conwayTxL = (Tx ConwayEra -> AlonzoTx ConwayEra)
-> (Tx ConwayEra -> AlonzoTx ConwayEra -> Tx ConwayEra)
-> Lens' (Tx ConwayEra) (AlonzoTx ConwayEra)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Tx ConwayEra -> AlonzoTx ConwayEra
unConwayTx (\Tx ConwayEra
x AlonzoTx ConwayEra
y -> Tx ConwayEra
x {unConwayTx = y})
getConwayMinFeeTx ::
( EraTx era
, AlonzoEraTxWits era
, ConwayEraPParams era
) =>
PParams era ->
Tx era ->
Int ->
Coin
getConwayMinFeeTx :: forall era.
(EraTx era, AlonzoEraTxWits era, ConwayEraPParams era) =>
PParams era -> Tx era -> Int -> Coin
getConwayMinFeeTx PParams era
pp Tx era
tx Int
refScriptsSize =
PParams era -> Tx era -> Coin
forall era.
(EraTx era, AlonzoEraTxWits era, AlonzoEraPParams era) =>
PParams era -> Tx era -> Coin
alonzoMinFeeTx PParams era
pp Tx era
tx Coin -> Coin -> Coin
forall t. Val t => t -> t -> t
<+> Coin
refScriptsFee
where
refScriptCostPerByte :: Rational
refScriptCostPerByte = NonNegativeInterval -> Rational
forall r. BoundedRational r => r -> Rational
unboundRational (PParams era
pp PParams era
-> Getting NonNegativeInterval (PParams era) NonNegativeInterval
-> NonNegativeInterval
forall s a. s -> Getting a s a -> a
^. Getting NonNegativeInterval (PParams era) NonNegativeInterval
forall era.
ConwayEraPParams era =>
Lens' (PParams era) NonNegativeInterval
Lens' (PParams era) NonNegativeInterval
ppMinFeeRefScriptCostPerByteL)
refScriptsFee :: Coin
refScriptsFee =
HasCallStack => Rational -> Int -> Rational -> Int -> Coin
Rational -> Int -> Rational -> Int -> Coin
tierRefScriptFee
(PositiveInterval -> Rational
forall r. BoundedRational r => r -> Rational
unboundRational (PositiveInterval -> Rational) -> PositiveInterval -> Rational
forall a b. (a -> b) -> a -> b
$ PParams era
pp PParams era
-> Getting PositiveInterval (PParams era) PositiveInterval
-> PositiveInterval
forall s a. s -> Getting a s a -> a
^. Getting PositiveInterval (PParams era) PositiveInterval
forall era.
ConwayEraPParams era =>
SimpleGetter (PParams era) PositiveInterval
SimpleGetter (PParams era) PositiveInterval
ppRefScriptCostMultiplierG)
(forall a b. (Integral a, Num b) => a -> b
fromIntegral @Word32 @Int (Word32 -> Int)
-> (NonZero Word32 -> Word32) -> NonZero Word32 -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonZero Word32 -> Word32
forall a. NonZero a -> a
unNonZero (NonZero Word32 -> Int) -> NonZero Word32 -> Int
forall a b. (a -> b) -> a -> b
$ PParams era
pp PParams era
-> Getting (NonZero Word32) (PParams era) (NonZero Word32)
-> NonZero Word32
forall s a. s -> Getting a s a -> a
^. Getting (NonZero Word32) (PParams era) (NonZero Word32)
forall era.
ConwayEraPParams era =>
SimpleGetter (PParams era) (NonZero Word32)
SimpleGetter (PParams era) (NonZero Word32)
ppRefScriptCostStrideG)
Rational
refScriptCostPerByte
Int
refScriptsSize
tierRefScriptFee ::
HasCallStack =>
Rational ->
Int ->
Rational ->
Int ->
Coin
tierRefScriptFee :: HasCallStack => Rational -> Int -> Rational -> Int -> Coin
tierRefScriptFee Rational
multiplier Int
sizeIncrement
| Rational
multiplier Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
<= Rational
0 Bool -> Bool -> Bool
|| Int
sizeIncrement Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = String -> Rational -> Int -> Coin
forall a. HasCallStack => String -> a
error String
"Size increment and multiplier must be positive"
| Bool
otherwise = Rational -> Rational -> Int -> Coin
go Rational
0
where
go :: Rational -> Rational -> Int -> Coin
go !Rational
acc !Rational
curTierPrice !Int
n
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
sizeIncrement =
Integer -> Coin
Coin (Integer -> Coin) -> Integer -> Coin
forall a b. (a -> b) -> a -> b
$ Rational -> Integer
forall b. Integral b => Rational -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor (Rational
acc Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ Int -> Rational
forall a. Real a => a -> Rational
toRational Int
n Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* Rational
curTierPrice)
| Bool
otherwise =
Rational -> Rational -> Int -> Coin
go (Rational
acc Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ Rational
sizeIncrementRational Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* Rational
curTierPrice) (Rational
multiplier Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* Rational
curTierPrice) (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
sizeIncrement)
sizeIncrementRational :: Rational
sizeIncrementRational = Int -> Rational
forall a. Real a => a -> Rational
toRational Int
sizeIncrement
instance AlonzoEraTx ConwayEra where
isValidTxL :: Lens' (Tx ConwayEra) IsValid
isValidTxL = (AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra))
-> Tx ConwayEra -> f (Tx ConwayEra)
Lens' (Tx ConwayEra) (AlonzoTx ConwayEra)
conwayTxL ((AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra))
-> Tx ConwayEra -> f (Tx ConwayEra))
-> ((IsValid -> f IsValid)
-> AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra))
-> (IsValid -> f IsValid)
-> Tx ConwayEra
-> f (Tx ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (IsValid -> f IsValid)
-> AlonzoTx ConwayEra -> f (AlonzoTx ConwayEra)
forall era (f :: * -> *).
Functor f =>
(IsValid -> f IsValid) -> AlonzoTx era -> f (AlonzoTx era)
isValidAlonzoTxL
{-# INLINE isValidTxL #-}
instance DecCBOR (Annotator (Tx ConwayEra)) where
decCBOR :: forall s. Decoder s (Annotator (Tx ConwayEra))
decCBOR = (AlonzoTx ConwayEra -> Tx ConwayEra)
-> Annotator (AlonzoTx ConwayEra) -> Annotator (Tx ConwayEra)
forall a b. (a -> b) -> Annotator a -> Annotator b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap AlonzoTx ConwayEra -> Tx ConwayEra
MkConwayTx (Annotator (AlonzoTx ConwayEra) -> Annotator (Tx ConwayEra))
-> Decoder s (Annotator (AlonzoTx ConwayEra))
-> Decoder s (Annotator (Tx ConwayEra))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder s (Annotator (AlonzoTx ConwayEra))
forall s. Decoder s (Annotator (AlonzoTx ConwayEra))
forall a s. DecCBOR a => Decoder s a
decCBOR