module Test.Cardano.Chain.UTxO.Gen (
  genCompactTxId,
  genCompactTxIn,
  genCompactTxOut,
  genVKWitness,
  genRedeemWitness,
  genTx,
  genTxAttributes,
  genTxAux,
  genTxHash,
  genTxId,
  genTxIn,
  genTxInList,
  genTxInWitness,
  genTxOut,
  genTxOutList,
  genTxPayload,
  genUTxOConfiguration,
  genTxProof,
  genTxSig,
  genTxSigData,
  genTxValidationError,
  genTxWitness,
  genUTxO,
  genUTxOError,
  genUTxOValidationError,
) where

import Cardano.Chain.Common (makeNetworkMagic, mkAttributes)
import Cardano.Chain.UTxO (
  CompactTxId,
  CompactTxIn,
  CompactTxOut,
  Tx (..),
  TxAttributes,
  TxAux,
  TxId,
  TxIn (..),
  TxInWitness (..),
  TxOut (..),
  TxPayload,
  TxProof (..),
  TxSig,
  TxSigData (..),
  TxValidationError (..),
  TxWitness,
  UTxO,
  UTxOConfiguration (..),
  UTxOError (..),
  UTxOValidationError (..),
  fromList,
  mkTxAux,
  mkTxPayload,
  mkUTxOConfiguration,
  toCompactTxId,
  toCompactTxIn,
  toCompactTxOut,
 )
import Cardano.Crypto (
  Hash,
  ProtocolMagicId,
  decodeHash,
  getProtocolMagicId,
  sign,
 )
import Cardano.Prelude
import Data.ByteString.Base16 as B16
import Data.Coerce (coerce)
import qualified Data.Vector as V
import Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import Test.Cardano.Chain.Common.Gen (
  genAddress,
  genLovelace,
  genLovelaceError,
  genMerkleRoot,
  genNetworkMagic,
 )
import Test.Cardano.Crypto.Gen (
  genAbstractHash,
  genProtocolMagic,
  genRedeemSignature,
  genRedeemVerificationKey,
  genSignTag,
  genSigningKey,
  genTextHash,
  genVerificationKey,
 )
import Test.Cardano.Prelude

genCompactTxId :: Gen CompactTxId
genCompactTxId :: Gen CompactTxId
genCompactTxId = Hash Tx -> CompactTxId
toCompactTxId (Hash Tx -> CompactTxId)
-> GenT Identity (Hash Tx) -> Gen CompactTxId
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity (Hash Tx)
genTxId

genCompactTxIn :: Gen CompactTxIn
genCompactTxIn :: Gen CompactTxIn
genCompactTxIn = TxIn -> CompactTxIn
toCompactTxIn (TxIn -> CompactTxIn) -> GenT Identity TxIn -> Gen CompactTxIn
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity TxIn
genTxIn

genCompactTxOut :: Gen CompactTxOut
genCompactTxOut :: Gen CompactTxOut
genCompactTxOut = TxOut -> CompactTxOut
toCompactTxOut (TxOut -> CompactTxOut) -> GenT Identity TxOut -> Gen CompactTxOut
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity TxOut
genTxOut

genVKWitness :: ProtocolMagicId -> Gen TxInWitness
genVKWitness :: ProtocolMagicId -> Gen TxInWitness
genVKWitness ProtocolMagicId
pm = VerificationKey -> TxSig -> TxInWitness
VKWitness (VerificationKey -> TxSig -> TxInWitness)
-> GenT Identity VerificationKey
-> GenT Identity (TxSig -> TxInWitness)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity VerificationKey
genVerificationKey GenT Identity (TxSig -> TxInWitness)
-> GenT Identity TxSig -> Gen TxInWitness
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ProtocolMagicId -> GenT Identity TxSig
genTxSig ProtocolMagicId
pm

genRedeemWitness :: ProtocolMagicId -> Gen TxInWitness
genRedeemWitness :: ProtocolMagicId -> Gen TxInWitness
genRedeemWitness ProtocolMagicId
pm =
  RedeemVerificationKey -> RedeemSignature TxSigData -> TxInWitness
RedeemWitness (RedeemVerificationKey -> RedeemSignature TxSigData -> TxInWitness)
-> GenT Identity RedeemVerificationKey
-> GenT Identity (RedeemSignature TxSigData -> TxInWitness)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity RedeemVerificationKey
genRedeemVerificationKey GenT Identity (RedeemSignature TxSigData -> TxInWitness)
-> GenT Identity (RedeemSignature TxSigData) -> Gen TxInWitness
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ProtocolMagicId
-> Gen TxSigData -> GenT Identity (RedeemSignature TxSigData)
forall a.
EncCBOR a =>
ProtocolMagicId -> Gen a -> Gen (RedeemSignature a)
genRedeemSignature ProtocolMagicId
pm Gen TxSigData
genTxSigData

genTx :: Gen Tx
genTx :: Gen Tx
genTx = NonEmpty TxIn -> NonEmpty TxOut -> TxAttributes -> Tx
UnsafeTx (NonEmpty TxIn -> NonEmpty TxOut -> TxAttributes -> Tx)
-> GenT Identity (NonEmpty TxIn)
-> GenT Identity (NonEmpty TxOut -> TxAttributes -> Tx)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity (NonEmpty TxIn)
genTxInList GenT Identity (NonEmpty TxOut -> TxAttributes -> Tx)
-> GenT Identity (NonEmpty TxOut)
-> GenT Identity (TxAttributes -> Tx)
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> GenT Identity (NonEmpty TxOut)
genTxOutList GenT Identity (TxAttributes -> Tx)
-> GenT Identity TxAttributes -> Gen Tx
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> GenT Identity TxAttributes
genTxAttributes

genTxAttributes :: Gen TxAttributes
genTxAttributes :: GenT Identity TxAttributes
genTxAttributes = TxAttributes -> GenT Identity TxAttributes
forall a. a -> GenT Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (TxAttributes -> GenT Identity TxAttributes)
-> TxAttributes -> GenT Identity TxAttributes
forall a b. (a -> b) -> a -> b
$ () -> TxAttributes
forall h. h -> Attributes h
mkAttributes ()

genTxAux :: ProtocolMagicId -> Gen TxAux
genTxAux :: ProtocolMagicId -> Gen TxAux
genTxAux ProtocolMagicId
pm = Tx -> TxWitness -> TxAux
mkTxAux (Tx -> TxWitness -> TxAux)
-> Gen Tx -> GenT Identity (TxWitness -> TxAux)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Tx
genTx GenT Identity (TxWitness -> TxAux)
-> GenT Identity TxWitness -> Gen TxAux
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (ProtocolMagicId -> GenT Identity TxWitness
genTxWitness ProtocolMagicId
pm)

genTxHash :: Gen (Hash Tx)
genTxHash :: GenT Identity (Hash Tx)
genTxHash = Hash Text -> Hash Tx
forall a b. Coercible a b => a -> b
coerce (Hash Text -> Hash Tx)
-> GenT Identity (Hash Text) -> GenT Identity (Hash Tx)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity (Hash Text)
genTextHash

genTxId :: Gen TxId
genTxId :: GenT Identity (Hash Tx)
genTxId = GenT Identity Text
genBase16Text GenT Identity Text
-> (Text -> GenT Identity (Either Text (Hash Tx)))
-> GenT Identity (Either Text (Hash Tx))
forall a b.
GenT Identity a -> (a -> GenT Identity b) -> GenT Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Either Text (Hash Tx) -> GenT Identity (Either Text (Hash Tx))
forall a. a -> GenT Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either Text (Hash Tx) -> GenT Identity (Either Text (Hash Tx)))
-> (Text -> Either Text (Hash Tx))
-> Text
-> GenT Identity (Either Text (Hash Tx))
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> Either Text (Hash Tx)
forall a. Text -> Either Text (Hash a)
decodeHash GenT Identity (Either Text (Hash Tx))
-> (Either Text (Hash Tx) -> GenT Identity (Hash Tx))
-> GenT Identity (Hash Tx)
forall a b.
GenT Identity a -> (a -> GenT Identity b) -> GenT Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Text -> GenT Identity (Hash Tx))
-> (Hash Tx -> GenT Identity (Hash Tx))
-> Either Text (Hash Tx)
-> GenT Identity (Hash Tx)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Text -> GenT Identity (Hash Tx)
forall a. HasCallStack => Text -> a
panic Hash Tx -> GenT Identity (Hash Tx)
forall a. a -> GenT Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
  where
    genBase16Text :: GenT Identity Text
genBase16Text = ByteString -> Text
decodeUtf8 (ByteString -> Text)
-> GenT Identity ByteString -> GenT Identity Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity ByteString
genBase16Bs

genBase16Bs :: Gen ByteString
genBase16Bs :: GenT Identity ByteString
genBase16Bs = ByteString -> ByteString
B16.encode (ByteString -> ByteString)
-> GenT Identity ByteString -> GenT Identity ByteString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> GenT Identity ByteString
genBytes Int
32

genTxIn :: Gen TxIn
genTxIn :: GenT Identity TxIn
genTxIn = Hash Tx -> Word16 -> TxIn
TxInUtxo (Hash Tx -> Word16 -> TxIn)
-> GenT Identity (Hash Tx) -> GenT Identity (Word16 -> TxIn)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity (Hash Tx)
genTxId GenT Identity (Word16 -> TxIn)
-> GenT Identity Word16 -> GenT Identity TxIn
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> GenT Identity Word16
genWord16

genTxInList :: Gen (NonEmpty TxIn)
genTxInList :: GenT Identity (NonEmpty TxIn)
genTxInList = Range Int -> GenT Identity TxIn -> GenT Identity (NonEmpty TxIn)
forall (m :: * -> *) a.
MonadGen m =>
Range Int -> m a -> m (NonEmpty a)
Gen.nonEmpty (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
Range.linear Int
1 Int
20) GenT Identity TxIn
genTxIn

genTxOut :: Gen TxOut
genTxOut :: GenT Identity TxOut
genTxOut = Address -> Lovelace -> TxOut
TxOut (Address -> Lovelace -> TxOut)
-> GenT Identity Address -> GenT Identity (Lovelace -> TxOut)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity Address
genAddress GenT Identity (Lovelace -> TxOut)
-> GenT Identity Lovelace -> GenT Identity TxOut
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> GenT Identity Lovelace
genLovelace

genTxOutList :: Gen (NonEmpty TxOut)
genTxOutList :: GenT Identity (NonEmpty TxOut)
genTxOutList = Range Int -> GenT Identity TxOut -> GenT Identity (NonEmpty TxOut)
forall (m :: * -> *) a.
MonadGen m =>
Range Int -> m a -> m (NonEmpty a)
Gen.nonEmpty (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
Range.linear Int
1 Int
100) GenT Identity TxOut
genTxOut

genUTxOConfiguration :: Gen UTxOConfiguration
genUTxOConfiguration :: Gen UTxOConfiguration
genUTxOConfiguration =
  [Address] -> UTxOConfiguration
mkUTxOConfiguration
    ([Address] -> UTxOConfiguration)
-> GenT Identity [Address] -> Gen UTxOConfiguration
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range Int -> GenT Identity Address -> GenT Identity [Address]
forall (m :: * -> *) a. MonadGen m => Range Int -> m a -> m [a]
Gen.list (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
Range.linear Int
0 Int
50) GenT Identity Address
genAddress

genTxPayload :: ProtocolMagicId -> Gen TxPayload
genTxPayload :: ProtocolMagicId -> Gen TxPayload
genTxPayload ProtocolMagicId
pm = [TxAux] -> TxPayload
mkTxPayload ([TxAux] -> TxPayload) -> GenT Identity [TxAux] -> Gen TxPayload
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range Int -> Gen TxAux -> GenT Identity [TxAux]
forall (m :: * -> *) a. MonadGen m => Range Int -> m a -> m [a]
Gen.list (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
Range.linear Int
0 Int
10) (ProtocolMagicId -> Gen TxAux
genTxAux ProtocolMagicId
pm)

genTxProof :: ProtocolMagicId -> Gen TxProof
genTxProof :: ProtocolMagicId -> Gen TxProof
genTxProof ProtocolMagicId
pm =
  Word32 -> MerkleRoot Tx -> Hash [TxWitness] -> TxProof
TxProof
    (Word32 -> MerkleRoot Tx -> Hash [TxWitness] -> TxProof)
-> GenT Identity Word32
-> GenT Identity (MerkleRoot Tx -> Hash [TxWitness] -> TxProof)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity Word32
genWord32
    GenT Identity (MerkleRoot Tx -> Hash [TxWitness] -> TxProof)
-> GenT Identity (MerkleRoot Tx)
-> GenT Identity (Hash [TxWitness] -> TxProof)
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Tx -> GenT Identity (MerkleRoot Tx)
forall a. EncCBOR a => Gen a -> Gen (MerkleRoot a)
genMerkleRoot Gen Tx
genTx
    GenT Identity (Hash [TxWitness] -> TxProof)
-> GenT Identity (Hash [TxWitness]) -> Gen TxProof
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen [TxWitness] -> GenT Identity (Hash [TxWitness])
forall a algo.
(EncCBOR a, HashAlgorithm algo) =>
Gen a -> Gen (AbstractHash algo a)
genAbstractHash
      (Range Int -> GenT Identity TxWitness -> Gen [TxWitness]
forall (m :: * -> *) a. MonadGen m => Range Int -> m a -> m [a]
Gen.list (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
Range.linear Int
1 Int
5) (ProtocolMagicId -> GenT Identity TxWitness
genTxWitness ProtocolMagicId
pm))

genTxSig :: ProtocolMagicId -> Gen TxSig
genTxSig :: ProtocolMagicId -> GenT Identity TxSig
genTxSig ProtocolMagicId
pm = ProtocolMagicId -> SignTag -> SigningKey -> TxSigData -> TxSig
forall a.
EncCBOR a =>
ProtocolMagicId -> SignTag -> SigningKey -> a -> Signature a
sign ProtocolMagicId
pm (SignTag -> SigningKey -> TxSigData -> TxSig)
-> GenT Identity SignTag
-> GenT Identity (SigningKey -> TxSigData -> TxSig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity SignTag
genSignTag GenT Identity (SigningKey -> TxSigData -> TxSig)
-> GenT Identity SigningKey -> GenT Identity (TxSigData -> TxSig)
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> GenT Identity SigningKey
genSigningKey GenT Identity (TxSigData -> TxSig)
-> Gen TxSigData -> GenT Identity TxSig
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen TxSigData
genTxSigData

genTxSigData :: Gen TxSigData
genTxSigData :: Gen TxSigData
genTxSigData = Hash Tx -> TxSigData
TxSigData (Hash Tx -> TxSigData) -> GenT Identity (Hash Tx) -> Gen TxSigData
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity (Hash Tx)
genTxHash

genTxValidationError :: Gen TxValidationError
genTxValidationError :: Gen TxValidationError
genTxValidationError = do
  ProtocolMagic
pm <- Gen ProtocolMagic
genProtocolMagic
  let pmi :: ProtocolMagicId
pmi = ProtocolMagic -> ProtocolMagicId
forall a. AProtocolMagic a -> ProtocolMagicId
getProtocolMagicId ProtocolMagic
pm
      nm :: NetworkMagic
nm = ProtocolMagic -> NetworkMagic
forall a. AProtocolMagic a -> NetworkMagic
makeNetworkMagic ProtocolMagic
pm
  [Gen TxValidationError] -> Gen TxValidationError
forall (m :: * -> *) a. MonadGen m => [m a] -> m a
Gen.choice
    [ Text -> LovelaceError -> TxValidationError
TxValidationLovelaceError
        (Text -> LovelaceError -> TxValidationError)
-> GenT Identity Text
-> GenT Identity (LovelaceError -> TxValidationError)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range Int -> GenT Identity Char -> GenT Identity Text
forall (m :: * -> *). MonadGen m => Range Int -> m Char -> m Text
Gen.text (Int -> Int -> Range Int
forall a. a -> a -> Range a
Range.constant Int
0 Int
1000) GenT Identity Char
forall (m :: * -> *). MonadGen m => m Char
Gen.alphaNum
        GenT Identity (LovelaceError -> TxValidationError)
-> GenT Identity LovelaceError -> Gen TxValidationError
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> GenT Identity LovelaceError
genLovelaceError
    , Tx -> Lovelace -> Lovelace -> TxValidationError
TxValidationFeeTooSmall (Tx -> Lovelace -> Lovelace -> TxValidationError)
-> Gen Tx
-> GenT Identity (Lovelace -> Lovelace -> TxValidationError)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Tx
genTx GenT Identity (Lovelace -> Lovelace -> TxValidationError)
-> GenT Identity Lovelace
-> GenT Identity (Lovelace -> TxValidationError)
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> GenT Identity Lovelace
genLovelace GenT Identity (Lovelace -> TxValidationError)
-> GenT Identity Lovelace -> Gen TxValidationError
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> GenT Identity Lovelace
genLovelace
    , TxInWitness -> ProtocolMagicId -> TxSigData -> TxValidationError
TxValidationWitnessWrongSignature
        (TxInWitness -> ProtocolMagicId -> TxSigData -> TxValidationError)
-> Gen TxInWitness
-> GenT
     Identity (ProtocolMagicId -> TxSigData -> TxValidationError)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ProtocolMagicId -> Gen TxInWitness
genTxInWitness ProtocolMagicId
pmi
        GenT Identity (ProtocolMagicId -> TxSigData -> TxValidationError)
-> GenT Identity ProtocolMagicId
-> GenT Identity (TxSigData -> TxValidationError)
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ProtocolMagicId -> GenT Identity ProtocolMagicId
forall a. a -> GenT Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ProtocolMagicId
pmi
        GenT Identity (TxSigData -> TxValidationError)
-> Gen TxSigData -> Gen TxValidationError
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen TxSigData
genTxSigData
    , TxInWitness -> Address -> TxValidationError
TxValidationWitnessWrongKey (TxInWitness -> Address -> TxValidationError)
-> Gen TxInWitness -> GenT Identity (Address -> TxValidationError)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ProtocolMagicId -> Gen TxInWitness
genTxInWitness ProtocolMagicId
pmi GenT Identity (Address -> TxValidationError)
-> GenT Identity Address -> Gen TxValidationError
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> GenT Identity Address
genAddress
    , TxIn -> TxValidationError
TxValidationMissingInput (TxIn -> TxValidationError)
-> GenT Identity TxIn -> Gen TxValidationError
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity TxIn
genTxIn
    , NetworkMagic -> NetworkMagic -> TxValidationError
TxValidationNetworkMagicMismatch (NetworkMagic -> NetworkMagic -> TxValidationError)
-> GenT Identity NetworkMagic
-> GenT Identity (NetworkMagic -> TxValidationError)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity NetworkMagic
genNetworkMagic GenT Identity (NetworkMagic -> TxValidationError)
-> GenT Identity NetworkMagic -> Gen TxValidationError
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> NetworkMagic -> GenT Identity NetworkMagic
forall a. a -> GenT Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure NetworkMagic
nm
    , Natural -> Natural -> TxValidationError
TxValidationTxTooLarge
        (Natural -> Natural -> TxValidationError)
-> GenT Identity Natural
-> GenT Identity (Natural -> TxValidationError)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range Natural -> GenT Identity Natural
forall (m :: * -> *) a. (MonadGen m, Integral a) => Range a -> m a
Gen.integral (Natural -> Natural -> Range Natural
forall a. a -> a -> Range a
Range.constant Natural
0 Natural
1000)
        GenT Identity (Natural -> TxValidationError)
-> GenT Identity Natural -> Gen TxValidationError
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Range Natural -> GenT Identity Natural
forall (m :: * -> *) a. (MonadGen m, Integral a) => Range a -> m a
Gen.integral (Natural -> Natural -> Range Natural
forall a. a -> a -> Range a
Range.constant Natural
0 Natural
1000)
    , TxValidationError -> Gen TxValidationError
forall a. a -> GenT Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TxValidationError
TxValidationUnknownAddressAttributes
    , TxValidationError -> Gen TxValidationError
forall a. a -> GenT Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TxValidationError
TxValidationUnknownAttributes
    ]

genTxInWitness :: ProtocolMagicId -> Gen TxInWitness
genTxInWitness :: ProtocolMagicId -> Gen TxInWitness
genTxInWitness ProtocolMagicId
pm = [Gen TxInWitness] -> Gen TxInWitness
forall (m :: * -> *) a. MonadGen m => [m a] -> m a
Gen.choice [ProtocolMagicId -> Gen TxInWitness
genVKWitness ProtocolMagicId
pm, ProtocolMagicId -> Gen TxInWitness
genRedeemWitness ProtocolMagicId
pm]

genTxWitness :: ProtocolMagicId -> Gen TxWitness
genTxWitness :: ProtocolMagicId -> GenT Identity TxWitness
genTxWitness ProtocolMagicId
pm =
  [TxInWitness] -> TxWitness
forall a. [a] -> Vector a
V.fromList ([TxInWitness] -> TxWitness)
-> GenT Identity [TxInWitness] -> GenT Identity TxWitness
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range Int -> Gen TxInWitness -> GenT Identity [TxInWitness]
forall (m :: * -> *) a. MonadGen m => Range Int -> m a -> m [a]
Gen.list (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
Range.linear Int
1 Int
10) (ProtocolMagicId -> Gen TxInWitness
genTxInWitness ProtocolMagicId
pm)

genUTxO :: Gen UTxO
genUTxO :: Gen UTxO
genUTxO = [(TxIn, TxOut)] -> UTxO
fromList ([(TxIn, TxOut)] -> UTxO)
-> GenT Identity [(TxIn, TxOut)] -> Gen UTxO
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range Int
-> GenT Identity (TxIn, TxOut) -> GenT Identity [(TxIn, TxOut)]
forall (m :: * -> *) a. MonadGen m => Range Int -> m a -> m [a]
Gen.list (Int -> Int -> Range Int
forall a. a -> a -> Range a
Range.constant Int
0 Int
1000) GenT Identity (TxIn, TxOut)
genTxInTxOut
  where
    genTxInTxOut :: Gen (TxIn, TxOut)
    genTxInTxOut :: GenT Identity (TxIn, TxOut)
genTxInTxOut = (,) (TxIn -> TxOut -> (TxIn, TxOut))
-> GenT Identity TxIn -> GenT Identity (TxOut -> (TxIn, TxOut))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity TxIn
genTxIn GenT Identity (TxOut -> (TxIn, TxOut))
-> GenT Identity TxOut -> GenT Identity (TxIn, TxOut)
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> GenT Identity TxOut
genTxOut

genUTxOError :: Gen UTxOError
genUTxOError :: Gen UTxOError
genUTxOError =
  [Gen UTxOError] -> Gen UTxOError
forall (m :: * -> *) a. MonadGen m => [m a] -> m a
Gen.choice
    [ TxIn -> UTxOError
UTxOMissingInput (TxIn -> UTxOError) -> GenT Identity TxIn -> Gen UTxOError
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenT Identity TxIn
genTxIn
    , UTxOError -> Gen UTxOError
forall a. a -> GenT Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure UTxOError
UTxOOverlappingUnion
    ]

genUTxOValidationError :: Gen UTxOValidationError
genUTxOValidationError :: Gen UTxOValidationError
genUTxOValidationError =
  [Gen UTxOValidationError] -> Gen UTxOValidationError
forall (m :: * -> *) a. MonadGen m => [m a] -> m a
Gen.choice
    [ TxValidationError -> UTxOValidationError
UTxOValidationTxValidationError (TxValidationError -> UTxOValidationError)
-> Gen TxValidationError -> Gen UTxOValidationError
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen TxValidationError
genTxValidationError
    , UTxOError -> UTxOValidationError
UTxOValidationUTxOError (UTxOError -> UTxOValidationError)
-> Gen UTxOError -> Gen UTxOValidationError
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen UTxOError
genUTxOError
    ]