-
Pascal Engélibert authoredPascal Engélibert authored
handlers.rs 9.37 KiB
// Copyright 2021 Axiom-Team
//
// This file is part of Duniter-v2S.
//
// Duniter-v2S is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, version 3 of the License.
//
// Duniter-v2S is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
use super::entities::*;
use super::{AccountId, IdtyIndex};
use frame_support::dispatch::UnfilteredDispatchable;
use frame_support::instances::{Instance1, Instance2};
use frame_support::pallet_prelude::Weight;
use frame_support::traits::Get;
use frame_support::Parameter;
use pallet_identity::IdtyEvent;
use sp_runtime::traits::IsMember;
pub struct OnNewSessionHandler<Runtime>(core::marker::PhantomData<Runtime>);
impl<Runtime> pallet_authority_members::traits::OnNewSession for OnNewSessionHandler<Runtime>
where
Runtime: pallet_provide_randomness::Config,
{
fn on_new_session(_index: sp_staking::SessionIndex) -> Weight {
pallet_provide_randomness::Pallet::<Runtime>::on_new_epoch();
Weight::zero()
}
}
pub struct OnIdtyChangeHandler<Runtime>(core::marker::PhantomData<Runtime>);
impl<T> pallet_identity::traits::OnIdtyChange<T> for OnIdtyChangeHandler<T>
where
T: frame_system::Config<AccountId = AccountId>,
T: pallet_authority_members::Config<MemberId = IdtyIndex>,
T: pallet_identity::Config<IdtyIndex = IdtyIndex, IdtyData = IdtyData>,
T: pallet_universal_dividend::Config,
{
fn on_idty_change(idty_index: IdtyIndex, idty_event: &IdtyEvent<T>) -> Weight {
match idty_event {
IdtyEvent::Validated => {
pallet_identity::Identities::<T>::mutate_exists(idty_index, |idty_val_opt| {
if let Some(ref mut idty_val) = idty_val_opt {
idty_val.data = IdtyData {
first_eligible_ud:
pallet_universal_dividend::Pallet::<T>::init_first_eligible_ud(),
}
}
});
}
IdtyEvent::ChangedOwnerKey { new_owner_key } => {
if let Err(e) = pallet_authority_members::Pallet::<T>::change_owner_key(
idty_index,
new_owner_key.clone(),
) {
log::error!(
"on_idty_change: pallet_authority_members.change_owner_key(): {:?}",
e
);
}
}
IdtyEvent::Created { .. } | IdtyEvent::Confirmed | IdtyEvent::Removed { .. } => {}
}
Weight::zero()
}
}
pub struct OnMembershipEventHandler<Inner, Runtime>(core::marker::PhantomData<(Inner, Runtime)>);
impl<
Inner: sp_membership::traits::OnEvent<IdtyIndex, ()>,
Runtime: frame_system::Config<AccountId = AccountId>
+ pallet_identity::Config<IdtyData = IdtyData, IdtyIndex = IdtyIndex>
+ pallet_membership::Config<Instance1, MetaData = ()>
+ pallet_universal_dividend::Config,
> sp_membership::traits::OnEvent<IdtyIndex, ()> for OnMembershipEventHandler<Inner, Runtime>
{
fn on_event(membership_event: &sp_membership::Event<IdtyIndex, ()>) -> Weight {
(match membership_event {
sp_membership::Event::MembershipRevoked(idty_index) => {
if let Some(idty_value) = pallet_identity::Identities::<Runtime>::get(idty_index) {
if let Some(first_ud_index) = idty_value.data.first_eligible_ud.into() {
pallet_universal_dividend::Pallet::<Runtime>::on_removed_member(
first_ud_index,
&idty_value.owner_key,
)
} else {
Runtime::DbWeight::get().reads(1)
}
} else {
Runtime::DbWeight::get().reads(1)
}
}
_ => Weight::zero(),
}) + Inner::on_event(membership_event)
}
}
pub struct OnSmithMembershipEventHandler<Inner, Runtime>(
core::marker::PhantomData<(Inner, Runtime)>,
);
impl<
IdtyIndex: Copy + Parameter,
SessionKeysWrapper: Clone,
Inner: sp_membership::traits::OnEvent<IdtyIndex, SmithsMembershipMetaData<SessionKeysWrapper>>,
Runtime: frame_system::Config<AccountId = AccountId>
+ pallet_identity::Config<IdtyIndex = IdtyIndex>
+ pallet_authority_members::Config<KeysWrapper = SessionKeysWrapper, MemberId = IdtyIndex>
+ pallet_membership::Config<
Instance2,
MetaData = SmithsMembershipMetaData<SessionKeysWrapper>,
>,
> sp_membership::traits::OnEvent<IdtyIndex, SmithsMembershipMetaData<SessionKeysWrapper>>
for OnSmithMembershipEventHandler<Inner, Runtime>
{
fn on_event(
membership_event: &sp_membership::Event<
IdtyIndex,
SmithsMembershipMetaData<SessionKeysWrapper>,
>,
) -> Weight {
(match membership_event {
sp_membership::Event::MembershipAcquired(
_idty_index,
SmithsMembershipMetaData {
owner_key,
session_keys,
..
},
) => {
let call = pallet_authority_members::Call::<Runtime>::set_session_keys {
keys: session_keys.clone(),
};
if let Err(e) = call.dispatch_bypass_filter(
frame_system::Origin::<Runtime>::Signed(owner_key.clone()).into(),
) {
sp_std::if_std! {
println!("fail to set session keys: {:?}", e)
}
}
Weight::zero()
}
sp_membership::Event::MembershipRevoked(idty_index) => {
let call = pallet_authority_members::Call::<Runtime>::remove_member {
member_id: *idty_index,
};
if let Err(e) =
call.dispatch_bypass_filter(frame_system::Origin::<Runtime>::Root.into())
{
sp_std::if_std! {
println!("faid to remove member: {:?}", e)
}
}
Weight::zero()
}
_ => Weight::zero(),
}) + Inner::on_event(membership_event)
}
}
pub struct OnRemovedAuthorityMemberHandler<Runtime>(core::marker::PhantomData<Runtime>);
impl<Runtime> pallet_authority_members::traits::OnRemovedMember<IdtyIndex>
for OnRemovedAuthorityMemberHandler<Runtime>
where
Runtime: frame_system::Config + pallet_membership::Config<Instance2, IdtyId = IdtyIndex>,
{
fn on_removed_member(idty_index: IdtyIndex) -> Weight {
if let Err(e) = pallet_membership::Pallet::<Runtime, Instance2>::revoke_membership(
frame_system::RawOrigin::Root.into(),
Some(idty_index),
) {
sp_std::if_std! {
println!("fail to revoke membership: {:?}", e)
}
}
Weight::zero()
}
}
pub struct RemoveIdentityConsumersImpl<Runtime>(core::marker::PhantomData<Runtime>);
impl<Runtime> pallet_identity::traits::RemoveIdentityConsumers<IdtyIndex>
for RemoveIdentityConsumersImpl<Runtime>
where
Runtime: pallet_identity::Config<IdtyIndex = IdtyIndex>
+ pallet_authority_members::Config<MemberId = IdtyIndex>
+ pallet_membership::Config<Instance1, IdtyId = IdtyIndex>
+ pallet_membership::Config<Instance2, IdtyId = IdtyIndex>,
{
fn remove_idty_consumers(idty_index: IdtyIndex) -> Weight {
// Remove smith member
if pallet_membership::Pallet::<Runtime, Instance2>::is_member(&idty_index) {
if let Err(e) = pallet_membership::Pallet::<Runtime, Instance2>::revoke_membership(
frame_system::RawOrigin::Root.into(),
Some(idty_index),
) {
log::error!(
target: "runtime::common",
"Logic error: fail to revoke smith membership in remove_idty_consumers(): {:?}",
e
);
}
}
// Remove "classic" member
if let Err(e) = pallet_membership::Pallet::<Runtime, Instance1>::revoke_membership(
frame_system::RawOrigin::Root.into(),
Some(idty_index),
) {
log::error!(
target: "runtime::common",
"Logic error: fail to revoke membership in remove_idty_consumers(): {:?}",
e
);
}
Weight::zero()
}
}
pub struct TreasurySpendFunds<Runtime>(core::marker::PhantomData<Runtime>);
impl<Runtime> pallet_treasury::SpendFunds<Runtime> for TreasurySpendFunds<Runtime>
where
Runtime: pallet_treasury::Config,
{
fn spend_funds(
_budget_remaining: &mut pallet_treasury::BalanceOf<Runtime>,
_imbalance: &mut pallet_treasury::PositiveImbalanceOf<Runtime>,
_total_weight: &mut Weight,
missed_any: &mut bool,
) {
*missed_any = true;
}
}