{- |
Module      : Singular.Registry.Wire.Redeemer
Description : Mint, update, and pinned-hook consumer redeemers
License     : Apache-2.0

What the registry scripts read as redeemers: the migration parameters,
the minting redeemer, the per-request actions inside a modify, the
spending redeemer — and the pinned-hook consumer redeemer, which is
encode-only by construction. Reads "Singular.Registry.Wire.Primitive"
and "Singular.Registry.Wire.Proof"; nothing here is importable by a
caller — the public surface is the "Singular.Registry.Types" facade.
-}
module Singular.Registry.Wire.Redeemer
    ( -- * On-chain datum / redeemer wrappers
      Migration (..)
    , MintRedeemer (..)
    , RequestAction (..)
    , UpdateRedeemer (..)

      -- * Pinned-hook consumer redeemer (NOTE-021)
    , ConsumerRedeemer (..)
    ) where

import PlutusCore.Data (Data (..))
import PlutusTx.Builtins.Internal
    ( BuiltinByteString (..)
    )
import PlutusTx.IsData.Class
    ( FromData (..)
    , ToData (..)
    , UnsafeFromData (..)
    )
import Singular.Registry.Wire.Primitive
    ( OnChainTokenId (..)
    , OnChainTxOutRef (..)
    , bbsFromD
    , bbsToD
    , mkD
    , unD
    )
import Singular.Registry.Wire.Proof
    ( ProofStep (..)
    )

{- | Migration parameters. Matches Aiken
@types\/Migration@.
-}
data Migration = Migration
    { Migration -> BuiltinByteString
migrationOldPolicy :: !BuiltinByteString
    -- ^ Policy ID of the old cage validator
    , Migration -> OnChainTokenId
migrationTokenId :: !OnChainTokenId
    -- ^ Token being migrated to the new policy
    }
    deriving stock (Int -> Migration -> ShowS
[Migration] -> ShowS
Migration -> String
(Int -> Migration -> ShowS)
-> (Migration -> String)
-> ([Migration] -> ShowS)
-> Show Migration
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Migration -> ShowS
showsPrec :: Int -> Migration -> ShowS
$cshow :: Migration -> String
show :: Migration -> String
$cshowList :: [Migration] -> ShowS
showList :: [Migration] -> ShowS
Show, Migration -> Migration -> Bool
(Migration -> Migration -> Bool)
-> (Migration -> Migration -> Bool) -> Eq Migration
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Migration -> Migration -> Bool
== :: Migration -> Migration -> Bool
$c/= :: Migration -> Migration -> Bool
/= :: Migration -> Migration -> Bool
Eq)

{- | Minting redeemer. Matches Aiken
@types\/MintRedeemer@.

The seed @OutputReference@ that authorizes a fresh
mint and derives the asset name is carried by the
redeemer because the state validator is global and
unparameterized.
-}
data MintRedeemer
    = -- | Mint a new cage token (Constr 0)
      Minting !OnChainTxOutRef
    | -- | Migrate from old validator (Constr 1)
      Migrating !Migration
    | -- | Burn a cage token (Constr 2)
      Burning !OnChainTokenId
    deriving stock (Int -> MintRedeemer -> ShowS
[MintRedeemer] -> ShowS
MintRedeemer -> String
(Int -> MintRedeemer -> ShowS)
-> (MintRedeemer -> String)
-> ([MintRedeemer] -> ShowS)
-> Show MintRedeemer
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MintRedeemer -> ShowS
showsPrec :: Int -> MintRedeemer -> ShowS
$cshow :: MintRedeemer -> String
show :: MintRedeemer -> String
$cshowList :: [MintRedeemer] -> ShowS
showList :: [MintRedeemer] -> ShowS
Show, MintRedeemer -> MintRedeemer -> Bool
(MintRedeemer -> MintRedeemer -> Bool)
-> (MintRedeemer -> MintRedeemer -> Bool) -> Eq MintRedeemer
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MintRedeemer -> MintRedeemer -> Bool
== :: MintRedeemer -> MintRedeemer -> Bool
$c/= :: MintRedeemer -> MintRedeemer -> Bool
/= :: MintRedeemer -> MintRedeemer -> Bool
Eq)

{- | Per-request action in a 'Modify' redeemer.
Matches Aiken @types\/RequestAction@.
-}
data RequestAction
    = -- | Update with Merkle proof (Constr 0)
      Update ![ProofStep]
    | -- | Reject expired request (Constr 1)
      Rejected
    deriving stock (Int -> RequestAction -> ShowS
[RequestAction] -> ShowS
RequestAction -> String
(Int -> RequestAction -> ShowS)
-> (RequestAction -> String)
-> ([RequestAction] -> ShowS)
-> Show RequestAction
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RequestAction -> ShowS
showsPrec :: Int -> RequestAction -> ShowS
$cshow :: RequestAction -> String
show :: RequestAction -> String
$cshowList :: [RequestAction] -> ShowS
showList :: [RequestAction] -> ShowS
Show, RequestAction -> RequestAction -> Bool
(RequestAction -> RequestAction -> Bool)
-> (RequestAction -> RequestAction -> Bool) -> Eq RequestAction
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: RequestAction -> RequestAction -> Bool
== :: RequestAction -> RequestAction -> Bool
$c/= :: RequestAction -> RequestAction -> Bool
/= :: RequestAction -> RequestAction -> Bool
Eq)

{- | Spending redeemer. Matches Aiken
@types\/UpdateRedeemer@.

@Sweep stateRef@ is refused for every party (operator ruling
NOTE-028/A-003); the constructor stays for the wire shape.
-}
data UpdateRedeemer
    = -- | End the token (Constr 0)
      End
    | -- | Link a request to a state UTxO (Constr 1)
      Contribute !OnChainTxOutRef
    | -- | Process requests with mixed actions (Constr 2)
      Modify ![RequestAction]
    | -- | Reclaim a pending request (Constr 3)
      Retract !OnChainTxOutRef
    | {- | Reclaim a non-legitimate UTxO at the cage's
      address (Constr 4). Owner-signed.
      -}
      Sweep !OnChainTxOutRef
    deriving stock (Int -> UpdateRedeemer -> ShowS
[UpdateRedeemer] -> ShowS
UpdateRedeemer -> String
(Int -> UpdateRedeemer -> ShowS)
-> (UpdateRedeemer -> String)
-> ([UpdateRedeemer] -> ShowS)
-> Show UpdateRedeemer
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UpdateRedeemer -> ShowS
showsPrec :: Int -> UpdateRedeemer -> ShowS
$cshow :: UpdateRedeemer -> String
show :: UpdateRedeemer -> String
$cshowList :: [UpdateRedeemer] -> ShowS
showList :: [UpdateRedeemer] -> ShowS
Show, UpdateRedeemer -> UpdateRedeemer -> Bool
(UpdateRedeemer -> UpdateRedeemer -> Bool)
-> (UpdateRedeemer -> UpdateRedeemer -> Bool) -> Eq UpdateRedeemer
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UpdateRedeemer -> UpdateRedeemer -> Bool
== :: UpdateRedeemer -> UpdateRedeemer -> Bool
$c/= :: UpdateRedeemer -> UpdateRedeemer -> Bool
/= :: UpdateRedeemer -> UpdateRedeemer -> Bool
Eq)

{- | Pinned-hook consumer redeemer (NOTE-021): a nullary hook. The
consumer authenticates the batch from the transaction's own evidence
(spent state, request datums, naming claims, mint field) — the redeemer
carries nothing because nothing caller-supplied is trusted. Encodes as
@Constr 0 []@.
-}
data ConsumerRedeemer
    = Hook
    deriving stock (Int -> ConsumerRedeemer -> ShowS
[ConsumerRedeemer] -> ShowS
ConsumerRedeemer -> String
(Int -> ConsumerRedeemer -> ShowS)
-> (ConsumerRedeemer -> String)
-> ([ConsumerRedeemer] -> ShowS)
-> Show ConsumerRedeemer
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ConsumerRedeemer -> ShowS
showsPrec :: Int -> ConsumerRedeemer -> ShowS
$cshow :: ConsumerRedeemer -> String
show :: ConsumerRedeemer -> String
$cshowList :: [ConsumerRedeemer] -> ShowS
showList :: [ConsumerRedeemer] -> ShowS
Show, ConsumerRedeemer -> ConsumerRedeemer -> Bool
(ConsumerRedeemer -> ConsumerRedeemer -> Bool)
-> (ConsumerRedeemer -> ConsumerRedeemer -> Bool)
-> Eq ConsumerRedeemer
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ConsumerRedeemer -> ConsumerRedeemer -> Bool
== :: ConsumerRedeemer -> ConsumerRedeemer -> Bool
$c/= :: ConsumerRedeemer -> ConsumerRedeemer -> Bool
/= :: ConsumerRedeemer -> ConsumerRedeemer -> Bool
Eq)

-- ---------------------------------------------------------
-- ToData / FromData instances
-- ---------------------------------------------------------

instance ToData Migration where
    toBuiltinData :: Migration -> BuiltinData
toBuiltinData Migration{BuiltinByteString
OnChainTokenId
migrationOldPolicy :: Migration -> BuiltinByteString
migrationTokenId :: Migration -> OnChainTokenId
migrationOldPolicy :: BuiltinByteString
migrationTokenId :: OnChainTokenId
..} =
        Data -> BuiltinData
mkD (Data -> BuiltinData) -> Data -> BuiltinData
forall a b. (a -> b) -> a -> b
$
            Integer -> [Data] -> Data
Constr
                Integer
0
                [ BuiltinByteString -> Data
bbsToD BuiltinByteString
migrationOldPolicy
                , BuiltinData -> Data
unD
                    (OnChainTokenId -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData OnChainTokenId
migrationTokenId)
                ]

instance FromData Migration where
    fromBuiltinData :: BuiltinData -> Maybe Migration
fromBuiltinData BuiltinData
bd = case BuiltinData -> Data
unD BuiltinData
bd of
        Constr Integer
0 [Data
pol, Data
tid] -> do
            migrationOldPolicy <- Data -> Maybe BuiltinByteString
bbsFromD Data
pol
            migrationTokenId <-
                fromBuiltinData (mkD tid)
            Just Migration{..}
        Data
_ -> Maybe Migration
forall a. Maybe a
Nothing

instance UnsafeFromData Migration where
    unsafeFromBuiltinData :: BuiltinData -> Migration
unsafeFromBuiltinData BuiltinData
bd = case BuiltinData -> Data
unD BuiltinData
bd of
        Constr Integer
0 [B ByteString
pol, Data
tid] ->
            Migration
                { migrationOldPolicy :: BuiltinByteString
migrationOldPolicy =
                    ByteString -> BuiltinByteString
BuiltinByteString ByteString
pol
                , migrationTokenId :: OnChainTokenId
migrationTokenId =
                    BuiltinData -> OnChainTokenId
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData (Data -> BuiltinData
mkD Data
tid)
                }
        Data
_ ->
            String -> Migration
forall a. HasCallStack => String -> a
error
                String
"unsafeFromBuiltinData: Migration"

instance ToData MintRedeemer where
    toBuiltinData :: MintRedeemer -> BuiltinData
toBuiltinData (Minting OnChainTxOutRef
ref) =
        Data -> BuiltinData
mkD (Data -> BuiltinData) -> Data -> BuiltinData
forall a b. (a -> b) -> a -> b
$ Integer -> [Data] -> Data
Constr Integer
0 [BuiltinData -> Data
unD (OnChainTxOutRef -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData OnChainTxOutRef
ref)]
    toBuiltinData (Migrating Migration
m) =
        Data -> BuiltinData
mkD (Data -> BuiltinData) -> Data -> BuiltinData
forall a b. (a -> b) -> a -> b
$ Integer -> [Data] -> Data
Constr Integer
1 [BuiltinData -> Data
unD (Migration -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData Migration
m)]
    toBuiltinData (Burning OnChainTokenId
tokenId) =
        Data -> BuiltinData
mkD (Data -> BuiltinData) -> Data -> BuiltinData
forall a b. (a -> b) -> a -> b
$ Integer -> [Data] -> Data
Constr Integer
2 [BuiltinData -> Data
unD (OnChainTokenId -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData OnChainTokenId
tokenId)]

instance FromData MintRedeemer where
    fromBuiltinData :: BuiltinData -> Maybe MintRedeemer
fromBuiltinData BuiltinData
bd = case BuiltinData -> Data
unD BuiltinData
bd of
        Constr Integer
0 [Data
d] -> OnChainTxOutRef -> MintRedeemer
Minting (OnChainTxOutRef -> MintRedeemer)
-> Maybe OnChainTxOutRef -> Maybe MintRedeemer
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BuiltinData -> Maybe OnChainTxOutRef
forall a. FromData a => BuiltinData -> Maybe a
fromBuiltinData (Data -> BuiltinData
mkD Data
d)
        Constr Integer
1 [Data
d] ->
            Migration -> MintRedeemer
Migrating (Migration -> MintRedeemer)
-> Maybe Migration -> Maybe MintRedeemer
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BuiltinData -> Maybe Migration
forall a. FromData a => BuiltinData -> Maybe a
fromBuiltinData (Data -> BuiltinData
mkD Data
d)
        Constr Integer
2 [Data
d] -> OnChainTokenId -> MintRedeemer
Burning (OnChainTokenId -> MintRedeemer)
-> Maybe OnChainTokenId -> Maybe MintRedeemer
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BuiltinData -> Maybe OnChainTokenId
forall a. FromData a => BuiltinData -> Maybe a
fromBuiltinData (Data -> BuiltinData
mkD Data
d)
        Data
_ -> Maybe MintRedeemer
forall a. Maybe a
Nothing

instance UnsafeFromData MintRedeemer where
    unsafeFromBuiltinData :: BuiltinData -> MintRedeemer
unsafeFromBuiltinData BuiltinData
bd = case BuiltinData -> Data
unD BuiltinData
bd of
        Constr Integer
0 [Data
d] ->
            OnChainTxOutRef -> MintRedeemer
Minting (OnChainTxOutRef -> MintRedeemer)
-> OnChainTxOutRef -> MintRedeemer
forall a b. (a -> b) -> a -> b
$
                BuiltinData -> OnChainTxOutRef
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData (Data -> BuiltinData
mkD Data
d)
        Constr Integer
1 [Data
d] ->
            Migration -> MintRedeemer
Migrating (Migration -> MintRedeemer) -> Migration -> MintRedeemer
forall a b. (a -> b) -> a -> b
$
                BuiltinData -> Migration
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData (Data -> BuiltinData
mkD Data
d)
        Constr Integer
2 [Data
d] ->
            OnChainTokenId -> MintRedeemer
Burning (OnChainTokenId -> MintRedeemer) -> OnChainTokenId -> MintRedeemer
forall a b. (a -> b) -> a -> b
$
                BuiltinData -> OnChainTokenId
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData (Data -> BuiltinData
mkD Data
d)
        Data
_ ->
            String -> MintRedeemer
forall a. HasCallStack => String -> a
error
                String
"unsafeFromBuiltinData: MintRedeemer"

instance ToData RequestAction where
    toBuiltinData :: RequestAction -> BuiltinData
toBuiltinData (Update [ProofStep]
steps) =
        Data -> BuiltinData
mkD (Data -> BuiltinData) -> Data -> BuiltinData
forall a b. (a -> b) -> a -> b
$
            Integer -> [Data] -> Data
Constr
                Integer
0
                [ [Data] -> Data
List ([Data] -> Data) -> [Data] -> Data
forall a b. (a -> b) -> a -> b
$
                    (ProofStep -> Data) -> [ProofStep] -> [Data]
forall a b. (a -> b) -> [a] -> [b]
map (BuiltinData -> Data
unD (BuiltinData -> Data)
-> (ProofStep -> BuiltinData) -> ProofStep -> Data
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProofStep -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData) [ProofStep]
steps
                ]
    toBuiltinData RequestAction
Rejected = Data -> BuiltinData
mkD (Data -> BuiltinData) -> Data -> BuiltinData
forall a b. (a -> b) -> a -> b
$ Integer -> [Data] -> Data
Constr Integer
1 []

instance FromData RequestAction where
    fromBuiltinData :: BuiltinData -> Maybe RequestAction
fromBuiltinData BuiltinData
bd = case BuiltinData -> Data
unD BuiltinData
bd of
        Constr Integer
0 [List [Data]
steps] ->
            [ProofStep] -> RequestAction
Update
                ([ProofStep] -> RequestAction)
-> Maybe [ProofStep] -> Maybe RequestAction
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Data -> Maybe ProofStep) -> [Data] -> Maybe [ProofStep]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse
                    (BuiltinData -> Maybe ProofStep
forall a. FromData a => BuiltinData -> Maybe a
fromBuiltinData (BuiltinData -> Maybe ProofStep)
-> (Data -> BuiltinData) -> Data -> Maybe ProofStep
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Data -> BuiltinData
mkD)
                    [Data]
steps
        Constr Integer
1 [] -> RequestAction -> Maybe RequestAction
forall a. a -> Maybe a
Just RequestAction
Rejected
        Data
_ -> Maybe RequestAction
forall a. Maybe a
Nothing

instance UnsafeFromData RequestAction where
    unsafeFromBuiltinData :: BuiltinData -> RequestAction
unsafeFromBuiltinData BuiltinData
bd = case BuiltinData -> Data
unD BuiltinData
bd of
        Constr Integer
0 [List [Data]
steps] ->
            [ProofStep] -> RequestAction
Update ([ProofStep] -> RequestAction) -> [ProofStep] -> RequestAction
forall a b. (a -> b) -> a -> b
$
                (Data -> ProofStep) -> [Data] -> [ProofStep]
forall a b. (a -> b) -> [a] -> [b]
map
                    (BuiltinData -> ProofStep
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData (BuiltinData -> ProofStep)
-> (Data -> BuiltinData) -> Data -> ProofStep
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Data -> BuiltinData
mkD)
                    [Data]
steps
        Constr Integer
1 [] -> RequestAction
Rejected
        Data
_ ->
            String -> RequestAction
forall a. HasCallStack => String -> a
error
                String
"unsafeFromBuiltinData:\
                \ RequestAction"

instance ToData UpdateRedeemer where
    toBuiltinData :: UpdateRedeemer -> BuiltinData
toBuiltinData UpdateRedeemer
End = Data -> BuiltinData
mkD (Data -> BuiltinData) -> Data -> BuiltinData
forall a b. (a -> b) -> a -> b
$ Integer -> [Data] -> Data
Constr Integer
0 []
    toBuiltinData (Contribute OnChainTxOutRef
ref) =
        Data -> BuiltinData
mkD (Data -> BuiltinData) -> Data -> BuiltinData
forall a b. (a -> b) -> a -> b
$ Integer -> [Data] -> Data
Constr Integer
1 [BuiltinData -> Data
unD (OnChainTxOutRef -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData OnChainTxOutRef
ref)]
    toBuiltinData (Modify [RequestAction]
actions) =
        Data -> BuiltinData
mkD (Data -> BuiltinData) -> Data -> BuiltinData
forall a b. (a -> b) -> a -> b
$
            Integer -> [Data] -> Data
Constr
                Integer
2
                [ [Data] -> Data
List ([Data] -> Data) -> [Data] -> Data
forall a b. (a -> b) -> a -> b
$
                    (RequestAction -> Data) -> [RequestAction] -> [Data]
forall a b. (a -> b) -> [a] -> [b]
map (BuiltinData -> Data
unD (BuiltinData -> Data)
-> (RequestAction -> BuiltinData) -> RequestAction -> Data
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RequestAction -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData) [RequestAction]
actions
                ]
    toBuiltinData (Retract OnChainTxOutRef
ref) =
        Data -> BuiltinData
mkD (Data -> BuiltinData) -> Data -> BuiltinData
forall a b. (a -> b) -> a -> b
$ Integer -> [Data] -> Data
Constr Integer
3 [BuiltinData -> Data
unD (OnChainTxOutRef -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData OnChainTxOutRef
ref)]
    toBuiltinData (Sweep OnChainTxOutRef
ref) =
        Data -> BuiltinData
mkD (Data -> BuiltinData) -> Data -> BuiltinData
forall a b. (a -> b) -> a -> b
$ Integer -> [Data] -> Data
Constr Integer
4 [BuiltinData -> Data
unD (OnChainTxOutRef -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData OnChainTxOutRef
ref)]

instance FromData UpdateRedeemer where
    fromBuiltinData :: BuiltinData -> Maybe UpdateRedeemer
fromBuiltinData BuiltinData
bd = case BuiltinData -> Data
unD BuiltinData
bd of
        Constr Integer
0 [] -> UpdateRedeemer -> Maybe UpdateRedeemer
forall a. a -> Maybe a
Just UpdateRedeemer
End
        Constr Integer
1 [Data
d] ->
            OnChainTxOutRef -> UpdateRedeemer
Contribute (OnChainTxOutRef -> UpdateRedeemer)
-> Maybe OnChainTxOutRef -> Maybe UpdateRedeemer
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BuiltinData -> Maybe OnChainTxOutRef
forall a. FromData a => BuiltinData -> Maybe a
fromBuiltinData (Data -> BuiltinData
mkD Data
d)
        Constr Integer
2 [List [Data]
as] ->
            [RequestAction] -> UpdateRedeemer
Modify
                ([RequestAction] -> UpdateRedeemer)
-> Maybe [RequestAction] -> Maybe UpdateRedeemer
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Data -> Maybe RequestAction) -> [Data] -> Maybe [RequestAction]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse
                    (BuiltinData -> Maybe RequestAction
forall a. FromData a => BuiltinData -> Maybe a
fromBuiltinData (BuiltinData -> Maybe RequestAction)
-> (Data -> BuiltinData) -> Data -> Maybe RequestAction
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Data -> BuiltinData
mkD)
                    [Data]
as
        Constr Integer
3 [Data
d] ->
            OnChainTxOutRef -> UpdateRedeemer
Retract (OnChainTxOutRef -> UpdateRedeemer)
-> Maybe OnChainTxOutRef -> Maybe UpdateRedeemer
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BuiltinData -> Maybe OnChainTxOutRef
forall a. FromData a => BuiltinData -> Maybe a
fromBuiltinData (Data -> BuiltinData
mkD Data
d)
        Constr Integer
4 [Data
d] ->
            OnChainTxOutRef -> UpdateRedeemer
Sweep (OnChainTxOutRef -> UpdateRedeemer)
-> Maybe OnChainTxOutRef -> Maybe UpdateRedeemer
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BuiltinData -> Maybe OnChainTxOutRef
forall a. FromData a => BuiltinData -> Maybe a
fromBuiltinData (Data -> BuiltinData
mkD Data
d)
        Data
_ -> Maybe UpdateRedeemer
forall a. Maybe a
Nothing

instance UnsafeFromData UpdateRedeemer where
    unsafeFromBuiltinData :: BuiltinData -> UpdateRedeemer
unsafeFromBuiltinData BuiltinData
bd = case BuiltinData -> Data
unD BuiltinData
bd of
        Constr Integer
0 [] -> UpdateRedeemer
End
        Constr Integer
1 [Data
d] ->
            OnChainTxOutRef -> UpdateRedeemer
Contribute (OnChainTxOutRef -> UpdateRedeemer)
-> OnChainTxOutRef -> UpdateRedeemer
forall a b. (a -> b) -> a -> b
$
                BuiltinData -> OnChainTxOutRef
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData (Data -> BuiltinData
mkD Data
d)
        Constr Integer
2 [List [Data]
as] ->
            [RequestAction] -> UpdateRedeemer
Modify ([RequestAction] -> UpdateRedeemer)
-> [RequestAction] -> UpdateRedeemer
forall a b. (a -> b) -> a -> b
$
                (Data -> RequestAction) -> [Data] -> [RequestAction]
forall a b. (a -> b) -> [a] -> [b]
map
                    (BuiltinData -> RequestAction
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData (BuiltinData -> RequestAction)
-> (Data -> BuiltinData) -> Data -> RequestAction
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Data -> BuiltinData
mkD)
                    [Data]
as
        Constr Integer
3 [Data
d] ->
            OnChainTxOutRef -> UpdateRedeemer
Retract (OnChainTxOutRef -> UpdateRedeemer)
-> OnChainTxOutRef -> UpdateRedeemer
forall a b. (a -> b) -> a -> b
$
                BuiltinData -> OnChainTxOutRef
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData (Data -> BuiltinData
mkD Data
d)
        Constr Integer
4 [Data
d] ->
            OnChainTxOutRef -> UpdateRedeemer
Sweep (OnChainTxOutRef -> UpdateRedeemer)
-> OnChainTxOutRef -> UpdateRedeemer
forall a b. (a -> b) -> a -> b
$
                BuiltinData -> OnChainTxOutRef
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData (Data -> BuiltinData
mkD Data
d)
        Data
_ ->
            String -> UpdateRedeemer
forall a. HasCallStack => String -> a
error
                String
"unsafeFromBuiltinData:\
                \ UpdateRedeemer"

instance ToData ConsumerRedeemer where
    toBuiltinData :: ConsumerRedeemer -> BuiltinData
toBuiltinData ConsumerRedeemer
Hook = Data -> BuiltinData
mkD (Data -> BuiltinData) -> Data -> BuiltinData
forall a b. (a -> b) -> a -> b
$ Integer -> [Data] -> Data
Constr Integer
0 []