1#![cfg_attr(not(feature = "std"), no_std)]
22
23mod benchmarking;
24pub mod weights;
25
26#[cfg(test)]
27mod mock;
28#[cfg(test)]
29mod tests;
30
31extern crate alloc;
32
33use alloc::vec::Vec;
34
35pub use pallet::*;
37pub use weights::WeightInfo;
38
39#[frame_support::pallet]
40pub mod pallet {
41	use super::*;
42	use frame_support::pallet_prelude::*;
43	use frame_system::pallet_prelude::*;
44
45	#[pallet::config]
46	pub trait Config: frame_system::Config {
47		#[allow(deprecated)]
49		type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
50		type WeightInfo: WeightInfo;
52	}
53
54	#[pallet::error]
55	pub enum Error<T> {
56		Empty,
58		BadContext,
60	}
61
62	#[pallet::pallet]
63	pub struct Pallet<T>(_);
64
65	#[pallet::call]
66	impl<T: Config> Pallet<T> {
67		#[pallet::call_index(0)]
69		#[pallet::weight(T::WeightInfo::store(remark.len() as u32))]
70		pub fn store(origin: OriginFor<T>, remark: Vec<u8>) -> DispatchResultWithPostInfo {
71			ensure!(!remark.is_empty(), Error::<T>::Empty);
72			let sender = ensure_signed(origin)?;
73			let content_hash = sp_io::hashing::blake2_256(&remark);
74			let extrinsic_index = <frame_system::Pallet<T>>::extrinsic_index()
75				.ok_or_else(|| Error::<T>::BadContext)?;
76			sp_io::transaction_index::index(extrinsic_index, remark.len() as u32, content_hash);
77			Self::deposit_event(Event::Stored { sender, content_hash: content_hash.into() });
78			Ok(().into())
79		}
80	}
81
82	#[pallet::event]
83	#[pallet::generate_deposit(pub(super) fn deposit_event)]
84	pub enum Event<T: Config> {
85		Stored { sender: T::AccountId, content_hash: sp_core::H256 },
87	}
88}