packages feed

web3-polkadot-1.0.1.0: src/Network/Polkadot/Extrinsic/SignedExtension/System.hs

{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric  #-}
{-# LANGUAGE TypeFamilies   #-}

-- |
-- Module      :  Network.Polkadot.Extrinsic.SignedExtension.System
-- Copyright   :  Aleksandr Krupenkin 2016-2024
-- License     :  Apache-2.0
--
-- Maintainer  :  mail@akru.me
-- Stability   :  experimental
-- Portability :  portable
--
-- A frame system signed extensions.
--

module Network.Polkadot.Extrinsic.SignedExtension.System where

import           Codec.Scale                                (Compact, Decode,
                                                             Encode, Generic)
import           Data.BigNum                                (h256)
import           Data.Maybe                                 (fromJust)
import           Data.Word                                  (Word32)
import qualified GHC.Generics                               as GHC (Generic)

import           Network.Polkadot.Extrinsic.Era             (Era, birth)
import           Network.Polkadot.Extrinsic.SignedExtension (SignedExtension (..))
import           Network.Polkadot.Primitives                (Hash, Index)
import           Network.Polkadot.Rpc.Chain                 (getBlockHash,
                                                             getHeader)
import           Network.Polkadot.Rpc.State                 (getRuntimeVersion)
import           Network.Polkadot.Rpc.Types                 (RuntimeVersion (..),
                                                             headerNumber,
                                                             unBlockNumber)

-- | Ensure the runtime version registered in the transaction is the same as at present.
data CheckSpecVersion = CheckSpecVersion
    deriving (Eq, Show, Generic, GHC.Generic, Encode, Decode)

instance SignedExtension CheckSpecVersion where
    type AdditionalSigned CheckSpecVersion = Word32
    additional_signed _ = runtimeSpecVersion <$> getRuntimeVersion Nothing

data CheckTxVersion = CheckTxVersion
    deriving (Eq, Show, Generic, GHC.Generic, Encode, Decode)

instance SignedExtension CheckTxVersion where
    type AdditionalSigned CheckTxVersion = Word32
    additional_signed _ = runtimeTransactionVersion <$> getRuntimeVersion Nothing

data CheckGenesis = CheckGenesis
    deriving (Eq, Show, Generic, GHC.Generic, Encode, Decode)

instance SignedExtension CheckGenesis where
    type AdditionalSigned CheckGenesis = Hash
    additional_signed _ = do
        -- chain must have genesis block, fromJust is safe
        (fromJust . (h256 =<<)) <$> getBlockHash (Just 0)

newtype CheckEra = CheckEra Era
    deriving (Eq, Show, Generic, GHC.Generic, Encode, Decode)

instance SignedExtension CheckEra where
    type AdditionalSigned CheckEra = Hash
    additional_signed (CheckEra era) = do
        -- chain must have top header, fromJust is safe here
        current <- (unBlockNumber . headerNumber . fromJust) <$> getHeader Nothing
        (fromJust . (h256 =<<)) <$> getBlockHash (Just $ birth era current)

newtype CheckNonce = CheckNonce (Compact Index)
    deriving (Eq, Show, Generic, GHC.Generic, Encode, Decode)

instance SignedExtension CheckNonce where
    type AdditionalSigned CheckNonce = ()
    additional_signed _ = return ()

data CheckWeight = CheckWeight
    deriving (Eq, Show, Generic, GHC.Generic, Encode, Decode)

instance SignedExtension CheckWeight where
    type AdditionalSigned CheckWeight = ()
    additional_signed _ = return ()