{-# LANGUAGE FlexibleContexts #-}
{-# 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.Inspect
( Cmd (..)
, mod
, run
) where
import Prelude hiding
( mod )
import Cardano.Address.Derivation
( XPrv, XPub, xprvChainCode, xprvPrivateKey, xpubChainCode, xpubPublicKey )
import Codec.Binary.Bech32
( HumanReadablePart )
import Codec.Binary.Encoding
( AbstractEncoding (..), encode )
import Data.Aeson
( (.=) )
import Data.ByteString
( ByteString )
import Data.Text
( Text )
import Options.Applicative
( CommandFields, Mod, command, footerDoc, helper, info, progDesc )
import Options.Applicative.Help.Pretty
( pretty )
import System.IO
( stdin, stdout )
import System.IO.Extra
( hGetXP__ )
import qualified Cardano.Codec.Bech32.Prefixes as CIP5
import qualified Data.Aeson as Json
import qualified Data.Aeson.Encode.Pretty as Json
import qualified Data.ByteString.Lazy.Char8 as BL8
import qualified Data.Text.Encoding as T
data Cmd = Inspect
deriving (Show)
mod :: (Cmd -> parent) -> Mod CommandFields parent
mod liftCmd = command "inspect" $
info (helper <*> fmap liftCmd parser) $ mempty
<> progDesc "Show information about a key"
<> footerDoc (Just $ pretty $ mconcat
[ "The parent key is read from stdin." :: Text
])
where
parser = pure Inspect
run :: Cmd -> IO ()
run Inspect = do
either inspectXPub inspectXPrv =<< hGetXP__ stdin allowedPrefixes
where
allowedPrefixes :: [HumanReadablePart]
allowedPrefixes =
[ CIP5.root_xvk
, CIP5.root_xsk
, CIP5.acct_xvk
, CIP5.acct_xsk
, CIP5.addr_xvk
, CIP5.addr_xsk
, CIP5.stake_xvk
, CIP5.stake_xsk
, CIP5.policy_xvk
, CIP5.policy_xsk
, CIP5.root_shared_xvk
, CIP5.root_shared_xsk
, CIP5.acct_shared_xvk
, CIP5.acct_shared_xsk
, CIP5.addr_shared_xvk
, CIP5.addr_shared_xsk
, CIP5.stake_shared_xvk
, CIP5.stake_shared_xsk
, CIP5.drep_xvk
, CIP5.drep_xsk
, CIP5.cc_cold_xvk
, CIP5.cc_cold_xsk
, CIP5.cc_hot_xvk
, CIP5.cc_hot_xsk
]
base16 :: ByteString -> Text
base16 = T.decodeUtf8 . encode EBase16
inspectXPub :: (HumanReadablePart, XPub) -> IO ()
inspectXPub (_, xpub) = do
BL8.hPutStrLn stdout $ Json.encodePretty $ Json.object
[ "key_type" .= Json.String "public"
, "extended_key" .= Json.String (base16 pub)
, "chain_code" .= Json.String (base16 cc)
]
where
pub = xpubPublicKey xpub
cc = xpubChainCode xpub
inspectXPrv :: (HumanReadablePart, XPrv) -> IO ()
inspectXPrv (_, xprv) =
BL8.hPutStrLn stdout $ Json.encodePretty $ Json.object
[ "key_type" .= Json.String "private"
, "extended_key" .= Json.String (base16 prv)
, "chain_code" .= Json.String (base16 cc)
]
where
prv = xprvPrivateKey xprv
cc = xprvChainCode xprv