difftreelog
CORE-386 Refactor permissions
in: master
1 file changed
pallets/common/src/erc.rsdiffbeforeafterboth21};21};22pub use pallet_evm::{PrecompileOutput, PrecompileResult, PrecompileHandle, account::CrossAccountId};22pub use pallet_evm::{PrecompileOutput, PrecompileResult, PrecompileHandle, account::CrossAccountId};23use pallet_evm_coder_substrate::dispatch_to_evm;23use pallet_evm_coder_substrate::dispatch_to_evm;24use sp_core::{H160, U256, H256};24use sp_core::{H160, U256};25use sp_std::vec::Vec;25use sp_std::vec::Vec;26use up_data_structs::{Property, SponsoringRateLimit, NestingRule, OwnerRestrictedSet, AccessMode};26use up_data_structs::{Property, SponsoringRateLimit, NestingRule, OwnerRestrictedSet, AccessMode};27use alloc::format;27use alloc::format;84 }84 }858586 fn set_collection_sponsor(&mut self, caller: caller, sponsor: address) -> Result<void> {86 fn set_collection_sponsor(&mut self, caller: caller, sponsor: address) -> Result<void> {87 check_is_owner(caller, self)?;87 check_is_owner_or_admin(caller, self)?;888889 let sponsor = T::CrossAccountId::from_eth(sponsor);89 let sponsor = T::CrossAccountId::from_eth(sponsor);90 self.set_sponsor(sponsor.as_sub().clone())90 self.set_sponsor(sponsor.as_sub().clone())105105106 #[solidity(rename_selector = "setCollectionLimit")]106 #[solidity(rename_selector = "setCollectionLimit")]107 fn set_int_limit(&mut self, caller: caller, limit: string, value: uint32) -> Result<void> {107 fn set_int_limit(&mut self, caller: caller, limit: string, value: uint32) -> Result<void> {108 check_is_owner(caller, self)?;108 check_is_owner_or_admin(caller, self)?;109 let mut limits = self.limits.clone();109 let mut limits = self.limits.clone();110110111 match limit.as_str() {111 match limit.as_str() {141141142 #[solidity(rename_selector = "setCollectionLimit")]142 #[solidity(rename_selector = "setCollectionLimit")]143 fn set_bool_limit(&mut self, caller: caller, limit: string, value: bool) -> Result<void> {143 fn set_bool_limit(&mut self, caller: caller, limit: string, value: bool) -> Result<void> {144 check_is_owner(caller, self)?;144 check_is_owner_or_admin(caller, self)?;145 let mut limits = self.limits.clone();145 let mut limits = self.limits.clone();146146147 match limit.as_str() {147 match limit.as_str() {170 Ok(crate::eth::collection_id_to_address(self.id))170 Ok(crate::eth::collection_id_to_address(self.id))171 }171 }172172173 // fn add_admin_substrate(&self, caller: caller, new_admin: uint256) -> Result<void> {173 fn add_collection_admin_substrate(&self, caller: caller, new_admin: uint256) -> Result<void> {174 // let mut new_admin_h256 = H256::default();174 let caller = T::CrossAccountId::from_eth(caller);175 let mut new_admin_arr: [u8; 32] = Default::default();175 // new_admin.to_little_endian(&mut new_admin_h256.0);176 new_admin.to_big_endian(&mut new_admin_arr);176 // let account_id = T::AccountId::from(new_admin_h256);177 let account_id = T::AccountId::from(new_admin_arr);177 // let caller = T::CrossAccountId::from_eth(caller);178 let new_admin = T::CrossAccountId::from_sub(account_id);178 // let new_admin = T::CrossAccountId::from_sub(account_id);179 // <Pallet<T>>::toggle_admin(&self, &caller, &new_admin, true)179 <Pallet<T>>::toggle_admin(self, &caller, &new_admin, true)180 // .map_err(dispatch_to_evm::<T>)?;180 .map_err(dispatch_to_evm::<T>)?;181 // Ok(())181 Ok(())182 // }182 }183183184 // fn remove_admin_substrate(&self, caller: caller, new_admin: uint256) -> Result<void> {184 fn remove_collection_admin_substrate(&self, caller: caller, new_admin: uint256) -> Result<void> {185 // let mut new_admin_h256 = H256::default();185 let caller = T::CrossAccountId::from_eth(caller);186 let mut new_admin_arr: [u8; 32] = Default::default();186 // new_admin.to_little_endian(&mut new_admin_h256.0);187 new_admin.to_big_endian(&mut new_admin_arr);187 // let account_id = T::AccountId::from(new_admin_h256);188 let account_id = T::AccountId::from(new_admin_arr);188 // let caller = T::CrossAccountId::from_eth(caller);189 let new_admin = T::CrossAccountId::from_sub(account_id);189 // let new_admin = T::CrossAccountId::from_sub(account_id);190 // <Pallet<T>>::toggle_admin(&self, &caller, &new_admin, false)190 <Pallet<T>>::toggle_admin(self, &caller, &new_admin, false)191 // .map_err(dispatch_to_evm::<T>)?;191 .map_err(dispatch_to_evm::<T>)?;192 // Ok(())192 Ok(())193 // }193 }194194195 fn add_admin(&self, caller: caller, new_admin: address) -> Result<void> {195 fn add_collection_admin(&self, caller: caller, new_admin: address) -> Result<void> {196 let caller = T::CrossAccountId::from_eth(caller);196 let caller = T::CrossAccountId::from_eth(caller);197 self.check_is_owner_or_admin(&caller)198 .map_err(dispatch_to_evm::<T>)?;199 let new_admin = T::CrossAccountId::from_eth(new_admin);197 let new_admin = T::CrossAccountId::from_eth(new_admin);200 <Pallet<T>>::toggle_admin(&self, &caller, &new_admin, true)198 <Pallet<T>>::toggle_admin(self, &caller, &new_admin, true)201 .map_err(dispatch_to_evm::<T>)?;199 .map_err(dispatch_to_evm::<T>)?;202 Ok(())200 Ok(())203 }201 }204202205 fn remove_admin(&self, caller: caller, admin: address) -> Result<void> {203 fn remove_admin(&self, caller: caller, admin: address) -> Result<void> {206 let caller = T::CrossAccountId::from_eth(caller);204 let caller = T::CrossAccountId::from_eth(caller);207 self.check_is_owner_or_admin(&caller)208 .map_err(dispatch_to_evm::<T>)?;209 let admin = T::CrossAccountId::from_eth(admin);205 let admin = T::CrossAccountId::from_eth(admin);210 <Pallet<T>>::toggle_admin(&self, &caller, &admin, false)206 <Pallet<T>>::toggle_admin(self, &caller, &admin, false)211 .map_err(dispatch_to_evm::<T>)?;207 .map_err(dispatch_to_evm::<T>)?;212 Ok(())208 Ok(())213 }209 }214210215 #[solidity(rename_selector = "setNesting")]211 #[solidity(rename_selector = "setNesting")]216 fn set_nesting_bool(&mut self, caller: caller, enable: bool) -> Result<void> {212 fn set_nesting_bool(&mut self, caller: caller, enable: bool) -> Result<void> {217 let caller = T::CrossAccountId::from_eth(caller);213 check_is_owner_or_admin(caller, self)?;218 self.check_is_owner_or_admin(&caller)219 .map_err(dispatch_to_evm::<T>)?;220 self.collection.permissions.nesting = Some(match enable {214 self.collection.permissions.nesting = Some(match enable {221 false => NestingRule::Disabled,215 false => NestingRule::Disabled,222 true => NestingRule::Owner,216 true => NestingRule::Owner,223 });217 });224 save(self);218 save(self)?;225 Ok(())219 Ok(())226 }220 }227221233 if collections.len() >= OwnerRestrictedSet::bound() {227 if collections.len() >= OwnerRestrictedSet::bound() {234 return Err(Error::Revert(format!("Out of bound: {} >= {}", collections.len(), OwnerRestrictedSet::bound())));228 return Err(Error::Revert(format!("Out of bound: {} >= {}", collections.len(), OwnerRestrictedSet::bound())));235 }229 }236 let caller = T::CrossAccountId::from_eth(caller);230 check_is_owner_or_admin(caller, self)?;237 self.check_is_owner_or_admin(&caller)238 .map_err(dispatch_to_evm::<T>)?;239 self.collection.permissions.nesting = Some(match enable {231 self.collection.permissions.nesting = Some(match enable {240 false => NestingRule::Disabled,232 false => NestingRule::Disabled,241 true => {233 true => {242 let mut bv = OwnerRestrictedSet::new();234 let mut bv = OwnerRestrictedSet::new();243 for i in collections {235 for i in collections {244 bv.try_insert(236 bv.try_insert(crate::eth::map_eth_to_id(&i).ok_or_else(|| Error::Revert(245 crate::eth::map_eth_to_id(&i)246 .ok_or(Error::Revert("Can't convert address into collection id".into()))?237 "Can't convert address into collection id".into(),238 ))?)247 ).map_err(|e| Error::Revert(format!("{:?}", e)))?;239 .map_err(|e| Error::Revert(format!("{:?}", e)))?;248 }240 }249 NestingRule::OwnerRestricted (bv)241 NestingRule::OwnerRestricted (bv)250 }242 }251 });243 });252 save(self);244 save(self)?;253 Ok(())245 Ok(())254 }246 }255247256 fn set_access(&mut self, caller: caller, mode: string) -> Result<void> {248 fn set_collection_access(&mut self, caller: caller, mode: uint8) -> Result<void> {257 let caller = T::CrossAccountId::from_eth(caller);249 check_is_owner_or_admin(caller, self)?;258 self.check_is_owner_or_admin(&caller)259 .map_err(dispatch_to_evm::<T>)?;260 self.collection.permissions.access = Some(match mode.as_str() {250 self.collection.permissions.access = Some(match mode {261 "Normal" => AccessMode::Normal,251 0 => AccessMode::Normal,262 "AllowList" => AccessMode::AllowList,252 1 => AccessMode::AllowList,263 _ => return Err("Not supported access mode".into()),253 _ => return Err("Not supported access mode".into()),264 });254 });265 save(self);255 save(self)?;266 Ok(())256 Ok(())267 }257 }268258269 fn add_to_allow_list(&self, caller: caller, user: address) -> Result<void> {259 fn add_to_collection_allow_list(&self, caller: caller, user: address) -> Result<void> {270 let caller = check_is_owner_or_admin(caller, self)?;260 let caller = T::CrossAccountId::from_eth(caller);271 let user = T::CrossAccountId::from_eth(user);261 let user = T::CrossAccountId::from_eth(user);272 <Pallet<T>>::toggle_allowlist(self, &caller, &user, true)262 <Pallet<T>>::toggle_allowlist(self, &caller, &user, true)273 .map_err(dispatch_to_evm::<T>)?;263 .map_err(dispatch_to_evm::<T>)?;274 Ok(())264 Ok(())275 }265 }276266277 fn remove_from_allow_list(&self, caller: caller, user: address) -> Result<void> {267 fn remove_from_collection_allow_list(&self, caller: caller, user: address) -> Result<void> {278 let caller = check_is_owner_or_admin(caller, self)?;268 let caller = T::CrossAccountId::from_eth(caller);279 let user = T::CrossAccountId::from_eth(user);269 let user = T::CrossAccountId::from_eth(user);280 <Pallet<T>>::toggle_allowlist(self, &caller, &user, false)270 <Pallet<T>>::toggle_allowlist(self, &caller, &user, false)281 .map_err(dispatch_to_evm::<T>)?;271 .map_err(dispatch_to_evm::<T>)?;285 fn set_mint_mode(&mut self, caller: caller, mode: bool) -> Result<void> {275 fn set_mint_mode(&mut self, caller: caller, mode: bool) -> Result<void> {286 check_is_owner_or_admin(caller, self)?;276 check_is_owner_or_admin(caller, self)?;287 self.collection.permissions.mint_mode = Some(mode);277 self.collection.permissions.mint_mode = Some(mode);288 save(self);278 save(self)?;289 Ok(())279 Ok(())290 }280 }291}292293fn check_is_owner<T: Config>(caller: caller, collection: &CollectionHandle<T>) -> Result<void> {294 let caller = T::CrossAccountId::from_eth(caller);295 collection296 .check_is_owner(&caller)297 .map_err(pallet_evm_coder_substrate::dispatch_to_evm::<T>)?;298 Ok(())299}281}300282301fn check_is_owner_or_admin<T: Config>(caller: caller, collection: &CollectionHandle<T>) -> Result<T::CrossAccountId> {283fn check_is_owner_or_admin<T: Config>(284 caller: caller,285 collection: &CollectionHandle<T>,286) -> Result<T::CrossAccountId> {302 let caller = T::CrossAccountId::from_eth(caller);287 let caller = T::CrossAccountId::from_eth(caller);303 collection288 collection304 .check_is_owner_or_admin(&caller)289 .check_is_owner_or_admin(&caller)