{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Test.Cardano.Ledger.Conway.Genesis (expectedConwayGenesis) where

import Cardano.Ledger.BaseTypes (EpochInterval (..), textToUrl)
import Cardano.Ledger.Coin (Coin (..), CompactForm (..))
import Cardano.Ledger.Conway
import Cardano.Ledger.Conway.Genesis (ConwayGenesis (..))
import Cardano.Ledger.Conway.Governance (Anchor (..), Committee (..))
import Cardano.Ledger.Conway.PParams
import Cardano.Ledger.Conway.TxCert (Delegatee (..))
import Cardano.Ledger.Core
import Cardano.Ledger.Credential
import Cardano.Ledger.Slot (EpochNo (..))
import Cardano.Ledger.State (DRep (..), DRepState (..))
import Data.Default (Default (def))
import qualified Data.ListMap as ListMap
import Data.Map as Map
import Data.Maybe (fromJust)
import Data.Maybe.Strict (StrictMaybe (..))
import Data.Ratio ((%))
import Test.Cardano.Ledger.Conway.Arbitrary ()
import Test.Cardano.Ledger.Core.Utils (unsafeBoundRational)
import Test.Cardano.Ledger.Plutus (zeroTestingCostModelV3)

credMember :: Credential ColdCommitteeRole
credMember :: Credential ColdCommitteeRole
credMember = KeyHash ColdCommitteeRole -> Credential ColdCommitteeRole
forall (kr :: KeyRole). KeyHash kr -> Credential kr
KeyHashObj (Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash ColdCommitteeRole
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
KeyHash Hash ADDRHASH (VerKeyDSIGN DSIGN)
"4e88cc2d27c364aaf90648a87dfb95f8ee103ba67fa1f12f5e86c42a")

scriptMember :: Credential ColdCommitteeRole
scriptMember :: Credential ColdCommitteeRole
scriptMember = ScriptHash -> Credential ColdCommitteeRole
forall (kr :: KeyRole). ScriptHash -> Credential kr
ScriptHashObj (Hash ADDRHASH EraIndependentScript -> ScriptHash
ScriptHash Hash ADDRHASH EraIndependentScript
"4e88cc2d27c364aaf90648a87dfb95f8ee103ba67fa1f12f5e86c42a")

comm :: Committee ConwayEra
comm :: Committee ConwayEra
comm =
  Map (Credential ColdCommitteeRole) EpochNo
-> UnitInterval -> Committee ConwayEra
forall era.
Map (Credential ColdCommitteeRole) EpochNo
-> UnitInterval -> Committee era
Committee
    ( [(Credential ColdCommitteeRole, EpochNo)]
-> Map (Credential ColdCommitteeRole) EpochNo
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
        [
          ( Credential ColdCommitteeRole
credMember
          , Word64 -> EpochNo
EpochNo Word64
1
          )
        ,
          ( Credential ColdCommitteeRole
scriptMember
          , Word64 -> EpochNo
EpochNo Word64
2
          )
        ]
    )
    (Rational -> UnitInterval
forall r.
(HasCallStack, Typeable r, BoundedRational r) =>
Rational -> r
unsafeBoundRational (Integer
1 Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
% Integer
2))

expectedConwayGenesis :: ConwayGenesis
expectedConwayGenesis :: ConwayGenesis
expectedConwayGenesis =
  ConwayGenesis
    { cgCommittee :: Committee ConwayEra
cgCommittee = Committee ConwayEra
comm
    , cgInitialDReps :: ListMap (Credential DRepRole) DRepState
cgInitialDReps =
        [(Credential DRepRole, DRepState)]
-> ListMap (Credential DRepRole) DRepState
forall k v. [(k, v)] -> ListMap k v
ListMap.fromList
          [
            ( KeyHash DRepRole -> Credential DRepRole
forall (kr :: KeyRole). KeyHash kr -> Credential kr
KeyHashObj
                (Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash DRepRole
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
KeyHash Hash ADDRHASH (VerKeyDSIGN DSIGN)
"78301005df84ba67fa1f12f95f8ee10335bc5e86c42afbc593ab4cdd")
            , DRepState
                { drepExpiry :: EpochNo
drepExpiry = Word64 -> EpochNo
EpochNo Word64
1000
                , drepAnchor :: StrictMaybe Anchor
drepAnchor = StrictMaybe Anchor
forall a. StrictMaybe a
SNothing
                , drepDeposit :: CompactForm Coin
drepDeposit = Word64 -> CompactForm Coin
CompactCoin Word64
5000
                , drepDelegs :: Set (Credential Staking)
drepDelegs = Set (Credential Staking)
forall a. Monoid a => a
mempty
                }
            )
          ,
            ( ScriptHash -> Credential DRepRole
forall (kr :: KeyRole). ScriptHash -> Credential kr
ScriptHashObj
                (Hash ADDRHASH EraIndependentScript -> ScriptHash
ScriptHash Hash ADDRHASH EraIndependentScript
"01305df84b078ac5e86c42afbc593ab4cdd67fa1f12f95f8ee10335b")
            , DRepState
                { drepExpiry :: EpochNo
drepExpiry = Word64 -> EpochNo
EpochNo Word64
300
                , drepAnchor :: StrictMaybe Anchor
drepAnchor =
                    Anchor -> StrictMaybe Anchor
forall a. a -> StrictMaybe a
SJust (Anchor -> StrictMaybe Anchor) -> Anchor -> StrictMaybe Anchor
forall a b. (a -> b) -> a -> b
$
                      Anchor
                        { anchorUrl :: Url
anchorUrl = Maybe Url -> Url
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe Url -> Url) -> Maybe Url -> Url
forall a b. (a -> b) -> a -> b
$ Int -> Text -> Maybe Url
forall (m :: * -> *). MonadFail m => Int -> Text -> m Url
textToUrl Int
99 Text
"example.com"
                        , anchorDataHash :: SafeHash AnchorData
anchorDataHash = SafeHash AnchorData
forall a. Default a => a
def
                        }
                , drepDeposit :: CompactForm Coin
drepDeposit = Word64 -> CompactForm Coin
CompactCoin Word64
6000
                , drepDelegs :: Set (Credential Staking)
drepDelegs = Set (Credential Staking)
forall a. Monoid a => a
mempty
                }
            )
          ]
    , cgDelegs :: ListMap (Credential Staking) Delegatee
cgDelegs =
        [(Credential Staking, Delegatee)]
-> ListMap (Credential Staking) Delegatee
forall k v. [(k, v)] -> ListMap k v
ListMap.fromList
          [
            ( KeyHash Staking -> Credential Staking
forall (kr :: KeyRole). KeyHash kr -> Credential kr
KeyHashObj
                (Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash Staking
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
KeyHash Hash ADDRHASH (VerKeyDSIGN DSIGN)
"35bc5e86c42afbc593ab4cdd78301005df84ba67fa1f12f95f8ee103")
            , DRep -> Delegatee
DelegVote DRep
DRepAlwaysNoConfidence
            )
          ,
            ( KeyHash Staking -> Credential Staking
forall (kr :: KeyRole). KeyHash kr -> Credential kr
KeyHashObj
                (Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash Staking
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
KeyHash Hash ADDRHASH (VerKeyDSIGN DSIGN)
"4e88cc2d27c364aaf90648a87dfb95f8ee103ba67fa1f12f5e86c42a")
            , DRep -> Delegatee
DelegVote DRep
DRepAlwaysAbstain
            )
          ,
            ( KeyHash Staking -> Credential Staking
forall (kr :: KeyRole). KeyHash kr -> Credential kr
KeyHashObj
                (Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash Staking
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
KeyHash Hash ADDRHASH (VerKeyDSIGN DSIGN)
"5df84bcdd7a5f8ee93aafbc500b435bc5e83067fa1f12f9110386c42")
            , KeyHash StakePool -> Delegatee
DelegStake (KeyHash StakePool -> Delegatee) -> KeyHash StakePool -> Delegatee
forall a b. (a -> b) -> a -> b
$ Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash StakePool
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
KeyHash Hash ADDRHASH (VerKeyDSIGN DSIGN)
"0335bc5e86c42afbc578301005df84ba67fa1f12f95f8ee193ab4cdd"
            )
          ,
            ( KeyHash Staking -> Credential Staking
forall (kr :: KeyRole). KeyHash kr -> Credential kr
KeyHashObj
                (Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash Staking
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
KeyHash Hash ADDRHASH (VerKeyDSIGN DSIGN)
"8ee93a5df84bc42cdd7a5fafbc500b435bc5e83067fa1f12f9110386")
            , KeyHash StakePool -> DRep -> Delegatee
DelegStakeVote
                (Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash StakePool
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
KeyHash Hash ADDRHASH (VerKeyDSIGN DSIGN)
"086c42afbc578301005df84ba67fa1f12f95f8ee193ab4cdd335bc5e")
                DRep
DRepAlwaysAbstain
            )
          ,
            ( KeyHash Staking -> Credential Staking
forall (kr :: KeyRole). KeyHash kr -> Credential kr
KeyHashObj
                (Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash Staking
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
KeyHash Hash ADDRHASH (VerKeyDSIGN DSIGN)
"df93ab435bc5eafbc500583067fa1f12f9110386c42cdd784ba5f8ee")
            , DRep -> Delegatee
DelegVote (DRep -> Delegatee) -> DRep -> Delegatee
forall a b. (a -> b) -> a -> b
$
                Credential DRepRole -> DRep
DRepCredential
                  (ScriptHash -> Credential DRepRole
forall (kr :: KeyRole). ScriptHash -> Credential kr
ScriptHashObj (Hash ADDRHASH EraIndependentScript -> ScriptHash
ScriptHash Hash ADDRHASH EraIndependentScript
"01305df84b078ac5e86c42afbc593ab4cdd67fa1f12f95f8ee10335b"))
            )
          ,
            ( ScriptHash -> Credential Staking
forall (kr :: KeyRole). ScriptHash -> Credential kr
ScriptHashObj
                (Hash ADDRHASH EraIndependentScript -> ScriptHash
ScriptHash Hash ADDRHASH EraIndependentScript
"afbc5005df84ba5f8ee93ab435bc5e83067fa1f12f9c42cdd7110386")
            , DRep -> Delegatee
DelegVote (DRep -> Delegatee) -> DRep -> Delegatee
forall a b. (a -> b) -> a -> b
$
                Credential DRepRole -> DRep
DRepCredential
                  (KeyHash DRepRole -> Credential DRepRole
forall (kr :: KeyRole). KeyHash kr -> Credential kr
KeyHashObj (Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash DRepRole
forall (r :: KeyRole).
Hash ADDRHASH (VerKeyDSIGN DSIGN) -> KeyHash r
KeyHash Hash ADDRHASH (VerKeyDSIGN DSIGN)
"78301005df84ba67fa1f12f95f8ee10335bc5e86c42afbc593ab4cdd"))
            )
          ]
    , cgConstitution :: Constitution ConwayEra
cgConstitution = Constitution ConwayEra
forall a. Default a => a
def
    , cgUpgradePParams :: UpgradeConwayPParams Identity
cgUpgradePParams =
        UpgradeConwayPParams
          { ucppPoolVotingThresholds :: HKD Identity PoolVotingThresholds
ucppPoolVotingThresholds = PoolVotingThresholds
HKD Identity PoolVotingThresholds
forall a. Default a => a
def
          , ucppDRepVotingThresholds :: HKD Identity DRepVotingThresholds
ucppDRepVotingThresholds = DRepVotingThresholds
HKD Identity DRepVotingThresholds
forall a. Default a => a
def
          , ucppCommitteeMinSize :: HKD Identity Word16
ucppCommitteeMinSize = Word16
HKD Identity Word16
0
          , ucppCommitteeMaxTermLength :: HKD Identity EpochInterval
ucppCommitteeMaxTermLength = Word32 -> EpochInterval
EpochInterval Word32
0
          , ucppGovActionLifetime :: HKD Identity EpochInterval
ucppGovActionLifetime = Word32 -> EpochInterval
EpochInterval Word32
0
          , ucppGovActionDeposit :: HKD Identity Coin
ucppGovActionDeposit = Integer -> Coin
Coin Integer
0
          , ucppDRepDeposit :: HKD Identity Coin
ucppDRepDeposit = Integer -> Coin
Coin Integer
0
          , ucppDRepActivity :: HKD Identity EpochInterval
ucppDRepActivity = Word32 -> EpochInterval
EpochInterval Word32
0
          , ucppMinFeeRefScriptCostPerByte :: HKD Identity NonNegativeInterval
ucppMinFeeRefScriptCostPerByte = HKD Identity NonNegativeInterval
NonNegativeInterval
forall a. Bounded a => a
minBound
          , ucppPlutusV3CostModel :: HKD Identity CostModel
ucppPlutusV3CostModel = CostModel
HKD Identity CostModel
HasCallStack => CostModel
zeroTestingCostModelV3
          }
    }