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)]2425extern crate alloc;2627pub use serde::{Serialize, Deserialize};2829use frame_support::{30 decl_module, decl_storage, decl_error, decl_event,31 dispatch::DispatchResult,32 ensure,33 weights::{Weight},34 transactional,35 pallet_prelude::{DispatchResultWithPostInfo, ConstU32},36 BoundedVec,37};38use scale_info::TypeInfo;39use frame_system::{self as system, ensure_signed};40use sp_runtime::{sp_std::prelude::Vec};41use up_data_structs::{42 VARIABLE_ON_CHAIN_SCHEMA_LIMIT, CONST_ON_CHAIN_SCHEMA_LIMIT, OFFCHAIN_SCHEMA_LIMIT,43 MAX_COLLECTION_NAME_LENGTH, MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_TOKEN_PREFIX_LENGTH,44 AccessMode, CreateItemData, CollectionLimits, CollectionId, CollectionMode, TokenId,45 SchemaVersion, SponsorshipState, MetaUpdatePermission, CreateCollectionData, CustomDataLimit,46 CreateItemExData,47};48use pallet_evm::account::CrossAccountId;49use pallet_common::{50 CollectionHandle, Pallet as PalletCommon, Error as CommonError, CommonWeightInfo,51 dispatch::dispatch_call, dispatch::CollectionDispatch,52};5354#[cfg(test)]55mod mock;5657#[cfg(test)]58mod tests;5960mod eth;61mod sponsorship;62pub use sponsorship::{UniqueSponsorshipHandler, UniqueSponsorshipPredict};63pub use eth::sponsoring::UniqueEthSponsorshipHandler;6465pub mod common;66use common::CommonWeights;6768#[cfg(feature = "runtime-benchmarks")]69mod benchmarking;70pub mod weights;71use weights::WeightInfo;7273pub trait SponsorshipPredict<T: Config> {74 fn predict(collection: CollectionId, account: T::CrossAccountId, token: TokenId) -> Option<u64>75 where76 u64: From<<T as frame_system::Config>::BlockNumber>;77}7879decl_error! {80 81 pub enum Error for Module<T: Config> {82 83 CollectionDecimalPointLimitExceeded,84 85 ConfirmUnsetSponsorFail,86 87 EmptyArgument,88 }89}9091pub trait Config:92 system::Config93 + pallet_evm_coder_substrate::Config94 + pallet_common::Config95 + pallet_nonfungible::Config96 + pallet_refungible::Config97 + pallet_fungible::Config98 + Sized99 + TypeInfo100{101 type Event: From<Event<Self>> + Into<<Self as frame_system::Config>::Event>;102103 104 type WeightInfo: WeightInfo;105}106107decl_event! {108 pub enum Event<T>109 where110 <T as frame_system::Config>::AccountId,111 <T as pallet_evm::account::Config>::CrossAccountId,112 {113 114 115 116 117 118 CollectionSponsorRemoved(CollectionId),119120 121 122 123 124 125 126 127 CollectionAdminAdded(CollectionId, CrossAccountId),128129 130 131 132 133 134 135 136 CollectionOwnedChanged(CollectionId, AccountId),137138 139 140 141 142 143 144 145 CollectionSponsorSet(CollectionId, AccountId),146147 148 149 150 151 152 ConstOnChainSchemaSet(CollectionId),153154 155 156 157 158 159 160 161 SponsorshipConfirmed(CollectionId, AccountId),162163 164 165 166 167 168 169 170 CollectionAdminRemoved(CollectionId, CrossAccountId),171172 173 174 175 176 177 178 179 AllowListAddressRemoved(CollectionId, CrossAccountId),180181 182 183 184 185 186 187 188 AllowListAddressAdded(CollectionId, CrossAccountId),189190 191 192 193 194 195 CollectionLimitSet(CollectionId),196197 198 199 200 201 202 MintPermissionSet(CollectionId),203204 205 206 207 208 209 OffchainSchemaSet(CollectionId),210211 212 213 214 215 216 217 218 PublicAccessModeSet(CollectionId, AccessMode),219220 221 222 223 224 225 SchemaVersionSet(CollectionId),226227 228 229 230 231 232 VariableOnChainSchemaSet(CollectionId),233 }234}235236type SelfWeightOf<T> = <T as Config>::WeightInfo;237238239240241242243244245246247248249250251252253254255256257258259260decl_storage! {261 trait Store for Module<T: Config> as Unique {262263 264 265 ChainVersion: u64;266 267268 269 270 271 pub CreateItemBasket get(fn create_item_basket): map hasher(blake2_128_concat) (CollectionId, T::AccountId) => Option<T::BlockNumber>;272 273 pub NftTransferBasket get(fn nft_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;274 275 pub FungibleTransferBasket get(fn fungible_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;276 277 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>;278 279280 281 282 pub VariableMetaDataBasket get(fn variable_meta_data_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;283 284 pub NftApproveBasket get(fn nft_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;285 pub FungibleApproveBasket get(fn fungible_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;286 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>;287 }288}289290decl_module! {291 pub struct Module<T: Config> for enum Call292 where293 origin: T::Origin294 {295 type Error = Error<T>;296297 fn deposit_event() = default;298299 fn on_initialize(_now: T::BlockNumber) -> Weight {300 0301 }302303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 #[weight = <SelfWeightOf<T>>::create_collection()]320 #[transactional]321 #[deprecated]322 pub fn create_collection(origin,323 collection_name: BoundedVec<u16, ConstU32<MAX_COLLECTION_NAME_LENGTH>>,324 collection_description: BoundedVec<u16, ConstU32<MAX_COLLECTION_DESCRIPTION_LENGTH>>,325 token_prefix: BoundedVec<u8, ConstU32<MAX_TOKEN_PREFIX_LENGTH>>,326 mode: CollectionMode) -> DispatchResult {327 let data: CreateCollectionData<T::AccountId> = CreateCollectionData {328 name: collection_name,329 description: collection_description,330 token_prefix,331 mode,332 ..Default::default()333 };334 Self::create_collection_ex(origin, data)335 }336337 338 339 340 #[weight = <SelfWeightOf<T>>::create_collection()]341 #[transactional]342 pub fn create_collection_ex(origin, data: CreateCollectionData<T::AccountId>) -> DispatchResult {343 let sender = ensure_signed(origin)?;344345 346347 T::CollectionDispatch::create(sender, data)?;348349 Ok(())350 }351352 353 354 355 356 357 358 359 360 361 #[weight = <SelfWeightOf<T>>::destroy_collection()]362 #[transactional]363 pub fn destroy_collection(origin, collection_id: CollectionId) -> DispatchResult {364 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);365 let collection = <CollectionHandle<T>>::try_get(collection_id)?;366367 368369 T::CollectionDispatch::destroy(sender, collection)?;370371 <NftTransferBasket<T>>::remove_prefix(collection_id, None);372 <FungibleTransferBasket<T>>::remove_prefix(collection_id, None);373 <ReFungibleTransferBasket<T>>::remove_prefix((collection_id,), None);374375 <VariableMetaDataBasket<T>>::remove_prefix(collection_id, None);376 <NftApproveBasket<T>>::remove_prefix(collection_id, None);377 <FungibleApproveBasket<T>>::remove_prefix(collection_id, None);378 <RefungibleApproveBasket<T>>::remove_prefix((collection_id,), None);379380 Ok(())381 }382383 384 385 386 387 388 389 390 391 392 393 394 395 #[weight = <SelfWeightOf<T>>::add_to_allow_list()]396 #[transactional]397 pub fn add_to_allow_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{398399 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);400 let collection = <CollectionHandle<T>>::try_get(collection_id)?;401402 <PalletCommon<T>>::toggle_allowlist(403 &collection,404 &sender,405 &address,406 true,407 )?;408409 Self::deposit_event(Event::<T>::AllowListAddressAdded(410 collection_id,411 address412 ));413414 Ok(())415 }416417 418 419 420 421 422 423 424 425 426 427 428 429 #[weight = <SelfWeightOf<T>>::remove_from_allow_list()]430 #[transactional]431 pub fn remove_from_allow_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{432433 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);434 let collection = <CollectionHandle<T>>::try_get(collection_id)?;435436 <PalletCommon<T>>::toggle_allowlist(437 &collection,438 &sender,439 &address,440 false,441 )?;442443 <Pallet<T>>::deposit_event(Event::<T>::AllowListAddressRemoved(444 collection_id,445 address446 ));447448 Ok(())449 }450451 452 453 454 455 456 457 458 459 460 461 462 #[weight = <SelfWeightOf<T>>::set_public_access_mode()]463 #[transactional]464 pub fn set_public_access_mode(origin, collection_id: CollectionId, mode: AccessMode) -> 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.access = mode.clone();472473 <Pallet<T>>::deposit_event(Event::<T>::PublicAccessModeSet(474 collection_id,475 mode476 ));477478 target_collection.save()479 }480481 482 483 484 485 486 487 488 489 490 491 492 493 494 #[weight = <SelfWeightOf<T>>::set_mint_permission()]495 #[transactional]496 pub fn set_mint_permission(origin, collection_id: CollectionId, mint_permission: bool) -> DispatchResult497 {498 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);499500 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;501 target_collection.check_is_owner(&sender)?;502503 target_collection.mint_mode = mint_permission;504505 <Pallet<T>>::deposit_event(Event::<T>::MintPermissionSet(506 collection_id507 ));508509 target_collection.save()510 }511512 513 514 515 516 517 518 519 520 521 522 523 #[weight = <SelfWeightOf<T>>::change_collection_owner()]524 #[transactional]525 pub fn change_collection_owner(origin, collection_id: CollectionId, new_owner: T::AccountId) -> DispatchResult {526527 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);528529 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;530 target_collection.check_is_owner(&sender)?;531532 target_collection.owner = new_owner.clone();533 <Pallet<T>>::deposit_event(Event::<T>::CollectionOwnedChanged(534 collection_id,535 new_owner536 ));537538 target_collection.save()539 }540541 542 543 544 545 546 547 548 549 550 551 552 553 554 #[weight = <SelfWeightOf<T>>::add_collection_admin()]555 #[transactional]556 pub fn add_collection_admin(origin, collection_id: CollectionId, new_admin_id: T::CrossAccountId) -> DispatchResult {557 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);558 let collection = <CollectionHandle<T>>::try_get(collection_id)?;559560 <Pallet<T>>::deposit_event(Event::<T>::CollectionAdminAdded(561 collection_id,562 new_admin_id.clone()563 ));564565 <PalletCommon<T>>::toggle_admin(&collection, &sender, &new_admin_id, true)566 }567568 569 570 571 572 573 574 575 576 577 578 579 580 #[weight = <SelfWeightOf<T>>::remove_collection_admin()]581 #[transactional]582 pub fn remove_collection_admin(origin, collection_id: CollectionId, account_id: T::CrossAccountId) -> DispatchResult {583 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);584 let collection = <CollectionHandle<T>>::try_get(collection_id)?;585586 <Pallet<T>>::deposit_event(Event::<T>::CollectionAdminRemoved(587 collection_id,588 account_id.clone()589 ));590591 <PalletCommon<T>>::toggle_admin(&collection, &sender, &account_id, false)592 }593594 595 596 597 598 599 600 601 602 603 #[weight = <SelfWeightOf<T>>::set_collection_sponsor()]604 #[transactional]605 pub fn set_collection_sponsor(origin, collection_id: CollectionId, new_sponsor: T::AccountId) -> DispatchResult {606 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);607608 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;609 target_collection.check_is_owner(&sender)?;610611 target_collection.sponsorship = SponsorshipState::Unconfirmed(new_sponsor.clone());612613 <Pallet<T>>::deposit_event(Event::<T>::CollectionSponsorSet(614 collection_id,615 new_sponsor616 ));617618 target_collection.save()619 }620621 622 623 624 625 626 627 628 #[weight = <SelfWeightOf<T>>::confirm_sponsorship()]629 #[transactional]630 pub fn confirm_sponsorship(origin, collection_id: CollectionId) -> DispatchResult {631 let sender = ensure_signed(origin)?;632633 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;634 ensure!(635 target_collection.sponsorship.pending_sponsor() == Some(&sender),636 Error::<T>::ConfirmUnsetSponsorFail637 );638639 target_collection.sponsorship = SponsorshipState::Confirmed(sender.clone());640641 <Pallet<T>>::deposit_event(Event::<T>::SponsorshipConfirmed(642 collection_id,643 sender644 ));645646 target_collection.save()647 }648649 650 651 652 653 654 655 656 657 658 #[weight = <SelfWeightOf<T>>::remove_collection_sponsor()]659 #[transactional]660 pub fn remove_collection_sponsor(origin, collection_id: CollectionId) -> DispatchResult {661 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);662663 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;664 target_collection.check_is_owner(&sender)?;665666 target_collection.sponsorship = SponsorshipState::Disabled;667668 <Pallet<T>>::deposit_event(Event::<T>::CollectionSponsorRemoved(669 collection_id670 ));671 target_collection.save()672 }673674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 #[weight = <CommonWeights<T>>::create_item()]693 #[transactional]694 pub fn create_item(origin, collection_id: CollectionId, owner: T::CrossAccountId, data: CreateItemData) -> DispatchResultWithPostInfo {695 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);696697 dispatch_call::<T, _>(collection_id, |d| d.create_item(sender, owner, data))698 }699700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 #[weight = <CommonWeights<T>>::create_multiple_items(items_data.len() as u32)]719 #[transactional]720 pub fn create_multiple_items(origin, collection_id: CollectionId, owner: T::CrossAccountId, items_data: Vec<CreateItemData>) -> DispatchResultWithPostInfo {721 ensure!(!items_data.is_empty(), Error::<T>::EmptyArgument);722 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);723724 dispatch_call::<T, _>(collection_id, |d| d.create_multiple_items(sender, owner, items_data))725 }726727 #[weight = <CommonWeights<T>>::create_multiple_items_ex(&data)]728 #[transactional]729 pub fn create_multiple_items_ex(origin, collection_id: CollectionId, data: CreateItemExData<T::CrossAccountId>) -> DispatchResultWithPostInfo {730 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);731732 dispatch_call::<T, _>(collection_id, |d| d.create_multiple_items_ex(sender, data))733 }734735 736737 738 739 740 741 742 743 744 745 746 747 748 #[weight = <SelfWeightOf<T>>::set_transfers_enabled_flag()]749 #[transactional]750 pub fn set_transfers_enabled_flag(origin, collection_id: CollectionId, value: bool) -> DispatchResult {751 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);752 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;753 target_collection.check_is_owner(&sender)?;754755 756757 target_collection.limits.transfers_enabled = Some(value);758 target_collection.save()759 }760761 762 763 764 765 766 767 768 769 770 771 772 773 774 #[weight = <CommonWeights<T>>::burn_item()]775 #[transactional]776 pub fn burn_item(origin, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {777 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);778779 let post_info = dispatch_call::<T, _>(collection_id, |d| d.burn_item(sender, item_id, value))?;780 if value == 1 {781 <NftTransferBasket<T>>::remove(collection_id, item_id);782 <NftApproveBasket<T>>::remove(collection_id, item_id);783 }784 785 786 787 Ok(post_info)788 }789790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 #[weight = <CommonWeights<T>>::burn_from()]807 #[transactional]808 pub fn burn_from(origin, collection_id: CollectionId, from: T::CrossAccountId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {809 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);810811 dispatch_call::<T, _>(collection_id, |d| d.burn_from(sender, from, item_id, value))812 }813814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 #[weight = <CommonWeights<T>>::transfer()]838 #[transactional]839 pub fn transfer(origin, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {840 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);841842 dispatch_call::<T, _>(collection_id, |d| d.transfer(sender, recipient, item_id, value))843 }844845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 #[weight = <CommonWeights<T>>::approve()]861 #[transactional]862 pub fn approve(origin, spender: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, amount: u128) -> DispatchResultWithPostInfo {863 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);864865 dispatch_call::<T, _>(collection_id, |d| d.approve(sender, spender, item_id, amount))866 }867868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 #[weight = <CommonWeights<T>>::transfer_from()]888 #[transactional]889 pub fn transfer_from(origin, from: T::CrossAccountId, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128 ) -> DispatchResultWithPostInfo {890 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);891892 dispatch_call::<T, _>(collection_id, |d| d.transfer_from(sender, from, recipient, item_id, value))893 }894895 896 897 898 899 900 901 902 903 904 905 906 907 #[weight = <CommonWeights<T>>::set_variable_metadata(data.len() as u32)]908 #[transactional]909 pub fn set_variable_meta_data (910 origin,911 collection_id: CollectionId,912 item_id: TokenId,913 data: BoundedVec<u8, CustomDataLimit>,914 ) -> DispatchResultWithPostInfo {915 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);916917 dispatch_call::<T, _>(collection_id, |d| d.set_variable_metadata(sender, item_id, data))918 }919920 921 922 923 924 925 926 927 928 929 930 931 #[weight = <SelfWeightOf<T>>::set_meta_update_permission_flag()]932 #[transactional]933 pub fn set_meta_update_permission_flag(origin, collection_id: CollectionId, value: MetaUpdatePermission) -> DispatchResult {934 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);935 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;936937 ensure!(938 target_collection.meta_update_permission != MetaUpdatePermission::None,939 <CommonError<T>>::MetadataFlagFrozen,940 );941 target_collection.check_is_owner(&sender)?;942943 target_collection.meta_update_permission = value;944945 target_collection.save()946 }947948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 #[weight = <SelfWeightOf<T>>::set_schema_version()]963 #[transactional]964 pub fn set_schema_version(965 origin,966 collection_id: CollectionId,967 version: SchemaVersion968 ) -> DispatchResult {969 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);970 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;971 target_collection.check_is_owner_or_admin(&sender)?;972 target_collection.schema_version = version;973974 <Pallet<T>>::deposit_event(Event::<T>::SchemaVersionSet(975 collection_id976 ));977978 target_collection.save()979 }980981 982 983 984 985 986 987 988 989 990 991 992 993 #[weight = <SelfWeightOf<T>>::set_offchain_schema(schema.len() as u32)]994 #[transactional]995 pub fn set_offchain_schema(996 origin,997 collection_id: CollectionId,998 schema: BoundedVec<u8, ConstU32<OFFCHAIN_SCHEMA_LIMIT>>,999 ) -> DispatchResult {1000 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);1001 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;1002 target_collection.check_is_owner_or_admin(&sender)?;10031004 target_collection.offchain_schema = schema;10051006 <Pallet<T>>::deposit_event(Event::<T>::OffchainSchemaSet(1007 collection_id1008 ));10091010 target_collection.save()1011 }10121013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 #[weight = <SelfWeightOf<T>>::set_const_on_chain_schema(schema.len() as u32)]1026 #[transactional]1027 pub fn set_const_on_chain_schema (1028 origin,1029 collection_id: CollectionId,1030 schema: BoundedVec<u8, ConstU32<CONST_ON_CHAIN_SCHEMA_LIMIT>>1031 ) -> DispatchResult {1032 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);1033 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;1034 target_collection.check_is_owner_or_admin(&sender)?;10351036 target_collection.const_on_chain_schema = schema;10371038 <Pallet<T>>::deposit_event(Event::<T>::ConstOnChainSchemaSet(1039 collection_id1040 ));10411042 target_collection.save()1043 }10441045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 #[weight = <SelfWeightOf<T>>::set_const_on_chain_schema(schema.len() as u32)]1058 #[transactional]1059 pub fn set_variable_on_chain_schema (1060 origin,1061 collection_id: CollectionId,1062 schema: BoundedVec<u8, ConstU32<VARIABLE_ON_CHAIN_SCHEMA_LIMIT>>1063 ) -> DispatchResult {1064 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);1065 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;1066 target_collection.check_is_owner_or_admin(&sender)?;10671068 target_collection.variable_on_chain_schema = schema;10691070 <Pallet<T>>::deposit_event(Event::<T>::VariableOnChainSchemaSet(1071 collection_id1072 ));10731074 target_collection.save()1075 }10761077 #[weight = <SelfWeightOf<T>>::set_collection_limits()]1078 #[transactional]1079 pub fn set_collection_limits(1080 origin,1081 collection_id: CollectionId,1082 new_limit: CollectionLimits,1083 ) -> DispatchResult {1084 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);1085 let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;1086 target_collection.check_is_owner(&sender)?;1087 let old_limit = &target_collection.limits;10881089 target_collection.limits = <PalletCommon<T>>::clamp_limits(target_collection.mode.clone(), &old_limit, new_limit)?;10901091 <Pallet<T>>::deposit_event(Event::<T>::CollectionLimitSet(1092 collection_id1093 ));10941095 target_collection.save()1096 }1097 }1098}