fix: tiki pallet - burn cleanup, remove on_initialize, scoring fixes

- burn_citizen_nft now clears UserTikis and TikiHolder entries
- Removed on_initialize O(n) per-block scan (uses CitizenNftProvider hooks)
- Added Peseng role score (80 points)
- Removed catch-all match arm for compile-time safety on new roles
- Removed duplicate cfg benchmark/non-benchmark blocks in mint
This commit is contained in:
2026-02-11 04:37:46 +03:00
parent bc8e298ea3
commit 0be7357f90
3 changed files with 26 additions and 43 deletions
@@ -325,14 +325,9 @@ pub mod pezpallet {
}
#[pezpallet::hooks]
impl<T: Config> Hooks<BlockNumberFor<T>> for Pezpallet<T> {
fn on_initialize(_block_number: BlockNumberFor<T>) -> Weight {
// Check newly KYC-approved users and mint citizenship NFT
Self::check_and_mint_citizen_nfts();
T::DbWeight::get().reads_writes(10, 5)
}
}
impl<T: Config> Hooks<BlockNumberFor<T>> for Pezpallet<T> {}
// Citizenship NFT minting is handled by CitizenNftProvider hooks,
// no per-block scanning needed.
#[pezpallet::call]
impl<T: Config> Pezpallet<T> {
@@ -468,23 +463,6 @@ pub mod pezpallet {
// Pezpallet's helper functions
impl<T: Config> Pezpallet<T> {
/// Checks newly KYC-completed users and mints citizenship NFT
fn check_and_mint_citizen_nfts() {
// Check all approved users in KYC pezpallet
for (account, kyc_status) in pezpallet_identity_kyc::KycStatuses::<T>::iter() {
// Check if KYC is approved
if kyc_status == pezpallet_identity_kyc::types::KycLevel::Approved {
// Check if citizenship NFT exists
if Self::citizen_nft(&account).is_none() {
// Mint NFT (log error but continue on failure)
if Self::mint_citizen_nft_for_user(&account).is_err() {
log::warn!("Failed to mint citizen NFT for account: {account:?}");
}
}
}
}
}
/// Mints citizenship NFT for specific user
pub fn mint_citizen_nft_for_user(user: &T::AccountId) -> DispatchResult {
// Check if NFT already exists
@@ -493,17 +471,7 @@ pub mod pezpallet {
let collection_id = T::TikiCollectionId::get();
let next_id_u32 = Self::next_item_id();
// Mint the NFT - use force_mint in benchmarks to bypass balance/origin requirements
#[cfg(feature = "runtime-benchmarks")]
pezpallet_nfts::Pezpallet::<T>::force_mint(
T::RuntimeOrigin::from(pezframe_system::RawOrigin::Root),
collection_id,
next_id_u32,
T::Lookup::unlookup(user.clone()),
Default::default(),
)?;
#[cfg(not(feature = "runtime-benchmarks"))]
// Mint the NFT via force_mint (root origin, no deposit needed)
pezpallet_nfts::Pezpallet::<T>::force_mint(
T::RuntimeOrigin::from(pezframe_system::RawOrigin::Root),
collection_id,
@@ -825,12 +793,11 @@ impl<T: Config> Pezpallet<T> {
Tiki::Qeydkar => 25,
Tiki::ParêzvaneÇandî => 25,
Tiki::Sêwirmend => 20,
Tiki::Bazargan => 60, // Yeni eklenen ekonomik rol
Tiki::Bazargan => 60,
Tiki::Pêseng => 80,
// Temel Vatandaşlık ve Diğerleri
// Temel Vatandaşlık
Tiki::Welati => 10,
// Yukarıdaki listede olmayan diğer tüm roller 5 puan alır.
_ => 5,
}
}
}
@@ -858,7 +825,16 @@ impl<T: Config> pezpallet_identity_kyc::types::CitizenNftProvider<T::AccountId>
item_id,
)?;
// Remove from our storage
// Clear unique role mappings before removing roles
let user_tikis = UserTikis::<T>::get(who);
for tiki in user_tikis.iter() {
if Self::is_unique_role(tiki) {
TikiHolder::<T>::remove(tiki);
}
}
// Remove all roles and citizen NFT mapping
UserTikis::<T>::remove(who);
CitizenNft::<T>::remove(who);
Ok(())
@@ -204,6 +204,13 @@ impl pezpallet_identity_kyc::types::CitizenNftProvider<AccountId> for MockCitize
}
}
pub struct DefaultReferrerAccount;
impl pezframe_support::traits::Get<AccountId> for DefaultReferrerAccount {
fn get() -> AccountId {
100
}
}
impl pezpallet_identity_kyc::Config for Test {
type Currency = Balances;
type WeightInfo = ();
@@ -214,6 +221,7 @@ impl pezpallet_identity_kyc::Config for Test {
type OnKycApproved = MockOnKycApproved;
type OnCitizenshipRevoked = MockOnCitizenshipRevoked;
type CitizenNftProvider = MockCitizenNftProvider;
type DefaultReferrer = DefaultReferrerAccount;
}
parameter_types! {
@@ -373,8 +373,7 @@ fn scoring_system_comprehensive() {
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Feqî), 50);
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Welati), 10);
// Test default score for unspecified roles
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Pêseng), 5);
assert_eq!(TikiPallet::get_bonus_for_tiki(&TikiEnum::Pêseng), 80);
});
}