-- | This module provide primitives to transform certificates from our skeleton
-- to certificate in Cardano transaction bodies.
module Cooked.MockChain.GenerateTx.Certificate (toCertificates) where

import Cardano.Api qualified as Cardano
import Cardano.Ledger.Conway.TxCert qualified as Conway
import Cardano.Ledger.DRep qualified as Ledger
import Cardano.Ledger.PoolParams qualified as Ledger
import Cardano.Ledger.Shelley.TxCert qualified as Shelley
import Cardano.Node.Emulator.Internal.Node qualified as Emulator
import Cooked.MockChain.BlockChain
import Cooked.MockChain.GenerateTx.Witness
import Cooked.Skeleton.Certificate
import Cooked.Skeleton.User
import Data.Default
import Data.Maybe.Strict
import Optics.Core
import Plutus.Script.Utils.Address qualified as Script
import PlutusLedgerApi.V3 qualified as Api

toDRep :: (MonadBlockChainBalancing m) => Api.DRep -> m Ledger.DRep
toDRep :: forall (m :: * -> *). MonadBlockChainBalancing m => DRep -> m DRep
toDRep DRep
Api.DRepAlwaysAbstain = DRep -> m DRep
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return DRep
Ledger.DRepAlwaysAbstain
toDRep DRep
Api.DRepAlwaysNoConfidence = DRep -> m DRep
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return DRep
Ledger.DRepAlwaysNoConfidence
toDRep (Api.DRep (Api.DRepCredential Credential
cred)) = Credential 'DRepRole -> DRep
Ledger.DRepCredential (Credential 'DRepRole -> DRep)
-> m (Credential 'DRepRole) -> m DRep
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Credential -> m (Credential 'DRepRole)
forall (m :: * -> *).
MonadBlockChainBalancing m =>
Credential -> m (Credential 'DRepRole)
toDRepCredential Credential
cred

toDelegatee :: (MonadBlockChainBalancing m) => Api.Delegatee -> m Conway.Delegatee
toDelegatee :: forall (m :: * -> *).
MonadBlockChainBalancing m =>
Delegatee -> m Delegatee
toDelegatee (Api.DelegStake PubKeyHash
pkh) = KeyHash 'StakePool -> Delegatee
Conway.DelegStake (KeyHash 'StakePool -> Delegatee)
-> m (KeyHash 'StakePool) -> m Delegatee
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PubKeyHash -> m (KeyHash 'StakePool)
forall (m :: * -> *).
MonadBlockChainBalancing m =>
PubKeyHash -> m (KeyHash 'StakePool)
toStakePoolKeyHash PubKeyHash
pkh
toDelegatee (Api.DelegVote DRep
dRep) = DRep -> Delegatee
Conway.DelegVote (DRep -> Delegatee) -> m DRep -> m Delegatee
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> DRep -> m DRep
forall (m :: * -> *). MonadBlockChainBalancing m => DRep -> m DRep
toDRep DRep
dRep
toDelegatee (Api.DelegStakeVote PubKeyHash
pkh DRep
dRep) = (KeyHash 'StakePool -> DRep -> Delegatee)
-> m (KeyHash 'StakePool) -> m DRep -> m Delegatee
forall a b c. (a -> b -> c) -> m a -> m b -> m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 KeyHash 'StakePool -> DRep -> Delegatee
Conway.DelegStakeVote (PubKeyHash -> m (KeyHash 'StakePool)
forall (m :: * -> *).
MonadBlockChainBalancing m =>
PubKeyHash -> m (KeyHash 'StakePool)
toStakePoolKeyHash PubKeyHash
pkh) (DRep -> m DRep
forall (m :: * -> *). MonadBlockChainBalancing m => DRep -> m DRep
toDRep DRep
dRep)

toCertificate :: (MonadBlockChainBalancing m) => TxSkelCertificate -> m (Cardano.Certificate Cardano.ConwayEra)
toCertificate :: forall (m :: * -> *).
MonadBlockChainBalancing m =>
TxSkelCertificate -> m (Certificate ConwayEra)
toCertificate TxSkelCertificate
txSkelCert =
  do
    Coin
depositStake <- Integer -> Coin
Cardano.Coin (Integer -> Coin) -> (Lovelace -> Integer) -> Lovelace -> Coin
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Lovelace -> Integer
Api.getLovelace (Lovelace -> Coin) -> m Lovelace -> m Coin
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m Lovelace
forall (m :: * -> *). MonadBlockChainBalancing m => m Lovelace
stakeAddressDeposit
    Coin
depositDRep <- Integer -> Coin
Cardano.Coin (Integer -> Coin) -> (Lovelace -> Integer) -> Lovelace -> Coin
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Lovelace -> Integer
Api.getLovelace (Lovelace -> Coin) -> m Lovelace -> m Coin
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m Lovelace
forall (m :: * -> *). MonadBlockChainBalancing m => m Lovelace
dRepDeposit
    ConwayEraOnwards ConwayEra
-> ConwayTxCert (ShelleyLedgerEra ConwayEra)
-> Certificate ConwayEra
forall era.
Typeable era =>
ConwayEraOnwards era
-> ConwayTxCert (ShelleyLedgerEra era) -> Certificate era
Cardano.ConwayCertificate ConwayEraOnwards ConwayEra
Cardano.ConwayEraOnwardsConway (ConwayTxCert ConwayEra -> Certificate ConwayEra)
-> m (ConwayTxCert ConwayEra) -> m (Certificate ConwayEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> case TxSkelCertificate
txSkelCert of
      TxSkelCertificate (User kind 'Redemption -> Credential
forall a. ToCredential a => a -> Credential
Script.toCredential -> Credential
cred) CertificateAction kind
StakingRegister ->
        ConwayDelegCert -> ConwayTxCert ConwayEra
forall era. ConwayDelegCert -> ConwayTxCert era
Conway.ConwayTxCertDeleg (ConwayDelegCert -> ConwayTxCert ConwayEra)
-> (StakeCredential -> ConwayDelegCert)
-> StakeCredential
-> ConwayTxCert ConwayEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StakeCredential -> StrictMaybe Coin -> ConwayDelegCert
`Conway.ConwayRegCert` Coin -> StrictMaybe Coin
forall a. a -> StrictMaybe a
SJust Coin
depositStake) (StakeCredential -> ConwayTxCert ConwayEra)
-> m StakeCredential -> m (ConwayTxCert ConwayEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Credential -> m StakeCredential
forall (m :: * -> *).
MonadBlockChainBalancing m =>
Credential -> m StakeCredential
toStakeCredential Credential
cred
      TxSkelCertificate (User kind 'Redemption -> Credential
forall a. ToCredential a => a -> Credential
Script.toCredential -> Credential
cred) CertificateAction kind
StakingUnRegister ->
        ConwayDelegCert -> ConwayTxCert ConwayEra
forall era. ConwayDelegCert -> ConwayTxCert era
Conway.ConwayTxCertDeleg (ConwayDelegCert -> ConwayTxCert ConwayEra)
-> (StakeCredential -> ConwayDelegCert)
-> StakeCredential
-> ConwayTxCert ConwayEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StakeCredential -> StrictMaybe Coin -> ConwayDelegCert
`Conway.ConwayUnRegCert` Coin -> StrictMaybe Coin
forall a. a -> StrictMaybe a
SJust Coin
depositStake) (StakeCredential -> ConwayTxCert ConwayEra)
-> m StakeCredential -> m (ConwayTxCert ConwayEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Credential -> m StakeCredential
forall (m :: * -> *).
MonadBlockChainBalancing m =>
Credential -> m StakeCredential
toStakeCredential Credential
cred
      TxSkelCertificate (User kind 'Redemption -> Credential
forall a. ToCredential a => a -> Credential
Script.toCredential -> Credential
cred) (StakingDelegate Delegatee
delegatee) ->
        ConwayDelegCert -> ConwayTxCert ConwayEra
forall era. ConwayDelegCert -> ConwayTxCert era
Conway.ConwayTxCertDeleg (ConwayDelegCert -> ConwayTxCert ConwayEra)
-> m ConwayDelegCert -> m (ConwayTxCert ConwayEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (StakeCredential -> Delegatee -> ConwayDelegCert)
-> m StakeCredential -> m Delegatee -> m ConwayDelegCert
forall a b c. (a -> b -> c) -> m a -> m b -> m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 StakeCredential -> Delegatee -> ConwayDelegCert
Conway.ConwayDelegCert (Credential -> m StakeCredential
forall (m :: * -> *).
MonadBlockChainBalancing m =>
Credential -> m StakeCredential
toStakeCredential Credential
cred) (Delegatee -> m Delegatee
forall (m :: * -> *).
MonadBlockChainBalancing m =>
Delegatee -> m Delegatee
toDelegatee Delegatee
delegatee)
      TxSkelCertificate (User kind 'Redemption -> Credential
forall a. ToCredential a => a -> Credential
Script.toCredential -> Credential
cred) (StakingRegisterDelegate Delegatee
delegatee) ->
        ConwayDelegCert -> ConwayTxCert ConwayEra
forall era. ConwayDelegCert -> ConwayTxCert era
Conway.ConwayTxCertDeleg (ConwayDelegCert -> ConwayTxCert ConwayEra)
-> ((Coin -> ConwayDelegCert) -> ConwayDelegCert)
-> (Coin -> ConwayDelegCert)
-> ConwayTxCert ConwayEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Coin
depositStake Coin -> (Coin -> ConwayDelegCert) -> ConwayDelegCert
forall a b. a -> (a -> b) -> b
&) ((Coin -> ConwayDelegCert) -> ConwayTxCert ConwayEra)
-> m (Coin -> ConwayDelegCert) -> m (ConwayTxCert ConwayEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (StakeCredential -> Delegatee -> Coin -> ConwayDelegCert)
-> m StakeCredential -> m Delegatee -> m (Coin -> ConwayDelegCert)
forall a b c. (a -> b -> c) -> m a -> m b -> m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 StakeCredential -> Delegatee -> Coin -> ConwayDelegCert
Conway.ConwayRegDelegCert (Credential -> m StakeCredential
forall (m :: * -> *).
MonadBlockChainBalancing m =>
Credential -> m StakeCredential
toStakeCredential Credential
cred) (Delegatee -> m Delegatee
forall (m :: * -> *).
MonadBlockChainBalancing m =>
Delegatee -> m Delegatee
toDelegatee Delegatee
delegatee)
      TxSkelCertificate (User kind 'Redemption -> Credential
forall a. ToCredential a => a -> Credential
Script.toCredential -> Credential
cred) CertificateAction kind
DRepRegister ->
        ConwayGovCert -> ConwayTxCert ConwayEra
forall era. ConwayGovCert -> ConwayTxCert era
Conway.ConwayTxCertGov (ConwayGovCert -> ConwayTxCert ConwayEra)
-> (Credential 'DRepRole -> ConwayGovCert)
-> Credential 'DRepRole
-> ConwayTxCert ConwayEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (\Credential 'DRepRole
c -> Credential 'DRepRole -> Coin -> StrictMaybe Anchor -> ConwayGovCert
Conway.ConwayRegDRep Credential 'DRepRole
c Coin
depositDRep StrictMaybe Anchor
forall a. StrictMaybe a
SNothing) (Credential 'DRepRole -> ConwayTxCert ConwayEra)
-> m (Credential 'DRepRole) -> m (ConwayTxCert ConwayEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Credential -> m (Credential 'DRepRole)
forall (m :: * -> *).
MonadBlockChainBalancing m =>
Credential -> m (Credential 'DRepRole)
toDRepCredential Credential
cred
      TxSkelCertificate (User kind 'Redemption -> Credential
forall a. ToCredential a => a -> Credential
Script.toCredential -> Credential
cred) CertificateAction kind
DRepUpdate ->
        ConwayGovCert -> ConwayTxCert ConwayEra
forall era. ConwayGovCert -> ConwayTxCert era
Conway.ConwayTxCertGov (ConwayGovCert -> ConwayTxCert ConwayEra)
-> (Credential 'DRepRole -> ConwayGovCert)
-> Credential 'DRepRole
-> ConwayTxCert ConwayEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Credential 'DRepRole -> StrictMaybe Anchor -> ConwayGovCert
`Conway.ConwayUpdateDRep` StrictMaybe Anchor
forall a. StrictMaybe a
SNothing) (Credential 'DRepRole -> ConwayTxCert ConwayEra)
-> m (Credential 'DRepRole) -> m (ConwayTxCert ConwayEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Credential -> m (Credential 'DRepRole)
forall (m :: * -> *).
MonadBlockChainBalancing m =>
Credential -> m (Credential 'DRepRole)
toDRepCredential Credential
cred
      TxSkelCertificate (User kind 'Redemption -> Credential
forall a. ToCredential a => a -> Credential
Script.toCredential -> Credential
cred) CertificateAction kind
DRepUnRegister ->
        ConwayGovCert -> ConwayTxCert ConwayEra
forall era. ConwayGovCert -> ConwayTxCert era
Conway.ConwayTxCertGov (ConwayGovCert -> ConwayTxCert ConwayEra)
-> (Credential 'DRepRole -> ConwayGovCert)
-> Credential 'DRepRole
-> ConwayTxCert ConwayEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Credential 'DRepRole -> Coin -> ConwayGovCert
`Conway.ConwayUnRegDRep` Coin
depositDRep) (Credential 'DRepRole -> ConwayTxCert ConwayEra)
-> m (Credential 'DRepRole) -> m (ConwayTxCert ConwayEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Credential -> m (Credential 'DRepRole)
forall (m :: * -> *).
MonadBlockChainBalancing m =>
Credential -> m (Credential 'DRepRole)
toDRepCredential Credential
cred
      -- TODO: For now, when registering a new pool we use the default parameters
      -- excepct for the pool id and pool vrf. We could change it later on.
      TxSkelCertificate (UserPubKey (pkh -> PubKeyHash
forall a. ToPubKeyHash a => a -> PubKeyHash
Script.toPubKeyHash -> PubKeyHash
poolHash)) (PoolRegister PubKeyHash
poolVrf) ->
        PoolCert -> ConwayTxCert ConwayEra
forall era. PoolCert -> ConwayTxCert era
Conway.ConwayTxCertPool (PoolCert -> ConwayTxCert ConwayEra)
-> (PoolParams -> PoolCert) -> PoolParams -> ConwayTxCert ConwayEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PoolParams -> PoolCert
Shelley.RegPool
          (PoolParams -> ConwayTxCert ConwayEra)
-> m PoolParams -> m (ConwayTxCert ConwayEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (KeyHash 'StakePool -> VRFVerKeyHash 'StakePoolVRF -> PoolParams)
-> m (KeyHash 'StakePool)
-> m (VRFVerKeyHash 'StakePoolVRF)
-> m PoolParams
forall a b c. (a -> b -> c) -> m a -> m b -> m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
            (\KeyHash 'StakePool
pId VRFVerKeyHash 'StakePoolVRF
pVrf -> PoolParams
forall a. Default a => a
def {Ledger.ppId = pId, Ledger.ppVrf = pVrf})
            (PubKeyHash -> m (KeyHash 'StakePool)
forall (m :: * -> *).
MonadBlockChainBalancing m =>
PubKeyHash -> m (KeyHash 'StakePool)
toStakePoolKeyHash PubKeyHash
poolHash)
            (PubKeyHash -> m (VRFVerKeyHash 'StakePoolVRF)
forall (m :: * -> *) (a :: KeyRoleVRF).
MonadBlockChainBalancing m =>
PubKeyHash -> m (VRFVerKeyHash a)
toVRFVerKeyHash PubKeyHash
poolVrf)
      TxSkelCertificate (UserPubKey (pkh -> PubKeyHash
forall a. ToPubKeyHash a => a -> PubKeyHash
Script.toPubKeyHash -> PubKeyHash
poolHash)) (PoolRetire Slot
slot) ->
        PoolCert -> ConwayTxCert ConwayEra
forall era. PoolCert -> ConwayTxCert era
Conway.ConwayTxCertPool
          (PoolCert -> ConwayTxCert ConwayEra)
-> m PoolCert -> m (ConwayTxCert ConwayEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (KeyHash 'StakePool -> EpochNo -> PoolCert)
-> m (KeyHash 'StakePool) -> m EpochNo -> m PoolCert
forall a b c. (a -> b -> c) -> m a -> m b -> m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2
            KeyHash 'StakePool -> EpochNo -> PoolCert
Shelley.RetirePool
            (PubKeyHash -> m (KeyHash 'StakePool)
forall (m :: * -> *).
MonadBlockChainBalancing m =>
PubKeyHash -> m (KeyHash 'StakePool)
toStakePoolKeyHash PubKeyHash
poolHash)
            ( do
                EraHistory
eeh <- Params -> EraHistory
Emulator.emulatorEraHistory (Params -> EraHistory) -> m Params -> m EraHistory
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m Params
forall (m :: * -> *). MonadBlockChainBalancing m => m Params
getParams
                case SlotNo
-> EraHistory
-> Either
     PastHorizonException (EpochNo, SlotsInEpoch, SlotsToEpochEnd)
Cardano.slotToEpoch (Slot -> SlotNo
forall a b. (Integral a, Num b) => a -> b
fromIntegral Slot
slot) EraHistory
eeh of
                  -- TODO: we could have a dedicated error for this case if the
                  -- can occur at several places in the codebase
                  Left PastHorizonException
_ -> String -> m EpochNo
forall a. String -> m a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Too far away in the future"
                  Right (EpochNo
epoch, SlotsInEpoch
_, SlotsToEpochEnd
_) -> EpochNo -> m EpochNo
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return EpochNo
epoch
            )
      TxSkelCertificate (User kind 'Redemption -> Credential
forall a. ToCredential a => a -> Credential
Script.toCredential -> Credential
coldCred) (CommitteeRegisterHot Credential
hotCred) ->
        ConwayGovCert -> ConwayTxCert ConwayEra
forall era. ConwayGovCert -> ConwayTxCert era
Conway.ConwayTxCertGov (ConwayGovCert -> ConwayTxCert ConwayEra)
-> m ConwayGovCert -> m (ConwayTxCert ConwayEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Credential 'ColdCommitteeRole
 -> Credential 'HotCommitteeRole -> ConwayGovCert)
-> m (Credential 'ColdCommitteeRole)
-> m (Credential 'HotCommitteeRole)
-> m ConwayGovCert
forall a b c. (a -> b -> c) -> m a -> m b -> m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Credential 'ColdCommitteeRole
-> Credential 'HotCommitteeRole -> ConwayGovCert
Conway.ConwayAuthCommitteeHotKey (Credential -> m (Credential 'ColdCommitteeRole)
forall (m :: * -> *).
MonadBlockChainBalancing m =>
Credential -> m (Credential 'ColdCommitteeRole)
toColdCredential Credential
coldCred) (Credential -> m (Credential 'HotCommitteeRole)
forall (m :: * -> *).
MonadBlockChainBalancing m =>
Credential -> m (Credential 'HotCommitteeRole)
toHotCredential Credential
hotCred)
      TxSkelCertificate (User kind 'Redemption -> Credential
forall a. ToCredential a => a -> Credential
Script.toCredential -> Credential
cred) CertificateAction kind
CommitteeResign ->
        ConwayGovCert -> ConwayTxCert ConwayEra
forall era. ConwayGovCert -> ConwayTxCert era
Conway.ConwayTxCertGov (ConwayGovCert -> ConwayTxCert ConwayEra)
-> (Credential 'ColdCommitteeRole -> ConwayGovCert)
-> Credential 'ColdCommitteeRole
-> ConwayTxCert ConwayEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Credential 'ColdCommitteeRole
-> StrictMaybe Anchor -> ConwayGovCert
`Conway.ConwayResignCommitteeColdKey` StrictMaybe Anchor
forall a. StrictMaybe a
SNothing) (Credential 'ColdCommitteeRole -> ConwayTxCert ConwayEra)
-> m (Credential 'ColdCommitteeRole) -> m (ConwayTxCert ConwayEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Credential -> m (Credential 'ColdCommitteeRole)
forall (m :: * -> *).
MonadBlockChainBalancing m =>
Credential -> m (Credential 'ColdCommitteeRole)
toColdCredential Credential
cred

toCertificateWitness :: (MonadBlockChainBalancing m) => TxSkelCertificate -> m (Maybe (Cardano.ScriptWitness Cardano.WitCtxStake Cardano.ConwayEra))
toCertificateWitness :: forall (m :: * -> *).
MonadBlockChainBalancing m =>
TxSkelCertificate
-> m (Maybe (ScriptWitness WitCtxStake ConwayEra))
toCertificateWitness =
  m (Maybe (ScriptWitness WitCtxStake ConwayEra))
-> (User 'IsEither 'Redemption
    -> m (Maybe (ScriptWitness WitCtxStake ConwayEra)))
-> Maybe (User 'IsEither 'Redemption)
-> m (Maybe (ScriptWitness WitCtxStake ConwayEra))
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
    (Maybe (ScriptWitness WitCtxStake ConwayEra)
-> m (Maybe (ScriptWitness WitCtxStake ConwayEra))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (ScriptWitness WitCtxStake ConwayEra)
forall a. Maybe a
Nothing)
    ( \case
        (UserRedeemedScript script
s TxSkelRedeemer
red) -> ScriptWitness WitCtxStake ConwayEra
-> Maybe (ScriptWitness WitCtxStake ConwayEra)
forall a. a -> Maybe a
Just (ScriptWitness WitCtxStake ConwayEra
 -> Maybe (ScriptWitness WitCtxStake ConwayEra))
-> m (ScriptWitness WitCtxStake ConwayEra)
-> m (Maybe (ScriptWitness WitCtxStake ConwayEra))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> script
-> TxSkelRedeemer
-> ScriptDatum WitCtxStake
-> m (ScriptWitness WitCtxStake ConwayEra)
forall (m :: * -> *) a b.
(MonadBlockChainBalancing m, ToVScript a) =>
a
-> TxSkelRedeemer -> ScriptDatum b -> m (ScriptWitness b ConwayEra)
toScriptWitness script
s TxSkelRedeemer
red ScriptDatum WitCtxStake
Cardano.NoScriptDatumForStake
        User 'IsEither 'Redemption
_ -> Maybe (ScriptWitness WitCtxStake ConwayEra)
-> m (Maybe (ScriptWitness WitCtxStake ConwayEra))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (ScriptWitness WitCtxStake ConwayEra)
forall a. Maybe a
Nothing
    )
    (Maybe (User 'IsEither 'Redemption)
 -> m (Maybe (ScriptWitness WitCtxStake ConwayEra)))
-> (TxSkelCertificate -> Maybe (User 'IsEither 'Redemption))
-> TxSkelCertificate
-> m (Maybe (ScriptWitness WitCtxStake ConwayEra))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Optic'
  An_AffineTraversal
  NoIx
  TxSkelCertificate
  (User 'IsEither 'Redemption)
-> TxSkelCertificate -> Maybe (User 'IsEither 'Redemption)
forall k (is :: IxList) s a.
Is k An_AffineFold =>
Optic' k is s a -> s -> Maybe a
preview (forall (user :: UserKind).
Typeable user =>
AffineTraversal' TxSkelCertificate (User user 'Redemption)
txSkelCertificateOwnerAT @IsEither)

-- | Builds a 'Cardano.TxCertificates' from a list of 'TxSkelCertificate'
toCertificates :: (MonadBlockChainBalancing m) => [TxSkelCertificate] -> m (Cardano.TxCertificates Cardano.BuildTx Cardano.ConwayEra)
toCertificates :: forall (m :: * -> *).
MonadBlockChainBalancing m =>
[TxSkelCertificate] -> m (TxCertificates BuildTx ConwayEra)
toCertificates =
  ([(Certificate ConwayEra,
   Maybe (ScriptWitness WitCtxStake ConwayEra))]
 -> TxCertificates BuildTx ConwayEra)
-> m [(Certificate ConwayEra,
       Maybe (ScriptWitness WitCtxStake ConwayEra))]
-> m (TxCertificates BuildTx ConwayEra)
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ShelleyBasedEra ConwayEra
-> [(Certificate ConwayEra,
     Maybe (ScriptWitness WitCtxStake ConwayEra))]
-> TxCertificates BuildTx ConwayEra
forall build era.
Applicative (BuildTxWith build) =>
ShelleyBasedEra era
-> [(Certificate era, Maybe (ScriptWitness WitCtxStake era))]
-> TxCertificates build era
Cardano.mkTxCertificates ShelleyBasedEra ConwayEra
Cardano.ShelleyBasedEraConway)
    (m [(Certificate ConwayEra,
     Maybe (ScriptWitness WitCtxStake ConwayEra))]
 -> m (TxCertificates BuildTx ConwayEra))
-> ([TxSkelCertificate]
    -> m [(Certificate ConwayEra,
           Maybe (ScriptWitness WitCtxStake ConwayEra))])
-> [TxSkelCertificate]
-> m (TxCertificates BuildTx ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxSkelCertificate
 -> m (Certificate ConwayEra,
       Maybe (ScriptWitness WitCtxStake ConwayEra)))
-> [TxSkelCertificate]
-> m [(Certificate ConwayEra,
       Maybe (ScriptWitness WitCtxStake ConwayEra))]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (\TxSkelCertificate
txSkelCert -> (Certificate ConwayEra
 -> Maybe (ScriptWitness WitCtxStake ConwayEra)
 -> (Certificate ConwayEra,
     Maybe (ScriptWitness WitCtxStake ConwayEra)))
-> m (Certificate ConwayEra)
-> m (Maybe (ScriptWitness WitCtxStake ConwayEra))
-> m (Certificate ConwayEra,
      Maybe (ScriptWitness WitCtxStake ConwayEra))
forall a b c. (a -> b -> c) -> m a -> m b -> m c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (,) (TxSkelCertificate -> m (Certificate ConwayEra)
forall (m :: * -> *).
MonadBlockChainBalancing m =>
TxSkelCertificate -> m (Certificate ConwayEra)
toCertificate TxSkelCertificate
txSkelCert) (TxSkelCertificate
-> m (Maybe (ScriptWitness WitCtxStake ConwayEra))
forall (m :: * -> *).
MonadBlockChainBalancing m =>
TxSkelCertificate
-> m (Maybe (ScriptWitness WitCtxStake ConwayEra))
toCertificateWitness TxSkelCertificate
txSkelCert))