{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE GADTs #-}
module Cardano.CLI.Shelley.Run.Genesis
( ShelleyGenesisCmdError
, renderShelleyGenesisCmdError
, runGenesisCmd
) where
import Cardano.Prelude
import Prelude (id)
import qualified Data.Aeson as Aeson
import Data.Aeson.Encode.Pretty (encodePretty)
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString.Lazy.Char8 as LBS
import qualified Data.List as List
import qualified Data.Map.Strict as Map
import qualified Data.Text as Text
import qualified Data.Text.IO as Text
import Data.Time.Clock (NominalDiffTime, UTCTime, addUTCTime, getCurrentTime)
import System.Directory (createDirectoryIfMissing, listDirectory)
import System.FilePath (takeExtension, takeExtensions, (</>))
import System.IO.Error (isDoesNotExistError)
import Control.Monad.Trans.Except.Extra (firstExceptT, handleIOExceptT, hoistEither, left,
newExceptT)
import qualified Cardano.Crypto.Hash as Crypto
import Cardano.Api.Shelley.Genesis
import Cardano.Api.TextView (TextViewDescription (..))
import Cardano.Api.Typed
import Ouroboros.Consensus.BlockchainTime (SystemStart (..))
import qualified Shelley.Spec.Ledger.Address as Ledger
import qualified Shelley.Spec.Ledger.Coin as Ledger
import qualified Shelley.Spec.Ledger.Keys as Ledger
import Cardano.CLI.Helpers (textShow)
import Cardano.CLI.Shelley.Commands
import Cardano.CLI.Shelley.Parsers (renderTxIn)
import Cardano.CLI.Types
data ShelleyGenesisCmdError
= ShelleyGenesisCmdAesonDecodeError !FilePath !Text
| ShelleyGenesisCmdGenesisFileError !(FileError ())
| ShelleyGenesisCmdMismatchedGenesisKeyFiles [Int] [Int] [Int]
| ShelleyGenesisCmdFilesNoIndex [FilePath]
| ShelleyGenesisCmdFilesDupIndex [FilePath]
| ShelleyGenesisCmdTextEnvReadFileError !(FileError TextEnvelopeError)
deriving Int -> ShelleyGenesisCmdError -> ShowS
[ShelleyGenesisCmdError] -> ShowS
ShelleyGenesisCmdError -> String
(Int -> ShelleyGenesisCmdError -> ShowS)
-> (ShelleyGenesisCmdError -> String)
-> ([ShelleyGenesisCmdError] -> ShowS)
-> Show ShelleyGenesisCmdError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ShelleyGenesisCmdError] -> ShowS
$cshowList :: [ShelleyGenesisCmdError] -> ShowS
show :: ShelleyGenesisCmdError -> String
$cshow :: ShelleyGenesisCmdError -> String
showsPrec :: Int -> ShelleyGenesisCmdError -> ShowS
$cshowsPrec :: Int -> ShelleyGenesisCmdError -> ShowS
Show
renderShelleyGenesisCmdError :: ShelleyGenesisCmdError -> Text
renderShelleyGenesisCmdError :: ShelleyGenesisCmdError -> Text
renderShelleyGenesisCmdError ShelleyGenesisCmdError
err =
case ShelleyGenesisCmdError
err of
ShelleyGenesisCmdAesonDecodeError String
fp Text
decErr ->
Text
"Error while decoding Shelley genesis at: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
forall a. Show a => a -> Text
textShow String
fp Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" Error: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> Text
forall a. Show a => a -> Text
textShow Text
decErr
ShelleyGenesisCmdGenesisFileError FileError ()
fe -> String -> Text
Text.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ FileError () -> String
forall e. Error e => e -> String
displayError FileError ()
fe
ShelleyGenesisCmdMismatchedGenesisKeyFiles [Int]
gfiles [Int]
dfiles [Int]
vfiles ->
Text
"Mismatch between the files found:\n"
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"Genesis key file indexes: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> [Int] -> Text
forall a. Show a => a -> Text
textShow [Int]
gfiles Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"\n"
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"Delegate key file indexes: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> [Int] -> Text
forall a. Show a => a -> Text
textShow [Int]
dfiles Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"\n"
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"Delegate VRF key file indexes: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> [Int] -> Text
forall a. Show a => a -> Text
textShow [Int]
vfiles
ShelleyGenesisCmdFilesNoIndex [String]
files ->
Text
"The genesis keys files are expected to have a numeric index but these do not:\n"
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> [Text] -> Text
Text.unlines ((String -> Text) -> [String] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
map String -> Text
Text.pack [String]
files)
ShelleyGenesisCmdFilesDupIndex [String]
files ->
Text
"The genesis keys files are expected to have a unique numeric index but these do not:\n"
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> [Text] -> Text
Text.unlines ((String -> Text) -> [String] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
map String -> Text
Text.pack [String]
files)
ShelleyGenesisCmdTextEnvReadFileError FileError TextEnvelopeError
fileErr -> String -> Text
Text.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ FileError TextEnvelopeError -> String
forall e. Error e => e -> String
displayError FileError TextEnvelopeError
fileErr
runGenesisCmd :: GenesisCmd -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisCmd :: GenesisCmd -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisCmd (GenesisKeyGenGenesis VerificationKeyFile
vk SigningKeyFile
sk) = VerificationKeyFile
-> SigningKeyFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyGenGenesis VerificationKeyFile
vk SigningKeyFile
sk
runGenesisCmd (GenesisKeyGenDelegate VerificationKeyFile
vk SigningKeyFile
sk OpCertCounterFile
ctr) = VerificationKeyFile
-> SigningKeyFile
-> OpCertCounterFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyGenDelegate VerificationKeyFile
vk SigningKeyFile
sk OpCertCounterFile
ctr
runGenesisCmd (GenesisKeyGenUTxO VerificationKeyFile
vk SigningKeyFile
sk) = VerificationKeyFile
-> SigningKeyFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyGenUTxO VerificationKeyFile
vk SigningKeyFile
sk
runGenesisCmd (GenesisCmdKeyHash VerificationKeyFile
vk) = VerificationKeyFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyHash VerificationKeyFile
vk
runGenesisCmd (GenesisVerKey VerificationKeyFile
vk SigningKeyFile
sk) = VerificationKeyFile
-> SigningKeyFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisVerKey VerificationKeyFile
vk SigningKeyFile
sk
runGenesisCmd (GenesisTxIn VerificationKeyFile
vk NetworkId
nw Maybe OutputFile
mOutFile) = VerificationKeyFile
-> NetworkId
-> Maybe OutputFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisTxIn VerificationKeyFile
vk NetworkId
nw Maybe OutputFile
mOutFile
runGenesisCmd (GenesisAddr VerificationKeyFile
vk NetworkId
nw Maybe OutputFile
mOutFile) = VerificationKeyFile
-> NetworkId
-> Maybe OutputFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisAddr VerificationKeyFile
vk NetworkId
nw Maybe OutputFile
mOutFile
runGenesisCmd (GenesisCreate GenesisDir
gd Word
gn Word
un Maybe SystemStart
ms Maybe Lovelace
am NetworkId
nw) = GenesisDir
-> Word
-> Word
-> Maybe SystemStart
-> Maybe Lovelace
-> NetworkId
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisCreate GenesisDir
gd Word
gn Word
un Maybe SystemStart
ms Maybe Lovelace
am NetworkId
nw
runGenesisCmd (GenesisHashFile GenesisFile
gf) = GenesisFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisHashFile GenesisFile
gf
runGenesisKeyGenGenesis :: VerificationKeyFile -> SigningKeyFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyGenGenesis :: VerificationKeyFile
-> SigningKeyFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyGenGenesis (VerificationKeyFile String
vkeyPath)
(SigningKeyFile String
skeyPath) = do
SigningKey GenesisKey
skey <- IO (SigningKey GenesisKey)
-> ExceptT ShelleyGenesisCmdError IO (SigningKey GenesisKey)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (SigningKey GenesisKey)
-> ExceptT ShelleyGenesisCmdError IO (SigningKey GenesisKey))
-> IO (SigningKey GenesisKey)
-> ExceptT ShelleyGenesisCmdError IO (SigningKey GenesisKey)
forall a b. (a -> b) -> a -> b
$ AsType GenesisKey -> IO (SigningKey GenesisKey)
forall keyrole.
Key keyrole =>
AsType keyrole -> IO (SigningKey keyrole)
generateSigningKey AsType GenesisKey
AsGenesisKey
let vkey :: VerificationKey GenesisKey
vkey = SigningKey GenesisKey -> VerificationKey GenesisKey
forall keyrole.
Key keyrole =>
SigningKey keyrole -> VerificationKey keyrole
getVerificationKey SigningKey GenesisKey
skey
(FileError () -> ShelleyGenesisCmdError)
-> ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError () -> ShelleyGenesisCmdError
ShelleyGenesisCmdGenesisFileError
(ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ())
-> (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ()
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
(IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String
-> Maybe TextEnvelopeDescr
-> SigningKey GenesisKey
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
skeyPath (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
skeyDesc) SigningKey GenesisKey
skey
(FileError () -> ShelleyGenesisCmdError)
-> ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError () -> ShelleyGenesisCmdError
ShelleyGenesisCmdGenesisFileError
(ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ())
-> (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ()
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
(IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String
-> Maybe TextEnvelopeDescr
-> VerificationKey GenesisKey
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
vkeyPath (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
vkeyDesc) VerificationKey GenesisKey
vkey
where
skeyDesc, vkeyDesc :: TextViewDescription
skeyDesc :: TextEnvelopeDescr
skeyDesc = ByteString -> TextEnvelopeDescr
TextViewDescription ByteString
"Genesis Signing Key"
vkeyDesc :: TextEnvelopeDescr
vkeyDesc = ByteString -> TextEnvelopeDescr
TextViewDescription ByteString
"Genesis Verification Key"
runGenesisKeyGenDelegate :: VerificationKeyFile
-> SigningKeyFile
-> OpCertCounterFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyGenDelegate :: VerificationKeyFile
-> SigningKeyFile
-> OpCertCounterFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyGenDelegate (VerificationKeyFile String
vkeyPath)
(SigningKeyFile String
skeyPath)
(OpCertCounterFile String
ocertCtrPath) = do
SigningKey GenesisDelegateKey
skey <- IO (SigningKey GenesisDelegateKey)
-> ExceptT
ShelleyGenesisCmdError IO (SigningKey GenesisDelegateKey)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (SigningKey GenesisDelegateKey)
-> ExceptT
ShelleyGenesisCmdError IO (SigningKey GenesisDelegateKey))
-> IO (SigningKey GenesisDelegateKey)
-> ExceptT
ShelleyGenesisCmdError IO (SigningKey GenesisDelegateKey)
forall a b. (a -> b) -> a -> b
$ AsType GenesisDelegateKey -> IO (SigningKey GenesisDelegateKey)
forall keyrole.
Key keyrole =>
AsType keyrole -> IO (SigningKey keyrole)
generateSigningKey AsType GenesisDelegateKey
AsGenesisDelegateKey
let vkey :: VerificationKey GenesisDelegateKey
vkey = SigningKey GenesisDelegateKey -> VerificationKey GenesisDelegateKey
forall keyrole.
Key keyrole =>
SigningKey keyrole -> VerificationKey keyrole
getVerificationKey SigningKey GenesisDelegateKey
skey
(FileError () -> ShelleyGenesisCmdError)
-> ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError () -> ShelleyGenesisCmdError
ShelleyGenesisCmdGenesisFileError
(ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ())
-> (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ()
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
(IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String
-> Maybe TextEnvelopeDescr
-> SigningKey GenesisDelegateKey
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
skeyPath (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
skeyDesc) SigningKey GenesisDelegateKey
skey
(FileError () -> ShelleyGenesisCmdError)
-> ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError () -> ShelleyGenesisCmdError
ShelleyGenesisCmdGenesisFileError
(ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ())
-> (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ()
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
(IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String
-> Maybe TextEnvelopeDescr
-> VerificationKey GenesisDelegateKey
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
vkeyPath (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
vkeyDesc) VerificationKey GenesisDelegateKey
vkey
(FileError () -> ShelleyGenesisCmdError)
-> ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError () -> ShelleyGenesisCmdError
ShelleyGenesisCmdGenesisFileError
(ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ())
-> (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ()
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
(IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String
-> Maybe TextEnvelopeDescr
-> OperationalCertificateIssueCounter
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
ocertCtrPath (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
certCtrDesc)
(OperationalCertificateIssueCounter
-> IO (Either (FileError ()) ()))
-> OperationalCertificateIssueCounter
-> IO (Either (FileError ()) ())
forall a b. (a -> b) -> a -> b
$ Word64
-> VerificationKey StakePoolKey
-> OperationalCertificateIssueCounter
OperationalCertificateIssueCounter
Word64
initialCounter
(VerificationKey GenesisDelegateKey -> VerificationKey StakePoolKey
forall keyroleA keyroleB.
CastVerificationKeyRole keyroleA keyroleB =>
VerificationKey keyroleA -> VerificationKey keyroleB
castVerificationKey VerificationKey GenesisDelegateKey
vkey)
where
skeyDesc, vkeyDesc, certCtrDesc :: TextViewDescription
skeyDesc :: TextEnvelopeDescr
skeyDesc = ByteString -> TextEnvelopeDescr
TextViewDescription ByteString
"Genesis delegate operator key"
vkeyDesc :: TextEnvelopeDescr
vkeyDesc = ByteString -> TextEnvelopeDescr
TextViewDescription ByteString
"Genesis delegate operator key"
certCtrDesc :: TextEnvelopeDescr
certCtrDesc = ByteString -> TextEnvelopeDescr
TextViewDescription (ByteString -> TextEnvelopeDescr)
-> ByteString -> TextEnvelopeDescr
forall a b. (a -> b) -> a -> b
$ ByteString
"Next certificate issue number: " ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> String -> ByteString
BS.pack (Word64 -> String
forall a b. (Show a, ConvertText String b) => a -> b
show Word64
initialCounter)
initialCounter :: Word64
initialCounter :: Word64
initialCounter = Word64
0
runGenesisKeyGenDelegateVRF :: VerificationKeyFile -> SigningKeyFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyGenDelegateVRF :: VerificationKeyFile
-> SigningKeyFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyGenDelegateVRF (VerificationKeyFile String
vkeyPath)
(SigningKeyFile String
skeyPath) = do
SigningKey VrfKey
skey <- IO (SigningKey VrfKey)
-> ExceptT ShelleyGenesisCmdError IO (SigningKey VrfKey)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (SigningKey VrfKey)
-> ExceptT ShelleyGenesisCmdError IO (SigningKey VrfKey))
-> IO (SigningKey VrfKey)
-> ExceptT ShelleyGenesisCmdError IO (SigningKey VrfKey)
forall a b. (a -> b) -> a -> b
$ AsType VrfKey -> IO (SigningKey VrfKey)
forall keyrole.
Key keyrole =>
AsType keyrole -> IO (SigningKey keyrole)
generateSigningKey AsType VrfKey
AsVrfKey
let vkey :: VerificationKey VrfKey
vkey = SigningKey VrfKey -> VerificationKey VrfKey
forall keyrole.
Key keyrole =>
SigningKey keyrole -> VerificationKey keyrole
getVerificationKey SigningKey VrfKey
skey
(FileError () -> ShelleyGenesisCmdError)
-> ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError () -> ShelleyGenesisCmdError
ShelleyGenesisCmdGenesisFileError
(ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ())
-> (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ()
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
(IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String
-> Maybe TextEnvelopeDescr
-> SigningKey VrfKey
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
skeyPath (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
skeyDesc) SigningKey VrfKey
skey
(FileError () -> ShelleyGenesisCmdError)
-> ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError () -> ShelleyGenesisCmdError
ShelleyGenesisCmdGenesisFileError
(ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ())
-> (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ()
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
(IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String
-> Maybe TextEnvelopeDescr
-> VerificationKey VrfKey
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
vkeyPath (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
vkeyDesc) VerificationKey VrfKey
vkey
where
skeyDesc, vkeyDesc :: TextViewDescription
skeyDesc :: TextEnvelopeDescr
skeyDesc = ByteString -> TextEnvelopeDescr
TextViewDescription ByteString
"VRF Signing Key"
vkeyDesc :: TextEnvelopeDescr
vkeyDesc = ByteString -> TextEnvelopeDescr
TextViewDescription ByteString
"VRF Verification Key"
runGenesisKeyGenUTxO :: VerificationKeyFile -> SigningKeyFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyGenUTxO :: VerificationKeyFile
-> SigningKeyFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyGenUTxO (VerificationKeyFile String
vkeyPath)
(SigningKeyFile String
skeyPath) = do
SigningKey GenesisUTxOKey
skey <- IO (SigningKey GenesisUTxOKey)
-> ExceptT ShelleyGenesisCmdError IO (SigningKey GenesisUTxOKey)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (SigningKey GenesisUTxOKey)
-> ExceptT ShelleyGenesisCmdError IO (SigningKey GenesisUTxOKey))
-> IO (SigningKey GenesisUTxOKey)
-> ExceptT ShelleyGenesisCmdError IO (SigningKey GenesisUTxOKey)
forall a b. (a -> b) -> a -> b
$ AsType GenesisUTxOKey -> IO (SigningKey GenesisUTxOKey)
forall keyrole.
Key keyrole =>
AsType keyrole -> IO (SigningKey keyrole)
generateSigningKey AsType GenesisUTxOKey
AsGenesisUTxOKey
let vkey :: VerificationKey GenesisUTxOKey
vkey = SigningKey GenesisUTxOKey -> VerificationKey GenesisUTxOKey
forall keyrole.
Key keyrole =>
SigningKey keyrole -> VerificationKey keyrole
getVerificationKey SigningKey GenesisUTxOKey
skey
(FileError () -> ShelleyGenesisCmdError)
-> ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError () -> ShelleyGenesisCmdError
ShelleyGenesisCmdGenesisFileError
(ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ())
-> (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ()
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
(IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String
-> Maybe TextEnvelopeDescr
-> SigningKey GenesisUTxOKey
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
skeyPath (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
skeyDesc) SigningKey GenesisUTxOKey
skey
(FileError () -> ShelleyGenesisCmdError)
-> ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError () -> ShelleyGenesisCmdError
ShelleyGenesisCmdGenesisFileError
(ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ())
-> (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ()
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
(IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String
-> Maybe TextEnvelopeDescr
-> VerificationKey GenesisUTxOKey
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
vkeyPath (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
vkeyDesc) VerificationKey GenesisUTxOKey
vkey
where
skeyDesc, vkeyDesc :: TextViewDescription
skeyDesc :: TextEnvelopeDescr
skeyDesc = ByteString -> TextEnvelopeDescr
TextViewDescription ByteString
"Genesis Initial UTxO Signing Key"
vkeyDesc :: TextEnvelopeDescr
vkeyDesc = ByteString -> TextEnvelopeDescr
TextViewDescription ByteString
"Genesis Initial UTxO Verification Key"
runGenesisKeyHash :: VerificationKeyFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyHash :: VerificationKeyFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyHash (VerificationKeyFile String
vkeyPath) = do
SomeGenesisKey VerificationKey
vkey <- (FileError TextEnvelopeError -> ShelleyGenesisCmdError)
-> ExceptT
(FileError TextEnvelopeError) IO (SomeGenesisKey VerificationKey)
-> ExceptT
ShelleyGenesisCmdError IO (SomeGenesisKey VerificationKey)
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError TextEnvelopeError -> ShelleyGenesisCmdError
ShelleyGenesisCmdTextEnvReadFileError (ExceptT
(FileError TextEnvelopeError) IO (SomeGenesisKey VerificationKey)
-> ExceptT
ShelleyGenesisCmdError IO (SomeGenesisKey VerificationKey))
-> (IO
(Either
(FileError TextEnvelopeError) (SomeGenesisKey VerificationKey))
-> ExceptT
(FileError TextEnvelopeError) IO (SomeGenesisKey VerificationKey))
-> IO
(Either
(FileError TextEnvelopeError) (SomeGenesisKey VerificationKey))
-> ExceptT
ShelleyGenesisCmdError IO (SomeGenesisKey VerificationKey)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO
(Either
(FileError TextEnvelopeError) (SomeGenesisKey VerificationKey))
-> ExceptT
(FileError TextEnvelopeError) IO (SomeGenesisKey VerificationKey)
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT (IO
(Either
(FileError TextEnvelopeError) (SomeGenesisKey VerificationKey))
-> ExceptT
ShelleyGenesisCmdError IO (SomeGenesisKey VerificationKey))
-> IO
(Either
(FileError TextEnvelopeError) (SomeGenesisKey VerificationKey))
-> ExceptT
ShelleyGenesisCmdError IO (SomeGenesisKey VerificationKey)
forall a b. (a -> b) -> a -> b
$
[FromSomeType HasTextEnvelope (SomeGenesisKey VerificationKey)]
-> String
-> IO
(Either
(FileError TextEnvelopeError) (SomeGenesisKey VerificationKey))
forall b.
[FromSomeType HasTextEnvelope b]
-> String -> IO (Either (FileError TextEnvelopeError) b)
readFileTextEnvelopeAnyOf
[ AsType (VerificationKey GenesisKey)
-> (VerificationKey GenesisKey -> SomeGenesisKey VerificationKey)
-> FromSomeType HasTextEnvelope (SomeGenesisKey VerificationKey)
forall (c :: * -> Constraint) a b.
c a =>
AsType a -> (a -> b) -> FromSomeType c b
FromSomeType (AsType GenesisKey -> AsType (VerificationKey GenesisKey)
forall a. AsType a -> AsType (VerificationKey a)
AsVerificationKey AsType GenesisKey
AsGenesisKey)
VerificationKey GenesisKey -> SomeGenesisKey VerificationKey
forall (f :: * -> *). f GenesisKey -> SomeGenesisKey f
AGenesisKey
, AsType (VerificationKey GenesisDelegateKey)
-> (VerificationKey GenesisDelegateKey
-> SomeGenesisKey VerificationKey)
-> FromSomeType HasTextEnvelope (SomeGenesisKey VerificationKey)
forall (c :: * -> Constraint) a b.
c a =>
AsType a -> (a -> b) -> FromSomeType c b
FromSomeType (AsType GenesisDelegateKey
-> AsType (VerificationKey GenesisDelegateKey)
forall a. AsType a -> AsType (VerificationKey a)
AsVerificationKey AsType GenesisDelegateKey
AsGenesisDelegateKey)
VerificationKey GenesisDelegateKey
-> SomeGenesisKey VerificationKey
forall (f :: * -> *). f GenesisDelegateKey -> SomeGenesisKey f
AGenesisDelegateKey
, AsType (VerificationKey GenesisUTxOKey)
-> (VerificationKey GenesisUTxOKey
-> SomeGenesisKey VerificationKey)
-> FromSomeType HasTextEnvelope (SomeGenesisKey VerificationKey)
forall (c :: * -> Constraint) a b.
c a =>
AsType a -> (a -> b) -> FromSomeType c b
FromSomeType (AsType GenesisUTxOKey -> AsType (VerificationKey GenesisUTxOKey)
forall a. AsType a -> AsType (VerificationKey a)
AsVerificationKey AsType GenesisUTxOKey
AsGenesisUTxOKey)
VerificationKey GenesisUTxOKey -> SomeGenesisKey VerificationKey
forall (f :: * -> *). f GenesisUTxOKey -> SomeGenesisKey f
AGenesisUTxOKey
]
String
vkeyPath
IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ExceptT ShelleyGenesisCmdError IO ())
-> IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ ByteString -> IO ()
BS.putStrLn (SomeGenesisKey VerificationKey -> ByteString
renderKeyHash SomeGenesisKey VerificationKey
vkey)
where
renderKeyHash :: SomeGenesisKey VerificationKey -> ByteString
renderKeyHash :: SomeGenesisKey VerificationKey -> ByteString
renderKeyHash (AGenesisKey VerificationKey GenesisKey
vk) = VerificationKey GenesisKey -> ByteString
forall keyrole.
Key keyrole =>
VerificationKey keyrole -> ByteString
renderVerificationKeyHash VerificationKey GenesisKey
vk
renderKeyHash (AGenesisDelegateKey VerificationKey GenesisDelegateKey
vk) = VerificationKey GenesisDelegateKey -> ByteString
forall keyrole.
Key keyrole =>
VerificationKey keyrole -> ByteString
renderVerificationKeyHash VerificationKey GenesisDelegateKey
vk
renderKeyHash (AGenesisUTxOKey VerificationKey GenesisUTxOKey
vk) = VerificationKey GenesisUTxOKey -> ByteString
forall keyrole.
Key keyrole =>
VerificationKey keyrole -> ByteString
renderVerificationKeyHash VerificationKey GenesisUTxOKey
vk
renderVerificationKeyHash :: Key keyrole => VerificationKey keyrole -> ByteString
renderVerificationKeyHash :: VerificationKey keyrole -> ByteString
renderVerificationKeyHash = Hash keyrole -> ByteString
forall a. SerialiseAsRawBytes a => a -> ByteString
serialiseToRawBytesHex
(Hash keyrole -> ByteString)
-> (VerificationKey keyrole -> Hash keyrole)
-> VerificationKey keyrole
-> ByteString
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. VerificationKey keyrole -> Hash keyrole
forall keyrole.
Key keyrole =>
VerificationKey keyrole -> Hash keyrole
verificationKeyHash
runGenesisVerKey :: VerificationKeyFile -> SigningKeyFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisVerKey :: VerificationKeyFile
-> SigningKeyFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisVerKey (VerificationKeyFile String
vkeyPath) (SigningKeyFile String
skeyPath) = do
SomeGenesisKey SigningKey
skey <- (FileError TextEnvelopeError -> ShelleyGenesisCmdError)
-> ExceptT
(FileError TextEnvelopeError) IO (SomeGenesisKey SigningKey)
-> ExceptT ShelleyGenesisCmdError IO (SomeGenesisKey SigningKey)
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError TextEnvelopeError -> ShelleyGenesisCmdError
ShelleyGenesisCmdTextEnvReadFileError (ExceptT
(FileError TextEnvelopeError) IO (SomeGenesisKey SigningKey)
-> ExceptT ShelleyGenesisCmdError IO (SomeGenesisKey SigningKey))
-> (IO
(Either (FileError TextEnvelopeError) (SomeGenesisKey SigningKey))
-> ExceptT
(FileError TextEnvelopeError) IO (SomeGenesisKey SigningKey))
-> IO
(Either (FileError TextEnvelopeError) (SomeGenesisKey SigningKey))
-> ExceptT ShelleyGenesisCmdError IO (SomeGenesisKey SigningKey)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO
(Either (FileError TextEnvelopeError) (SomeGenesisKey SigningKey))
-> ExceptT
(FileError TextEnvelopeError) IO (SomeGenesisKey SigningKey)
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT (IO
(Either (FileError TextEnvelopeError) (SomeGenesisKey SigningKey))
-> ExceptT ShelleyGenesisCmdError IO (SomeGenesisKey SigningKey))
-> IO
(Either (FileError TextEnvelopeError) (SomeGenesisKey SigningKey))
-> ExceptT ShelleyGenesisCmdError IO (SomeGenesisKey SigningKey)
forall a b. (a -> b) -> a -> b
$
[FromSomeType HasTextEnvelope (SomeGenesisKey SigningKey)]
-> String
-> IO
(Either (FileError TextEnvelopeError) (SomeGenesisKey SigningKey))
forall b.
[FromSomeType HasTextEnvelope b]
-> String -> IO (Either (FileError TextEnvelopeError) b)
readFileTextEnvelopeAnyOf
[ AsType (SigningKey GenesisKey)
-> (SigningKey GenesisKey -> SomeGenesisKey SigningKey)
-> FromSomeType HasTextEnvelope (SomeGenesisKey SigningKey)
forall (c :: * -> Constraint) a b.
c a =>
AsType a -> (a -> b) -> FromSomeType c b
FromSomeType (AsType GenesisKey -> AsType (SigningKey GenesisKey)
forall a. AsType a -> AsType (SigningKey a)
AsSigningKey AsType GenesisKey
AsGenesisKey)
SigningKey GenesisKey -> SomeGenesisKey SigningKey
forall (f :: * -> *). f GenesisKey -> SomeGenesisKey f
AGenesisKey
, AsType (SigningKey GenesisDelegateKey)
-> (SigningKey GenesisDelegateKey -> SomeGenesisKey SigningKey)
-> FromSomeType HasTextEnvelope (SomeGenesisKey SigningKey)
forall (c :: * -> Constraint) a b.
c a =>
AsType a -> (a -> b) -> FromSomeType c b
FromSomeType (AsType GenesisDelegateKey -> AsType (SigningKey GenesisDelegateKey)
forall a. AsType a -> AsType (SigningKey a)
AsSigningKey AsType GenesisDelegateKey
AsGenesisDelegateKey)
SigningKey GenesisDelegateKey -> SomeGenesisKey SigningKey
forall (f :: * -> *). f GenesisDelegateKey -> SomeGenesisKey f
AGenesisDelegateKey
, AsType (SigningKey GenesisUTxOKey)
-> (SigningKey GenesisUTxOKey -> SomeGenesisKey SigningKey)
-> FromSomeType HasTextEnvelope (SomeGenesisKey SigningKey)
forall (c :: * -> Constraint) a b.
c a =>
AsType a -> (a -> b) -> FromSomeType c b
FromSomeType (AsType GenesisUTxOKey -> AsType (SigningKey GenesisUTxOKey)
forall a. AsType a -> AsType (SigningKey a)
AsSigningKey AsType GenesisUTxOKey
AsGenesisUTxOKey)
SigningKey GenesisUTxOKey -> SomeGenesisKey SigningKey
forall (f :: * -> *). f GenesisUTxOKey -> SomeGenesisKey f
AGenesisUTxOKey
]
String
skeyPath
let vkey :: SomeGenesisKey VerificationKey
vkey :: SomeGenesisKey VerificationKey
vkey = case SomeGenesisKey SigningKey
skey of
AGenesisKey SigningKey GenesisKey
sk -> VerificationKey GenesisKey -> SomeGenesisKey VerificationKey
forall (f :: * -> *). f GenesisKey -> SomeGenesisKey f
AGenesisKey (SigningKey GenesisKey -> VerificationKey GenesisKey
forall keyrole.
Key keyrole =>
SigningKey keyrole -> VerificationKey keyrole
getVerificationKey SigningKey GenesisKey
sk)
AGenesisDelegateKey SigningKey GenesisDelegateKey
sk -> VerificationKey GenesisDelegateKey
-> SomeGenesisKey VerificationKey
forall (f :: * -> *). f GenesisDelegateKey -> SomeGenesisKey f
AGenesisDelegateKey (SigningKey GenesisDelegateKey -> VerificationKey GenesisDelegateKey
forall keyrole.
Key keyrole =>
SigningKey keyrole -> VerificationKey keyrole
getVerificationKey SigningKey GenesisDelegateKey
sk)
AGenesisUTxOKey SigningKey GenesisUTxOKey
sk -> VerificationKey GenesisUTxOKey -> SomeGenesisKey VerificationKey
forall (f :: * -> *). f GenesisUTxOKey -> SomeGenesisKey f
AGenesisUTxOKey (SigningKey GenesisUTxOKey -> VerificationKey GenesisUTxOKey
forall keyrole.
Key keyrole =>
SigningKey keyrole -> VerificationKey keyrole
getVerificationKey SigningKey GenesisUTxOKey
sk)
(FileError () -> ShelleyGenesisCmdError)
-> ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError () -> ShelleyGenesisCmdError
ShelleyGenesisCmdGenesisFileError (ExceptT (FileError ()) IO ()
-> ExceptT ShelleyGenesisCmdError IO ())
-> (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ()
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> (IO (Either (FileError ()) ()) -> IO (Either (FileError ()) ()))
-> IO (Either (FileError ()) ())
-> ExceptT (FileError ()) IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> IO (Either (FileError ()) ())
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$
case SomeGenesisKey VerificationKey
vkey of
AGenesisKey VerificationKey GenesisKey
vk -> String
-> Maybe TextEnvelopeDescr
-> VerificationKey GenesisKey
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
vkeyPath Maybe TextEnvelopeDescr
forall a. Maybe a
Nothing VerificationKey GenesisKey
vk
AGenesisDelegateKey VerificationKey GenesisDelegateKey
vk -> String
-> Maybe TextEnvelopeDescr
-> VerificationKey GenesisDelegateKey
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
vkeyPath Maybe TextEnvelopeDescr
forall a. Maybe a
Nothing VerificationKey GenesisDelegateKey
vk
AGenesisUTxOKey VerificationKey GenesisUTxOKey
vk -> String
-> Maybe TextEnvelopeDescr
-> VerificationKey GenesisUTxOKey
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
vkeyPath Maybe TextEnvelopeDescr
forall a. Maybe a
Nothing VerificationKey GenesisUTxOKey
vk
data SomeGenesisKey f
= AGenesisKey (f GenesisKey)
| AGenesisDelegateKey (f GenesisDelegateKey)
| AGenesisUTxOKey (f GenesisUTxOKey)
runGenesisTxIn :: VerificationKeyFile -> NetworkId -> Maybe OutputFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisTxIn :: VerificationKeyFile
-> NetworkId
-> Maybe OutputFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisTxIn (VerificationKeyFile String
vkeyPath) NetworkId
network Maybe OutputFile
mOutFile = do
VerificationKey GenesisUTxOKey
vkey <- (FileError TextEnvelopeError -> ShelleyGenesisCmdError)
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisUTxOKey)
-> ExceptT
ShelleyGenesisCmdError IO (VerificationKey GenesisUTxOKey)
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError TextEnvelopeError -> ShelleyGenesisCmdError
ShelleyGenesisCmdTextEnvReadFileError (ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisUTxOKey)
-> ExceptT
ShelleyGenesisCmdError IO (VerificationKey GenesisUTxOKey))
-> (IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisUTxOKey))
-> IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
-> ExceptT
ShelleyGenesisCmdError IO (VerificationKey GenesisUTxOKey)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisUTxOKey)
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT (IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
-> ExceptT
ShelleyGenesisCmdError IO (VerificationKey GenesisUTxOKey))
-> IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
-> ExceptT
ShelleyGenesisCmdError IO (VerificationKey GenesisUTxOKey)
forall a b. (a -> b) -> a -> b
$
AsType (VerificationKey GenesisUTxOKey)
-> String
-> IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
forall a.
HasTextEnvelope a =>
AsType a -> String -> IO (Either (FileError TextEnvelopeError) a)
readFileTextEnvelope (AsType GenesisUTxOKey -> AsType (VerificationKey GenesisUTxOKey)
forall a. AsType a -> AsType (VerificationKey a)
AsVerificationKey AsType GenesisUTxOKey
AsGenesisUTxOKey) String
vkeyPath
let txin :: TxIn
txin = NetworkId -> Hash GenesisUTxOKey -> TxIn
genesisUTxOPseudoTxIn NetworkId
network (VerificationKey GenesisUTxOKey -> Hash GenesisUTxOKey
forall keyrole.
Key keyrole =>
VerificationKey keyrole -> Hash keyrole
verificationKeyHash VerificationKey GenesisUTxOKey
vkey)
IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ExceptT ShelleyGenesisCmdError IO ())
-> IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ Maybe OutputFile -> Text -> IO ()
writeOutput Maybe OutputFile
mOutFile (TxIn -> Text
renderTxIn TxIn
txin)
runGenesisAddr :: VerificationKeyFile -> NetworkId -> Maybe OutputFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisAddr :: VerificationKeyFile
-> NetworkId
-> Maybe OutputFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisAddr (VerificationKeyFile String
vkeyPath) NetworkId
network Maybe OutputFile
mOutFile = do
VerificationKey GenesisUTxOKey
vkey <- (FileError TextEnvelopeError -> ShelleyGenesisCmdError)
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisUTxOKey)
-> ExceptT
ShelleyGenesisCmdError IO (VerificationKey GenesisUTxOKey)
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError TextEnvelopeError -> ShelleyGenesisCmdError
ShelleyGenesisCmdTextEnvReadFileError (ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisUTxOKey)
-> ExceptT
ShelleyGenesisCmdError IO (VerificationKey GenesisUTxOKey))
-> (IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisUTxOKey))
-> IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
-> ExceptT
ShelleyGenesisCmdError IO (VerificationKey GenesisUTxOKey)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisUTxOKey)
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT (IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
-> ExceptT
ShelleyGenesisCmdError IO (VerificationKey GenesisUTxOKey))
-> IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
-> ExceptT
ShelleyGenesisCmdError IO (VerificationKey GenesisUTxOKey)
forall a b. (a -> b) -> a -> b
$
AsType (VerificationKey GenesisUTxOKey)
-> String
-> IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
forall a.
HasTextEnvelope a =>
AsType a -> String -> IO (Either (FileError TextEnvelopeError) a)
readFileTextEnvelope (AsType GenesisUTxOKey -> AsType (VerificationKey GenesisUTxOKey)
forall a. AsType a -> AsType (VerificationKey a)
AsVerificationKey AsType GenesisUTxOKey
AsGenesisUTxOKey) String
vkeyPath
let vkh :: Hash PaymentKey
vkh = VerificationKey PaymentKey -> Hash PaymentKey
forall keyrole.
Key keyrole =>
VerificationKey keyrole -> Hash keyrole
verificationKeyHash (VerificationKey GenesisUTxOKey -> VerificationKey PaymentKey
forall keyroleA keyroleB.
CastVerificationKeyRole keyroleA keyroleB =>
VerificationKey keyroleA -> VerificationKey keyroleB
castVerificationKey VerificationKey GenesisUTxOKey
vkey)
addr :: Address Shelley
addr = NetworkId
-> PaymentCredential -> StakeAddressReference -> Address Shelley
makeShelleyAddress NetworkId
network (Hash PaymentKey -> PaymentCredential
PaymentCredentialByKey Hash PaymentKey
vkh)
StakeAddressReference
NoStakeAddress
IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ExceptT ShelleyGenesisCmdError IO ())
-> IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ Maybe OutputFile -> Text -> IO ()
writeOutput Maybe OutputFile
mOutFile (Address Shelley -> Text
forall addr. SerialiseAddress addr => addr -> Text
serialiseAddress Address Shelley
addr)
writeOutput :: Maybe OutputFile -> Text -> IO ()
writeOutput :: Maybe OutputFile -> Text -> IO ()
writeOutput (Just (OutputFile String
fpath)) = String -> Text -> IO ()
Text.writeFile String
fpath
writeOutput Maybe OutputFile
Nothing = Text -> IO ()
Text.putStrLn
runGenesisCreate :: GenesisDir
-> Word
-> Word
-> Maybe SystemStart
-> Maybe Lovelace
-> NetworkId
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisCreate :: GenesisDir
-> Word
-> Word
-> Maybe SystemStart
-> Maybe Lovelace
-> NetworkId
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisCreate (GenesisDir String
rootdir)
Word
genNumGenesisKeys Word
genNumUTxOKeys
Maybe SystemStart
mStart Maybe Lovelace
mAmount NetworkId
network = do
IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ExceptT ShelleyGenesisCmdError IO ())
-> IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ do
Bool -> String -> IO ()
createDirectoryIfMissing Bool
False String
rootdir
Bool -> String -> IO ()
createDirectoryIfMissing Bool
False String
gendir
Bool -> String -> IO ()
createDirectoryIfMissing Bool
False String
deldir
Bool -> String -> IO ()
createDirectoryIfMissing Bool
False String
utxodir
ShelleyGenesis StandardShelley
template <- String
-> (ShelleyGenesis StandardShelley
-> ShelleyGenesis StandardShelley)
-> ExceptT
ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley)
readShelleyGenesis (String
rootdir String -> ShowS
</> String
"genesis.spec.json") ShelleyGenesis StandardShelley -> ShelleyGenesis StandardShelley
adjustTemplate
[Word]
-> (Word -> ExceptT ShelleyGenesisCmdError IO ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [ Word
1 .. Word
genNumGenesisKeys ] ((Word -> ExceptT ShelleyGenesisCmdError IO ())
-> ExceptT ShelleyGenesisCmdError IO ())
-> (Word -> ExceptT ShelleyGenesisCmdError IO ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ \Word
index -> do
String -> Word -> ExceptT ShelleyGenesisCmdError IO ()
createGenesisKeys String
gendir Word
index
String -> Word -> ExceptT ShelleyGenesisCmdError IO ()
createDelegateKeys String
deldir Word
index
[Word]
-> (Word -> ExceptT ShelleyGenesisCmdError IO ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [ Word
1 .. Word
genNumUTxOKeys ] ((Word -> ExceptT ShelleyGenesisCmdError IO ())
-> ExceptT ShelleyGenesisCmdError IO ())
-> (Word -> ExceptT ShelleyGenesisCmdError IO ())
-> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ \Word
index ->
String -> Word -> ExceptT ShelleyGenesisCmdError IO ()
createUtxoKeys String
utxodir Word
index
Map (Hash GenesisKey) (Hash GenesisDelegateKey, Hash VrfKey)
genDlgs <- String
-> String
-> ExceptT
ShelleyGenesisCmdError
IO
(Map (Hash GenesisKey) (Hash GenesisDelegateKey, Hash VrfKey))
readGenDelegsMap String
gendir String
deldir
[Address Shelley]
utxoAddrs <- String
-> NetworkId -> ExceptT ShelleyGenesisCmdError IO [Address Shelley]
readInitialFundAddresses String
utxodir NetworkId
network
SystemStart
start <- ExceptT ShelleyGenesisCmdError IO SystemStart
-> (SystemStart -> ExceptT ShelleyGenesisCmdError IO SystemStart)
-> Maybe SystemStart
-> ExceptT ShelleyGenesisCmdError IO SystemStart
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (UTCTime -> SystemStart
SystemStart (UTCTime -> SystemStart)
-> ExceptT ShelleyGenesisCmdError IO UTCTime
-> ExceptT ShelleyGenesisCmdError IO SystemStart
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ExceptT ShelleyGenesisCmdError IO UTCTime
getCurrentTimePlus30) SystemStart -> ExceptT ShelleyGenesisCmdError IO SystemStart
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe SystemStart
mStart
let finalGenesis :: ShelleyGenesis StandardShelley
finalGenesis = SystemStart
-> Maybe Lovelace
-> Map (Hash GenesisKey) (Hash GenesisDelegateKey, Hash VrfKey)
-> [Address Shelley]
-> ShelleyGenesis StandardShelley
-> ShelleyGenesis StandardShelley
updateTemplate SystemStart
start Maybe Lovelace
mAmount Map (Hash GenesisKey) (Hash GenesisDelegateKey, Hash VrfKey)
genDlgs [Address Shelley]
utxoAddrs ShelleyGenesis StandardShelley
template
String
-> ShelleyGenesis StandardShelley
-> ExceptT ShelleyGenesisCmdError IO ()
writeShelleyGenesis (String
rootdir String -> ShowS
</> String
"genesis.json") ShelleyGenesis StandardShelley
finalGenesis
where
adjustTemplate :: ShelleyGenesis StandardShelley -> ShelleyGenesis StandardShelley
adjustTemplate ShelleyGenesis StandardShelley
t = ShelleyGenesis StandardShelley
t { sgNetworkMagic :: Word32
sgNetworkMagic = NetworkMagic -> Word32
unNetworkMagic (NetworkId -> NetworkMagic
toNetworkMagic NetworkId
network) }
gendir :: String
gendir = String
rootdir String -> ShowS
</> String
"genesis-keys"
deldir :: String
deldir = String
rootdir String -> ShowS
</> String
"delegate-keys"
utxodir :: String
utxodir = String
rootdir String -> ShowS
</> String
"utxo-keys"
createDelegateKeys :: FilePath -> Word -> ExceptT ShelleyGenesisCmdError IO ()
createDelegateKeys :: String -> Word -> ExceptT ShelleyGenesisCmdError IO ()
createDelegateKeys String
dir Word
index = do
IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ExceptT ShelleyGenesisCmdError IO ())
-> IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> String -> IO ()
createDirectoryIfMissing Bool
False String
dir
let strIndex :: String
strIndex = Word -> String
forall a b. (Show a, ConvertText String b) => a -> b
show Word
index
VerificationKeyFile
-> SigningKeyFile
-> OpCertCounterFile
-> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyGenDelegate
(String -> VerificationKeyFile
VerificationKeyFile (String -> VerificationKeyFile) -> String -> VerificationKeyFile
forall a b. (a -> b) -> a -> b
$ String
dir String -> ShowS
</> String
"delegate" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
strIndex String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
".vkey")
(String -> SigningKeyFile
SigningKeyFile (String -> SigningKeyFile) -> String -> SigningKeyFile
forall a b. (a -> b) -> a -> b
$ String
dir String -> ShowS
</> String
"delegate" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
strIndex String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
".skey")
(String -> OpCertCounterFile
OpCertCounterFile (String -> OpCertCounterFile) -> String -> OpCertCounterFile
forall a b. (a -> b) -> a -> b
$ String
dir String -> ShowS
</> String
"delegate" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
strIndex String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
".counter")
VerificationKeyFile
-> SigningKeyFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyGenDelegateVRF
(String -> VerificationKeyFile
VerificationKeyFile (String -> VerificationKeyFile) -> String -> VerificationKeyFile
forall a b. (a -> b) -> a -> b
$ String
dir String -> ShowS
</> String
"delegate" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
strIndex String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
".vrf.vkey")
(String -> SigningKeyFile
SigningKeyFile (String -> SigningKeyFile) -> String -> SigningKeyFile
forall a b. (a -> b) -> a -> b
$ String
dir String -> ShowS
</> String
"delegate" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
strIndex String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
".vrf.skey")
createGenesisKeys :: FilePath -> Word -> ExceptT ShelleyGenesisCmdError IO ()
createGenesisKeys :: String -> Word -> ExceptT ShelleyGenesisCmdError IO ()
createGenesisKeys String
dir Word
index = do
IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ExceptT ShelleyGenesisCmdError IO ())
-> IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> String -> IO ()
createDirectoryIfMissing Bool
False String
dir
let strIndex :: String
strIndex = Word -> String
forall a b. (Show a, ConvertText String b) => a -> b
show Word
index
VerificationKeyFile
-> SigningKeyFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyGenGenesis
(String -> VerificationKeyFile
VerificationKeyFile (String -> VerificationKeyFile) -> String -> VerificationKeyFile
forall a b. (a -> b) -> a -> b
$ String
dir String -> ShowS
</> String
"genesis" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
strIndex String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
".vkey")
(String -> SigningKeyFile
SigningKeyFile (String -> SigningKeyFile) -> String -> SigningKeyFile
forall a b. (a -> b) -> a -> b
$ String
dir String -> ShowS
</> String
"genesis" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
strIndex String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
".skey")
createUtxoKeys :: FilePath -> Word -> ExceptT ShelleyGenesisCmdError IO ()
createUtxoKeys :: String -> Word -> ExceptT ShelleyGenesisCmdError IO ()
createUtxoKeys String
dir Word
index = do
IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ExceptT ShelleyGenesisCmdError IO ())
-> IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> String -> IO ()
createDirectoryIfMissing Bool
False String
dir
let strIndex :: String
strIndex = Word -> String
forall a b. (Show a, ConvertText String b) => a -> b
show Word
index
VerificationKeyFile
-> SigningKeyFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisKeyGenUTxO
(String -> VerificationKeyFile
VerificationKeyFile (String -> VerificationKeyFile) -> String -> VerificationKeyFile
forall a b. (a -> b) -> a -> b
$ String
dir String -> ShowS
</> String
"utxo" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
strIndex String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
".vkey")
(String -> SigningKeyFile
SigningKeyFile (String -> SigningKeyFile) -> String -> SigningKeyFile
forall a b. (a -> b) -> a -> b
$ String
dir String -> ShowS
</> String
"utxo" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
strIndex String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
".skey")
getCurrentTimePlus30 :: ExceptT ShelleyGenesisCmdError IO UTCTime
getCurrentTimePlus30 :: ExceptT ShelleyGenesisCmdError IO UTCTime
getCurrentTimePlus30 =
UTCTime -> UTCTime
plus30sec (UTCTime -> UTCTime)
-> ExceptT ShelleyGenesisCmdError IO UTCTime
-> ExceptT ShelleyGenesisCmdError IO UTCTime
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO UTCTime -> ExceptT ShelleyGenesisCmdError IO UTCTime
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO UTCTime
getCurrentTime
where
plus30sec :: UTCTime -> UTCTime
plus30sec :: UTCTime -> UTCTime
plus30sec = NominalDiffTime -> UTCTime -> UTCTime
addUTCTime (NominalDiffTime
30 :: NominalDiffTime)
readShelleyGenesis
:: FilePath
-> (ShelleyGenesis StandardShelley -> ShelleyGenesis StandardShelley)
-> ExceptT ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley)
readShelleyGenesis :: String
-> (ShelleyGenesis StandardShelley
-> ShelleyGenesis StandardShelley)
-> ExceptT
ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley)
readShelleyGenesis String
fpath ShelleyGenesis StandardShelley -> ShelleyGenesis StandardShelley
adjustDefaults = do
ExceptT ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley)
readAndDecode
ExceptT ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley)
-> (ShelleyGenesisCmdError
-> ExceptT
ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley))
-> ExceptT
ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley)
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
`catchError` \ShelleyGenesisCmdError
err ->
case ShelleyGenesisCmdError
err of
ShelleyGenesisCmdGenesisFileError (FileIOError String
_ IOException
ioe)
| IOException -> Bool
isDoesNotExistError IOException
ioe -> ExceptT ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley)
writeDefault
ShelleyGenesisCmdError
_ -> ShelleyGenesisCmdError
-> ExceptT
ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley)
forall (m :: * -> *) x a. Monad m => x -> ExceptT x m a
left ShelleyGenesisCmdError
err
where
readAndDecode :: ExceptT ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley)
readAndDecode = do
ByteString
lbs <- (IOException -> ShelleyGenesisCmdError)
-> IO ByteString -> ExceptT ShelleyGenesisCmdError IO ByteString
forall (m :: * -> *) x a.
MonadIO m =>
(IOException -> x) -> IO a -> ExceptT x m a
handleIOExceptT (FileError () -> ShelleyGenesisCmdError
ShelleyGenesisCmdGenesisFileError (FileError () -> ShelleyGenesisCmdError)
-> (IOException -> FileError ())
-> IOException
-> ShelleyGenesisCmdError
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. String -> IOException -> FileError ()
forall e. String -> IOException -> FileError e
FileIOError String
fpath) (IO ByteString -> ExceptT ShelleyGenesisCmdError IO ByteString)
-> IO ByteString -> ExceptT ShelleyGenesisCmdError IO ByteString
forall a b. (a -> b) -> a -> b
$ String -> IO ByteString
LBS.readFile String
fpath
(String -> ShelleyGenesisCmdError)
-> ExceptT String IO (ShelleyGenesis StandardShelley)
-> ExceptT
ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley)
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT (String -> Text -> ShelleyGenesisCmdError
ShelleyGenesisCmdAesonDecodeError String
fpath (Text -> ShelleyGenesisCmdError)
-> (String -> Text) -> String -> ShelleyGenesisCmdError
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. String -> Text
Text.pack)
(ExceptT String IO (ShelleyGenesis StandardShelley)
-> ExceptT
ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley))
-> (Either String (ShelleyGenesis StandardShelley)
-> ExceptT String IO (ShelleyGenesis StandardShelley))
-> Either String (ShelleyGenesis StandardShelley)
-> ExceptT
ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Either String (ShelleyGenesis StandardShelley)
-> ExceptT String IO (ShelleyGenesis StandardShelley)
forall (m :: * -> *) x a. Monad m => Either x a -> ExceptT x m a
hoistEither (Either String (ShelleyGenesis StandardShelley)
-> ExceptT
ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley))
-> Either String (ShelleyGenesis StandardShelley)
-> ExceptT
ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley)
forall a b. (a -> b) -> a -> b
$ ByteString -> Either String (ShelleyGenesis StandardShelley)
forall a. FromJSON a => ByteString -> Either String a
Aeson.eitherDecode' ByteString
lbs
defaults :: ShelleyGenesis StandardShelley
defaults :: ShelleyGenesis StandardShelley
defaults = ShelleyGenesis StandardShelley -> ShelleyGenesis StandardShelley
adjustDefaults ShelleyGenesis StandardShelley
forall crypto. ShelleyGenesis crypto
shelleyGenesisDefaults
writeDefault :: ExceptT ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley)
writeDefault = do
(IOException -> ShelleyGenesisCmdError)
-> IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) x a.
MonadIO m =>
(IOException -> x) -> IO a -> ExceptT x m a
handleIOExceptT (FileError () -> ShelleyGenesisCmdError
ShelleyGenesisCmdGenesisFileError (FileError () -> ShelleyGenesisCmdError)
-> (IOException -> FileError ())
-> IOException
-> ShelleyGenesisCmdError
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. String -> IOException -> FileError ()
forall e. String -> IOException -> FileError e
FileIOError String
fpath) (IO () -> ExceptT ShelleyGenesisCmdError IO ())
-> IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$
String -> ByteString -> IO ()
LBS.writeFile String
fpath (ShelleyGenesis StandardShelley -> ByteString
forall a. ToJSON a => a -> ByteString
encodePretty ShelleyGenesis StandardShelley
defaults)
ShelleyGenesis StandardShelley
-> ExceptT
ShelleyGenesisCmdError IO (ShelleyGenesis StandardShelley)
forall (m :: * -> *) a. Monad m => a -> m a
return ShelleyGenesis StandardShelley
defaults
updateTemplate
:: SystemStart
-> Maybe Lovelace
-> Map (Hash GenesisKey) (Hash GenesisDelegateKey, Hash VrfKey)
-> [Address Shelley]
-> ShelleyGenesis StandardShelley
-> ShelleyGenesis StandardShelley
updateTemplate :: SystemStart
-> Maybe Lovelace
-> Map (Hash GenesisKey) (Hash GenesisDelegateKey, Hash VrfKey)
-> [Address Shelley]
-> ShelleyGenesis StandardShelley
-> ShelleyGenesis StandardShelley
updateTemplate (SystemStart UTCTime
start) Maybe Lovelace
mAmount Map (Hash GenesisKey) (Hash GenesisDelegateKey, Hash VrfKey)
delKeys [Address Shelley]
utxoAddrs ShelleyGenesis StandardShelley
template =
ShelleyGenesis StandardShelley
template
{ sgSystemStart :: UTCTime
sgSystemStart = UTCTime
start
, sgMaxLovelaceSupply :: Word64
sgMaxLovelaceSupply = Integer -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
totalCoin
, sgGenDelegs :: Map
(KeyHash 'Genesis (Crypto StandardShelley))
(GenDelegPair (Crypto StandardShelley))
sgGenDelegs = Map (KeyHash 'Genesis StandardCrypto) (GenDelegPair StandardCrypto)
Map
(KeyHash 'Genesis (Crypto StandardShelley))
(GenDelegPair (Crypto StandardShelley))
shelleyDelKeys
, sgInitialFunds :: Map (Addr StandardShelley) Coin
sgInitialFunds = [(Addr StandardShelley, Coin)] -> Map (Addr StandardShelley) Coin
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
[ (Address Shelley -> Addr StandardShelley
toShelleyAddr Address Shelley
addr, Lovelace -> Coin
toShelleyLovelace Lovelace
v)
| (Address Shelley
addr, Lovelace
v) <- [(Address Shelley, Lovelace)]
utxoList ]
}
where
shelleyDelKeys :: Map (KeyHash 'Genesis StandardCrypto) (GenDelegPair StandardCrypto)
shelleyDelKeys =
[(KeyHash 'Genesis StandardCrypto, GenDelegPair StandardCrypto)]
-> Map
(KeyHash 'Genesis StandardCrypto) (GenDelegPair StandardCrypto)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
[ (KeyHash 'Genesis StandardCrypto
gh, KeyHash 'GenesisDelegate StandardCrypto
-> Hash StandardCrypto (VerKeyVRF StandardCrypto)
-> GenDelegPair StandardCrypto
forall crypto.
KeyHash 'GenesisDelegate crypto
-> Hash crypto (VerKeyVRF crypto) -> GenDelegPair crypto
Ledger.GenDelegPair KeyHash 'GenesisDelegate StandardCrypto
gdh Hash StandardCrypto (VerKeyVRF StandardCrypto)
h)
| (GenesisKeyHash gh,
(GenesisDelegateKeyHash gdh, VrfKeyHash h)) <- Map (Hash GenesisKey) (Hash GenesisDelegateKey, Hash VrfKey)
-> [(Hash GenesisKey, (Hash GenesisDelegateKey, Hash VrfKey))]
forall k a. Map k a -> [(k, a)]
Map.toList Map (Hash GenesisKey) (Hash GenesisDelegateKey, Hash VrfKey)
delKeys
]
totalCoin :: Integer
totalCoin :: Integer
totalCoin = case Maybe Lovelace
mAmount of
Maybe Lovelace
Nothing -> Word64 -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (ShelleyGenesis StandardShelley -> Word64
forall era. ShelleyGenesis era -> Word64
sgMaxLovelaceSupply ShelleyGenesis StandardShelley
template)
Just (Lovelace Integer
x) -> Integer
x
eachAddrCoin :: Integer
eachAddrCoin :: Integer
eachAddrCoin = Integer
totalCoin Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
`div` Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([Address Shelley] -> Int
forall a. HasLength a => a -> Int
length [Address Shelley]
utxoAddrs)
utxoList :: [(Address Shelley, Lovelace)]
utxoList :: [(Address Shelley, Lovelace)]
utxoList = ([(Address Shelley, Lovelace)], Integer)
-> [(Address Shelley, Lovelace)]
forall a b. (a, b) -> a
fst (([(Address Shelley, Lovelace)], Integer)
-> [(Address Shelley, Lovelace)])
-> ([(Address Shelley, Lovelace)], Integer)
-> [(Address Shelley, Lovelace)]
forall a b. (a -> b) -> a -> b
$ (([(Address Shelley, Lovelace)], Integer)
-> Address Shelley -> ([(Address Shelley, Lovelace)], Integer))
-> ([(Address Shelley, Lovelace)], Integer)
-> [Address Shelley]
-> ([(Address Shelley, Lovelace)], Integer)
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' ([(Address Shelley, Lovelace)], Integer)
-> Address Shelley -> ([(Address Shelley, Lovelace)], Integer)
folder ([], Integer
totalCoin) [Address Shelley]
utxoAddrs
folder :: ([(Address Shelley, Lovelace)], Integer)
-> Address Shelley
-> ([(Address Shelley, Lovelace)], Integer)
folder :: ([(Address Shelley, Lovelace)], Integer)
-> Address Shelley -> ([(Address Shelley, Lovelace)], Integer)
folder ([(Address Shelley, Lovelace)]
acc, Integer
rest) Address Shelley
addr
| Integer
rest Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer
eachAddrCoin Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([Address Shelley] -> Int
forall a. HasLength a => a -> Int
length [Address Shelley]
utxoAddrs) =
((Address Shelley
addr, Integer -> Lovelace
Lovelace Integer
eachAddrCoin) (Address Shelley, Lovelace)
-> [(Address Shelley, Lovelace)] -> [(Address Shelley, Lovelace)]
forall a. a -> [a] -> [a]
: [(Address Shelley, Lovelace)]
acc, Integer
rest Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
eachAddrCoin)
| Bool
otherwise = ((Address Shelley
addr, Integer -> Lovelace
Lovelace Integer
rest) (Address Shelley, Lovelace)
-> [(Address Shelley, Lovelace)] -> [(Address Shelley, Lovelace)]
forall a. a -> [a] -> [a]
: [(Address Shelley, Lovelace)]
acc, Integer
0)
writeShelleyGenesis :: FilePath -> ShelleyGenesis StandardShelley -> ExceptT ShelleyGenesisCmdError IO ()
writeShelleyGenesis :: String
-> ShelleyGenesis StandardShelley
-> ExceptT ShelleyGenesisCmdError IO ()
writeShelleyGenesis String
fpath ShelleyGenesis StandardShelley
sg =
(IOException -> ShelleyGenesisCmdError)
-> IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) x a.
MonadIO m =>
(IOException -> x) -> IO a -> ExceptT x m a
handleIOExceptT (FileError () -> ShelleyGenesisCmdError
ShelleyGenesisCmdGenesisFileError (FileError () -> ShelleyGenesisCmdError)
-> (IOException -> FileError ())
-> IOException
-> ShelleyGenesisCmdError
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. String -> IOException -> FileError ()
forall e. String -> IOException -> FileError e
FileIOError String
fpath) (IO () -> ExceptT ShelleyGenesisCmdError IO ())
-> IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String -> ByteString -> IO ()
LBS.writeFile String
fpath (ShelleyGenesis StandardShelley -> ByteString
forall a. ToJSON a => a -> ByteString
encodePretty ShelleyGenesis StandardShelley
sg)
toShelleyAddr :: Address Shelley -> Ledger.Addr StandardShelley
toShelleyAddr :: Address Shelley -> Addr StandardShelley
toShelleyAddr (ByronAddress Address
addr) = BootstrapAddress StandardShelley -> Addr StandardShelley
forall era. BootstrapAddress era -> Addr era
Ledger.AddrBootstrap
(Address -> BootstrapAddress StandardShelley
forall era. Address -> BootstrapAddress era
Ledger.BootstrapAddress Address
addr)
toShelleyAddr (ShelleyAddress Network
nw PaymentCredential StandardShelley
pc StakeReference StandardShelley
scr) = Network
-> PaymentCredential StandardShelley
-> StakeReference StandardShelley
-> Addr StandardShelley
forall era.
Network -> PaymentCredential era -> StakeReference era -> Addr era
Ledger.Addr Network
nw PaymentCredential StandardShelley
pc StakeReference StandardShelley
scr
toShelleyLovelace :: Lovelace -> Ledger.Coin
toShelleyLovelace :: Lovelace -> Coin
toShelleyLovelace (Lovelace Integer
l) = Integer -> Coin
Ledger.Coin Integer
l
readGenDelegsMap :: FilePath -> FilePath
-> ExceptT ShelleyGenesisCmdError IO
(Map (Hash GenesisKey)
(Hash GenesisDelegateKey, Hash VrfKey))
readGenDelegsMap :: String
-> String
-> ExceptT
ShelleyGenesisCmdError
IO
(Map (Hash GenesisKey) (Hash GenesisDelegateKey, Hash VrfKey))
readGenDelegsMap String
gendir String
deldir = do
Map Int (VerificationKey GenesisKey)
gkm <- String
-> ExceptT
ShelleyGenesisCmdError IO (Map Int (VerificationKey GenesisKey))
readGenesisKeys String
gendir
Map Int (VerificationKey GenesisDelegateKey)
dkm <- String
-> ExceptT
ShelleyGenesisCmdError
IO
(Map Int (VerificationKey GenesisDelegateKey))
readDelegateKeys String
deldir
Map Int (VerificationKey VrfKey)
vkm <- String
-> ExceptT
ShelleyGenesisCmdError IO (Map Int (VerificationKey VrfKey))
readDelegateVrfKeys String
deldir
let combinedMap :: Map Int (VerificationKey GenesisKey,
(VerificationKey GenesisDelegateKey,
VerificationKey VrfKey))
combinedMap :: Map
Int
(VerificationKey GenesisKey,
(VerificationKey GenesisDelegateKey, VerificationKey VrfKey))
combinedMap =
(VerificationKey GenesisKey
-> (VerificationKey GenesisDelegateKey, VerificationKey VrfKey)
-> (VerificationKey GenesisKey,
(VerificationKey GenesisDelegateKey, VerificationKey VrfKey)))
-> Map Int (VerificationKey GenesisKey)
-> Map
Int (VerificationKey GenesisDelegateKey, VerificationKey VrfKey)
-> Map
Int
(VerificationKey GenesisKey,
(VerificationKey GenesisDelegateKey, VerificationKey VrfKey))
forall k a b c.
Ord k =>
(a -> b -> c) -> Map k a -> Map k b -> Map k c
Map.intersectionWith (,)
Map Int (VerificationKey GenesisKey)
gkm
((VerificationKey GenesisDelegateKey
-> VerificationKey VrfKey
-> (VerificationKey GenesisDelegateKey, VerificationKey VrfKey))
-> Map Int (VerificationKey GenesisDelegateKey)
-> Map Int (VerificationKey VrfKey)
-> Map
Int (VerificationKey GenesisDelegateKey, VerificationKey VrfKey)
forall k a b c.
Ord k =>
(a -> b -> c) -> Map k a -> Map k b -> Map k c
Map.intersectionWith (,)
Map Int (VerificationKey GenesisDelegateKey)
dkm Map Int (VerificationKey VrfKey)
vkm)
let gkmExtra :: Map Int (VerificationKey GenesisKey)
gkmExtra = Map Int (VerificationKey GenesisKey)
gkm Map Int (VerificationKey GenesisKey)
-> Map
Int
(VerificationKey GenesisKey,
(VerificationKey GenesisDelegateKey, VerificationKey VrfKey))
-> Map Int (VerificationKey GenesisKey)
forall k a b. Ord k => Map k a -> Map k b -> Map k a
Map.\\ Map
Int
(VerificationKey GenesisKey,
(VerificationKey GenesisDelegateKey, VerificationKey VrfKey))
combinedMap
dkmExtra :: Map Int (VerificationKey GenesisDelegateKey)
dkmExtra = Map Int (VerificationKey GenesisDelegateKey)
dkm Map Int (VerificationKey GenesisDelegateKey)
-> Map
Int
(VerificationKey GenesisKey,
(VerificationKey GenesisDelegateKey, VerificationKey VrfKey))
-> Map Int (VerificationKey GenesisDelegateKey)
forall k a b. Ord k => Map k a -> Map k b -> Map k a
Map.\\ Map
Int
(VerificationKey GenesisKey,
(VerificationKey GenesisDelegateKey, VerificationKey VrfKey))
combinedMap
vkmExtra :: Map Int (VerificationKey VrfKey)
vkmExtra = Map Int (VerificationKey VrfKey)
vkm Map Int (VerificationKey VrfKey)
-> Map
Int
(VerificationKey GenesisKey,
(VerificationKey GenesisDelegateKey, VerificationKey VrfKey))
-> Map Int (VerificationKey VrfKey)
forall k a b. Ord k => Map k a -> Map k b -> Map k a
Map.\\ Map
Int
(VerificationKey GenesisKey,
(VerificationKey GenesisDelegateKey, VerificationKey VrfKey))
combinedMap
Bool
-> ExceptT ShelleyGenesisCmdError IO ()
-> ExceptT ShelleyGenesisCmdError IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Map Int (VerificationKey GenesisKey) -> Bool
forall k a. Map k a -> Bool
Map.null Map Int (VerificationKey GenesisKey)
gkmExtra Bool -> Bool -> Bool
&& Map Int (VerificationKey GenesisDelegateKey) -> Bool
forall k a. Map k a -> Bool
Map.null Map Int (VerificationKey GenesisDelegateKey)
dkmExtra Bool -> Bool -> Bool
&& Map Int (VerificationKey VrfKey) -> Bool
forall k a. Map k a -> Bool
Map.null Map Int (VerificationKey VrfKey)
vkmExtra) (ExceptT ShelleyGenesisCmdError IO ()
-> ExceptT ShelleyGenesisCmdError IO ())
-> ExceptT ShelleyGenesisCmdError IO ()
-> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$
ShelleyGenesisCmdError -> ExceptT ShelleyGenesisCmdError IO ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (ShelleyGenesisCmdError -> ExceptT ShelleyGenesisCmdError IO ())
-> ShelleyGenesisCmdError -> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ [Int] -> [Int] -> [Int] -> ShelleyGenesisCmdError
ShelleyGenesisCmdMismatchedGenesisKeyFiles
(Map Int (VerificationKey GenesisKey) -> [Int]
forall k a. Map k a -> [k]
Map.keys Map Int (VerificationKey GenesisKey)
gkm) (Map Int (VerificationKey GenesisDelegateKey) -> [Int]
forall k a. Map k a -> [k]
Map.keys Map Int (VerificationKey GenesisDelegateKey)
dkm) (Map Int (VerificationKey VrfKey) -> [Int]
forall k a. Map k a -> [k]
Map.keys Map Int (VerificationKey VrfKey)
vkm)
let delegsMap :: Map (Hash GenesisKey)
(Hash GenesisDelegateKey, Hash VrfKey)
delegsMap :: Map (Hash GenesisKey) (Hash GenesisDelegateKey, Hash VrfKey)
delegsMap =
[(Hash GenesisKey, (Hash GenesisDelegateKey, Hash VrfKey))]
-> Map (Hash GenesisKey) (Hash GenesisDelegateKey, Hash VrfKey)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [ (Hash GenesisKey
gh, (Hash GenesisDelegateKey
dh, Hash VrfKey
vh))
| (VerificationKey GenesisKey
g,(VerificationKey GenesisDelegateKey
d,VerificationKey VrfKey
v)) <- Map
Int
(VerificationKey GenesisKey,
(VerificationKey GenesisDelegateKey, VerificationKey VrfKey))
-> [(VerificationKey GenesisKey,
(VerificationKey GenesisDelegateKey, VerificationKey VrfKey))]
forall k a. Map k a -> [a]
Map.elems Map
Int
(VerificationKey GenesisKey,
(VerificationKey GenesisDelegateKey, VerificationKey VrfKey))
combinedMap
, let gh :: Hash GenesisKey
gh = VerificationKey GenesisKey -> Hash GenesisKey
forall keyrole.
Key keyrole =>
VerificationKey keyrole -> Hash keyrole
verificationKeyHash VerificationKey GenesisKey
g
dh :: Hash GenesisDelegateKey
dh = VerificationKey GenesisDelegateKey -> Hash GenesisDelegateKey
forall keyrole.
Key keyrole =>
VerificationKey keyrole -> Hash keyrole
verificationKeyHash VerificationKey GenesisDelegateKey
d
vh :: Hash VrfKey
vh = VerificationKey VrfKey -> Hash VrfKey
forall keyrole.
Key keyrole =>
VerificationKey keyrole -> Hash keyrole
verificationKeyHash VerificationKey VrfKey
v
]
Map (Hash GenesisKey) (Hash GenesisDelegateKey, Hash VrfKey)
-> ExceptT
ShelleyGenesisCmdError
IO
(Map (Hash GenesisKey) (Hash GenesisDelegateKey, Hash VrfKey))
forall (f :: * -> *) a. Applicative f => a -> f a
pure Map (Hash GenesisKey) (Hash GenesisDelegateKey, Hash VrfKey)
delegsMap
readGenesisKeys :: FilePath -> ExceptT ShelleyGenesisCmdError IO
(Map Int (VerificationKey GenesisKey))
readGenesisKeys :: String
-> ExceptT
ShelleyGenesisCmdError IO (Map Int (VerificationKey GenesisKey))
readGenesisKeys String
gendir = do
[String]
files <- IO [String] -> ExceptT ShelleyGenesisCmdError IO [String]
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (String -> IO [String]
listDirectory String
gendir)
[(String, Int)]
fileIxs <- [String] -> ExceptT ShelleyGenesisCmdError IO [(String, Int)]
extractFileNameIndexes [ String
gendir String -> ShowS
</> String
file
| String
file <- [String]
files
, ShowS
takeExtension String
file String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
".vkey" ]
(FileError TextEnvelopeError -> ShelleyGenesisCmdError)
-> ExceptT
(FileError TextEnvelopeError)
IO
(Map Int (VerificationKey GenesisKey))
-> ExceptT
ShelleyGenesisCmdError IO (Map Int (VerificationKey GenesisKey))
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError TextEnvelopeError -> ShelleyGenesisCmdError
ShelleyGenesisCmdTextEnvReadFileError (ExceptT
(FileError TextEnvelopeError)
IO
(Map Int (VerificationKey GenesisKey))
-> ExceptT
ShelleyGenesisCmdError IO (Map Int (VerificationKey GenesisKey)))
-> ExceptT
(FileError TextEnvelopeError)
IO
(Map Int (VerificationKey GenesisKey))
-> ExceptT
ShelleyGenesisCmdError IO (Map Int (VerificationKey GenesisKey))
forall a b. (a -> b) -> a -> b
$
[(Int, VerificationKey GenesisKey)]
-> Map Int (VerificationKey GenesisKey)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(Int, VerificationKey GenesisKey)]
-> Map Int (VerificationKey GenesisKey))
-> ExceptT
(FileError TextEnvelopeError)
IO
[(Int, VerificationKey GenesisKey)]
-> ExceptT
(FileError TextEnvelopeError)
IO
(Map Int (VerificationKey GenesisKey))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
[ExceptT
(FileError TextEnvelopeError) IO (Int, VerificationKey GenesisKey)]
-> ExceptT
(FileError TextEnvelopeError)
IO
[(Int, VerificationKey GenesisKey)]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence
[ (,) Int
ix (VerificationKey GenesisKey -> (Int, VerificationKey GenesisKey))
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisKey)
-> ExceptT
(FileError TextEnvelopeError) IO (Int, VerificationKey GenesisKey)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisKey)
readKeyFile String
file
| (String
file, Int
ix) <- [(String, Int)]
fileIxs ]
where
readKeyFile :: String
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisKey)
readKeyFile = IO
(Either (FileError TextEnvelopeError) (VerificationKey GenesisKey))
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisKey)
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
(IO
(Either (FileError TextEnvelopeError) (VerificationKey GenesisKey))
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisKey))
-> (String
-> IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisKey)))
-> String
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisKey)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. AsType (VerificationKey GenesisKey)
-> String
-> IO
(Either (FileError TextEnvelopeError) (VerificationKey GenesisKey))
forall a.
HasTextEnvelope a =>
AsType a -> String -> IO (Either (FileError TextEnvelopeError) a)
readFileTextEnvelope (AsType GenesisKey -> AsType (VerificationKey GenesisKey)
forall a. AsType a -> AsType (VerificationKey a)
AsVerificationKey AsType GenesisKey
AsGenesisKey)
readDelegateKeys :: FilePath
-> ExceptT ShelleyGenesisCmdError IO
(Map Int (VerificationKey GenesisDelegateKey))
readDelegateKeys :: String
-> ExceptT
ShelleyGenesisCmdError
IO
(Map Int (VerificationKey GenesisDelegateKey))
readDelegateKeys String
deldir = do
[String]
files <- IO [String] -> ExceptT ShelleyGenesisCmdError IO [String]
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (String -> IO [String]
listDirectory String
deldir)
[(String, Int)]
fileIxs <- [String] -> ExceptT ShelleyGenesisCmdError IO [(String, Int)]
extractFileNameIndexes [ String
deldir String -> ShowS
</> String
file
| String
file <- [String]
files
, ShowS
takeExtensions String
file String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
".vkey" ]
(FileError TextEnvelopeError -> ShelleyGenesisCmdError)
-> ExceptT
(FileError TextEnvelopeError)
IO
(Map Int (VerificationKey GenesisDelegateKey))
-> ExceptT
ShelleyGenesisCmdError
IO
(Map Int (VerificationKey GenesisDelegateKey))
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError TextEnvelopeError -> ShelleyGenesisCmdError
ShelleyGenesisCmdTextEnvReadFileError (ExceptT
(FileError TextEnvelopeError)
IO
(Map Int (VerificationKey GenesisDelegateKey))
-> ExceptT
ShelleyGenesisCmdError
IO
(Map Int (VerificationKey GenesisDelegateKey)))
-> ExceptT
(FileError TextEnvelopeError)
IO
(Map Int (VerificationKey GenesisDelegateKey))
-> ExceptT
ShelleyGenesisCmdError
IO
(Map Int (VerificationKey GenesisDelegateKey))
forall a b. (a -> b) -> a -> b
$
[(Int, VerificationKey GenesisDelegateKey)]
-> Map Int (VerificationKey GenesisDelegateKey)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(Int, VerificationKey GenesisDelegateKey)]
-> Map Int (VerificationKey GenesisDelegateKey))
-> ExceptT
(FileError TextEnvelopeError)
IO
[(Int, VerificationKey GenesisDelegateKey)]
-> ExceptT
(FileError TextEnvelopeError)
IO
(Map Int (VerificationKey GenesisDelegateKey))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
[ExceptT
(FileError TextEnvelopeError)
IO
(Int, VerificationKey GenesisDelegateKey)]
-> ExceptT
(FileError TextEnvelopeError)
IO
[(Int, VerificationKey GenesisDelegateKey)]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence
[ (,) Int
ix (VerificationKey GenesisDelegateKey
-> (Int, VerificationKey GenesisDelegateKey))
-> ExceptT
(FileError TextEnvelopeError)
IO
(VerificationKey GenesisDelegateKey)
-> ExceptT
(FileError TextEnvelopeError)
IO
(Int, VerificationKey GenesisDelegateKey)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String
-> ExceptT
(FileError TextEnvelopeError)
IO
(VerificationKey GenesisDelegateKey)
readKeyFile String
file
| (String
file, Int
ix) <- [(String, Int)]
fileIxs ]
where
readKeyFile :: String
-> ExceptT
(FileError TextEnvelopeError)
IO
(VerificationKey GenesisDelegateKey)
readKeyFile = IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisDelegateKey))
-> ExceptT
(FileError TextEnvelopeError)
IO
(VerificationKey GenesisDelegateKey)
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
(IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisDelegateKey))
-> ExceptT
(FileError TextEnvelopeError)
IO
(VerificationKey GenesisDelegateKey))
-> (String
-> IO
(Either
(FileError TextEnvelopeError)
(VerificationKey GenesisDelegateKey)))
-> String
-> ExceptT
(FileError TextEnvelopeError)
IO
(VerificationKey GenesisDelegateKey)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. AsType (VerificationKey GenesisDelegateKey)
-> String
-> IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisDelegateKey))
forall a.
HasTextEnvelope a =>
AsType a -> String -> IO (Either (FileError TextEnvelopeError) a)
readFileTextEnvelope (AsType GenesisDelegateKey
-> AsType (VerificationKey GenesisDelegateKey)
forall a. AsType a -> AsType (VerificationKey a)
AsVerificationKey AsType GenesisDelegateKey
AsGenesisDelegateKey)
readDelegateVrfKeys :: FilePath -> ExceptT ShelleyGenesisCmdError IO
(Map Int (VerificationKey VrfKey))
readDelegateVrfKeys :: String
-> ExceptT
ShelleyGenesisCmdError IO (Map Int (VerificationKey VrfKey))
readDelegateVrfKeys String
deldir = do
[String]
files <- IO [String] -> ExceptT ShelleyGenesisCmdError IO [String]
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (String -> IO [String]
listDirectory String
deldir)
[(String, Int)]
fileIxs <- [String] -> ExceptT ShelleyGenesisCmdError IO [(String, Int)]
extractFileNameIndexes [ String
deldir String -> ShowS
</> String
file
| String
file <- [String]
files
, ShowS
takeExtensions String
file String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
".vrf.vkey" ]
(FileError TextEnvelopeError -> ShelleyGenesisCmdError)
-> ExceptT
(FileError TextEnvelopeError) IO (Map Int (VerificationKey VrfKey))
-> ExceptT
ShelleyGenesisCmdError IO (Map Int (VerificationKey VrfKey))
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError TextEnvelopeError -> ShelleyGenesisCmdError
ShelleyGenesisCmdTextEnvReadFileError (ExceptT
(FileError TextEnvelopeError) IO (Map Int (VerificationKey VrfKey))
-> ExceptT
ShelleyGenesisCmdError IO (Map Int (VerificationKey VrfKey)))
-> ExceptT
(FileError TextEnvelopeError) IO (Map Int (VerificationKey VrfKey))
-> ExceptT
ShelleyGenesisCmdError IO (Map Int (VerificationKey VrfKey))
forall a b. (a -> b) -> a -> b
$
[(Int, VerificationKey VrfKey)] -> Map Int (VerificationKey VrfKey)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(Int, VerificationKey VrfKey)]
-> Map Int (VerificationKey VrfKey))
-> ExceptT
(FileError TextEnvelopeError) IO [(Int, VerificationKey VrfKey)]
-> ExceptT
(FileError TextEnvelopeError) IO (Map Int (VerificationKey VrfKey))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
[ExceptT
(FileError TextEnvelopeError) IO (Int, VerificationKey VrfKey)]
-> ExceptT
(FileError TextEnvelopeError) IO [(Int, VerificationKey VrfKey)]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence
[ (,) Int
ix (VerificationKey VrfKey -> (Int, VerificationKey VrfKey))
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey VrfKey)
-> ExceptT
(FileError TextEnvelopeError) IO (Int, VerificationKey VrfKey)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey VrfKey)
readKeyFile String
file
| (String
file, Int
ix) <- [(String, Int)]
fileIxs ]
where
readKeyFile :: String
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey VrfKey)
readKeyFile = IO (Either (FileError TextEnvelopeError) (VerificationKey VrfKey))
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey VrfKey)
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
(IO (Either (FileError TextEnvelopeError) (VerificationKey VrfKey))
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey VrfKey))
-> (String
-> IO
(Either (FileError TextEnvelopeError) (VerificationKey VrfKey)))
-> String
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey VrfKey)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. AsType (VerificationKey VrfKey)
-> String
-> IO
(Either (FileError TextEnvelopeError) (VerificationKey VrfKey))
forall a.
HasTextEnvelope a =>
AsType a -> String -> IO (Either (FileError TextEnvelopeError) a)
readFileTextEnvelope (AsType VrfKey -> AsType (VerificationKey VrfKey)
forall a. AsType a -> AsType (VerificationKey a)
AsVerificationKey AsType VrfKey
AsVrfKey)
extractFileNameIndex :: FilePath -> Maybe Int
String
fp =
case (Char -> Bool) -> ShowS
forall a. (a -> Bool) -> [a] -> [a]
filter Char -> Bool
isDigit String
fp of
[] -> Maybe Int
forall a. Maybe a
Nothing
String
xs -> String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe String
xs
extractFileNameIndexes :: [FilePath]
-> ExceptT ShelleyGenesisCmdError IO [(FilePath, Int)]
[String]
files = do
case [ String
file | (String
file, Maybe Int
Nothing) <- [(String, Maybe Int)]
filesIxs ] of
[] -> () -> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
[String]
files' -> ShelleyGenesisCmdError -> ExceptT ShelleyGenesisCmdError IO ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError ([String] -> ShelleyGenesisCmdError
ShelleyGenesisCmdFilesNoIndex [String]
files')
case ([(String, Int)] -> Bool) -> [[(String, Int)]] -> [[(String, Int)]]
forall a. (a -> Bool) -> [a] -> [a]
filter (\[(String, Int)]
g -> [(String, Int)] -> Int
forall a. HasLength a => a -> Int
length [(String, Int)]
g Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
1)
([[(String, Int)]] -> [[(String, Int)]])
-> ([(String, Int)] -> [[(String, Int)]])
-> [(String, Int)]
-> [[(String, Int)]]
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ((String, Int) -> (String, Int) -> Bool)
-> [(String, Int)] -> [[(String, Int)]]
forall a. (a -> a -> Bool) -> [a] -> [[a]]
groupBy (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
(==) (Int -> Int -> Bool)
-> ((String, Int) -> Int) -> (String, Int) -> (String, Int) -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` (String, Int) -> Int
forall a b. (a, b) -> b
snd)
([(String, Int)] -> [[(String, Int)]])
-> ([(String, Int)] -> [(String, Int)])
-> [(String, Int)]
-> [[(String, Int)]]
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ((String, Int) -> (String, Int) -> Ordering)
-> [(String, Int)] -> [(String, Int)]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy (Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Int -> Int -> Ordering)
-> ((String, Int) -> Int)
-> (String, Int)
-> (String, Int)
-> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` (String, Int) -> Int
forall a b. (a, b) -> b
snd)
([(String, Int)] -> [[(String, Int)]])
-> [(String, Int)] -> [[(String, Int)]]
forall a b. (a -> b) -> a -> b
$ [ (String
file, Int
ix) | (String
file, Just Int
ix) <- [(String, Maybe Int)]
filesIxs ] of
[] -> () -> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
([(String, Int)]
g:[[(String, Int)]]
_) -> ShelleyGenesisCmdError -> ExceptT ShelleyGenesisCmdError IO ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError ([String] -> ShelleyGenesisCmdError
ShelleyGenesisCmdFilesDupIndex (((String, Int) -> String) -> [(String, Int)] -> [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
map (String, Int) -> String
forall a b. (a, b) -> a
fst [(String, Int)]
g))
[(String, Int)]
-> ExceptT ShelleyGenesisCmdError IO [(String, Int)]
forall (m :: * -> *) a. Monad m => a -> m a
return [ (String
file, Int
ix) | (String
file, Just Int
ix) <- [(String, Maybe Int)]
filesIxs ]
where
filesIxs :: [(String, Maybe Int)]
filesIxs = [ (String
file, String -> Maybe Int
extractFileNameIndex String
file) | String
file <- [String]
files ]
readInitialFundAddresses :: FilePath -> NetworkId
-> ExceptT ShelleyGenesisCmdError IO [Address Shelley]
readInitialFundAddresses :: String
-> NetworkId -> ExceptT ShelleyGenesisCmdError IO [Address Shelley]
readInitialFundAddresses String
utxodir NetworkId
nw = do
[String]
files <- IO [String] -> ExceptT ShelleyGenesisCmdError IO [String]
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (String -> IO [String]
listDirectory String
utxodir)
[VerificationKey GenesisUTxOKey]
vkeys <- (FileError TextEnvelopeError -> ShelleyGenesisCmdError)
-> ExceptT
(FileError TextEnvelopeError) IO [VerificationKey GenesisUTxOKey]
-> ExceptT
ShelleyGenesisCmdError IO [VerificationKey GenesisUTxOKey]
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError TextEnvelopeError -> ShelleyGenesisCmdError
ShelleyGenesisCmdTextEnvReadFileError (ExceptT
(FileError TextEnvelopeError) IO [VerificationKey GenesisUTxOKey]
-> ExceptT
ShelleyGenesisCmdError IO [VerificationKey GenesisUTxOKey])
-> ExceptT
(FileError TextEnvelopeError) IO [VerificationKey GenesisUTxOKey]
-> ExceptT
ShelleyGenesisCmdError IO [VerificationKey GenesisUTxOKey]
forall a b. (a -> b) -> a -> b
$
[ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisUTxOKey)]
-> ExceptT
(FileError TextEnvelopeError) IO [VerificationKey GenesisUTxOKey]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence
[ IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisUTxOKey)
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT (IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisUTxOKey))
-> IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
-> ExceptT
(FileError TextEnvelopeError) IO (VerificationKey GenesisUTxOKey)
forall a b. (a -> b) -> a -> b
$
AsType (VerificationKey GenesisUTxOKey)
-> String
-> IO
(Either
(FileError TextEnvelopeError) (VerificationKey GenesisUTxOKey))
forall a.
HasTextEnvelope a =>
AsType a -> String -> IO (Either (FileError TextEnvelopeError) a)
readFileTextEnvelope (AsType GenesisUTxOKey -> AsType (VerificationKey GenesisUTxOKey)
forall a. AsType a -> AsType (VerificationKey a)
AsVerificationKey AsType GenesisUTxOKey
AsGenesisUTxOKey)
(String
utxodir String -> ShowS
</> String
file)
| String
file <- [String]
files
, ShowS
takeExtension String
file String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
".vkey" ]
[Address Shelley]
-> ExceptT ShelleyGenesisCmdError IO [Address Shelley]
forall (m :: * -> *) a. Monad m => a -> m a
return [ Address Shelley
addr | VerificationKey GenesisUTxOKey
vkey <- [VerificationKey GenesisUTxOKey]
vkeys
, let vkh :: Hash PaymentKey
vkh = VerificationKey PaymentKey -> Hash PaymentKey
forall keyrole.
Key keyrole =>
VerificationKey keyrole -> Hash keyrole
verificationKeyHash (VerificationKey GenesisUTxOKey -> VerificationKey PaymentKey
forall keyroleA keyroleB.
CastVerificationKeyRole keyroleA keyroleB =>
VerificationKey keyroleA -> VerificationKey keyroleB
castVerificationKey VerificationKey GenesisUTxOKey
vkey)
addr :: Address Shelley
addr = NetworkId
-> PaymentCredential -> StakeAddressReference -> Address Shelley
makeShelleyAddress NetworkId
nw (Hash PaymentKey -> PaymentCredential
PaymentCredentialByKey Hash PaymentKey
vkh)
StakeAddressReference
NoStakeAddress
]
runGenesisHashFile :: GenesisFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisHashFile :: GenesisFile -> ExceptT ShelleyGenesisCmdError IO ()
runGenesisHashFile (GenesisFile String
fpath) = do
ByteString
content <- (IOException -> ShelleyGenesisCmdError)
-> IO ByteString -> ExceptT ShelleyGenesisCmdError IO ByteString
forall (m :: * -> *) x a.
MonadIO m =>
(IOException -> x) -> IO a -> ExceptT x m a
handleIOExceptT (FileError () -> ShelleyGenesisCmdError
ShelleyGenesisCmdGenesisFileError (FileError () -> ShelleyGenesisCmdError)
-> (IOException -> FileError ())
-> IOException
-> ShelleyGenesisCmdError
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. String -> IOException -> FileError ()
forall e. String -> IOException -> FileError e
FileIOError String
fpath) (IO ByteString -> ExceptT ShelleyGenesisCmdError IO ByteString)
-> IO ByteString -> ExceptT ShelleyGenesisCmdError IO ByteString
forall a b. (a -> b) -> a -> b
$
String -> IO ByteString
BS.readFile String
fpath
let gh :: Crypto.Hash Crypto.Blake2b_256 ByteString
gh :: Hash Blake2b_256 ByteString
gh = (ByteString -> ByteString)
-> ByteString -> Hash Blake2b_256 ByteString
forall h a. HashAlgorithm h => (a -> ByteString) -> a -> Hash h a
Crypto.hashWith ByteString -> ByteString
forall a. a -> a
id ByteString
content
IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ExceptT ShelleyGenesisCmdError IO ())
-> IO () -> ExceptT ShelleyGenesisCmdError IO ()
forall a b. (a -> b) -> a -> b
$ Text -> IO ()
Text.putStrLn (Hash Blake2b_256 ByteString -> Text
forall h a. Hash h a -> Text
Crypto.hashToTextAsHex Hash Blake2b_256 ByteString
gh)