difftreelog
fix forward collection flags
in: master
10 files changed
pallets/common/src/dispatch.rsdiffbeforeafterboth1//! Module with interfaces for dispatching collections.23use frame_support::{4 dispatch::{5 DispatchResultWithPostInfo, PostDispatchInfo, Weight, DispatchErrorWithPostInfo,6 DispatchResult,7 },8 weights::Pays,9 traits::Get,10};11use sp_runtime::DispatchError;12use up_data_structs::{CollectionId, CreateCollectionData};1314use crate::{pallet::Config, CommonCollectionOperations, CollectionHandle};1516// TODO: move to benchmarking17/// Price of [`dispatch_tx`] call with noop `call` argument18pub fn dispatch_weight<T: Config>() -> Weight {19 // Read collection20 <T as frame_system::Config>::DbWeight::get().reads(1)21 // Dynamic dispatch?22 + Weight::from_ref_time(6_000_000)23 // submit_logs is measured as part of collection pallets24}2526/// Helper function to implement substrate calls for common collection methods.27///28/// * `collection` - The collection on which to call the method.29/// * `call` - The function in which to call the corresponding method from [`CommonCollectionOperations`].30pub fn dispatch_tx<31 T: Config,32 C: FnOnce(&dyn CommonCollectionOperations<T>) -> DispatchResultWithPostInfo,33>(34 collection: CollectionId,35 call: C,36) -> DispatchResultWithPostInfo {37 let handle =38 CollectionHandle::try_get(collection).map_err(|error| DispatchErrorWithPostInfo {39 post_info: PostDispatchInfo {40 actual_weight: Some(dispatch_weight::<T>()),41 pays_fee: Pays::Yes,42 },43 error,44 })?;45 handle46 .check_is_internal()47 .map_err(|error| DispatchErrorWithPostInfo {48 post_info: PostDispatchInfo {49 actual_weight: Some(dispatch_weight::<T>()),50 pays_fee: Pays::Yes,51 },52 error,53 })?;54 let dispatched = T::CollectionDispatch::dispatch(handle);55 let mut result = call(dispatched.as_dyn());56 match &mut result {57 Ok(PostDispatchInfo {58 actual_weight: Some(weight),59 ..60 })61 | Err(DispatchErrorWithPostInfo {62 post_info: PostDispatchInfo {63 actual_weight: Some(weight),64 ..65 },66 ..67 }) => *weight += dispatch_weight::<T>(),68 _ => {}69 }70 result71}7273/// Interface for working with different collections through the dispatcher.74pub trait CollectionDispatch<T: Config> {75 /// Create a collection. The collection will be created according to the value of [`data.mode`](CreateCollectionData::mode).76 ///77 /// * `sender` - The user who will become the owner of the collection.78 /// * `data` - Description of the created collection.79 fn create(80 sender: T::CrossAccountId,81 payer: T::CrossAccountId,82 data: CreateCollectionData<T::AccountId>,83 ) -> Result<CollectionId, DispatchError>;8485 /// Delete the collection.86 ///87 /// * `sender` - The owner of the collection.88 /// * `handle` - Collection handle.89 fn destroy(sender: T::CrossAccountId, handle: CollectionHandle<T>) -> DispatchResult;9091 /// Get a specialized collection from the handle.92 ///93 /// * `handle` - Collection handle.94 fn dispatch(handle: CollectionHandle<T>) -> Self;9596 /// Get the collection handle for the corresponding implementation.97 fn into_inner(self) -> CollectionHandle<T>;9899 /// Get the implementation of [`CommonCollectionOperations`].100 fn as_dyn(&self) -> &dyn CommonCollectionOperations<T>;101}1//! Module with interfaces for dispatching collections.23use frame_support::{4 dispatch::{5 DispatchResultWithPostInfo, PostDispatchInfo, Weight, DispatchErrorWithPostInfo,6 DispatchResult,7 },8 weights::Pays,9 traits::Get,10};11use sp_runtime::DispatchError;12use up_data_structs::{CollectionId, CreateCollectionData, CollectionFlags};1314use crate::{pallet::Config, CommonCollectionOperations, CollectionHandle};1516// TODO: move to benchmarking17/// Price of [`dispatch_tx`] call with noop `call` argument18pub fn dispatch_weight<T: Config>() -> Weight {19 // Read collection20 <T as frame_system::Config>::DbWeight::get().reads(1)21 // Dynamic dispatch?22 + Weight::from_ref_time(6_000_000)23 // submit_logs is measured as part of collection pallets24}2526/// Helper function to implement substrate calls for common collection methods.27///28/// * `collection` - The collection on which to call the method.29/// * `call` - The function in which to call the corresponding method from [`CommonCollectionOperations`].30pub fn dispatch_tx<31 T: Config,32 C: FnOnce(&dyn CommonCollectionOperations<T>) -> DispatchResultWithPostInfo,33>(34 collection: CollectionId,35 call: C,36) -> DispatchResultWithPostInfo {37 let handle =38 CollectionHandle::try_get(collection).map_err(|error| DispatchErrorWithPostInfo {39 post_info: PostDispatchInfo {40 actual_weight: Some(dispatch_weight::<T>()),41 pays_fee: Pays::Yes,42 },43 error,44 })?;45 handle46 .check_is_internal()47 .map_err(|error| DispatchErrorWithPostInfo {48 post_info: PostDispatchInfo {49 actual_weight: Some(dispatch_weight::<T>()),50 pays_fee: Pays::Yes,51 },52 error,53 })?;54 let dispatched = T::CollectionDispatch::dispatch(handle);55 let mut result = call(dispatched.as_dyn());56 match &mut result {57 Ok(PostDispatchInfo {58 actual_weight: Some(weight),59 ..60 })61 | Err(DispatchErrorWithPostInfo {62 post_info: PostDispatchInfo {63 actual_weight: Some(weight),64 ..65 },66 ..67 }) => *weight += dispatch_weight::<T>(),68 _ => {}69 }70 result71}7273/// Interface for working with different collections through the dispatcher.74pub trait CollectionDispatch<T: Config> {75 /// Create a collection. The collection will be created according to the value of [`data.mode`](CreateCollectionData::mode).76 ///77 /// * `sender` - The user who will become the owner of the collection.78 /// * `data` - Description of the created collection.79 fn create(80 sender: T::CrossAccountId,81 payer: T::CrossAccountId,82 data: CreateCollectionData<T::AccountId>,83 flags: CollectionFlags,84 ) -> Result<CollectionId, DispatchError>;8586 /// Delete the collection.87 ///88 /// * `sender` - The owner of the collection.89 /// * `handle` - Collection handle.90 fn destroy(sender: T::CrossAccountId, handle: CollectionHandle<T>) -> DispatchResult;9192 /// Get a specialized collection from the handle.93 ///94 /// * `handle` - Collection handle.95 fn dispatch(handle: CollectionHandle<T>) -> Self;9697 /// Get the collection handle for the corresponding implementation.98 fn into_inner(self) -> CollectionHandle<T>;99100 /// Get the implementation of [`CommonCollectionOperations`].101 fn as_dyn(&self) -> &dyn CommonCollectionOperations<T>;102}pallets/fungible/src/lib.rsdiffbeforeafterboth--- a/pallets/fungible/src/lib.rs
+++ b/pallets/fungible/src/lib.rs
@@ -212,8 +212,9 @@
owner: T::CrossAccountId,
payer: T::CrossAccountId,
data: CreateCollectionData<T::AccountId>,
+ flags: CollectionFlags,
) -> Result<CollectionId, DispatchError> {
- <PalletCommon<T>>::init_collection(owner, payer, data, CollectionFlags::default())
+ <PalletCommon<T>>::init_collection(owner, payer, data, flags)
}
/// Initializes the collection with ForeignCollection flag. Returns [CollectionId] on success, [DispatchError] otherwise.
pallets/nonfungible/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/benchmarking.rs
+++ b/pallets/nonfungible/src/benchmarking.rs
@@ -55,7 +55,7 @@
owner,
CollectionMode::NFT,
|owner: T::CrossAccountId, data| {
- <Pallet<T>>::init_collection(owner.clone(), owner, data, true)
+ <Pallet<T>>::init_collection(owner.clone(), owner, data, Default::default())
},
NonfungibleHandle::cast,
)
pallets/nonfungible/src/lib.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/lib.rs
+++ b/pallets/nonfungible/src/lib.rs
@@ -408,17 +408,9 @@
owner: T::CrossAccountId,
payer: T::CrossAccountId,
data: CreateCollectionData<T::AccountId>,
- is_external: bool,
+ flags: CollectionFlags,
) -> Result<CollectionId, DispatchError> {
- <PalletCommon<T>>::init_collection(
- owner,
- payer,
- data,
- CollectionFlags {
- external: is_external,
- ..Default::default()
- },
- )
+ <PalletCommon<T>>::init_collection(owner, payer, data, flags)
}
/// Destroy NFT collection
pallets/proxy-rmrk-core/src/lib.rsdiffbeforeafterboth--- a/pallets/proxy-rmrk-core/src/lib.rs
+++ b/pallets/proxy-rmrk-core/src/lib.rs
@@ -1448,7 +1448,15 @@
data: CreateCollectionData<T::AccountId>,
properties: impl Iterator<Item = Property>,
) -> Result<CollectionId, DispatchError> {
- let collection_id = <PalletNft<T>>::init_collection(sender.clone(), sender, data, true);
+ let collection_id = <PalletNft<T>>::init_collection(
+ sender.clone(),
+ sender,
+ data,
+ up_data_structs::CollectionFlags {
+ external: true,
+ ..Default::default()
+ },
+ );
if let Err(DispatchError::Arithmetic(_)) = &collection_id {
return Err(<Error<T>>::NoAvailableCollectionId.into());
pallets/proxy-rmrk-equip/src/lib.rsdiffbeforeafterboth--- a/pallets/proxy-rmrk-equip/src/lib.rs
+++ b/pallets/proxy-rmrk-equip/src/lib.rs
@@ -254,7 +254,10 @@
cross_sender.clone(),
cross_sender.clone(),
data,
- true,
+ up_data_structs::CollectionFlags {
+ external: true,
+ ..Default::default()
+ },
);
if let Err(DispatchError::Arithmetic(_)) = &collection_id_res {
pallets/refungible/src/lib.rsdiffbeforeafterboth--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -371,8 +371,9 @@
owner: T::CrossAccountId,
payer: T::CrossAccountId,
data: CreateCollectionData<T::AccountId>,
+ flags: CollectionFlags,
) -> Result<CollectionId, DispatchError> {
- <PalletCommon<T>>::init_collection(owner, payer, data, CollectionFlags::default())
+ <PalletCommon<T>>::init_collection(owner, payer, data, flags)
}
/// Destroy RFT collection
pallets/unique/src/eth/mod.rsdiffbeforeafterboth--- a/pallets/unique/src/eth/mod.rs
+++ b/pallets/unique/src/eth/mod.rs
@@ -34,7 +34,7 @@
use sp_std::vec;
use up_data_structs::{
CollectionName, CollectionDescription, CollectionTokenPrefix, CreateCollectionData,
- CollectionMode, PropertyValue,
+ CollectionMode, PropertyValue, CollectionFlags,
};
use crate::{Config, SelfWeightOf, weights::WeightInfo};
@@ -186,9 +186,16 @@
let collection_helpers_address =
T::CrossAccountId::from_eth(<T as pallet_common::Config>::ContractAddress::get());
- let collection_id =
- T::CollectionDispatch::create(caller.clone(), collection_helpers_address, data)
- .map_err(pallet_evm_coder_substrate::dispatch_to_evm::<T>)?;
+ let collection_id = T::CollectionDispatch::create(
+ caller.clone(),
+ collection_helpers_address,
+ data,
+ CollectionFlags {
+ erc721metadata: add_properties,
+ ..Default::default()
+ },
+ )
+ .map_err(pallet_evm_coder_substrate::dispatch_to_evm::<T>)?;
let address = pallet_common::eth::collection_id_to_address(collection_id);
Ok(address)
}
@@ -243,8 +250,13 @@
check_sent_amount_equals_collection_creation_price::<T>(value)?;
let collection_helpers_address =
T::CrossAccountId::from_eth(<T as pallet_common::Config>::ContractAddress::get());
- let collection_id = T::CollectionDispatch::create(caller, collection_helpers_address, data)
- .map_err(dispatch_to_evm::<T>)?;
+ let collection_id = T::CollectionDispatch::create(
+ caller,
+ collection_helpers_address,
+ data,
+ Default::default(),
+ )
+ .map_err(dispatch_to_evm::<T>)?;
let address = pallet_common::eth::collection_id_to_address(collection_id);
Ok(address)
@@ -291,8 +303,16 @@
check_sent_amount_equals_collection_creation_price::<T>(value)?;
let collection_helpers_address =
T::CrossAccountId::from_eth(<T as pallet_common::Config>::ContractAddress::get());
- let collection_id = T::CollectionDispatch::create(caller, collection_helpers_address, data)
- .map_err(pallet_evm_coder_substrate::dispatch_to_evm::<T>)?;
+ let collection_id = T::CollectionDispatch::create(
+ caller,
+ collection_helpers_address,
+ data,
+ CollectionFlags {
+ erc721metadata: true,
+ ..Default::default()
+ },
+ )
+ .map_err(pallet_evm_coder_substrate::dispatch_to_evm::<T>)?;
let address = pallet_common::eth::collection_id_to_address(collection_id);
Ok(address)
pallets/unique/src/lib.rsdiffbeforeafterboth--- a/pallets/unique/src/lib.rs
+++ b/pallets/unique/src/lib.rs
@@ -345,7 +345,7 @@
// =========
let sender = T::CrossAccountId::from_sub(sender);
- let _id = T::CollectionDispatch::create(sender.clone(), sender, data)?;
+ let _id = T::CollectionDispatch::create(sender.clone(), sender, data, Default::default())?;
Ok(())
}
runtime/common/dispatch.rsdiffbeforeafterboth--- a/runtime/common/dispatch.rs
+++ b/runtime/common/dispatch.rs
@@ -31,7 +31,7 @@
};
use up_data_structs::{
CollectionMode, CreateCollectionData, MAX_DECIMAL_POINTS, mapping::TokenAddressMapping,
- CollectionId,
+ CollectionId, CollectionFlags,
};
#[cfg(not(feature = "refungible"))]
@@ -57,10 +57,11 @@
sender: T::CrossAccountId,
payer: T::CrossAccountId,
data: CreateCollectionData<T::AccountId>,
+ flags: CollectionFlags,
) -> Result<CollectionId, DispatchError> {
let id = match data.mode {
CollectionMode::NFT => {
- <PalletNonfungible<T>>::init_collection(sender, payer, data, false)?
+ <PalletNonfungible<T>>::init_collection(sender, payer, data, flags)?
}
CollectionMode::Fungible(decimal_points) => {
// check params
@@ -68,11 +69,13 @@
decimal_points <= MAX_DECIMAL_POINTS,
pallet_unique::Error::<T>::CollectionDecimalPointLimitExceeded
);
- <PalletFungible<T>>::init_collection(sender, payer, data)?
+ <PalletFungible<T>>::init_collection(sender, payer, data, flags)?
}
#[cfg(feature = "refungible")]
- CollectionMode::ReFungible => <PalletRefungible<T>>::init_collection(sender, payer, data)?,
+ CollectionMode::ReFungible => {
+ <PalletRefungible<T>>::init_collection(sender, payer, data, flags)?
+ }
#[cfg(not(feature = "refungible"))]
CollectionMode::ReFungible => return unsupported!(T),