module Cooked.Skeleton.Proposal
  ( TxParameterChange (..),
    TxGovAction (..),
    TxSkelProposal (..),
    txSkelProposalAddressL,
    txSkelProposalActionL,
    txSkelProposalWitnessL,
    txSkelProposalAnchorL,
    txSkelProposalAutoConstitutionL,
    simpleTxSkelProposal,
    withWitness,
    withAnchor,
    withConstitution,
    updateConstitution,
  )
where
import Cooked.Skeleton.Redeemer as X
import Data.Map (Map)
import Optics.Core ((&), (.~), (?~), (^.))
import Optics.TH
import Plutus.Script.Utils.Address qualified as Script
import Plutus.Script.Utils.Scripts qualified as Script
import PlutusLedgerApi.V3 qualified as Api
import PlutusTx.Prelude qualified as PlutusTx
data TxParameterChange where
  
  FeePerByte :: Integer -> TxParameterChange
  
  FeeFixed :: Integer -> TxParameterChange
  
  MaxBlockBodySize :: Integer -> TxParameterChange
  
  MaxTxSize :: Integer -> TxParameterChange
  
   :: Integer -> TxParameterChange
  
  KeyDeposit :: Integer -> TxParameterChange
  
  PoolDeposit :: Integer -> TxParameterChange
  
  
  PoolRetirementMaxEpoch :: Integer -> TxParameterChange
  
  PoolNumber :: Integer -> TxParameterChange
  
  PoolInfluence :: Rational -> TxParameterChange
  
  MonetaryExpansion :: Rational -> TxParameterChange
  
  TreasuryCut :: Rational -> TxParameterChange
  
  MinPoolCost :: Integer -> TxParameterChange
  
  CoinsPerUTxOByte :: Integer -> TxParameterChange
  
  CostModels ::
    { TxParameterChange -> [Integer]
cmPlutusV1Costs :: [Integer],
      TxParameterChange -> [Integer]
cmPlutusV2Costs :: [Integer],
      TxParameterChange -> [Integer]
cmPlutusV3Costs :: [Integer]
    } ->
    TxParameterChange
  
  Prices ::
    { TxParameterChange -> Rational
pMemoryCost :: Rational,
      TxParameterChange -> Rational
pStepCost :: Rational
    } ->
    TxParameterChange
  
  MaxTxExUnits ::
    { TxParameterChange -> Integer
mteuMemory :: Integer,
      TxParameterChange -> Integer
mteuSteps :: Integer
    } ->
    TxParameterChange
  
  MaxBlockExUnits ::
    { TxParameterChange -> Integer
mbeuMemory :: Integer,
      TxParameterChange -> Integer
mbeuSteps :: Integer
    } ->
    TxParameterChange
  
  MaxValSize :: Integer -> TxParameterChange
  
  
  CollateralPercentage :: Integer -> TxParameterChange
  
  MaxCollateralInputs :: Integer -> TxParameterChange
  
  PoolVotingThresholds ::
    { TxParameterChange -> Rational
pvtMotionNoConfidence :: Rational,
      TxParameterChange -> Rational
pvtCommitteeNormal :: Rational,
      TxParameterChange -> Rational
pvtCommitteeNoConfidence :: Rational,
      TxParameterChange -> Rational
pvtHardFork :: Rational,
      TxParameterChange -> Rational
pvtSecurityGroup :: Rational
    } ->
    TxParameterChange
  
  DRepVotingThresholds ::
    { TxParameterChange -> Rational
drvtMotionNoConfidence :: Rational,
      TxParameterChange -> Rational
drvtCommitteeNormal :: Rational,
      TxParameterChange -> Rational
drvtCommitteeNoConfidence :: Rational,
      TxParameterChange -> Rational
drvtUpdateConstitution :: Rational,
      TxParameterChange -> Rational
drvtHardForkInitialization :: Rational,
      TxParameterChange -> Rational
drvtNetworkGroup :: Rational,
      TxParameterChange -> Rational
drvtEconomicGroup :: Rational,
      TxParameterChange -> Rational
drvtTechnicalGroup :: Rational,
      TxParameterChange -> Rational
drvtGovernanceGroup :: Rational,
      TxParameterChange -> Rational
drvtTreasuryWithdrawal :: Rational
    } ->
    TxParameterChange
  
  CommitteeMinSize :: Integer -> TxParameterChange
  
  CommitteeMaxTermLength :: Integer -> TxParameterChange
  
  GovActionLifetime :: Integer -> TxParameterChange
  
  GovActionDeposit :: Integer -> TxParameterChange
  
  DRepRegistrationDeposit :: Integer -> TxParameterChange
  
  
  DRepActivity :: Integer -> TxParameterChange
  
  MinFeeRefScriptCostPerByte :: Rational -> TxParameterChange
  deriving (Int -> TxParameterChange -> ShowS
[TxParameterChange] -> ShowS
TxParameterChange -> String
(Int -> TxParameterChange -> ShowS)
-> (TxParameterChange -> String)
-> ([TxParameterChange] -> ShowS)
-> Show TxParameterChange
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TxParameterChange -> ShowS
showsPrec :: Int -> TxParameterChange -> ShowS
$cshow :: TxParameterChange -> String
show :: TxParameterChange -> String
$cshowList :: [TxParameterChange] -> ShowS
showList :: [TxParameterChange] -> ShowS
Show, TxParameterChange -> TxParameterChange -> Bool
(TxParameterChange -> TxParameterChange -> Bool)
-> (TxParameterChange -> TxParameterChange -> Bool)
-> Eq TxParameterChange
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TxParameterChange -> TxParameterChange -> Bool
== :: TxParameterChange -> TxParameterChange -> Bool
$c/= :: TxParameterChange -> TxParameterChange -> Bool
/= :: TxParameterChange -> TxParameterChange -> Bool
Eq)
data TxGovAction where
  
  
  TxGovActionParameterChange :: [TxParameterChange] -> TxGovAction
  TxGovActionHardForkInitiation :: Api.ProtocolVersion -> TxGovAction
  TxGovActionTreasuryWithdrawals :: Map Api.Credential Api.Lovelace -> TxGovAction
  TxGovActionNoConfidence :: TxGovAction
  TxGovActionUpdateCommittee :: [Api.ColdCommitteeCredential] -> Map Api.ColdCommitteeCredential Integer -> PlutusTx.Rational -> TxGovAction
  TxGovActionNewConstitution :: Api.Constitution -> TxGovAction
  deriving (Int -> TxGovAction -> ShowS
[TxGovAction] -> ShowS
TxGovAction -> String
(Int -> TxGovAction -> ShowS)
-> (TxGovAction -> String)
-> ([TxGovAction] -> ShowS)
-> Show TxGovAction
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TxGovAction -> ShowS
showsPrec :: Int -> TxGovAction -> ShowS
$cshow :: TxGovAction -> String
show :: TxGovAction -> String
$cshowList :: [TxGovAction] -> ShowS
showList :: [TxGovAction] -> ShowS
Show, TxGovAction -> TxGovAction -> Bool
(TxGovAction -> TxGovAction -> Bool)
-> (TxGovAction -> TxGovAction -> Bool) -> Eq TxGovAction
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TxGovAction -> TxGovAction -> Bool
== :: TxGovAction -> TxGovAction -> Bool
$c/= :: TxGovAction -> TxGovAction -> Bool
/= :: TxGovAction -> TxGovAction -> Bool
Eq)
data TxSkelProposal where
  TxSkelProposal ::
    { 
      TxSkelProposal -> Address
txSkelProposalAddress :: Api.Address,
      
      TxSkelProposal -> TxGovAction
txSkelProposalAction :: TxGovAction,
      
      
      
      
      TxSkelProposal -> Maybe (Versioned Script, TxSkelRedeemer)
txSkelProposalWitness :: Maybe (Script.Versioned Script.Script, TxSkelRedeemer),
      
      
      TxSkelProposal -> Maybe String
txSkelProposalAnchor :: Maybe String,
      
      TxSkelProposal -> Bool
txSkelProposalAutoConstitution :: Bool
    } ->
    TxSkelProposal
  deriving (Int -> TxSkelProposal -> ShowS
[TxSkelProposal] -> ShowS
TxSkelProposal -> String
(Int -> TxSkelProposal -> ShowS)
-> (TxSkelProposal -> String)
-> ([TxSkelProposal] -> ShowS)
-> Show TxSkelProposal
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TxSkelProposal -> ShowS
showsPrec :: Int -> TxSkelProposal -> ShowS
$cshow :: TxSkelProposal -> String
show :: TxSkelProposal -> String
$cshowList :: [TxSkelProposal] -> ShowS
showList :: [TxSkelProposal] -> ShowS
Show, TxSkelProposal -> TxSkelProposal -> Bool
(TxSkelProposal -> TxSkelProposal -> Bool)
-> (TxSkelProposal -> TxSkelProposal -> Bool) -> Eq TxSkelProposal
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TxSkelProposal -> TxSkelProposal -> Bool
== :: TxSkelProposal -> TxSkelProposal -> Bool
$c/= :: TxSkelProposal -> TxSkelProposal -> Bool
/= :: TxSkelProposal -> TxSkelProposal -> Bool
Eq)
makeLensesFor [("txSkelProposalAddress", "txSkelProposalAddressL")] ''TxSkelProposal
makeLensesFor [("txSkelProposalAction", "txSkelProposalActionL")] ''TxSkelProposal
makeLensesFor [("txSkelProposalWitness", "txSkelProposalWitnessL")] ''TxSkelProposal
makeLensesFor [("txSkelProposalAnchor", "txSkelProposalAnchorL")] ''TxSkelProposal
makeLensesFor [("txSkelProposalAutoConstitution", "txSkelProposalAutoConstitutionL")] ''TxSkelProposal
simpleTxSkelProposal :: (Script.ToAddress a) => a -> TxGovAction -> TxSkelProposal
simpleTxSkelProposal :: forall a. ToAddress a => a -> TxGovAction -> TxSkelProposal
simpleTxSkelProposal a
a TxGovAction
govAction = Address
-> TxGovAction
-> Maybe (Versioned Script, TxSkelRedeemer)
-> Maybe String
-> Bool
-> TxSkelProposal
TxSkelProposal (a -> Address
forall a. ToAddress a => a -> Address
Script.toAddress a
a) TxGovAction
govAction Maybe (Versioned Script, TxSkelRedeemer)
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing Bool
True
withWitness :: (Script.ToVersioned Script.Script a) => TxSkelProposal -> (a, TxSkelRedeemer) -> TxSkelProposal
withWitness :: forall a.
ToVersioned Script a =>
TxSkelProposal -> (a, TxSkelRedeemer) -> TxSkelProposal
withWitness TxSkelProposal
prop (a
s, TxSkelRedeemer
red) =
  TxSkelProposal
prop
    TxSkelProposal
-> (TxSkelProposal -> TxSkelProposal) -> TxSkelProposal
forall a b. a -> (a -> b) -> b
& Lens' TxSkelProposal (Maybe (Versioned Script, TxSkelRedeemer))
txSkelProposalWitnessL
    Lens' TxSkelProposal (Maybe (Versioned Script, TxSkelRedeemer))
-> (Versioned Script, TxSkelRedeemer)
-> TxSkelProposal
-> TxSkelProposal
forall k (is :: IxList) s t a b.
Is k A_Setter =>
Optic k is s t a (Maybe b) -> b -> s -> t
?~ (a -> Versioned Script
forall s a. ToVersioned s a => a -> Versioned s
Script.toVersioned a
s, TxSkelRedeemer
red)
    TxSkelProposal
-> (TxSkelProposal -> TxSkelProposal) -> TxSkelProposal
forall a b. a -> (a -> b) -> b
& Lens' TxSkelProposal Bool
txSkelProposalAutoConstitutionL
    Lens' TxSkelProposal Bool
-> Bool -> TxSkelProposal -> TxSkelProposal
forall k (is :: IxList) s t a b.
Is k A_Setter =>
Optic k is s t a b -> b -> s -> t
.~ Bool
False
withConstitution :: (Script.ToVersioned Script.Script a) => TxSkelProposal -> Maybe a -> TxSkelProposal
withConstitution :: forall a.
ToVersioned Script a =>
TxSkelProposal -> Maybe a -> TxSkelProposal
withConstitution TxSkelProposal
prop Maybe a
sM = TxSkelProposal
prop TxSkelProposal
-> (TxSkelProposal -> TxSkelProposal) -> TxSkelProposal
forall a b. a -> (a -> b) -> b
& Lens' TxSkelProposal (Maybe (Versioned Script, TxSkelRedeemer))
txSkelProposalWitnessL Lens' TxSkelProposal (Maybe (Versioned Script, TxSkelRedeemer))
-> Maybe (Versioned Script, TxSkelRedeemer)
-> TxSkelProposal
-> TxSkelProposal
forall k (is :: IxList) s t a b.
Is k A_Setter =>
Optic k is s t a b -> b -> s -> t
.~ ((,TxSkelRedeemer
emptyTxSkelRedeemer) (Versioned Script -> (Versioned Script, TxSkelRedeemer))
-> (a -> Versioned Script)
-> a
-> (Versioned Script, TxSkelRedeemer)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Versioned Script
forall s a. ToVersioned s a => a -> Versioned s
Script.toVersioned (a -> (Versioned Script, TxSkelRedeemer))
-> Maybe a -> Maybe (Versioned Script, TxSkelRedeemer)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe a
sM)
withAnchor :: TxSkelProposal -> String -> TxSkelProposal
withAnchor :: TxSkelProposal -> String -> TxSkelProposal
withAnchor TxSkelProposal
prop String
url = TxSkelProposal
prop TxSkelProposal
-> (TxSkelProposal -> TxSkelProposal) -> TxSkelProposal
forall a b. a -> (a -> b) -> b
& Lens' TxSkelProposal (Maybe String)
txSkelProposalAnchorL Lens' TxSkelProposal (Maybe String)
-> String -> TxSkelProposal -> TxSkelProposal
forall k (is :: IxList) s t a b.
Is k A_Setter =>
Optic k is s t a (Maybe b) -> b -> s -> t
?~ String
url
updateConstitution :: (Script.ToVersioned Script.Script a) => TxSkelProposal -> Maybe a -> TxSkelProposal
updateConstitution :: forall a.
ToVersioned Script a =>
TxSkelProposal -> Maybe a -> TxSkelProposal
updateConstitution TxSkelProposal
prop Maybe a
sM | TxSkelProposal
prop TxSkelProposal -> Lens' TxSkelProposal Bool -> Bool
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Lens' TxSkelProposal Bool
txSkelProposalAutoConstitutionL = TxSkelProposal
prop TxSkelProposal -> Maybe a -> TxSkelProposal
forall a.
ToVersioned Script a =>
TxSkelProposal -> Maybe a -> TxSkelProposal
`withConstitution` Maybe a
sM
updateConstitution TxSkelProposal
prop Maybe a
_ = TxSkelProposal
prop