use alloc::{string::String, vec::Vec};
use codec::{Decode, Encode, MaxEncodedLen};
use core::fmt::Debug;
use scale_info::TypeInfo;
use serde::{Deserialize, Serialize};
use sp_runtime::traits::{AtLeast32BitUnsigned, Zero};
pub type RefCount = u32;
#[derive(Encode, Decode, Clone, PartialEq, Eq, Default, Debug, MaxEncodedLen, TypeInfo)]
pub struct AccountData<Balance> {
pub free: Balance,
pub reserved: Balance,
pub frozen: Balance,
pub flags: ExtraFlags,
}
const IS_NEW_LOGIC: u128 = 0x80000000_00000000_00000000_00000000u128;
#[derive(Encode, Decode, Clone, PartialEq, Eq, Debug, MaxEncodedLen, TypeInfo)]
pub struct ExtraFlags(u128);
impl Default for ExtraFlags {
fn default() -> Self {
Self(IS_NEW_LOGIC)
}
}
impl ExtraFlags {
pub fn old_logic() -> Self {
Self(0)
}
pub fn set_new_logic(&mut self) {
self.0 |= IS_NEW_LOGIC
}
pub fn is_new_logic(&self) -> bool {
(self.0 & IS_NEW_LOGIC) == IS_NEW_LOGIC
}
}
#[derive(Clone, Eq, PartialEq, Default, Encode, Decode, TypeInfo, MaxEncodedLen)]
pub struct AccountInfo<Index, AccountData> {
pub nonce: Index,
pub consumers: RefCount,
pub providers: RefCount,
pub sufficients: RefCount,
pub data: AccountData,
}
#[derive(Encode, Decode, Clone, Eq, PartialEq, Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct InclusionFee<Balance> {
pub base_fee: Balance,
pub len_fee: Balance,
pub adjusted_weight_fee: Balance,
}
impl<Balance: AtLeast32BitUnsigned + Copy> InclusionFee<Balance> {
pub fn inclusion_fee(&self) -> Balance {
self.base_fee
.saturating_add(self.len_fee)
.saturating_add(self.adjusted_weight_fee)
}
}
#[derive(Encode, Decode, Clone, Eq, PartialEq, Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct FeeDetails<Balance> {
pub inclusion_fee: Option<InclusionFee<Balance>>,
#[serde(skip)]
pub tip: Balance,
}
impl<Balance: AtLeast32BitUnsigned + Copy> FeeDetails<Balance> {
pub fn final_fee(&self) -> Balance {
self.inclusion_fee
.as_ref()
.map(|i| i.inclusion_fee())
.unwrap_or_else(|| Zero::zero())
.saturating_add(self.tip)
}
}
#[derive(Eq, PartialEq, Encode, Decode, Default, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[serde(bound(serialize = "Balance: core::fmt::Display, Weight: Serialize"))]
#[serde(bound(deserialize = "Balance: core::str::FromStr, Weight: Deserialize<'de>"))]
pub struct RuntimeDispatchInfo<Balance, Weight = sp_weights::Weight> {
pub weight: Weight,
pub class: DispatchClass,
#[serde(with = "serde_balance")]
pub partial_fee: Balance,
}
mod serde_balance {
use alloc::string::ToString;
use serde::{Deserialize, Deserializer, Serializer};
pub fn serialize<S: Serializer, T: core::fmt::Display>(
t: &T,
serializer: S,
) -> Result<S::Ok, S::Error> {
serializer.serialize_str(&t.to_string())
}
pub fn deserialize<'de, D: Deserializer<'de>, T: core::str::FromStr>(
deserializer: D,
) -> Result<T, D::Error> {
let s = alloc::string::String::deserialize(deserializer)?;
s.parse::<T>().map_err(|_| serde::de::Error::custom("Parse from string failed"))
}
}
#[derive(
PartialEq, Eq, Clone, Copy, Encode, Decode, Debug, TypeInfo, Serialize, Deserialize, Default,
)]
#[serde(rename_all = "camelCase")]
pub enum DispatchClass {
#[default]
Normal,
Operational,
Mandatory,
}
impl DispatchClass {
pub fn all() -> &'static [DispatchClass] {
&[DispatchClass::Normal, DispatchClass::Operational, DispatchClass::Mandatory]
}
pub fn non_mandatory() -> &'static [DispatchClass] {
&[DispatchClass::Normal, DispatchClass::Operational]
}
}
#[derive(PartialEq, Eq, Copy, Clone, Encode, Decode, Debug, TypeInfo, MaxEncodedLen, Default)]
pub enum RewardDestination<AccountId> {
#[default]
Staked,
Stash,
Controller,
Account(AccountId),
None,
}
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Health {
pub peers: usize,
pub is_syncing: bool,
pub should_have_peers: bool,
}
impl core::fmt::Display for Health {
fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
write!(fmt, "{} peers ({})", self.peers, if self.is_syncing { "syncing" } else { "idle" })
}
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
pub enum ChainType {
Development,
Local,
Live,
Custom(String),
}
pub type Properties = serde_json::map::Map<String, serde_json::Value>;
#[derive(codec::Encode, codec::Decode, PartialEq, Eq, TypeInfo, Clone)]
pub struct EncodableOpaqueLeaf(pub Vec<u8>);
#[derive(codec::Encode, codec::Decode, Debug, Clone, PartialEq, Eq, TypeInfo)]
pub struct Proof<Hash> {
pub leaf_indices: Vec<LeafIndex>,
pub leaf_count: NodeIndex,
pub items: Vec<Hash>,
}
pub type LeafIndex = u64;
pub type NodeIndex = u64;
#[derive(Encode, Decode, PartialEq, Eq, TypeInfo, Debug)]
pub enum MmrError {
InvalidNumericOp,
Push,
GetRoot,
Commit,
GenerateProof,
Verify,
LeafNotFound,
PalletNotIncluded,
InvalidLeafIndex,
InvalidBestKnownBlock,
}
#[derive(Clone, Copy, Encode, Decode, TypeInfo, MaxEncodedLen, Debug, PartialEq, Eq)]
pub enum Determinism {
Enforced,
Relaxed,
}