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

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

module Network.Polkadot.Api.Chain where

import           Data.ByteArray.HexString   (HexString)
import           Network.JsonRpc.TinyClient (JsonRpc (..))
import           Network.Polkadot.Api.Types (Header, SignedBlock)

-- | Get header and body of a relay chain block.
getBlock :: JsonRpc m
         => Maybe HexString
         -- ^ Block hash
         -> m (Maybe SignedBlock)
{-# INLINE getBlock #-}
getBlock = remote "chain_getBlock"

-- | Get the block hash for a specific block.
getBlockHash :: JsonRpc m
             => Maybe Int
             -- ^ Block number
             -> m (Maybe HexString)
{-# INLINE getBlockHash #-}
getBlockHash = remote "chain_getBlockHash"

-- | Get hash of the last finalized block in the canon chain.
getFinalizedHead :: JsonRpc m => m HexString
{-# INLINE getFinalizedHead #-}
getFinalizedHead = remote "chain_getFinalizedHead"

-- | Retrieves the header for a specific block.
getHeader :: JsonRpc m
          => Maybe HexString
          -- ^ Block hash
          -> m (Maybe Header)
{-# INLINE getHeader #-}
getHeader = remote "chain_getHeader"