use polkadot_sdk::*;
use codec::{Decode, Encode};
use ismp::router::{Request, Response};
use scale_info::TypeInfo;
use sp_core::{RuntimeDebug, H256};
use sp_mmr_primitives::NodeIndex;
use sp_std::prelude::*;
#[derive(codec::Encode, codec::Decode, scale_info::TypeInfo)]
#[cfg_attr(feature = "std", derive(serde::Deserialize, serde::Serialize))]
pub struct LeafIndexQuery {
pub commitment: H256,
}
#[derive(
codec::Encode,
codec::Decode,
scale_info::TypeInfo,
Ord,
PartialOrd,
Eq,
PartialEq,
Clone,
Copy,
RuntimeDebug,
)]
#[cfg_attr(feature = "std", derive(serde::Deserialize, serde::Serialize))]
pub struct LeafIndexAndPos {
pub leaf_index: u64,
pub pos: u64,
}
#[derive(Debug, Clone, Encode, Decode, PartialEq, Eq, scale_info::TypeInfo)]
pub enum Leaf {
Request(Request),
Response(Response),
}
impl FullLeaf for Leaf {
fn preimage(&self) -> Vec<u8> {
match self {
Leaf::Request(req) => req.encode(),
Leaf::Response(res) => res.encode(),
}
}
}
#[derive(
codec::Encode,
codec::Decode,
scale_info::TypeInfo,
Ord,
PartialOrd,
Eq,
PartialEq,
Clone,
Copy,
RuntimeDebug,
Default,
)]
#[cfg_attr(feature = "std", derive(serde::Deserialize, serde::Serialize))]
pub struct LeafMetadata {
pub index: u64,
pub position: u64,
}
pub trait OffchainDBProvider {
type Leaf;
fn count() -> u64;
fn push(leaf: Self::Leaf) -> LeafMetadata;
fn finalize() -> Result<H256, sp_mmr_primitives::Error>;
fn leaf(pos: NodeIndex) -> Result<Option<Self::Leaf>, sp_mmr_primitives::Error>;
fn proof(
indices: Vec<NodeIndex>,
) -> Result<(Vec<Self::Leaf>, sp_mmr_primitives::LeafProof<H256>), sp_mmr_primitives::Error>;
}
pub fn leaf_default_key(commitment: H256) -> Vec<u8> {
let prefix = b"no_op";
(prefix, commitment).encode()
}
impl OffchainDBProvider for () {
type Leaf = Leaf;
fn count() -> u64 {
0
}
fn proof(
_indices: Vec<u64>,
) -> Result<(Vec<Self::Leaf>, sp_mmr_primitives::LeafProof<H256>), sp_mmr_primitives::Error> {
Err(sp_mmr_primitives::Error::GenerateProof)?
}
fn push(leaf: Self::Leaf) -> LeafMetadata {
let encoded = leaf.preimage();
let commitment = sp_io::hashing::keccak_256(&encoded);
let offchain_key = leaf_default_key(commitment.into());
sp_io::offchain_index::set(&offchain_key, &leaf.encode());
Default::default()
}
fn finalize() -> Result<H256, sp_mmr_primitives::Error> {
Ok(H256::default())
}
fn leaf(_pos: NodeIndex) -> Result<Option<Self::Leaf>, sp_mmr_primitives::Error> {
Ok(None)
}
}
pub trait FullLeaf: Clone + PartialEq + core::fmt::Debug + codec::FullCodec {
fn preimage(&self) -> Vec<u8>;
}
pub trait ForkIdentifier<T: frame_system::Config> {
fn identifier() -> T::Hash;
}
#[derive(TypeInfo, Encode, Decode, serde::Deserialize, serde::Serialize)]
pub enum ProofKeys {
Requests(Vec<H256>),
Responses(Vec<H256>),
}
#[derive(codec::Encode, codec::Decode, RuntimeDebug, Clone, PartialEq, Eq, TypeInfo)]
#[cfg_attr(feature = "std", derive(serde::Deserialize, serde::Serialize))]
pub struct Proof<Hash> {
pub leaf_indices_and_pos: Vec<LeafIndexAndPos>,
pub leaf_count: NodeIndex,
pub items: Vec<Hash>,
}