// This file is part of Substrate. // Copyright (C) Parity Technologies (UK) Ltd. // SPDX-License-Identifier: Apache-2.0 // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //! Various pieces of common functionality. use crate::*; use frame_support::pallet_prelude::*; impl, I: 'static> Pallet { /// Get the owner of the item, if the item exists. pub fn owner(collection: T::CollectionId, item: T::ItemId) -> Option { Item::::get(collection, item).map(|i| i.owner) } /// Get the owner of the collection, if the collection exists. pub fn collection_owner(collection: T::CollectionId) -> Option { Collection::::get(collection).map(|i| i.owner) } /// Validates the signature of the given data with the provided signer's account ID. /// /// # Errors /// /// This function returns a [`WrongSignature`](crate::Error::WrongSignature) error if the /// signature is invalid or the verification process fails. pub fn validate_signature( data: &Vec, signature: &T::OffchainSignature, signer: &T::AccountId, ) -> DispatchResult { if signature.verify(&**data, &signer) { return Ok(()) } // NOTE: for security reasons modern UIs implicitly wrap the data requested to sign into // , that's why we support both wrapped and raw versions. let prefix = b""; let suffix = b""; let mut wrapped: Vec = Vec::with_capacity(data.len() + prefix.len() + suffix.len()); wrapped.extend(prefix); wrapped.extend(data); wrapped.extend(suffix); ensure!(signature.verify(&*wrapped, &signer), Error::::WrongSignature); Ok(()) } pub(crate) fn set_next_collection_id(collection: T::CollectionId) { let next_id = collection.increment(); NextCollectionId::::set(next_id); Self::deposit_event(Event::NextCollectionIdIncremented { next_id }); } #[cfg(any(test, feature = "runtime-benchmarks"))] pub fn set_next_id(id: T::CollectionId) { NextCollectionId::::set(Some(id)); } #[cfg(test)] pub fn get_next_id() -> T::CollectionId { NextCollectionId::::get() .or(T::CollectionId::initial_value()) .expect("Failed to get next collection ID") } }