packages feed

cardano-addresses-4.0.1: lib/Command/RecoveryPhrase/Generate.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE TypeApplications #-}

{-# OPTIONS_HADDOCK hide #-}

-- |
-- Copyright: 2020 Input Output (Hong Kong) Ltd., 2021-2022 Input Output Global Inc. (IOG), 2023-2025 Intersect
-- License: Apache-2.0

module Command.RecoveryPhrase.Generate
    ( Cmd (..)
    , mod
    , run
    ) where

import Prelude hiding
    ( mod )

import Cardano.Dictionary
    ( SupportedDictionary (..), dictionaryFromLanguage )
import Cardano.Mnemonic
    ( entropyToMnemonic, genEntropy, mnemonicToTextWithDict )
import Options.Applicative
    ( CommandFields, Mod, command, helper, info, progDesc )
import Options.Applicative.MnemonicLanguage
    ( mnemonicLanguageOpt )
import Options.Applicative.MnemonicSize
    ( MnemonicSize (..), mnemonicSizeOpt )

import qualified Data.ByteString.Char8 as B8
import qualified Data.Text as T
import qualified Data.Text.Encoding as T


data Cmd = Generate
    { size :: MnemonicSize
    , language :: SupportedDictionary
    } deriving (Show)

mod :: (Cmd -> parent) -> Mod CommandFields parent
mod liftCmd = command "generate" $
    info (helper <*> fmap liftCmd parser) $ mempty
        <> progDesc "Generate a recovery phrase for a specified mnemonic size and language."
  where
    parser = Generate
        <$> mnemonicSizeOpt
        <*> mnemonicLanguageOpt

run :: Cmd -> IO ()
run Generate{size,language} = do
    m <- case size of
        MS_9  -> mnemonicToTextWithDict @9  . entropyToMnemonic <$> genEntropy
        MS_12 -> mnemonicToTextWithDict @12 . entropyToMnemonic <$> genEntropy
        MS_15 -> mnemonicToTextWithDict @15 . entropyToMnemonic <$> genEntropy
        MS_18 -> mnemonicToTextWithDict @18 . entropyToMnemonic <$> genEntropy
        MS_21 -> mnemonicToTextWithDict @21 . entropyToMnemonic <$> genEntropy
        MS_24 -> mnemonicToTextWithDict @24 . entropyToMnemonic <$> genEntropy
    B8.putStrLn $ T.encodeUtf8 $ T.unwords $ m $ dictionaryFromLanguage language