packages feed

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

-- |
-- Module      :  Network.Polkadot.Extrinsic.Payload
-- Copyright   :  Aleksandr Krupenkin 2016-2024
-- License     :  Apache-2.0
--
-- Maintainer  :  mail@akru.me
-- Stability   :  experimental
-- Portability :  portable
--
-- Extrinsic payload and payload signing methods.
--

module Network.Polkadot.Extrinsic.Payload where

import           Codec.Scale                                (encode)
import           Codec.Scale.Class                          (Encode (..))
import qualified Data.ByteString                            as BS (length)
import           Data.Digest.Blake2                         (blake2_256)
import           Network.JsonRpc.TinyClient                 (JsonRpc)

import           Network.Polkadot.Crypto                    (MultiPair (MultiSignature, multi_sign))
import           Network.Polkadot.Extrinsic.SignedExtension (SignedExtension (..))

-- | A payload that has been signed for an unchecked extrinsics.
--
-- Note that the payload that we sign to produce unchecked extrinsic signature
-- is going to be different than the `Payload` - so the thing the extrinsic
-- actually contains.
type Payload call extra = (call, extra)

-- | Sign extrinsic's payload by multi-pair.
sign_payload :: (MultiPair a, Encode c, SignedExtension e, JsonRpc m)
             => a
             -> Payload c e
             -> m (MultiSignature a)
sign_payload pair (call, extra) = do
    additional <- additional_signed extra
    let encoded = encode (call, extra, additional)
        payload | BS.length encoded > 256 = blake2_256 encoded
                | otherwise = encoded
    return $ multi_sign pair payload