use crate::{dispatcher::RequestMetadata, utils::ResponseReceipt, Config};
use alloc::vec::Vec;
use core::marker::PhantomData;
use frame_support::storage::child;
use polkadot_sdk::*;
use sp_core::{storage::ChildInfo, H256};
pub struct RequestCommitments<T: Config>(PhantomData<T>);
pub struct RequestReceipts<T: Config>(PhantomData<T>);
pub struct ResponseCommitments<T: Config>(PhantomData<T>);
pub struct ResponseReceipts<T: Config>(PhantomData<T>);
pub struct StateCommitments<T: Config>(PhantomData<T>);
pub const CHILD_TRIE_PREFIX: &'static [u8] = b"ISMP";
pub const STATE_COMMITMENTS_KEY: &[u8] = b"state";
pub fn request_commitment_storage_key(key: H256) -> Vec<u8> {
let mut full_key = "RequestCommitments".as_bytes().to_vec();
full_key.extend_from_slice(&key.0);
full_key
}
pub fn response_commitment_storage_key(key: H256) -> Vec<u8> {
let mut full_key = "ResponseCommitments".as_bytes().to_vec();
full_key.extend_from_slice(&key.0);
full_key
}
pub fn request_receipt_storage_key(key: H256) -> Vec<u8> {
let mut full_key = "RequestReceipts".as_bytes().to_vec();
full_key.extend_from_slice(&key.0);
full_key
}
pub fn response_receipt_storage_key(key: H256) -> Vec<u8> {
let mut full_key = "ResponseReceipts".as_bytes().to_vec();
full_key.extend_from_slice(&key.0);
full_key
}
impl<T: Config> RequestCommitments<T> {
pub fn storage_key(key: H256) -> Vec<u8> {
request_commitment_storage_key(key)
}
pub fn get(key: H256) -> Option<RequestMetadata<T>> {
child::get(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key))
}
pub fn insert(key: H256, meta: RequestMetadata<T>) {
child::put(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key), &meta);
}
pub fn remove(key: H256) {
child::kill(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key))
}
pub fn contains_key(key: H256) -> bool {
child::exists(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key))
}
}
impl<T: Config> ResponseCommitments<T> {
pub fn storage_key(key: H256) -> Vec<u8> {
response_commitment_storage_key(key)
}
pub fn get(key: H256) -> Option<RequestMetadata<T>> {
child::get(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key))
}
pub fn insert(key: H256, meta: RequestMetadata<T>) {
child::put(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key), &meta);
}
pub fn remove(key: H256) {
child::kill(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key))
}
pub fn contains_key(key: H256) -> bool {
child::exists(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key))
}
}
impl<T: Config> RequestReceipts<T> {
pub fn storage_key(key: H256) -> Vec<u8> {
request_receipt_storage_key(key)
}
pub fn get(key: H256) -> Option<Vec<u8>> {
child::get(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key))
}
pub fn insert(key: H256, relayer: &[u8]) {
child::put(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key), &relayer);
}
pub fn remove(key: H256) {
child::kill(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key))
}
pub fn contains_key(key: H256) -> bool {
child::exists(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key))
}
}
impl<T: Config> ResponseReceipts<T> {
pub fn storage_key(key: H256) -> Vec<u8> {
response_receipt_storage_key(key)
}
pub fn get(key: H256) -> Option<ResponseReceipt> {
child::get(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key))
}
pub fn insert(key: H256, receipt: ResponseReceipt) {
child::put(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key), &receipt);
}
pub fn remove(key: H256) {
child::kill(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key))
}
pub fn contains_key(key: H256) -> bool {
child::exists(&ChildInfo::new_default(CHILD_TRIE_PREFIX), &Self::storage_key(key))
}
}