module Cardano.YTxP.SDK.Redeemers (
  AuthorisedScriptIndex (AuthorisedScriptIndex),
  AuthorisedScriptPurpose (Minting, Spending, Rewarding),
  AuthorisedScriptProofIndex (AuthorisedScriptProofIndex),
  YieldingRedeemer (
    YieldingRedeemer,
    authorisedScriptIndex,
    authorisedScriptProofIndex
  ),
) where

import GHC.Generics (Generic)
import Generics.SOP qualified as SOP
import PlutusTx qualified
import PlutusTx.Blueprint (HasBlueprintDefinition)
import PlutusTx.Prelude qualified as PlutusTx
import Test.QuickCheck (Arbitrary (arbitrary), arbitraryBoundedEnum)

-- | Represents an index into a authorised reference script in a TxInReferenceInput list
newtype AuthorisedScriptIndex = AuthorisedScriptIndex Integer
  deriving newtype
    ( Int -> AuthorisedScriptIndex -> ShowS
[AuthorisedScriptIndex] -> ShowS
AuthorisedScriptIndex -> String
(Int -> AuthorisedScriptIndex -> ShowS)
-> (AuthorisedScriptIndex -> String)
-> ([AuthorisedScriptIndex] -> ShowS)
-> Show AuthorisedScriptIndex
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AuthorisedScriptIndex -> ShowS
showsPrec :: Int -> AuthorisedScriptIndex -> ShowS
$cshow :: AuthorisedScriptIndex -> String
show :: AuthorisedScriptIndex -> String
$cshowList :: [AuthorisedScriptIndex] -> ShowS
showList :: [AuthorisedScriptIndex] -> ShowS
Show
    , AuthorisedScriptIndex -> AuthorisedScriptIndex -> Bool
(AuthorisedScriptIndex -> AuthorisedScriptIndex -> Bool)
-> (AuthorisedScriptIndex -> AuthorisedScriptIndex -> Bool)
-> Eq AuthorisedScriptIndex
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AuthorisedScriptIndex -> AuthorisedScriptIndex -> Bool
== :: AuthorisedScriptIndex -> AuthorisedScriptIndex -> Bool
$c/= :: AuthorisedScriptIndex -> AuthorisedScriptIndex -> Bool
/= :: AuthorisedScriptIndex -> AuthorisedScriptIndex -> Bool
Eq
    , AuthorisedScriptIndex -> BuiltinData
(AuthorisedScriptIndex -> BuiltinData)
-> ToData AuthorisedScriptIndex
forall a. (a -> BuiltinData) -> ToData a
$ctoBuiltinData :: AuthorisedScriptIndex -> BuiltinData
toBuiltinData :: AuthorisedScriptIndex -> BuiltinData
PlutusTx.ToData
    , BuiltinData -> Maybe AuthorisedScriptIndex
(BuiltinData -> Maybe AuthorisedScriptIndex)
-> FromData AuthorisedScriptIndex
forall a. (BuiltinData -> Maybe a) -> FromData a
$cfromBuiltinData :: BuiltinData -> Maybe AuthorisedScriptIndex
fromBuiltinData :: BuiltinData -> Maybe AuthorisedScriptIndex
PlutusTx.FromData
    , BuiltinData -> AuthorisedScriptIndex
(BuiltinData -> AuthorisedScriptIndex)
-> UnsafeFromData AuthorisedScriptIndex
forall a. (BuiltinData -> a) -> UnsafeFromData a
$cunsafeFromBuiltinData :: BuiltinData -> AuthorisedScriptIndex
unsafeFromBuiltinData :: BuiltinData -> AuthorisedScriptIndex
PlutusTx.UnsafeFromData
    , AuthorisedScriptIndex -> AuthorisedScriptIndex -> Bool
(AuthorisedScriptIndex -> AuthorisedScriptIndex -> Bool)
-> Eq AuthorisedScriptIndex
forall a. (a -> a -> Bool) -> Eq a
$c== :: AuthorisedScriptIndex -> AuthorisedScriptIndex -> Bool
== :: AuthorisedScriptIndex -> AuthorisedScriptIndex -> Bool
PlutusTx.Eq
    , Gen AuthorisedScriptIndex
Gen AuthorisedScriptIndex
-> (AuthorisedScriptIndex -> [AuthorisedScriptIndex])
-> Arbitrary AuthorisedScriptIndex
AuthorisedScriptIndex -> [AuthorisedScriptIndex]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen AuthorisedScriptIndex
arbitrary :: Gen AuthorisedScriptIndex
$cshrink :: AuthorisedScriptIndex -> [AuthorisedScriptIndex]
shrink :: AuthorisedScriptIndex -> [AuthorisedScriptIndex]
Arbitrary
    )

{- The type of yielded to scripts
-}
data AuthorisedScriptPurpose = Minting | Spending | Rewarding
  deriving stock (Int -> AuthorisedScriptPurpose -> ShowS
[AuthorisedScriptPurpose] -> ShowS
AuthorisedScriptPurpose -> String
(Int -> AuthorisedScriptPurpose -> ShowS)
-> (AuthorisedScriptPurpose -> String)
-> ([AuthorisedScriptPurpose] -> ShowS)
-> Show AuthorisedScriptPurpose
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AuthorisedScriptPurpose -> ShowS
showsPrec :: Int -> AuthorisedScriptPurpose -> ShowS
$cshow :: AuthorisedScriptPurpose -> String
show :: AuthorisedScriptPurpose -> String
$cshowList :: [AuthorisedScriptPurpose] -> ShowS
showList :: [AuthorisedScriptPurpose] -> ShowS
Show, (forall x.
 AuthorisedScriptPurpose -> Rep AuthorisedScriptPurpose x)
-> (forall x.
    Rep AuthorisedScriptPurpose x -> AuthorisedScriptPurpose)
-> Generic AuthorisedScriptPurpose
forall x. Rep AuthorisedScriptPurpose x -> AuthorisedScriptPurpose
forall x. AuthorisedScriptPurpose -> Rep AuthorisedScriptPurpose x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. AuthorisedScriptPurpose -> Rep AuthorisedScriptPurpose x
from :: forall x. AuthorisedScriptPurpose -> Rep AuthorisedScriptPurpose x
$cto :: forall x. Rep AuthorisedScriptPurpose x -> AuthorisedScriptPurpose
to :: forall x. Rep AuthorisedScriptPurpose x -> AuthorisedScriptPurpose
Generic, AuthorisedScriptPurpose -> AuthorisedScriptPurpose -> Bool
(AuthorisedScriptPurpose -> AuthorisedScriptPurpose -> Bool)
-> (AuthorisedScriptPurpose -> AuthorisedScriptPurpose -> Bool)
-> Eq AuthorisedScriptPurpose
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AuthorisedScriptPurpose -> AuthorisedScriptPurpose -> Bool
== :: AuthorisedScriptPurpose -> AuthorisedScriptPurpose -> Bool
$c/= :: AuthorisedScriptPurpose -> AuthorisedScriptPurpose -> Bool
/= :: AuthorisedScriptPurpose -> AuthorisedScriptPurpose -> Bool
Eq, Int -> AuthorisedScriptPurpose
AuthorisedScriptPurpose -> Int
AuthorisedScriptPurpose -> [AuthorisedScriptPurpose]
AuthorisedScriptPurpose -> AuthorisedScriptPurpose
AuthorisedScriptPurpose
-> AuthorisedScriptPurpose -> [AuthorisedScriptPurpose]
AuthorisedScriptPurpose
-> AuthorisedScriptPurpose
-> AuthorisedScriptPurpose
-> [AuthorisedScriptPurpose]
(AuthorisedScriptPurpose -> AuthorisedScriptPurpose)
-> (AuthorisedScriptPurpose -> AuthorisedScriptPurpose)
-> (Int -> AuthorisedScriptPurpose)
-> (AuthorisedScriptPurpose -> Int)
-> (AuthorisedScriptPurpose -> [AuthorisedScriptPurpose])
-> (AuthorisedScriptPurpose
    -> AuthorisedScriptPurpose -> [AuthorisedScriptPurpose])
-> (AuthorisedScriptPurpose
    -> AuthorisedScriptPurpose -> [AuthorisedScriptPurpose])
-> (AuthorisedScriptPurpose
    -> AuthorisedScriptPurpose
    -> AuthorisedScriptPurpose
    -> [AuthorisedScriptPurpose])
-> Enum AuthorisedScriptPurpose
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: AuthorisedScriptPurpose -> AuthorisedScriptPurpose
succ :: AuthorisedScriptPurpose -> AuthorisedScriptPurpose
$cpred :: AuthorisedScriptPurpose -> AuthorisedScriptPurpose
pred :: AuthorisedScriptPurpose -> AuthorisedScriptPurpose
$ctoEnum :: Int -> AuthorisedScriptPurpose
toEnum :: Int -> AuthorisedScriptPurpose
$cfromEnum :: AuthorisedScriptPurpose -> Int
fromEnum :: AuthorisedScriptPurpose -> Int
$cenumFrom :: AuthorisedScriptPurpose -> [AuthorisedScriptPurpose]
enumFrom :: AuthorisedScriptPurpose -> [AuthorisedScriptPurpose]
$cenumFromThen :: AuthorisedScriptPurpose
-> AuthorisedScriptPurpose -> [AuthorisedScriptPurpose]
enumFromThen :: AuthorisedScriptPurpose
-> AuthorisedScriptPurpose -> [AuthorisedScriptPurpose]
$cenumFromTo :: AuthorisedScriptPurpose
-> AuthorisedScriptPurpose -> [AuthorisedScriptPurpose]
enumFromTo :: AuthorisedScriptPurpose
-> AuthorisedScriptPurpose -> [AuthorisedScriptPurpose]
$cenumFromThenTo :: AuthorisedScriptPurpose
-> AuthorisedScriptPurpose
-> AuthorisedScriptPurpose
-> [AuthorisedScriptPurpose]
enumFromThenTo :: AuthorisedScriptPurpose
-> AuthorisedScriptPurpose
-> AuthorisedScriptPurpose
-> [AuthorisedScriptPurpose]
Enum, AuthorisedScriptPurpose
AuthorisedScriptPurpose
-> AuthorisedScriptPurpose -> Bounded AuthorisedScriptPurpose
forall a. a -> a -> Bounded a
$cminBound :: AuthorisedScriptPurpose
minBound :: AuthorisedScriptPurpose
$cmaxBound :: AuthorisedScriptPurpose
maxBound :: AuthorisedScriptPurpose
Bounded)
  deriving anyclass (All @[Type] (SListI @Type) (Code AuthorisedScriptPurpose)
All @[Type] (SListI @Type) (Code AuthorisedScriptPurpose) =>
(AuthorisedScriptPurpose -> Rep AuthorisedScriptPurpose)
-> (Rep AuthorisedScriptPurpose -> AuthorisedScriptPurpose)
-> Generic AuthorisedScriptPurpose
Rep AuthorisedScriptPurpose -> AuthorisedScriptPurpose
AuthorisedScriptPurpose -> Rep AuthorisedScriptPurpose
forall a.
All @[Type] (SListI @Type) (Code a) =>
(a -> Rep a) -> (Rep a -> a) -> Generic a
$cfrom :: AuthorisedScriptPurpose -> Rep AuthorisedScriptPurpose
from :: AuthorisedScriptPurpose -> Rep AuthorisedScriptPurpose
$cto :: Rep AuthorisedScriptPurpose -> AuthorisedScriptPurpose
to :: Rep AuthorisedScriptPurpose -> AuthorisedScriptPurpose
SOP.Generic)

instance Arbitrary AuthorisedScriptPurpose where
  arbitrary :: Gen AuthorisedScriptPurpose
arbitrary = Gen AuthorisedScriptPurpose
forall a. (Bounded a, Enum a) => Gen a
arbitraryBoundedEnum

-- We write these instances like this to match the plutarch type implementation
-- that uses the fact that a type is an enum to encode it directly with integers onchain
instance PlutusTx.ToData AuthorisedScriptPurpose where
  {-# INLINEABLE toBuiltinData #-}
  toBuiltinData :: AuthorisedScriptPurpose -> BuiltinData
toBuiltinData = Integer -> BuiltinData
forall a. ToData a => a -> BuiltinData
PlutusTx.toBuiltinData (Integer -> BuiltinData)
-> (AuthorisedScriptPurpose -> Integer)
-> AuthorisedScriptPurpose
-> BuiltinData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Integer
forall a. Integral a => a -> Integer
toInteger (Int -> Integer)
-> (AuthorisedScriptPurpose -> Int)
-> AuthorisedScriptPurpose
-> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AuthorisedScriptPurpose -> Int
forall a. Enum a => a -> Int
fromEnum

instance PlutusTx.FromData AuthorisedScriptPurpose where
  {-# INLINEABLE fromBuiltinData #-}
  fromBuiltinData :: BuiltinData -> Maybe AuthorisedScriptPurpose
fromBuiltinData BuiltinData
d = case forall a. FromData a => BuiltinData -> Maybe a
PlutusTx.fromBuiltinData @Integer BuiltinData
d of
    Maybe Integer
PlutusTx.Nothing -> Maybe AuthorisedScriptPurpose
forall a. Maybe a
PlutusTx.Nothing
    PlutusTx.Just Integer
i ->
      if Integer
i Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
PlutusTx.== Integer
0
        then AuthorisedScriptPurpose -> Maybe AuthorisedScriptPurpose
forall a. a -> Maybe a
PlutusTx.Just AuthorisedScriptPurpose
Minting
        else
          if Integer
i Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
PlutusTx.== Integer
1
            then AuthorisedScriptPurpose -> Maybe AuthorisedScriptPurpose
forall a. a -> Maybe a
PlutusTx.Just AuthorisedScriptPurpose
Spending
            else
              if Integer
i Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
PlutusTx.== Integer
2
                then AuthorisedScriptPurpose -> Maybe AuthorisedScriptPurpose
forall a. a -> Maybe a
PlutusTx.Just AuthorisedScriptPurpose
Rewarding
                else Maybe AuthorisedScriptPurpose
forall a. Maybe a
PlutusTx.Nothing

instance PlutusTx.UnsafeFromData AuthorisedScriptPurpose where
  {-# INLINEABLE unsafeFromBuiltinData #-}
  unsafeFromBuiltinData :: BuiltinData -> AuthorisedScriptPurpose
unsafeFromBuiltinData BuiltinData
d = case BuiltinData -> Maybe AuthorisedScriptPurpose
forall a. FromData a => BuiltinData -> Maybe a
PlutusTx.fromBuiltinData BuiltinData
d of
    Maybe AuthorisedScriptPurpose
Nothing -> () -> AuthorisedScriptPurpose
forall a. () -> a
PlutusTx.error ()
    Just AuthorisedScriptPurpose
i -> AuthorisedScriptPurpose
i

instance PlutusTx.Eq AuthorisedScriptPurpose where
  {-# INLINEABLE (==) #-}
  AuthorisedScriptPurpose
Minting == :: AuthorisedScriptPurpose -> AuthorisedScriptPurpose -> Bool
== AuthorisedScriptPurpose
Minting = Bool
True
  AuthorisedScriptPurpose
Spending == AuthorisedScriptPurpose
Spending = Bool
True
  AuthorisedScriptPurpose
Rewarding == AuthorisedScriptPurpose
Rewarding = Bool
True
  AuthorisedScriptPurpose
_ == AuthorisedScriptPurpose
_ = Bool
False

{- Index for the yielding redeemer
-}
newtype AuthorisedScriptProofIndex
  = AuthorisedScriptProofIndex (AuthorisedScriptPurpose, Integer)
  deriving newtype
    ( Int -> AuthorisedScriptProofIndex -> ShowS
[AuthorisedScriptProofIndex] -> ShowS
AuthorisedScriptProofIndex -> String
(Int -> AuthorisedScriptProofIndex -> ShowS)
-> (AuthorisedScriptProofIndex -> String)
-> ([AuthorisedScriptProofIndex] -> ShowS)
-> Show AuthorisedScriptProofIndex
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AuthorisedScriptProofIndex -> ShowS
showsPrec :: Int -> AuthorisedScriptProofIndex -> ShowS
$cshow :: AuthorisedScriptProofIndex -> String
show :: AuthorisedScriptProofIndex -> String
$cshowList :: [AuthorisedScriptProofIndex] -> ShowS
showList :: [AuthorisedScriptProofIndex] -> ShowS
Show
    , AuthorisedScriptProofIndex -> AuthorisedScriptProofIndex -> Bool
(AuthorisedScriptProofIndex -> AuthorisedScriptProofIndex -> Bool)
-> (AuthorisedScriptProofIndex
    -> AuthorisedScriptProofIndex -> Bool)
-> Eq AuthorisedScriptProofIndex
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AuthorisedScriptProofIndex -> AuthorisedScriptProofIndex -> Bool
== :: AuthorisedScriptProofIndex -> AuthorisedScriptProofIndex -> Bool
$c/= :: AuthorisedScriptProofIndex -> AuthorisedScriptProofIndex -> Bool
/= :: AuthorisedScriptProofIndex -> AuthorisedScriptProofIndex -> Bool
Eq
    , AuthorisedScriptProofIndex -> BuiltinData
(AuthorisedScriptProofIndex -> BuiltinData)
-> ToData AuthorisedScriptProofIndex
forall a. (a -> BuiltinData) -> ToData a
$ctoBuiltinData :: AuthorisedScriptProofIndex -> BuiltinData
toBuiltinData :: AuthorisedScriptProofIndex -> BuiltinData
PlutusTx.ToData
    , BuiltinData -> Maybe AuthorisedScriptProofIndex
(BuiltinData -> Maybe AuthorisedScriptProofIndex)
-> FromData AuthorisedScriptProofIndex
forall a. (BuiltinData -> Maybe a) -> FromData a
$cfromBuiltinData :: BuiltinData -> Maybe AuthorisedScriptProofIndex
fromBuiltinData :: BuiltinData -> Maybe AuthorisedScriptProofIndex
PlutusTx.FromData
    , BuiltinData -> AuthorisedScriptProofIndex
(BuiltinData -> AuthorisedScriptProofIndex)
-> UnsafeFromData AuthorisedScriptProofIndex
forall a. (BuiltinData -> a) -> UnsafeFromData a
$cunsafeFromBuiltinData :: BuiltinData -> AuthorisedScriptProofIndex
unsafeFromBuiltinData :: BuiltinData -> AuthorisedScriptProofIndex
PlutusTx.UnsafeFromData
    , AuthorisedScriptProofIndex -> AuthorisedScriptProofIndex -> Bool
(AuthorisedScriptProofIndex -> AuthorisedScriptProofIndex -> Bool)
-> Eq AuthorisedScriptProofIndex
forall a. (a -> a -> Bool) -> Eq a
$c== :: AuthorisedScriptProofIndex -> AuthorisedScriptProofIndex -> Bool
== :: AuthorisedScriptProofIndex -> AuthorisedScriptProofIndex -> Bool
PlutusTx.Eq
    , Gen AuthorisedScriptProofIndex
Gen AuthorisedScriptProofIndex
-> (AuthorisedScriptProofIndex -> [AuthorisedScriptProofIndex])
-> Arbitrary AuthorisedScriptProofIndex
AuthorisedScriptProofIndex -> [AuthorisedScriptProofIndex]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen AuthorisedScriptProofIndex
arbitrary :: Gen AuthorisedScriptProofIndex
$cshrink :: AuthorisedScriptProofIndex -> [AuthorisedScriptProofIndex]
shrink :: AuthorisedScriptProofIndex -> [AuthorisedScriptProofIndex]
Arbitrary
    )

{- | The redeemer passed to the yielding minting policy, validator,
and staking validators
-}
data YieldingRedeemer = YieldingRedeemer
  { YieldingRedeemer -> AuthorisedScriptIndex
authorisedScriptIndex :: AuthorisedScriptIndex
  -- ^ Integer The index of the TxInReferenceInput that contains the authorised reference script.
  , YieldingRedeemer -> AuthorisedScriptProofIndex
authorisedScriptProofIndex :: AuthorisedScriptProofIndex
  -- ^ A tuple containing yielded to script type and the index at which to find proof: this allows us to avoid having to loop through inputs/mints/withdrawls to find the script we want to ensure is run.
  }
  deriving stock (Int -> YieldingRedeemer -> ShowS
[YieldingRedeemer] -> ShowS
YieldingRedeemer -> String
(Int -> YieldingRedeemer -> ShowS)
-> (YieldingRedeemer -> String)
-> ([YieldingRedeemer] -> ShowS)
-> Show YieldingRedeemer
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> YieldingRedeemer -> ShowS
showsPrec :: Int -> YieldingRedeemer -> ShowS
$cshow :: YieldingRedeemer -> String
show :: YieldingRedeemer -> String
$cshowList :: [YieldingRedeemer] -> ShowS
showList :: [YieldingRedeemer] -> ShowS
Show, (forall x. YieldingRedeemer -> Rep YieldingRedeemer x)
-> (forall x. Rep YieldingRedeemer x -> YieldingRedeemer)
-> Generic YieldingRedeemer
forall x. Rep YieldingRedeemer x -> YieldingRedeemer
forall x. YieldingRedeemer -> Rep YieldingRedeemer x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. YieldingRedeemer -> Rep YieldingRedeemer x
from :: forall x. YieldingRedeemer -> Rep YieldingRedeemer x
$cto :: forall x. Rep YieldingRedeemer x -> YieldingRedeemer
to :: forall x. Rep YieldingRedeemer x -> YieldingRedeemer
Generic, YieldingRedeemer -> YieldingRedeemer -> Bool
(YieldingRedeemer -> YieldingRedeemer -> Bool)
-> (YieldingRedeemer -> YieldingRedeemer -> Bool)
-> Eq YieldingRedeemer
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: YieldingRedeemer -> YieldingRedeemer -> Bool
== :: YieldingRedeemer -> YieldingRedeemer -> Bool
$c/= :: YieldingRedeemer -> YieldingRedeemer -> Bool
/= :: YieldingRedeemer -> YieldingRedeemer -> Bool
Eq)
  deriving anyclass (DefinitionId
DefinitionId -> HasBlueprintDefinition YieldingRedeemer
forall t. DefinitionId -> HasBlueprintDefinition t
$cdefinitionId :: DefinitionId
definitionId :: DefinitionId
HasBlueprintDefinition)

instance Arbitrary YieldingRedeemer where
  arbitrary :: Gen YieldingRedeemer
arbitrary = AuthorisedScriptIndex
-> AuthorisedScriptProofIndex -> YieldingRedeemer
YieldingRedeemer (AuthorisedScriptIndex
 -> AuthorisedScriptProofIndex -> YieldingRedeemer)
-> Gen AuthorisedScriptIndex
-> Gen (AuthorisedScriptProofIndex -> YieldingRedeemer)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen AuthorisedScriptIndex
forall a. Arbitrary a => Gen a
arbitrary Gen (AuthorisedScriptProofIndex -> YieldingRedeemer)
-> Gen AuthorisedScriptProofIndex -> Gen YieldingRedeemer
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: Type -> Type) a b.
Applicative f =>
f (a -> b) -> f a -> f b
<*> Gen AuthorisedScriptProofIndex
forall a. Arbitrary a => Gen a
arbitrary

instance PlutusTx.Eq YieldingRedeemer where
  {-# INLINEABLE (==) #-}
  YieldingRedeemer AuthorisedScriptIndex
si AuthorisedScriptProofIndex
spi == :: YieldingRedeemer -> YieldingRedeemer -> Bool
== YieldingRedeemer AuthorisedScriptIndex
si' AuthorisedScriptProofIndex
spi' =
    AuthorisedScriptIndex
si AuthorisedScriptIndex -> AuthorisedScriptIndex -> Bool
forall a. Eq a => a -> a -> Bool
PlutusTx.== AuthorisedScriptIndex
si' Bool -> Bool -> Bool
PlutusTx.&& AuthorisedScriptProofIndex
spi AuthorisedScriptProofIndex -> AuthorisedScriptProofIndex -> Bool
forall a. Eq a => a -> a -> Bool
PlutusTx.== AuthorisedScriptProofIndex
spi'

PlutusTx.makeIsDataIndexed ''YieldingRedeemer [('YieldingRedeemer, 0)]