// Copyright 2019-2022 Parity Technologies (UK) Ltd. // This file is part of subxt. // // subxt 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. // // subxt 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 subxt. If not, see . use crate::StorageEntry; use codec::{ Codec, Encode, EncodeLike, }; use core::fmt::Debug; use sp_runtime::traits::{ AtLeast32Bit, Extrinsic, Hash, Header, MaybeSerializeDeserialize, Member, Verify, }; /// Runtime types. // Note: the 'static bound isn't strictly required, but currently deriving TypeInfo // automatically applies a 'static bound to all generic types (including this one), // and so until that is resolved, we'll keep the (easy to satisfy) constraint here. pub trait Config: 'static { /// Account index (aka nonce) type. This stores the number of previous /// transactions associated with a sender account. type Index: Parameter + Member + Default + AtLeast32Bit + Copy + scale_info::TypeInfo; /// The block number type used by the runtime. type BlockNumber: Parameter + Member + Default + Copy + core::hash::Hash + core::str::FromStr; /// The output of the `Hashing` function. type Hash: Parameter + Member + MaybeSerializeDeserialize + Ord + Default + Copy + std::hash::Hash + AsRef<[u8]> + AsMut<[u8]> + scale_info::TypeInfo; /// The hashing system (algorithm) being used in the runtime (e.g. Blake2). type Hashing: Hash; /// The user account identifier type for the runtime. type AccountId: Parameter + Member; /// The address type. This instead of `::Source`. type Address: Codec + Clone + PartialEq; /// The block header. type Header: Parameter + Header + serde::de::DeserializeOwned; /// Signature type. type Signature: Verify + Encode + Send + Sync + 'static; /// Extrinsic type within blocks. type Extrinsic: Parameter + Extrinsic + Debug + MaybeSerializeDeserialize; } /// Parameter trait copied from `substrate::frame_support` pub trait Parameter: Codec + EncodeLike + Clone + Eq + Debug {} impl Parameter for T where T: Codec + EncodeLike + Clone + Eq + Debug {} /// Default set of commonly used types by Substrate runtimes. // Note: We only use this at the type level, so it should be impossible to // create an instance of it. pub enum DefaultConfig {} impl Config for DefaultConfig { type Index = u32; type BlockNumber = u32; type Hash = sp_core::H256; type Hashing = sp_runtime::traits::BlakeTwo256; type AccountId = sp_runtime::AccountId32; type Address = sp_runtime::MultiAddress; type Header = sp_runtime::generic::Header; type Signature = sp_runtime::MultiSignature; type Extrinsic = sp_runtime::OpaqueExtrinsic; } /// Trait to fetch data about an account. pub trait AccountData { /// The runtime storage entry from which the account data can be fetched. /// Usually generated by the `subxt` macro. type StorageEntry: StorageEntry; /// The type of the account id to fetch the account data for. type AccountId; /// The type of the account nonce returned from storage. type Index; /// Create a new storage entry key from the account id. fn storage_entry(account_id: Self::AccountId) -> Self::StorageEntry; /// Get the nonce from the storage entry value. fn nonce(result: &::Value) -> Self::Index; }