#![cfg_attr(not(feature = "std"), no_std)]
#![allow(clippy::unused_unit)]
pub use pallet::*;
#[cfg(test)]
mod tests;
#[frame_support::pallet]
pub mod pallet {
use frame_support::{dispatch::DispatchResultWithPostInfo, pallet_prelude::*};
use frame_system::pallet_prelude::*;
#[pallet::config]
pub trait Config: frame_system::Config {
type Event: From<Event<Self>> + IsType<<Self as frame_system::Config>::Event>;
}
#[pallet::pallet]
#[pallet::generate_store(pub(super) trait Store)]
pub struct Pallet<T>(PhantomData<T>);
#[pallet::event]
#[pallet::metadata(T::AccountId = "AccountId")]
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> {
EntrySet(T::AccountId, u32),
EntryGot(T::AccountId, u32),
EntryTaken(T::AccountId, u32),
EntryIncreased(T::AccountId, u32, u32),
}
#[pallet::storage]
#[pallet::getter(fn simple_map)]
pub(super) type SimpleMap<T: Config> =
StorageMap<_, Blake2_128Concat, T::AccountId, u32, ValueQuery>;
#[pallet::hooks]
impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {}
#[pallet::error]
pub enum Error<T> {
NoValueStored,
MaxValueReached,
}
#[pallet::call]
impl<T: Config> Pallet<T> {
#[pallet::weight(10_000)]
pub fn set_single_entry(origin: OriginFor<T>, entry: u32) -> DispatchResultWithPostInfo {
let user = ensure_signed(origin)?;
<SimpleMap<T>>::insert(&user, entry);
Self::deposit_event(Event::EntrySet(user, entry));
Ok(().into())
}
#[pallet::weight(10_000)]
pub fn get_single_entry(
origin: OriginFor<T>,
account: T::AccountId,
) -> DispatchResultWithPostInfo {
let getter = ensure_signed(origin)?;
ensure!(
<SimpleMap<T>>::contains_key(&account),
Error::<T>::NoValueStored
);
let entry = <SimpleMap<T>>::get(account);
Self::deposit_event(Event::EntryGot(getter, entry));
Ok(().into())
}
#[pallet::weight(10_000)]
pub fn take_single_entry(origin: OriginFor<T>) -> DispatchResultWithPostInfo {
let user = ensure_signed(origin)?;
ensure!(
<SimpleMap<T>>::contains_key(&user),
Error::<T>::NoValueStored
);
let entry = <SimpleMap<T>>::take(&user);
Self::deposit_event(Event::EntryTaken(user, entry));
Ok(().into())
}
#[pallet::weight(10_000)]
pub fn increase_single_entry(
origin: OriginFor<T>,
add_this_val: u32,
) -> DispatchResultWithPostInfo {
let user = ensure_signed(origin)?;
ensure!(
<SimpleMap<T>>::contains_key(&user),
Error::<T>::NoValueStored
);
let original_value = <SimpleMap<T>>::get(&user);
let new_value = original_value
.checked_add(add_this_val)
.ok_or(Error::<T>::MaxValueReached)?;
<SimpleMap<T>>::insert(&user, new_value);
Self::deposit_event(Event::EntryIncreased(user, original_value, new_value));
Ok(().into())
}
}
}