1234567891011121314151617#![recursion_limit = "1024"]18#![cfg_attr(not(feature = "std"), no_std)]19#![allow(20 clippy::too_many_arguments,21 clippy::unnecessary_mut_passed,22 clippy::unused_unit23)]2425use frame_support::{26 decl_module, decl_storage, decl_error, decl_event,27 dispatch::DispatchResult,28 ensure,29 weights::{Weight},30 transactional,31 pallet_prelude::{DispatchResultWithPostInfo, ConstU32},32 BoundedVec,33};34use scale_info::TypeInfo;35use frame_system::{self as system, ensure_signed};36use sp_runtime::{sp_std::prelude::Vec};37use up_data_structs::{38 VARIABLE_ON_CHAIN_SCHEMA_LIMIT, CONST_ON_CHAIN_SCHEMA_LIMIT, OFFCHAIN_SCHEMA_LIMIT,39 MAX_COLLECTION_NAME_LENGTH, MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_TOKEN_PREFIX_LENGTH,40 AccessMode, CreateItemData, CollectionLimits, CollectionId, CollectionMode, TokenId,41 SchemaVersion, SponsorshipState, MetaUpdatePermission, CreateCollectionData, CustomDataLimit,42 CreateItemExData, budget, CollectionField, Property, PropertyKey, PropertyKeyPermission,43};44use pallet_evm::account::CrossAccountId;45use pallet_common::{46 CollectionHandle, Pallet as PalletCommon, Error as CommonError, CommonWeightInfo,47 dispatch::dispatch_call, dispatch::CollectionDispatch,48};4950#[cfg(feature = "runtime-benchmarks")]51mod benchmarking;52pub mod weights;53use weights::WeightInfo;5455decl_error! {56 57 pub enum Error for Module<T: Config> {58 59 CollectionDecimalPointLimitExceeded,60 61 ConfirmUnsetSponsorFail,62 63 EmptyArgument,64 }65}6667pub trait Config: system::Config + pallet_common::Config + Sized + TypeInfo {68 type Event: From<Event<Self>> + Into<<Self as frame_system::Config>::Event>;6970 71 type WeightInfo: WeightInfo;72 type CommonWeightInfo: CommonWeightInfo<Self::CrossAccountId>;73}7475decl_event! {76 pub enum Event<T>77 where78 <T as frame_system::Config>::AccountId,79 <T as pallet_evm::account::Config>::CrossAccountId,80 {81 82 83 84 85 86 CollectionSponsorRemoved(CollectionId),8788 89 90 91 92 93 94 95 CollectionAdminAdded(CollectionId, CrossAccountId),9697 98 99 100 101 102 103 104 CollectionOwnedChanged(CollectionId, AccountId),105106 107 108 109 110 111 112 113 CollectionSponsorSet(CollectionId, AccountId),114115 116 117 118 119 120 ConstOnChainSchemaSet(CollectionId),121122 123 124 125 126 127 128 129 SponsorshipConfirmed(CollectionId, AccountId),130131 132 133 134 135 136 137 138 CollectionAdminRemoved(CollectionId, CrossAccountId),139140 141 142 143 144 145 146 147 AllowListAddressRemoved(CollectionId, CrossAccountId),148149 150 151 152 153 154 155 156 AllowListAddressAdded(CollectionId, CrossAccountId),157158 159 160 161 162 163 CollectionLimitSet(CollectionId),164165 166 167 168 169 170 MintPermissionSet(CollectionId),171172 173 174 175 176 177 OffchainSchemaSet(CollectionId),178179 180 181 182 183 184 185 186 PublicAccessModeSet(CollectionId, AccessMode),187188 189 190 191 192 193 SchemaVersionSet(CollectionId),194195 196 197 198 199 200 VariableOnChainSchemaSet(CollectionId),201 }202}203204type SelfWeightOf<T> = <T as Config>::WeightInfo;205206207208209210211212213214215216217218219220221222223224225226227228decl_storage! {229 trait Store for Module<T: Config> as Unique {230231 232 233 ChainVersion: u64;234 235236 237 238 239 pub CreateItemBasket get(fn create_item_basket): map hasher(blake2_128_concat) (CollectionId, T::AccountId) => Option<T::BlockNumber>;240 241 pub NftTransferBasket get(fn nft_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;242 243 pub FungibleTransferBasket get(fn fungible_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;244 245 pub ReFungibleTransferBasket get(fn refungible_transfer_basket): nmap hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;246 247248 249 250 pub VariableMetaDataBasket get(fn variable_meta_data_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;251 252 pub NftApproveBasket get(fn nft_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;253 pub FungibleApproveBasket get(fn fungible_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;254 pub RefungibleApproveBasket get(fn refungible_approve_basket): nmap hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;255 }256}257258decl_module! {259 pub struct Module<T: Config> for enum Call260 where261 origin: T::Origin262 {263 type Error = Error<T>;264265 fn deposit_event() = default;266267 fn on_initialize(_now: T::BlockNumber) -> Weight {268 0269 }270271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 #[weight = <SelfWeightOf<T>>::create_collection()]288 #[transactional]289 #[deprecated]290 pub fn create_collection(origin,291 collection_name: BoundedVec<u16, ConstU32<MAX_COLLECTION_NAME_LENGTH>>,292 collection_description: BoundedVec<u16, ConstU32<MAX_COLLECTION_DESCRIPTION_LENGTH>>,293 token_prefix: BoundedVec<u8, ConstU32<MAX_TOKEN_PREFIX_LENGTH>>,294 mode: CollectionMode) -> DispatchResult {295 let data: CreateCollectionData<T::AccountId> = CreateCollectionData {296 name: collection_name,297 description: collection_description,298 token_prefix,299 mode,300 ..Default::default()301 };302 Self::create_collection_ex(origin, data)303 }304305 306 307 308 #[weight = <SelfWeightOf<T>>::create_collection()]309 #[transactional]310 pub fn create_collection_ex(origin, data: CreateCollectionData<T::AccountId>) -> DispatchResult {311 let sender = ensure_signed(origin)?;312313 314315 T::CollectionDispatch::create(sender, data)?;316317 Ok(())318 }319320 321 322 323 324 325 326 327 328 329 #[weight = <SelfWeightOf<T>>::destroy_collection()]330 #[transactional]331 pub fn destroy_collection(origin, collection_id: CollectionId) -> DispatchResult {332 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);333 let collection = <CollectionHandle<T>>::try_get(collection_id)?;334335 336337 T::CollectionDispatch::destroy(sender, collection)?;338339 <NftTransferBasket<T>>::remove_prefix(collection_id, None);340 <FungibleTransferBasket<T>>::remove_prefix(collection_id, None);341 <ReFungibleTransferBasket<T>>::remove_prefix((collection_id,), None);342343 <VariableMetaDataBasket<T>>::remove_prefix(collection_id, None);344 <NftApproveBasket<T>>::remove_prefix(collection_id, None);345 <FungibleApproveBasket<T>>::remove_prefix(collection_id, None);346 <RefungibleApproveBasket<T>>::remove_prefix((collection_id,), None);347348 Ok(())349 }350351 352 353 354 355 356 357 358 359 360 361 362 363 #[weight = <SelfWeightOf<T>>::add_to_allow_list()]364 #[transactional]365 pub fn add_to_allow_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{366367 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);368 let collection = <CollectionHandle<T>>::try_get(collection_id)?;369370 <PalletCommon<T>>::toggle_allowlist(371 &collection,372 &sender,373 &address,374 true,375 )?;376377 Self::deposit_event(Event::<T>::AllowListAddressAdded(378 collection_id,379 address380 ));381382 Ok(())383 }384385 386 387 388 389 390 391 392 393 394 395 396 397 #[weight = <SelfWeightOf<T>>::remove_from_allow_list()]398 #[transactional]399 pub fn remove_from_allow_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{400401 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);402 let collection = <CollectionHandle<T>>::try_get(collection_id)?;403404 <PalletCommon<T>>::toggle_allowlist(405 &collection,406 &sender,407 &address,408 false,409 )?;410411 <Pallet<T>>::deposit_event(Event::<T>::AllowListAddressRemoved(412 collection_id,413 address414 ));415416 Ok(())417 }418419 420 421 422 423 424 425 426 427 428 429 430 #[weight = <SelfWeightOf<T>>::set_public_access_mode()]431 #[transactional]432 pub fn set_public_access_mode(origin, collection_id: CollectionId, mode: AccessMode) -> DispatchResult433 {434 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);435436 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;437 target_collection.check_is_owner(&sender)?;438439 target_collection.access = mode.clone();440441 <Pallet<T>>::deposit_event(Event::<T>::PublicAccessModeSet(442 collection_id,443 mode444 ));445446 target_collection.save()447 }448449 450 451 452 453 454 455 456 457 458 459 460 461 462 #[weight = <SelfWeightOf<T>>::set_mint_permission()]463 #[transactional]464 pub fn set_mint_permission(origin, collection_id: CollectionId, mint_permission: bool) -> DispatchResult465 {466 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);467468 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;469 target_collection.check_is_owner(&sender)?;470471 target_collection.mint_mode = mint_permission;472473 <Pallet<T>>::deposit_event(Event::<T>::MintPermissionSet(474 collection_id475 ));476477 target_collection.save()478 }479480 481 482 483 484 485 486 487 488 489 490 491 #[weight = <SelfWeightOf<T>>::change_collection_owner()]492 #[transactional]493 pub fn change_collection_owner(origin, collection_id: CollectionId, new_owner: T::AccountId) -> DispatchResult {494495 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);496497 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;498 target_collection.check_is_owner(&sender)?;499500 target_collection.owner = new_owner.clone();501 <Pallet<T>>::deposit_event(Event::<T>::CollectionOwnedChanged(502 collection_id,503 new_owner504 ));505506 target_collection.save()507 }508509 510 511 512 513 514 515 516 517 518 519 520 521 522 #[weight = <SelfWeightOf<T>>::add_collection_admin()]523 #[transactional]524 pub fn add_collection_admin(origin, collection_id: CollectionId, new_admin_id: T::CrossAccountId) -> DispatchResult {525 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);526 let collection = <CollectionHandle<T>>::try_get(collection_id)?;527528 <Pallet<T>>::deposit_event(Event::<T>::CollectionAdminAdded(529 collection_id,530 new_admin_id.clone()531 ));532533 <PalletCommon<T>>::toggle_admin(&collection, &sender, &new_admin_id, true)534 }535536 537 538 539 540 541 542 543 544 545 546 547 548 #[weight = <SelfWeightOf<T>>::remove_collection_admin()]549 #[transactional]550 pub fn remove_collection_admin(origin, collection_id: CollectionId, account_id: T::CrossAccountId) -> DispatchResult {551 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);552 let collection = <CollectionHandle<T>>::try_get(collection_id)?;553554 <Pallet<T>>::deposit_event(Event::<T>::CollectionAdminRemoved(555 collection_id,556 account_id.clone()557 ));558559 <PalletCommon<T>>::toggle_admin(&collection, &sender, &account_id, false)560 }561562 563 564 565 566 567 568 569 570 571 #[weight = <SelfWeightOf<T>>::set_collection_sponsor()]572 #[transactional]573 pub fn set_collection_sponsor(origin, collection_id: CollectionId, new_sponsor: T::AccountId) -> DispatchResult {574 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);575576 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;577 target_collection.check_is_owner(&sender)?;578579 target_collection.sponsorship = SponsorshipState::Unconfirmed(new_sponsor.clone());580581 <Pallet<T>>::deposit_event(Event::<T>::CollectionSponsorSet(582 collection_id,583 new_sponsor584 ));585586 target_collection.save()587 }588589 590 591 592 593 594 595 596 #[weight = <SelfWeightOf<T>>::confirm_sponsorship()]597 #[transactional]598 pub fn confirm_sponsorship(origin, collection_id: CollectionId) -> DispatchResult {599 let sender = ensure_signed(origin)?;600601 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;602 ensure!(603 target_collection.sponsorship.pending_sponsor() == Some(&sender),604 Error::<T>::ConfirmUnsetSponsorFail605 );606607 target_collection.sponsorship = SponsorshipState::Confirmed(sender.clone());608609 <Pallet<T>>::deposit_event(Event::<T>::SponsorshipConfirmed(610 collection_id,611 sender612 ));613614 target_collection.save()615 }616617 618 619 620 621 622 623 624 625 626 #[weight = <SelfWeightOf<T>>::remove_collection_sponsor()]627 #[transactional]628 pub fn remove_collection_sponsor(origin, collection_id: CollectionId) -> DispatchResult {629 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);630631 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;632 target_collection.check_is_owner(&sender)?;633634 target_collection.sponsorship = SponsorshipState::Disabled;635636 <Pallet<T>>::deposit_event(Event::<T>::CollectionSponsorRemoved(637 collection_id638 ));639 target_collection.save()640 }641642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 #[weight = T::CommonWeightInfo::create_item()]661 #[transactional]662 pub fn create_item(origin, collection_id: CollectionId, owner: T::CrossAccountId, data: CreateItemData) -> DispatchResultWithPostInfo {663 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);664 let budget = budget::Value::new(2);665666 dispatch_call::<T, _>(collection_id, |d| d.create_item(sender, owner, data, &budget))667 }668669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 #[weight = T::CommonWeightInfo::create_multiple_items(items_data.len() as u32)]688 #[transactional]689 pub fn create_multiple_items(origin, collection_id: CollectionId, owner: T::CrossAccountId, items_data: Vec<CreateItemData>) -> DispatchResultWithPostInfo {690 ensure!(!items_data.is_empty(), Error::<T>::EmptyArgument);691 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);692 let budget = budget::Value::new(2);693694 dispatch_call::<T, _>(collection_id, |d| d.create_multiple_items(sender, owner, items_data, &budget))695 }696697 #[weight = T::CommonWeightInfo::set_collection_properties(properties.len() as u32)]698 #[transactional]699 pub fn set_collection_properties(700 origin,701 collection_id: CollectionId,702 properties: Vec<Property>703 ) -> DispatchResultWithPostInfo {704 ensure!(!properties.is_empty(), Error::<T>::EmptyArgument);705706 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);707708 dispatch_call::<T, _>(collection_id, |d| d.set_collection_properties(sender, properties))709 }710711 #[weight = T::CommonWeightInfo::delete_collection_properties(property_keys.len() as u32)]712 #[transactional]713 pub fn delete_collection_properties(714 origin,715 collection_id: CollectionId,716 property_keys: Vec<PropertyKey>,717 ) -> DispatchResultWithPostInfo {718 ensure!(!property_keys.is_empty(), Error::<T>::EmptyArgument);719720 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);721722 dispatch_call::<T, _>(collection_id, |d| d.delete_collection_properties(&sender, property_keys))723 }724725 #[weight = T::CommonWeightInfo::set_token_properties(properties.len() as u32)]726 #[transactional]727 pub fn set_token_properties(728 origin,729 collection_id: CollectionId,730 token_id: TokenId,731 properties: Vec<Property>732 ) -> DispatchResultWithPostInfo {733 ensure!(!properties.is_empty(), Error::<T>::EmptyArgument);734735 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);736737 dispatch_call::<T, _>(collection_id, |d| d.set_token_properties(sender, token_id, properties))738 }739740 #[weight = T::CommonWeightInfo::delete_token_properties(property_keys.len() as u32)]741 #[transactional]742 pub fn delete_token_properties(743 origin,744 collection_id: CollectionId,745 token_id: TokenId,746 property_keys: Vec<PropertyKey>747 ) -> DispatchResultWithPostInfo {748 ensure!(!property_keys.is_empty(), Error::<T>::EmptyArgument);749750 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);751752 dispatch_call::<T, _>(collection_id, |d| d.delete_token_properties(sender, token_id, property_keys))753 }754755 #[weight = T::CommonWeightInfo::set_property_permissions(property_permissions.len() as u32)]756 #[transactional]757 pub fn set_property_permissions(758 origin,759 collection_id: CollectionId,760 property_permissions: Vec<PropertyKeyPermission>,761 ) -> DispatchResultWithPostInfo {762 ensure!(!property_permissions.is_empty(), Error::<T>::EmptyArgument);763764 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);765766 dispatch_call::<T, _>(collection_id, |d| d.set_property_permissions(&sender, property_permissions))767 }768769 #[weight = T::CommonWeightInfo::create_multiple_items_ex(&data)]770 #[transactional]771 pub fn create_multiple_items_ex(origin, collection_id: CollectionId, data: CreateItemExData<T::CrossAccountId>) -> DispatchResultWithPostInfo {772 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);773 let budget = budget::Value::new(2);774775 dispatch_call::<T, _>(collection_id, |d| d.create_multiple_items_ex(sender, data, &budget))776 }777778 779780 781 782 783 784 785 786 787 788 789 790 791 #[weight = <SelfWeightOf<T>>::set_transfers_enabled_flag()]792 #[transactional]793 pub fn set_transfers_enabled_flag(origin, collection_id: CollectionId, value: bool) -> DispatchResult {794 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);795 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;796 target_collection.check_is_owner(&sender)?;797798 799800 target_collection.limits.transfers_enabled = Some(value);801 target_collection.save()802 }803804 805 806 807 808 809 810 811 812 813 814 815 816 817 #[weight = T::CommonWeightInfo::burn_item()]818 #[transactional]819 pub fn burn_item(origin, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {820 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);821822 let post_info = dispatch_call::<T, _>(collection_id, |d| d.burn_item(sender, item_id, value))?;823 if value == 1 {824 <NftTransferBasket<T>>::remove(collection_id, item_id);825 <NftApproveBasket<T>>::remove(collection_id, item_id);826 }827 828 829 830 Ok(post_info)831 }832833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 #[weight = T::CommonWeightInfo::burn_from()]850 #[transactional]851 pub fn burn_from(origin, collection_id: CollectionId, from: T::CrossAccountId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {852 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);853 let budget = budget::Value::new(2);854855 dispatch_call::<T, _>(collection_id, |d| d.burn_from(sender, from, item_id, value, &budget))856 }857858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 #[weight = T::CommonWeightInfo::transfer()]882 #[transactional]883 pub fn transfer(origin, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {884 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);885 let budget = budget::Value::new(2);886887 dispatch_call::<T, _>(collection_id, |d| d.transfer(sender, recipient, item_id, value, &budget))888 }889890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 #[weight = T::CommonWeightInfo::approve()]906 #[transactional]907 pub fn approve(origin, spender: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, amount: u128) -> DispatchResultWithPostInfo {908 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);909910 dispatch_call::<T, _>(collection_id, |d| d.approve(sender, spender, item_id, amount))911 }912913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 #[weight = T::CommonWeightInfo::transfer_from()]933 #[transactional]934 pub fn transfer_from(origin, from: T::CrossAccountId, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128 ) -> DispatchResultWithPostInfo {935 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);936 let budget = budget::Value::new(2);937938 dispatch_call::<T, _>(collection_id, |d| d.transfer_from(sender, from, recipient, item_id, value, &budget))939 }940941 942 943 944 945 946 947 948 949 950 951 952 953 #[weight = T::CommonWeightInfo::set_variable_metadata(data.len() as u32)]954 #[transactional]955 pub fn set_variable_meta_data (956 origin,957 collection_id: CollectionId,958 item_id: TokenId,959 data: BoundedVec<u8, CustomDataLimit>,960 ) -> DispatchResultWithPostInfo {961 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);962963 dispatch_call::<T, _>(collection_id, |d| d.set_variable_metadata(sender, item_id, data))964 }965966 967 968 969 970 971 972 973 974 975 976 977 #[weight = <SelfWeightOf<T>>::set_meta_update_permission_flag()]978 #[transactional]979 pub fn set_meta_update_permission_flag(origin, collection_id: CollectionId, value: MetaUpdatePermission) -> DispatchResult {980 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);981 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;982983 ensure!(984 target_collection.meta_update_permission != MetaUpdatePermission::None,985 <CommonError<T>>::MetadataFlagFrozen,986 );987 target_collection.check_is_owner(&sender)?;988989 target_collection.meta_update_permission = value;990991 target_collection.save()992 }993994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 #[weight = <SelfWeightOf<T>>::set_schema_version()]1009 #[transactional]1010 pub fn set_schema_version(1011 origin,1012 collection_id: CollectionId,1013 version: SchemaVersion1014 ) -> DispatchResult {1015 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);1016 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;1017 target_collection.check_is_owner_or_admin(&sender)?;1018 target_collection.schema_version = version;10191020 <Pallet<T>>::deposit_event(Event::<T>::SchemaVersionSet(1021 collection_id1022 ));10231024 target_collection.save()1025 }10261027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 #[weight = <SelfWeightOf<T>>::set_offchain_schema(schema.len() as u32)]1040 #[transactional]1041 pub fn set_offchain_schema(1042 origin,1043 collection_id: CollectionId,1044 schema: BoundedVec<u8, ConstU32<OFFCHAIN_SCHEMA_LIMIT>>,1045 ) -> DispatchResult {1046 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);1047 let collection = <CollectionHandle<T>>::try_get(collection_id)?;10481049 10501051 <PalletCommon<T>>::set_field(&collection, &sender, CollectionField::OffchainSchema, schema.into_inner())?;10521053 <Pallet<T>>::deposit_event(Event::<T>::OffchainSchemaSet(1054 collection_id1055 ));1056 Ok(())1057 }10581059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 #[weight = <SelfWeightOf<T>>::set_const_on_chain_schema(schema.len() as u32)]1072 #[transactional]1073 pub fn set_const_on_chain_schema (1074 origin,1075 collection_id: CollectionId,1076 schema: BoundedVec<u8, ConstU32<CONST_ON_CHAIN_SCHEMA_LIMIT>>1077 ) -> DispatchResult {1078 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);1079 let collection = <CollectionHandle<T>>::try_get(collection_id)?;10801081 10821083 <PalletCommon<T>>::set_field(&collection, &sender, CollectionField::ConstOnChainSchema, schema.into_inner())?;10841085 <Pallet<T>>::deposit_event(Event::<T>::ConstOnChainSchemaSet(1086 collection_id1087 ));1088 Ok(())1089 }10901091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 #[weight = <SelfWeightOf<T>>::set_const_on_chain_schema(schema.len() as u32)]1104 #[transactional]1105 pub fn set_variable_on_chain_schema (1106 origin,1107 collection_id: CollectionId,1108 schema: BoundedVec<u8, ConstU32<VARIABLE_ON_CHAIN_SCHEMA_LIMIT>>1109 ) -> DispatchResult {1110 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);1111 let collection = <CollectionHandle<T>>::try_get(collection_id)?;11121113 11141115 <PalletCommon<T>>::set_field(&collection, &sender, CollectionField::VariableOnChainSchema, schema.into_inner())?;11161117 <Pallet<T>>::deposit_event(Event::<T>::VariableOnChainSchemaSet(1118 collection_id1119 ));1120 Ok(())1121 }11221123 #[weight = <SelfWeightOf<T>>::set_collection_limits()]1124 #[transactional]1125 pub fn set_collection_limits(1126 origin,1127 collection_id: CollectionId,1128 new_limit: CollectionLimits,1129 ) -> DispatchResult {1130 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);1131 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;1132 target_collection.check_is_owner(&sender)?;1133 let old_limit = &target_collection.limits;11341135 target_collection.limits = <PalletCommon<T>>::clamp_limits(target_collection.mode.clone(), &old_limit, new_limit)?;11361137 <Pallet<T>>::deposit_event(Event::<T>::CollectionLimitSet(1138 collection_id1139 ));11401141 target_collection.save()1142 }1143 }1144}