{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE OverloadedStrings #-}

-- |
-- Module      :  Network.Polkadot.Api.Author
-- Copyright   :  Alexander Krupenkin 2016
-- License     :  BSD3
--
-- Maintainer  :  mail@akru.me
-- Stability   :  experimental
-- Portability :  portable
--
-- Polkadot RPC methods with `author` prefix.
--

module Network.Polkadot.Api.Author where

import           Data.Text                  (Text)

import           Data.ByteArray.HexString   (HexString)
import           Network.JsonRpc.TinyClient (JsonRpc (..))

-- | Returns true if the keystore has private keys for the given public key and key type.
hasKey :: JsonRpc m
       => HexString
       -- ^ Public key
       -> Text
       -- ^ Key type
       -> m Bool
{-# INLINE hasKey #-}
hasKey = remote "author_hasKey"

-- | Returns true if the keystore has private keys for the given session public keys.
hasSessionKeys :: JsonRpc m
               => HexString
               -- ^ Session keys
               -> m Bool
{-# INLINE hasSessionKeys #-}
hasSessionKeys = remote "author_hasSessionKeys"

-- | Insert a key into the keystore.
insertKey :: JsonRpc m
          => Text
          -- ^ Key type
          -> Text
          -- ^ Key secret URI
          -> HexString
          -- ^ Public key
          -> m HexString
{-# INLINE insertKey #-}
insertKey = remote "author_insertKey"

-- | Returns all pending extrinsics, potentially grouped by sender.
pendingExtrinsics :: JsonRpc m => m [HexString]
{-# INLINE pendingExtrinsics #-}
pendingExtrinsics = remote "author_pendingExtrinsics"

-- | Remove given extrinsic from the pool and temporarily ban it to prevent reimporting.
removeExtrinsic :: JsonRpc m
                => [HexString]
                -- ^ Extrinsic or hash
                -> m HexString
{-# INLINE removeExtrinsic #-}
removeExtrinsic = remote "author_removeExtrinsic"

-- | Generate new session keys and returns the corresponding public keys.
rotateKeys :: JsonRpc m => m HexString
{-# INLINE rotateKeys #-}
rotateKeys = remote "author_rotateKeys"

-- | Submit a fully formatted extrinsic for block inclusion.
submitExtrinsic :: JsonRpc m
                => HexString
                -- ^ Extrinsic
                -> m HexString
                -- ^ Hash
{-# INLINE submitExtrinsic #-}
submitExtrinsic = remote "author_submitExtrinsic"