// Copyright 2019-2021 Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Parity Bridges Common is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Parity Bridges Common. If not, see . use bp_runtime::Chain as ChainBase; use frame_support::Parameter; use jsonrpsee_ws_client::{DeserializeOwned, Serialize}; use num_traits::{Bounded, CheckedSub, SaturatingAdd, Zero}; use sp_core::{storage::StorageKey, Pair}; use sp_runtime::{ generic::SignedBlock, traits::{ AtLeast32Bit, AtLeast32BitUnsigned, Block as BlockT, Dispatchable, MaybeDisplay, MaybeSerialize, MaybeSerializeDeserialize, Member, }, EncodedJustification, FixedPointOperand, }; use std::{fmt::Debug, time::Duration}; /// Substrate-based chain from minimal relay-client point of view. pub trait Chain: ChainBase + Clone { /// Chain name. const NAME: &'static str; /// Average block interval. /// /// How often blocks are produced on that chain. It's suggested to set this value /// to match the block time of the chain. const AVERAGE_BLOCK_INTERVAL: Duration; /// Maximal expected storage proof overhead (in bytes). const STORAGE_PROOF_OVERHEAD: u32; /// Maximal size (in bytes) of SCALE-encoded account id on this chain. const MAXIMAL_ENCODED_ACCOUNT_ID_SIZE: u32; /// The user account identifier type for the runtime. type AccountId: Parameter + Member + MaybeSerializeDeserialize + Debug + MaybeDisplay + Ord + Default; /// Index of a transaction used by the chain. type Index: Parameter + Member + MaybeSerialize + Debug + Default + MaybeDisplay + DeserializeOwned + AtLeast32Bit + Copy; /// Block type. type SignedBlock: Member + Serialize + DeserializeOwned + BlockWithJustification; /// The aggregated `Call` type. type Call: Dispatchable + Debug; /// Balance of an account in native tokens. /// /// The chain may support multiple tokens, but this particular type is for token that is used /// to pay for transaction dispatch, to reward different relayers (headers, messages), etc. type Balance: AtLeast32BitUnsigned + FixedPointOperand + Parameter + Parameter + Member + DeserializeOwned + Clone + Copy + Bounded + CheckedSub + PartialOrd + SaturatingAdd + Zero + std::convert::TryFrom; } /// Balance type used by the chain pub type BalanceOf = ::Balance; /// Index type used by the chain pub type IndexOf = ::Index; /// Substrate-based chain with `frame_system::Config::AccountData` set to /// the `pallet_balances::AccountData`. pub trait ChainWithBalances: Chain { /// Return runtime storage key for getting `frame_system::AccountInfo` of given account. fn account_info_storage_key(account_id: &Self::AccountId) -> StorageKey; } /// Block with justification. pub trait BlockWithJustification
{ /// Return block header. fn header(&self) -> Header; /// Return block justification, if known. fn justification(&self) -> Option<&EncodedJustification>; } /// Substrate-based chain transactions signing scheme. pub trait TransactionSignScheme { /// Chain that this scheme is to be used. type Chain: Chain; /// Type of key pairs used to sign transactions. type AccountKeyPair: Pair; /// Signed transaction. type SignedTransaction; /// Create transaction for given runtime call, signed by given account. fn sign_transaction( genesis_hash: ::Hash, signer: &Self::AccountKeyPair, era: bp_runtime::TransactionEraOf, signer_nonce: ::Index, call: ::Call, ) -> Self::SignedTransaction; } impl BlockWithJustification for SignedBlock { fn header(&self) -> Block::Header { self.block.header().clone() } fn justification(&self) -> Option<&EncodedJustification> { self.justifications .as_ref() .and_then(|j| j.get(sp_finality_grandpa::GRANDPA_ENGINE_ID)) } }