{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# 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.Key
( Cmd (..)
, mod
, run
) where
import Data.Text
( Text )
import Prelude hiding
( mod )
import Options.Applicative
( CommandFields
, Mod
, command
, footerDoc
, helper
, info
, progDesc
, subparser
)
import Options.Applicative.Help.Pretty
( Doc, annotate, bold, indent, pretty, vsep )
import System.IO.Extra
( progName )
import qualified Command.Key.Child as Child
import qualified Command.Key.FromRecoveryPhrase as FromRecoveryPhrase
import qualified Command.Key.Hash as Hash
import qualified Command.Key.Inspect as Inspect
import qualified Command.Key.Private as Private
import qualified Command.Key.Public as Public
import qualified Command.Key.WalletId as WalletId
data Cmd
= FromRecoveryPhrase FromRecoveryPhrase.Cmd
| Child Child.Cmd
| Private Private.Cmd
| Public Public.Cmd
| Inspect Inspect.Cmd
| Hash Hash.Cmd
| WalletId WalletId.Cmd
deriving (Show)
mod :: (Cmd -> parent) -> Mod CommandFields parent
mod liftCmd = command "key" $
info (helper <*> fmap liftCmd parser) $ mempty
<> progDesc "About public/private keys"
<> footerDoc (Just $ vsep
[ prettyText "Example:"
, indent 2 $ annotate bold $ pretty $ "$ "<>progName<>" recovery-phrase generate --size 15 \\"
, indent 4 $ annotate bold $ pretty $ "| "<>progName<>" key from-recovery-phrase Shelley > root.prv"
, indent 2 $ prettyText ""
, indent 2 $ annotate bold $ prettyText "$ cat root.prv \\"
, indent 4 $ annotate bold $ pretty $ "| "<>progName<>" key child 1852H/1815H/0H \\"
, indent 4 $ annotate bold $ prettyText "| tee acct.prv \\"
, indent 4 $ annotate bold $ pretty $ "| "<>progName<>" key public --with-chain-code > acct.pub"
, indent 2 $ prettyText ""
, indent 2 $ annotate bold $ pretty $ "$ "<>progName<>" key inspect <<< $(cat acct.prv)"
, indent 2 $ prettyText "{"
, indent 2 $ prettyText " \"key_type\": \"private\","
, indent 2 $ prettyText " \"chain_code\": \"67bef6f80df02c7452e20e76ffb4bb57cae8aac2adf042b21a6b19e4f7b1f511\","
, indent 2 $ prettyText " \"extended_key\": \"90ead3efad7aacac242705ede323665387f49ed847bed025eb333708ccf6aa54403482a867daeb18f38c57d6cddd7e6fd6aed4a3209f7425a3d1c5d9987a9c5f\""
, indent 2 $ prettyText "}"
, indent 2 $ prettyText ""
, indent 2 $ annotate bold $ pretty $ "$ "<>progName<>" key inspect <<< $(cat acct.pub)"
, indent 2 $ prettyText "{"
, indent 2 $ prettyText " \"key_type\": \"public\","
, indent 2 $ prettyText " \"chain_code\": \"67bef6f80df02c7452e20e76ffb4bb57cae8aac2adf042b21a6b19e4f7b1f511\","
, indent 2 $ prettyText " \"extended_key\": \"d306350ee88f51fb710252e27f0c40006c58e994761b383e02d400e2be59b3cc\""
, indent 2 $ prettyText "}"
])
where
parser = subparser $ mconcat
[ FromRecoveryPhrase.mod FromRecoveryPhrase
, Child.mod Child
, Private.mod Private
, Public.mod Public
, Inspect.mod Inspect
, Hash.mod Hash
, WalletId.mod WalletId
]
prettyText :: Text -> Doc
prettyText = pretty
run :: Cmd -> IO ()
run = \case
FromRecoveryPhrase sub -> FromRecoveryPhrase.run sub
Child sub -> Child.run sub
Private sub -> Private.run sub
Public sub -> Public.run sub
Inspect sub -> Inspect.run sub
Hash sub -> Hash.run sub
WalletId sub -> WalletId.run sub