packages feed

cardano-addresses-4.0.0: lib/Command/Script.hs

{-# 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.Script
    ( 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.Script.Hash as Hash
import qualified Command.Script.Preimage as Preimage
import qualified Command.Script.Validation as Validation

data Cmd
    = Hash Hash.Cmd
    | Validation Validation.Cmd
    | Preimage Preimage.Cmd
    deriving (Show)

mod :: (Cmd -> parent) -> Mod CommandFields parent
mod liftCmd = command "script" $
    info (helper <*> fmap liftCmd parser) $ mempty
        <> progDesc "About scripts"
        <> 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 Shared > root_shared.xsk"
            , indent 2 $ prettyText ""
            , indent 2 $ annotate bold $ prettyText "$ cat root_shared.xsk \\"
            , indent 4 $ annotate bold $ pretty $ "| "<>progName<>" key child 1854H/1815H/0H/0/0 > signingKey1.xsk"
            , indent 2 $ prettyText ""
            , indent 2 $ annotate bold $ prettyText "$ cat signingKey1.xsk \\"
            , indent 4 $ annotate bold $ pretty $ "| "<>progName<>" key public --without-chain-code \\"
            , indent 4 $ annotate bold $ pretty $ "| "<>progName<>" key hash > verKey1.vkh"
            , indent 2 $ prettyText ""
            , indent 2 $ annotate bold $ prettyText "$ cat root_shared.xsk \\"
            , indent 4 $ annotate bold $ pretty $ "| "<>progName<>" key child 1854H/1815H/0H/0/1 > signingKey2.xsk"
            , indent 2 $ prettyText ""
            , indent 2 $ annotate bold $ prettyText "$ cat signingKey2.xsk \\"
            , indent 4 $ annotate bold $ pretty $ "| "<>progName<>" key public --without-chain-code \\"
            , indent 4 $ annotate bold $ pretty $ "| "<>progName<>" key hash > verKey2.vkh"
            , indent 2 $ prettyText ""
            , indent 2 $ annotate bold $ pretty $ "$ "<>progName<>" script hash \"all [$(cat verKey1.vkh),$(cat verKey2.vkh)]\""
            , indent 2 $ prettyText ""
            , indent 2 $ annotate bold $ pretty $ "$ "<>progName<>" script preimage \"all [addr_shared_vkh1zxt0uvrza94h3hv4jpv0ttddgnwkvdgeyq8jf9w30mcs6y8w3nq, active_from 100, active_until 150]\""
            ])
  where
    parser = subparser $ mconcat
        [ Hash.mod Hash
        , Validation.mod Validation
        , Preimage.mod Preimage
        ]

    prettyText :: Text -> Doc
    prettyText = pretty

run :: Cmd -> IO ()
run = \case
    Hash sub -> Hash.run sub
    Validation sub -> Validation.run sub
    Preimage sub -> Preimage.run sub