git.delta.rocks / unique-network / refs/commits / b4842377adb1

difftreelog

CORE-386 Refactor permissions

Trubnikov Sergey2022-06-07parent: #89dc6e6.patch.diff
in: master

1 file changed

modifiedpallets/common/src/erc.rsdiffbeforeafterboth
21};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 }
8585
86 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)?;
8888
89 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())
105105
106 #[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();
110110
111 match limit.as_str() {111 match limit.as_str() {
141141
142 #[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();
146146
147 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 }
172172
173 // 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 }
183183
184 // 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 }
194194
195 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 }
204202
205 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 }
214210
215 #[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 }
227221
233 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 }
255247
256 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 }
268258
269 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 }
276266
277 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}
292
293fn check_is_owner<T: Config>(caller: caller, collection: &CollectionHandle<T>) -> Result<void> {
294 let caller = T::CrossAccountId::from_eth(caller);
295 collection
296 .check_is_owner(&caller)
297 .map_err(pallet_evm_coder_substrate::dispatch_to_evm::<T>)?;
298 Ok(())
299}281}
300282
301fn 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 collection
304 .check_is_owner_or_admin(&caller)289 .check_is_owner_or_admin(&caller)