packages feed

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

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies     #-}

-- |
-- Module      :  Network.Polkadot.Extrinsic.SignedExtension
-- Copyright   :  Aleksandr Krupenkin 2016-2021
-- License     :  Apache-2.0
--
-- Maintainer  :  mail@akru.me
-- Stability   :  experimental
-- Portability :  portable
--
-- Additional data that could be attached to the transaction.
--

module Network.Polkadot.Extrinsic.SignedExtension where


import           Codec.Scale                (Decode, Encode)
import           Network.JsonRpc.TinyClient (JsonRpc)

-- | Means by which a transaction may be extended. This type embodies both the data and the logic
-- that should be additionally associated with the transaction. It should be plain old data.
class (Encode a, Decode a, Encode (AdditionalSigned a), Decode (AdditionalSigned a))
    => SignedExtension a where
    -- | Any additional data that will go into the signed payload. This may be created dynamically
    --  from the transaction using the `additional_signed` function.
    type AdditionalSigned a

    -- | Construct any additional data that should be in the signed payload of the transaction. Can
    -- also perform any pre-signature-verification checks and return an error if needed.
    additional_signed :: JsonRpc m => a -> m (AdditionalSigned a)

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

instance (SignedExtension a, SignedExtension b) => SignedExtension (a, b) where
    type AdditionalSigned (a, b) = (AdditionalSigned a, AdditionalSigned b)
    additional_signed (a, b) = (,)
        <$> additional_signed a
        <*> additional_signed b

instance (SignedExtension a, SignedExtension b, SignedExtension c) => SignedExtension (a, b, c) where
    type AdditionalSigned (a, b, c) = (AdditionalSigned a, AdditionalSigned b, AdditionalSigned c)
    additional_signed (a, b, c) = (,,)
        <$> additional_signed a
        <*> additional_signed b
        <*> additional_signed c

instance (SignedExtension a, SignedExtension b, SignedExtension c, SignedExtension d) => SignedExtension (a, b, c, d) where
    type AdditionalSigned (a, b, c, d) = (AdditionalSigned a, AdditionalSigned b, AdditionalSigned c, AdditionalSigned d)
    additional_signed (a, b, c, d) = (,,,)
        <$> additional_signed a
        <*> additional_signed b
        <*> additional_signed c
        <*> additional_signed d

instance (SignedExtension a, SignedExtension b, SignedExtension c, SignedExtension d, SignedExtension e) => SignedExtension (a, b, c, d, e) where
    type AdditionalSigned (a, b, c, d, e) = (AdditionalSigned a, AdditionalSigned b, AdditionalSigned c, AdditionalSigned d, AdditionalSigned e)
    additional_signed (a, b, c, d, e) = (,,,,)
        <$> additional_signed a
        <*> additional_signed b
        <*> additional_signed c
        <*> additional_signed d
        <*> additional_signed e

instance (SignedExtension a, SignedExtension b, SignedExtension c, SignedExtension d, SignedExtension e, SignedExtension f) => SignedExtension (a, b, c, d, e, f) where
    type AdditionalSigned (a, b, c, d, e, f) = (AdditionalSigned a, AdditionalSigned b, AdditionalSigned c, AdditionalSigned d, AdditionalSigned e, AdditionalSigned f)
    additional_signed (a, b, c, d, e, f) = (,,,,,)
        <$> additional_signed a
        <*> additional_signed b
        <*> additional_signed c
        <*> additional_signed d
        <*> additional_signed e
        <*> additional_signed f

instance (SignedExtension a, SignedExtension b, SignedExtension c, SignedExtension d, SignedExtension e, SignedExtension f, SignedExtension g) => SignedExtension (a, b, c, d, e, f, g) where
    type AdditionalSigned (a, b, c, d, e, f, g) = (AdditionalSigned a, AdditionalSigned b, AdditionalSigned c, AdditionalSigned d, AdditionalSigned e, AdditionalSigned f, AdditionalSigned g)
    additional_signed (a, b, c, d, e, f, g) = (,,,,,,)
        <$> additional_signed a
        <*> additional_signed b
        <*> additional_signed c
        <*> additional_signed d
        <*> additional_signed e
        <*> additional_signed f
        <*> additional_signed g