difftreelog
Merge branch 'develop' into doc/scheduler
in: master
51 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5731,7 +5731,7 @@
[[package]]
name = "pallet-common"
-version = "0.1.0"
+version = "0.1.2"
dependencies = [
"ethereum",
"evm-coder",
@@ -6320,7 +6320,7 @@
[[package]]
name = "pallet-refungible"
-version = "0.1.0"
+version = "0.1.1"
dependencies = [
"frame-benchmarking",
"frame-support",
@@ -12733,7 +12733,7 @@
[[package]]
name = "up-data-structs"
-version = "0.1.0"
+version = "0.1.1"
dependencies = [
"derivative",
"frame-support",
pallets/common/CHANGELOG.MDdiffbeforeafterboth--- /dev/null
+++ b/pallets/common/CHANGELOG.MD
@@ -0,0 +1,10 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [0.1.2] - 2022-07-20
+
+### Fixed
+
+- Some methods in `#[solidity_interface]` for `CollectionHandle` had invalid
+ mutability modifiers, causing invalid stub/abi generation.
pallets/common/Cargo.tomldiffbeforeafterboth--- a/pallets/common/Cargo.toml
+++ b/pallets/common/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "pallet-common"
-version = "0.1.0"
+version = "0.1.2"
license = "GPLv3"
edition = "2021"
pallets/common/src/dispatch.rsdiffbeforeafterboth--- a/pallets/common/src/dispatch.rs
+++ b/pallets/common/src/dispatch.rs
@@ -1,3 +1,5 @@
+//! Module with interfaces for dispatching collections.
+
use frame_support::{
dispatch::{
DispatchResultWithPostInfo, PostDispatchInfo, Weight, DispatchErrorWithPostInfo,
@@ -20,7 +22,10 @@
// submit_logs is measured as part of collection pallets
}
-/// Helper function to implement substrate calls for common collection methods
+/// Helper function to implement substrate calls for common collection methods.
+///
+/// * `collection` - The collection on which to call the method.
+/// * `call` - The function in which to call the corresponding method from [`CommonCollectionOperations`].
pub fn dispatch_tx<
T: Config,
C: FnOnce(&dyn CommonCollectionOperations<T>) -> DispatchResultWithPostInfo,
@@ -64,15 +69,31 @@
result
}
+/// Interface for working with different collections through the dispatcher.
pub trait CollectionDispatch<T: Config> {
+ /// Create a collection. The collection will be created according to the value of [`data.mode`](CreateCollectionData::mode).
+ ///
+ /// * `sender` - The user who will become the owner of the collection.
+ /// * `data` - Description of the created collection.
fn create(
sender: T::CrossAccountId,
data: CreateCollectionData<T::AccountId>,
) -> DispatchResult;
+
+ /// Delete the collection.
+ ///
+ /// * `sender` - The owner of the collection.
+ /// * `handle` - Collection handle.
fn destroy(sender: T::CrossAccountId, handle: CollectionHandle<T>) -> DispatchResult;
+ /// Get a specialized collection from the handle.
+ ///
+ /// * `handle` - Collection handle.
fn dispatch(handle: CollectionHandle<T>) -> Self;
+
+ /// Get the collection handle for the corresponding implementation.
fn into_inner(self) -> CollectionHandle<T>;
+ /// Get the implementation of [`CommonCollectionOperations`].
fn as_dyn(&self) -> &dyn CommonCollectionOperations<T>;
}
pallets/common/src/erc.rsdiffbeforeafterboth--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -14,6 +14,8 @@
// You should have received a copy of the GNU General Public License
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+//! This module contains the implementation of pallet methods for evm.
+
use evm_coder::{
solidity_interface, solidity, ToLog,
types::*,
@@ -29,29 +31,40 @@
use crate::{Pallet, CollectionHandle, Config, CollectionProperties};
+/// Events for ethereum collection helper.
#[derive(ToLog)]
pub enum CollectionHelpersEvents {
+ /// The collection has been created.
CollectionCreated {
+ /// Collection owner.
#[indexed]
owner: address,
+
+ /// Collection ID.
#[indexed]
collection_id: address,
},
}
/// Does not always represent a full collection, for RFT it is either
-/// collection (Implementing ERC721), or specific collection token (Implementing ERC20)
+/// collection (Implementing ERC721), or specific collection token (Implementing ERC20).
pub trait CommonEvmHandler {
const CODE: &'static [u8];
+ /// Call precompiled handle.
fn call(self, handle: &mut impl PrecompileHandle) -> Option<PrecompileResult>;
}
+/// @title A contract that allows you to work with collections.
#[solidity_interface(name = "Collection")]
impl<T: Config> CollectionHandle<T>
where
T::AccountId: From<[u8; 32]>,
{
+ /// Set collection property.
+ ///
+ /// @param key Property key.
+ /// @param value Propery value.
fn set_collection_property(
&mut self,
caller: caller,
@@ -68,6 +81,9 @@
.map_err(dispatch_to_evm::<T>)
}
+ /// Delete collection property.
+ ///
+ /// @param key Property key.
fn delete_collection_property(&mut self, caller: caller, key: string) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let key = <Vec<u8>>::from(key)
@@ -77,7 +93,12 @@
<Pallet<T>>::delete_collection_property(self, &caller, key).map_err(dispatch_to_evm::<T>)
}
- /// Throws error if key not found
+ /// Get collection property.
+ ///
+ /// @dev Throws error if key not found.
+ ///
+ /// @param key Property key.
+ /// @return bytes The property corresponding to the key.
fn collection_property(&self, key: string) -> Result<bytes> {
let key = <Vec<u8>>::from(key)
.try_into()
@@ -89,6 +110,11 @@
Ok(prop.to_vec())
}
+ /// Set the sponsor of the collection.
+ ///
+ /// @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
+ ///
+ /// @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.
fn set_collection_sponsor(&mut self, caller: caller, sponsor: address) -> Result<void> {
check_is_owner_or_admin(caller, self)?;
@@ -98,6 +124,9 @@
save(self)
}
+ /// Collection sponsorship confirmation.
+ ///
+ /// @dev After setting the sponsor for the collection, it must be confirmed with this function.
fn confirm_collection_sponsorship(&mut self, caller: caller) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
if !self
@@ -109,6 +138,16 @@
save(self)
}
+ /// Set limits for the collection.
+ /// @dev Throws error if limit not found.
+ /// @param limit Name of the limit. Valid names:
+ /// "accountTokenOwnershipLimit",
+ /// "sponsoredDataSize",
+ /// "sponsoredDataRateLimit",
+ /// "tokenLimit",
+ /// "sponsorTransferTimeout",
+ /// "sponsorApproveTimeout"
+ /// @param value Value of the limit.
#[solidity(rename_selector = "setCollectionLimit")]
fn set_int_limit(&mut self, caller: caller, limit: string, value: uint32) -> Result<void> {
check_is_owner_or_admin(caller, self)?;
@@ -145,6 +184,13 @@
save(self)
}
+ /// Set limits for the collection.
+ /// @dev Throws error if limit not found.
+ /// @param limit Name of the limit. Valid names:
+ /// "ownerCanTransfer",
+ /// "ownerCanDestroy",
+ /// "transfersEnabled"
+ /// @param value Value of the limit.
#[solidity(rename_selector = "setCollectionLimit")]
fn set_bool_limit(&mut self, caller: caller, limit: string, value: bool) -> Result<void> {
check_is_owner_or_admin(caller, self)?;
@@ -172,11 +218,18 @@
save(self)
}
+ /// Get contract address.
fn contract_address(&self, _caller: caller) -> Result<address> {
Ok(crate::eth::collection_id_to_address(self.id))
}
- fn add_collection_admin_substrate(&self, caller: caller, new_admin: uint256) -> Result<void> {
+ /// Add collection admin by substrate address.
+ /// @param new_admin Substrate administrator address.
+ fn add_collection_admin_substrate(
+ &mut self,
+ caller: caller,
+ new_admin: uint256,
+ ) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
let mut new_admin_arr: [u8; 32] = Default::default();
new_admin.to_big_endian(&mut new_admin_arr);
@@ -186,35 +239,44 @@
Ok(())
}
+ /// Remove collection admin by substrate address.
+ /// @param admin Substrate administrator address.
fn remove_collection_admin_substrate(
- &self,
+ &mut self,
caller: caller,
- new_admin: uint256,
+ admin: uint256,
) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
- let mut new_admin_arr: [u8; 32] = Default::default();
- new_admin.to_big_endian(&mut new_admin_arr);
- let account_id = T::AccountId::from(new_admin_arr);
- let new_admin = T::CrossAccountId::from_sub(account_id);
- <Pallet<T>>::toggle_admin(self, &caller, &new_admin, false)
- .map_err(dispatch_to_evm::<T>)?;
+ let mut admin_arr: [u8; 32] = Default::default();
+ admin.to_big_endian(&mut admin_arr);
+ let account_id = T::AccountId::from(admin_arr);
+ let admin = T::CrossAccountId::from_sub(account_id);
+ <Pallet<T>>::toggle_admin(self, &caller, &admin, false).map_err(dispatch_to_evm::<T>)?;
Ok(())
}
- fn add_collection_admin(&self, caller: caller, new_admin: address) -> Result<void> {
+ /// Add collection admin.
+ /// @param new_admin Address of the added administrator.
+ fn add_collection_admin(&mut self, caller: caller, new_admin: address) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
let new_admin = T::CrossAccountId::from_eth(new_admin);
<Pallet<T>>::toggle_admin(self, &caller, &new_admin, true).map_err(dispatch_to_evm::<T>)?;
Ok(())
}
- fn remove_collection_admin(&self, caller: caller, admin: address) -> Result<void> {
+ /// Remove collection admin.
+ ///
+ /// @param new_admin Address of the removed administrator.
+ fn remove_collection_admin(&mut self, caller: caller, admin: address) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
let admin = T::CrossAccountId::from_eth(admin);
<Pallet<T>>::toggle_admin(self, &caller, &admin, false).map_err(dispatch_to_evm::<T>)?;
Ok(())
}
+ /// Toggle accessibility of collection nesting.
+ ///
+ /// @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'
#[solidity(rename_selector = "setCollectionNesting")]
fn set_nesting_bool(&mut self, caller: caller, enable: bool) -> Result<void> {
check_is_owner_or_admin(caller, self)?;
@@ -235,6 +297,10 @@
save(self)
}
+ /// Toggle accessibility of collection nesting.
+ ///
+ /// @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'
+ /// @param collections Addresses of collections that will be available for nesting.
#[solidity(rename_selector = "setCollectionNesting")]
fn set_nesting(
&mut self,
@@ -280,6 +346,10 @@
save(self)
}
+ /// Set the collection access method.
+ /// @param mode Access mode
+ /// 0 for Normal
+ /// 1 for AllowList
fn set_collection_access(&mut self, caller: caller, mode: uint8) -> Result<void> {
check_is_owner_or_admin(caller, self)?;
let permissions = CollectionPermissions {
@@ -300,20 +370,29 @@
save(self)
}
- fn add_to_collection_allow_list(&self, caller: caller, user: address) -> Result<void> {
+ /// Add the user to the allowed list.
+ ///
+ /// @param user Address of a trusted user.
+ fn add_to_collection_allow_list(&mut self, caller: caller, user: address) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
let user = T::CrossAccountId::from_eth(user);
<Pallet<T>>::toggle_allowlist(self, &caller, &user, true).map_err(dispatch_to_evm::<T>)?;
Ok(())
}
- fn remove_from_collection_allow_list(&self, caller: caller, user: address) -> Result<void> {
+ /// Remove the user from the allowed list.
+ ///
+ /// @param user Address of a removed user.
+ fn remove_from_collection_allow_list(&mut self, caller: caller, user: address) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
let user = T::CrossAccountId::from_eth(user);
<Pallet<T>>::toggle_allowlist(self, &caller, &user, false).map_err(dispatch_to_evm::<T>)?;
Ok(())
}
+ /// Switch permission for minting.
+ ///
+ /// @param mode Enable if "true".
fn set_collection_mint_mode(&mut self, caller: caller, mode: bool) -> Result<void> {
check_is_owner_or_admin(caller, self)?;
let permissions = CollectionPermissions {
@@ -351,6 +430,7 @@
Ok(())
}
+/// Get the "tokenURI" key as [PropertyKey](up_data_structs::PropertyKey).
pub fn token_uri_key() -> up_data_structs::PropertyKey {
b"tokenURI"
.to_vec()
pallets/common/src/eth.rsdiffbeforeafterboth--- a/pallets/common/src/eth.rs
+++ b/pallets/common/src/eth.rs
@@ -14,6 +14,8 @@
// You should have received a copy of the GNU General Public License
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+//! The module contains a number of functions for converting and checking ethereum identifiers.
+
use up_data_structs::CollectionId;
use sp_core::H160;
@@ -23,6 +25,7 @@
0x17, 0xc4, 0xe6, 0x45, 0x3c, 0xc4, 0x9a, 0xaa, 0xae, 0xac, 0xa8, 0x94, 0xe6, 0xd9, 0x68, 0x3e,
];
+/// Maps the ethereum address of the collection in substrate.
pub fn map_eth_to_id(eth: &H160) -> Option<CollectionId> {
if eth[0..16] != ETH_COLLECTION_PREFIX {
return None;
@@ -31,6 +34,8 @@
id_bytes.copy_from_slice(ð[16..20]);
Some(CollectionId(u32::from_be_bytes(id_bytes)))
}
+
+/// Maps the substrate collection id in ethereum.
pub fn collection_id_to_address(id: CollectionId) -> H160 {
let mut out = [0; 20];
out[0..16].copy_from_slice(Ð_COLLECTION_PREFIX);
@@ -38,6 +43,7 @@
H160(out)
}
+/// Check if the ethereum address is a collection.
pub fn is_collection(address: &H160) -> bool {
address[0..16] == ETH_COLLECTION_PREFIX
}
pallets/common/src/lib.rsdiffbeforeafterboth--- a/pallets/common/src/lib.rs
+++ b/pallets/common/src/lib.rs
@@ -14,8 +14,43 @@
// You should have received a copy of the GNU General Public License
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
-#![cfg_attr(not(feature = "std"), no_std)]
+//! # Common pallet
+//!
+//! The Common pallet provides functionality for handling collections.
+//!
+//! ## Overview
+//!
+//! The Common pallet provides an interface for common collection operations for different collection types
+//! (see [CommonCollectionOperations]), as well as a generic dispatcher for these, see [dispatch] module.
+//! It also provides this functionality to EVM, see [erc] and [eth] modules.
+//!
+//! The Common pallet provides functions for:
+//!
+//! - Setting and approving collection sponsor.
+//! - Get\set\delete allow list.
+//! - Get\set\delete collection properties.
+//! - Get\set\delete collection property permissions.
+//! - Get\set\delete token property permissions.
+//! - Get\set\delete collection administrators.
+//! - Checking access permissions.
+//!
+//! ### Terminology
+//! **Collection sponsor** - For the collection, you can set a sponsor, at whose expense it will
+//! be possible to mint tokens.
+//!
+//! **Allow list** - List of users who have the right to minting tokens.
+//!
+//! **Collection properties** - Collection properties are simply key-value stores where various
+//! metadata can be placed.
+//!
+//! **Permissions on token properties** - For each property in the token can be set permission
+//! to change, see [`PropertyPermission`].
+//!
+//! **Collection administrator** - For a collection, you can set administrators who have the right
+//! to most actions on the collection.
+#![warn(missing_docs)]
+#![cfg_attr(not(feature = "std"), no_std)]
extern crate alloc;
use core::ops::{Deref, DerefMut};
@@ -90,14 +125,24 @@
pub mod eth;
pub mod weights;
+/// Weight info.
pub type SelfWeightOf<T> = <T as Config>::WeightInfo;
+/// Collection handle contains information about collection data and id.
+/// Also provides functionality to count consumed gas.
+///
+/// CollectionHandle is used as a generic wrapper for collections of all types.
+/// It allows to perform common operations and queries on any collection type,
+/// both completely general for all, as well as their respective implementations of [`CommonCollectionOperations`].
#[must_use = "Should call submit_logs or save, otherwise some data will be lost for evm side"]
pub struct CollectionHandle<T: Config> {
+ /// Collection id
pub id: CollectionId,
collection: Collection<T::AccountId>,
+ /// Substrate recorder for counting consumed gas
pub recorder: SubstrateRecorder<T>,
}
+
impl<T: Config> WithRecorder<T> for CollectionHandle<T> {
fn recorder(&self) -> &SubstrateRecorder<T> {
&self.recorder
@@ -106,7 +151,9 @@
self.recorder
}
}
+
impl<T: Config> CollectionHandle<T> {
+ /// Same as [CollectionHandle::new] but with an explicit gas limit.
pub fn new_with_gas_limit(id: CollectionId, gas_limit: u64) -> Option<Self> {
<CollectionById<T>>::get(id).map(|collection| Self {
id,
@@ -115,6 +162,7 @@
})
}
+ /// Same as [CollectionHandle::new] but with an existed [`SubstrateRecorder`].
pub fn new_with_recorder(id: CollectionId, recorder: SubstrateRecorder<T>) -> Option<Self> {
<CollectionById<T>>::get(id).map(|collection| Self {
id,
@@ -123,14 +171,18 @@
})
}
+ /// Retrives collection data from storage and creates collection handle with default parameters.
+ /// If collection not found return `None`
pub fn new(id: CollectionId) -> Option<Self> {
Self::new_with_gas_limit(id, u64::MAX)
}
+ /// Same as [`CollectionHandle::new`] but if collection not found [CollectionNotFound](Error::CollectionNotFound) returned.
pub fn try_get(id: CollectionId) -> Result<Self, DispatchError> {
Ok(Self::new(id).ok_or(<Error<T>>::CollectionNotFound)?)
}
+ /// Consume gas for reading.
pub fn consume_store_reads(&self, reads: u64) -> evm_coder::execution::Result<()> {
self.recorder
.consume_gas(T::GasWeightMapping::weight_to_gas(
@@ -140,6 +192,7 @@
))
}
+ /// Consume gas for writing.
pub fn consume_store_writes(&self, writes: u64) -> evm_coder::execution::Result<()> {
self.recorder
.consume_gas(T::GasWeightMapping::weight_to_gas(
@@ -148,16 +201,27 @@
.saturating_mul(writes),
))
}
+
+ /// Save collection to storage.
pub fn save(self) -> DispatchResult {
<CollectionById<T>>::insert(self.id, self.collection);
Ok(())
}
+ /// Set collection sponsor.
+ ///
+ /// Unique collections allows sponsoring for certain actions.
+ /// This method allows you to set the sponsor of the collection.
+ /// In order for sponsorship to become active, it must be confirmed through [`Self::confirm_sponsorship`].
pub fn set_sponsor(&mut self, sponsor: T::AccountId) -> DispatchResult {
self.collection.sponsorship = SponsorshipState::Unconfirmed(sponsor);
Ok(())
}
+ /// Confirm sponsorship
+ ///
+ /// In order for the sponsorship to become active, the user set as the sponsor must confirm their participation.
+ /// Before confirming sponsorship, the user must be specified as the sponsor of the collection via [`Self::set_sponsor`].
pub fn confirm_sponsorship(&mut self, sender: &T::AccountId) -> Result<bool, DispatchError> {
if self.collection.sponsorship.pending_sponsor() != Some(sender) {
return Ok(false);
@@ -168,7 +232,7 @@
}
/// Checks that the collection was created with, and must be operated upon through **Unique API**.
- /// Now check only the `external_collection` flag and if it's **true**, then return `CollectionIsExternal` error.
+ /// Now check only the `external_collection` flag and if it's **true**, then return [`Error::CollectionIsExternal`] error.
pub fn check_is_internal(&self) -> DispatchResult {
if self.external_collection {
return Err(<Error<T>>::CollectionIsExternal)?;
@@ -178,7 +242,7 @@
}
/// Checks that the collection was created with, and must be operated upon through an **assimilated API**.
- /// Now check only the `external_collection` flag and if it's **false**, then return `CollectionIsInternal` error.
+ /// Now check only the `external_collection` flag and if it's **false**, then return [`Error::CollectionIsInternal`] error.
pub fn check_is_external(&self) -> DispatchResult {
if !self.external_collection {
return Err(<Error<T>>::CollectionIsInternal)?;
@@ -203,23 +267,34 @@
}
impl<T: Config> CollectionHandle<T> {
- pub fn check_is_owner(&self, subject: &T::CrossAccountId) -> DispatchResult {
- ensure!(*subject.as_sub() == self.owner, <Error<T>>::NoPermission);
+ /// Checks if the `user` is the owner of the collection.
+ pub fn check_is_owner(&self, user: &T::CrossAccountId) -> DispatchResult {
+ ensure!(*user.as_sub() == self.owner, <Error<T>>::NoPermission);
Ok(())
}
- pub fn is_owner_or_admin(&self, subject: &T::CrossAccountId) -> bool {
- *subject.as_sub() == self.owner || <IsAdmin<T>>::get((self.id, subject))
+
+ /// Returns **true** if the `user` is the owner or administrator of the collection.
+ pub fn is_owner_or_admin(&self, user: &T::CrossAccountId) -> bool {
+ *user.as_sub() == self.owner || <IsAdmin<T>>::get((self.id, user))
}
- pub fn check_is_owner_or_admin(&self, subject: &T::CrossAccountId) -> DispatchResult {
- ensure!(self.is_owner_or_admin(subject), <Error<T>>::NoPermission);
+
+ /// Checks if the `user` is the owner or administrator of the collection.
+ pub fn check_is_owner_or_admin(&self, user: &T::CrossAccountId) -> DispatchResult {
+ ensure!(self.is_owner_or_admin(user), <Error<T>>::NoPermission);
Ok(())
}
+
+ /// Return **true** if `user` was not allowed to have tokens, and he can ignore such restrictions.
pub fn ignores_allowance(&self, user: &T::CrossAccountId) -> bool {
self.limits.owner_can_transfer() && self.is_owner_or_admin(user)
}
+
+ /// Return **true** if `user` does not have enough token parts, and he can ignore such restrictions.
pub fn ignores_owned_amount(&self, user: &T::CrossAccountId) -> bool {
self.limits.owner_can_transfer() && self.is_owner_or_admin(user)
}
+
+ /// Checks if the user is in the allow list. If not [Error::AddressNotInAllowlist] returns.
pub fn check_allowlist(&self, user: &T::CrossAccountId) -> DispatchResult {
ensure!(
<Allowlist<T>>::get((self.id, user)),
@@ -249,21 +324,34 @@
+ TypeInfo
+ account::Config
{
+ /// Weight information for functions of this pallet.
type WeightInfo: WeightInfo;
+
+ /// Events compatible with [`frame_system::Config::Event`].
type Event: IsType<<Self as frame_system::Config>::Event> + From<Event<Self>>;
+ /// Handler of accounts and payment.
type Currency: Currency<Self::AccountId>;
+ /// Set price to create a collection.
#[pallet::constant]
type CollectionCreationPrice: Get<
<<Self as Config>::Currency as Currency<Self::AccountId>>::Balance,
>;
+
+ /// Dispatcher of operations on collections.
type CollectionDispatch: CollectionDispatch<Self>;
+ /// Account which holds the chain's treasury.
type TreasuryAccountId: Get<Self::AccountId>;
+
+ /// Address under which the CollectionHelper contract would be available.
type ContractAddress: Get<H160>;
+ /// Mapper for token addresses to Ethereum addresses.
type EvmTokenAddressMapping: TokenAddressMapping<H160>;
+
+ /// Mapper for token addresses to [`CrossAccountId`].
type CrossTokenAddressMapping: TokenAddressMapping<Self::CrossAccountId>;
}
@@ -276,6 +364,7 @@
#[pallet::extra_constants]
impl<T: Config> Pallet<T> {
+ /// Maximum admins per collection.
pub fn collection_admins_limit() -> u32 {
COLLECTION_ADMINS_LIMIT
}
@@ -285,94 +374,116 @@
#[pallet::generate_deposit(pub fn deposit_event)]
pub enum Event<T: Config> {
/// New collection was created
- ///
- /// # Arguments
- ///
- /// * collection_id: Globally unique identifier of newly created collection.
- ///
- /// * mode: [CollectionMode] converted into u8.
- ///
- /// * account_id: Collection owner.
- CollectionCreated(CollectionId, u8, T::AccountId),
+ CollectionCreated(
+ /// Globally unique identifier of newly created collection.
+ CollectionId,
+ /// [`CollectionMode`] converted into _u8_.
+ u8,
+ /// Collection owner.
+ T::AccountId,
+ ),
/// New collection was destroyed
- ///
- /// # Arguments
- ///
- /// * collection_id: Globally unique identifier of collection.
- CollectionDestroyed(CollectionId),
+ CollectionDestroyed(
+ /// Globally unique identifier of collection.
+ CollectionId,
+ ),
/// New item was created.
- ///
- /// # Arguments
- ///
- /// * collection_id: Id of the collection where item was created.
- ///
- /// * item_id: Id of an item. Unique within the collection.
- ///
- /// * recipient: Owner of newly created item
- ///
- /// * amount: Always 1 for NFT
- ItemCreated(CollectionId, TokenId, T::CrossAccountId, u128),
+ ItemCreated(
+ /// Id of the collection where item was created.
+ CollectionId,
+ /// Id of an item. Unique within the collection.
+ TokenId,
+ /// Owner of newly created item
+ T::CrossAccountId,
+ /// Always 1 for NFT
+ u128,
+ ),
/// Collection item was burned.
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * item_id: Identifier of burned NFT.
- ///
- /// * owner: which user has destroyed its tokens
- ///
- /// * amount: Always 1 for NFT
- ItemDestroyed(CollectionId, TokenId, T::CrossAccountId, u128),
+ ItemDestroyed(
+ /// Id of the collection where item was destroyed.
+ CollectionId,
+ /// Identifier of burned NFT.
+ TokenId,
+ /// Which user has destroyed its tokens.
+ T::CrossAccountId,
+ /// Amount of token pieces destroed. Always 1 for NFT.
+ u128,
+ ),
/// Item was transferred
- ///
- /// * collection_id: Id of collection to which item is belong
- ///
- /// * item_id: Id of an item
- ///
- /// * sender: Original owner of item
- ///
- /// * recipient: New owner of item
- ///
- /// * amount: Always 1 for NFT
Transfer(
+ /// Id of collection to which item is belong.
CollectionId,
+ /// Id of an item.
TokenId,
+ /// Original owner of item.
T::CrossAccountId,
+ /// New owner of item.
T::CrossAccountId,
+ /// Amount of token pieces transfered. Always 1 for NFT.
u128,
),
- /// * collection_id
- ///
- /// * item_id
- ///
- /// * sender
- ///
- /// * spender
- ///
- /// * amount
+ /// Amount pieces of token owned by `sender` was approved for `spender`.
Approved(
+ /// Id of collection to which item is belong.
CollectionId,
+ /// Id of an item.
TokenId,
+ /// Original owner of item.
T::CrossAccountId,
+ /// Id for which the approval was granted.
T::CrossAccountId,
+ /// Amount of token pieces transfered. Always 1 for NFT.
u128,
),
- CollectionPropertySet(CollectionId, PropertyKey),
+ /// The colletion property has been set.
+ CollectionPropertySet(
+ /// Id of collection to which property has been set.
+ CollectionId,
+ /// The property that was set.
+ PropertyKey,
+ ),
- CollectionPropertyDeleted(CollectionId, PropertyKey),
+ /// The property has been deleted.
+ CollectionPropertyDeleted(
+ /// Id of collection to which property has been deleted.
+ CollectionId,
+ /// The property that was deleted.
+ PropertyKey,
+ ),
- TokenPropertySet(CollectionId, TokenId, PropertyKey),
+ /// The token property has been set.
+ TokenPropertySet(
+ /// Identifier of the collection whose token has the property set.
+ CollectionId,
+ /// The token for which the property was set.
+ TokenId,
+ /// The property that was set.
+ PropertyKey,
+ ),
- TokenPropertyDeleted(CollectionId, TokenId, PropertyKey),
+ /// The token property has been deleted.
+ TokenPropertyDeleted(
+ /// Identifier of the collection whose token has the property deleted.
+ CollectionId,
+ /// The token for which the property was deleted.
+ TokenId,
+ /// The property that was deleted.
+ PropertyKey,
+ ),
- PropertyPermissionSet(CollectionId, PropertyKey),
+ /// The colletion property permission has been set.
+ PropertyPermissionSet(
+ /// Id of collection to which property permission has been set.
+ CollectionId,
+ /// The property permission that was set.
+ PropertyKey,
+ ),
}
#[pallet::error]
@@ -460,13 +571,16 @@
CollectionIsInternal,
}
+ /// Storage of the count of created collections.
#[pallet::storage]
pub type CreatedCollectionCount<T> = StorageValue<Value = CollectionId, QueryKind = ValueQuery>;
+
+ /// Storage of the count of deleted collections.
#[pallet::storage]
pub type DestroyedCollectionCount<T> =
StorageValue<Value = CollectionId, QueryKind = ValueQuery>;
- /// Collection info
+ /// Storage of collection info.
#[pallet::storage]
pub type CollectionById<T> = StorageMap<
Hasher = Blake2_128Concat,
@@ -475,7 +589,7 @@
QueryKind = OptionQuery,
>;
- /// Collection properties
+ /// Storage of collection properties.
#[pallet::storage]
#[pallet::getter(fn collection_properties)]
pub type CollectionProperties<T> = StorageMap<
@@ -486,6 +600,7 @@
OnEmpty = up_data_structs::CollectionProperties,
>;
+ /// Storage of collection properties permissions.
#[pallet::storage]
#[pallet::getter(fn property_permissions)]
pub type CollectionPropertyPermissions<T> = StorageMap<
@@ -495,6 +610,7 @@
QueryKind = ValueQuery,
>;
+ /// Storage of collection admins count.
#[pallet::storage]
pub type AdminAmount<T> = StorageMap<
Hasher = Blake2_128Concat,
@@ -525,7 +641,7 @@
QueryKind = ValueQuery,
>;
- /// Not used by code, exists only to provide some types to metadata
+ /// Not used by code, exists only to provide some types to metadata.
#[pallet::storage]
pub type DummyStorageValue<T: Config> = StorageValue<
Value = (
@@ -619,7 +735,9 @@
}
impl<T: Config> Pallet<T> {
- /// Ethereum receiver 0x0000000000000000000000000000000000000000 is reserved, and shouldn't own tokens
+ /// Enshure that receiver address is correct.
+ ///
+ /// Ethereum receiver 0x0000000000000000000000000000000000000000 is reserved, and shouldn't own tokens.
pub fn ensure_correct_receiver(receiver: &T::CrossAccountId) -> DispatchResult {
ensure!(
&T::CrossAccountId::from_eth(H160([0; 20])) != receiver,
@@ -627,19 +745,27 @@
);
Ok(())
}
+
+ /// Get a vector of collection admins.
pub fn adminlist(collection: CollectionId) -> Vec<T::CrossAccountId> {
<IsAdmin<T>>::iter_prefix((collection,))
.map(|(a, _)| a)
.collect()
}
+
+ /// Get a vector of users allowed to mint tokens.
pub fn allowlist(collection: CollectionId) -> Vec<T::CrossAccountId> {
<Allowlist<T>>::iter_prefix((collection,))
.map(|(a, _)| a)
.collect()
}
+
+ /// Is `user` allowed to mint token in `collection`.
pub fn allowed(collection: CollectionId, user: T::CrossAccountId) -> bool {
<Allowlist<T>>::get((collection, user))
}
+
+ /// Get statistics of collections.
pub fn collection_stats() -> CollectionStats {
let created = <CreatedCollectionCount<T>>::get();
let destroyed = <DestroyedCollectionCount<T>>::get();
@@ -650,6 +776,7 @@
}
}
+ /// Get the effective limits for the collection.
pub fn effective_collection_limits(collection: CollectionId) -> Option<CollectionLimits> {
let collection = <CollectionById<T>>::get(collection);
if collection.is_none() {
@@ -683,6 +810,7 @@
Some(effective_limits)
}
+ /// Returns information about the `collection` adapted for rpc.
pub fn rpc_collection(collection: CollectionId) -> Option<RpcCollection<T::AccountId>> {
let Collection {
name,
@@ -758,6 +886,11 @@
}
impl<T: Config> Pallet<T> {
+ /// Create new collection.
+ ///
+ /// * `owner` - The owner of the collection.
+ /// * `data` - Description of the created collection.
+ /// * `is_external` - Marks that collection managet by not "Unique network".
pub fn init_collection(
owner: T::CrossAccountId,
data: CreateCollectionData<T::AccountId>,
@@ -833,7 +966,7 @@
),
);
<T as Config>::Currency::settle(
- &owner.as_sub(),
+ owner.as_sub(),
imbalance,
WithdrawReasons::TRANSFER,
ExistenceRequirement::KeepAlive,
@@ -858,6 +991,10 @@
Ok(id)
}
+ /// Destroy collection.
+ ///
+ /// * `collection` - Collection handler.
+ /// * `sender` - The owner or administrator of the collection.
pub fn destroy_collection(
collection: CollectionHandle<T>,
sender: &T::CrossAccountId,
@@ -886,6 +1023,11 @@
Ok(())
}
+ /// Set collection property.
+ ///
+ /// * `collection` - Collection handler.
+ /// * `sender` - The owner or administrator of the collection.
+ /// * `property` - The property to set.
pub fn set_collection_property(
collection: &CollectionHandle<T>,
sender: &T::CrossAccountId,
@@ -904,6 +1046,11 @@
Ok(())
}
+ /// Set scouped collection property.
+ ///
+ /// * `collection_id` - ID of the collection for which the property is being set.
+ /// * `scope` - Property scope.
+ /// * `property` - The property to set.
pub fn set_scoped_collection_property(
collection_id: CollectionId,
scope: PropertyScope,
@@ -917,6 +1064,11 @@
Ok(())
}
+ /// Set scouped collection properties.
+ ///
+ /// * `collection_id` - ID of the collection for which the properties is being set.
+ /// * `scope` - Property scope.
+ /// * `properties` - The properties to set.
pub fn set_scoped_collection_properties(
collection_id: CollectionId,
scope: PropertyScope,
@@ -930,6 +1082,11 @@
Ok(())
}
+ /// Set collection properties.
+ ///
+ /// * `collection` - Collection handler.
+ /// * `sender` - The owner or administrator of the collection.
+ /// * `properties` - The properties to set.
#[transactional]
pub fn set_collection_properties(
collection: &CollectionHandle<T>,
@@ -943,6 +1100,11 @@
Ok(())
}
+ /// Delete collection property.
+ ///
+ /// * `collection` - Collection handler.
+ /// * `sender` - The owner or administrator of the collection.
+ /// * `property` - The property to delete.
pub fn delete_collection_property(
collection: &CollectionHandle<T>,
sender: &T::CrossAccountId,
@@ -963,6 +1125,11 @@
Ok(())
}
+ /// Delete collection properties.
+ ///
+ /// * `collection` - Collection handler.
+ /// * `sender` - The owner or administrator of the collection.
+ /// * `properties` - The properties to delete.
#[transactional]
pub fn delete_collection_properties(
collection: &CollectionHandle<T>,
@@ -976,7 +1143,12 @@
Ok(())
}
- // For migrations
+ /// Set collection propetry permission without any checks.
+ ///
+ /// Used for migrations.
+ ///
+ /// * `collection` - Collection handler.
+ /// * `property_permissions` - Property permissions.
pub fn set_property_permission_unchecked(
collection: CollectionId,
property_permission: PropertyKeyPermission,
@@ -988,6 +1160,11 @@
Ok(())
}
+ /// Set collection property permission.
+ ///
+ /// * `collection` - Collection handler.
+ /// * `sender` - The owner or administrator of the collection.
+ /// * `property_permission` - Property permission.
pub fn set_property_permission(
collection: &CollectionHandle<T>,
sender: &T::CrossAccountId,
@@ -1018,6 +1195,11 @@
Ok(())
}
+ /// Set token property permission.
+ ///
+ /// * `collection` - Collection handler.
+ /// * `sender` - The owner or administrator of the collection.
+ /// * `property_permissions` - Property permissions.
#[transactional]
pub fn set_token_property_permissions(
collection: &CollectionHandle<T>,
@@ -1031,6 +1213,7 @@
Ok(())
}
+ /// Get collection property.
pub fn get_collection_property(
collection_id: CollectionId,
key: &PropertyKey,
@@ -1038,6 +1221,7 @@
Self::collection_properties(collection_id).get(key).cloned()
}
+ /// Convert byte vector to property key vector.
pub fn bytes_keys_to_property_keys(
keys: Vec<Vec<u8>>,
) -> Result<Vec<PropertyKey>, DispatchError> {
@@ -1049,6 +1233,7 @@
.collect::<Result<Vec<PropertyKey>, DispatchError>>()
}
+ /// Get properties according to given keys.
pub fn filter_collection_properties(
collection_id: CollectionId,
keys: Option<Vec<PropertyKey>>,
@@ -1076,6 +1261,7 @@
Ok(properties)
}
+ /// Get property permissions according to given keys.
pub fn filter_property_permissions(
collection_id: CollectionId,
keys: Option<Vec<PropertyKey>>,
@@ -1105,6 +1291,7 @@
Ok(key_permissions)
}
+ /// Toggle `user` participation in the `collection`'s allow list.
pub fn toggle_allowlist(
collection: &CollectionHandle<T>,
sender: &T::CrossAccountId,
@@ -1124,6 +1311,7 @@
Ok(())
}
+ /// Toggle `user` participation in the `collection`'s admin list.
pub fn toggle_admin(
collection: &CollectionHandle<T>,
sender: &T::CrossAccountId,
@@ -1159,6 +1347,7 @@
Ok(())
}
+ /// Merge set fields from `new_limit` to `old_limit`.
pub fn clamp_limits(
mode: CollectionMode,
old_limit: &CollectionLimits,
@@ -1204,20 +1393,22 @@
Ok(new_limit)
}
+ /// Merge set fields from `new_permission` to `old_permission`.
pub fn clamp_permissions(
_mode: CollectionMode,
- old_limit: &CollectionPermissions,
- mut new_limit: CollectionPermissions,
+ old_permission: &CollectionPermissions,
+ mut new_permission: CollectionPermissions,
) -> Result<CollectionPermissions, DispatchError> {
- limit_default_clone!(old_limit, new_limit,
+ limit_default_clone!(old_permission, new_permission,
access => {},
mint_mode => {},
nesting => { /* todo check for permissive, if only it gets out of benchmarks */ },
);
- Ok(new_limit)
+ Ok(new_permission)
}
}
+/// Indicates unsupported methods by returning [Error::UnsupportedOperation].
#[macro_export]
macro_rules! unsupported {
() => {
@@ -1225,32 +1416,72 @@
};
}
-/// Worst cases
+/// Return weights for various worst-case operations.
pub trait CommonWeightInfo<CrossAccountId> {
+ /// Weight of item creation.
fn create_item() -> Weight;
+
+ /// Weight of items creation.
fn create_multiple_items(amount: &[CreateItemData]) -> Weight;
+
+ /// Weight of items creation.
fn create_multiple_items_ex(cost: &CreateItemExData<CrossAccountId>) -> Weight;
+
+ /// The weight of the burning item.
fn burn_item() -> Weight;
+
+ /// Property setting weight.
+ ///
+ /// * `amount`- The number of properties to set.
fn set_collection_properties(amount: u32) -> Weight;
+
+ /// Collection property deletion weight.
+ ///
+ /// * `amount`- The number of properties to set.
fn delete_collection_properties(amount: u32) -> Weight;
+
+ /// Token property setting weight.
+ ///
+ /// * `amount`- The number of properties to set.
fn set_token_properties(amount: u32) -> Weight;
+
+ /// Token property deletion weight.
+ ///
+ /// * `amount`- The number of properties to delete.
fn delete_token_properties(amount: u32) -> Weight;
+
+ /// Token property permissions set weight.
+ ///
+ /// * `amount`- The number of property permissions to set.
fn set_token_property_permissions(amount: u32) -> Weight;
+
+ /// Transfer price of the token or its parts.
fn transfer() -> Weight;
+
+ /// The price of setting the permission of the operation from another user.
fn approve() -> Weight;
+
+ /// Transfer price from another user.
fn transfer_from() -> Weight;
+
+ /// The price of burning a token from another user.
fn burn_from() -> Weight;
/// Differs from burn_item in case of Fungible and Refungible, as it should burn
- /// whole users's balance
+ /// whole users's balance.
///
- /// This method shouldn't be used directly, as it doesn't count breadth price, use `burn_recursively` instead
+ /// This method shouldn't be used directly, as it doesn't count breadth price, use [burn_recursively](CommonWeightInfo::burn_recursively) instead
fn burn_recursively_self_raw() -> Weight;
- /// Cost of iterating over `amount` children while burning, without counting child burning itself
+
+ /// Cost of iterating over `amount` children while burning, without counting child burning itself.
///
- /// This method shouldn't be used directly, as it doesn't count depth price, use `burn_recursively` instead
+ /// This method shouldn't be used directly, as it doesn't count depth price, use [burn_recursively](CommonWeightInfo::burn_recursively) instead
fn burn_recursively_breadth_raw(amount: u32) -> Weight;
+ /// The price of recursive burning a token.
+ ///
+ /// `max_selfs` - The maximum burning weight of the token itself.
+ /// `max_breadth` - The maximum number of nested tokens to burn.
fn burn_recursively(max_selfs: u32, max_breadth: u32) -> Weight {
Self::burn_recursively_self_raw()
.saturating_mul(max_selfs.max(1) as u64)
@@ -1258,11 +1489,23 @@
}
}
+/// Weight info extension trait for refungible pallet.
pub trait RefungibleExtensionsWeightInfo {
+ /// Weight of token repartition.
fn repartition() -> Weight;
}
+/// Common collection operations.
+///
+/// It wraps methods in Fungible, Nonfungible and Refungible pallets
+/// and adds weight info.
pub trait CommonCollectionOperations<T: Config> {
+ /// Create token.
+ ///
+ /// * `sender` - The user who mint the token and pays for the transaction.
+ /// * `to` - The user who will own the token.
+ /// * `data` - Token data.
+ /// * `nesting_budget` - A budget that can be spent on nesting tokens.
fn create_item(
&self,
sender: T::CrossAccountId,
@@ -1270,6 +1513,13 @@
data: CreateItemData,
nesting_budget: &dyn Budget,
) -> DispatchResultWithPostInfo;
+
+ /// Create multiple tokens.
+ ///
+ /// * `sender` - The user who mint the token and pays for the transaction.
+ /// * `to` - The user who will own the token.
+ /// * `data` - Token data.
+ /// * `nesting_budget` - A budget that can be spent on nesting tokens.
fn create_multiple_items(
&self,
sender: T::CrossAccountId,
@@ -1277,18 +1527,38 @@
data: Vec<CreateItemData>,
nesting_budget: &dyn Budget,
) -> DispatchResultWithPostInfo;
+
+ /// Create multiple tokens.
+ ///
+ /// * `sender` - The user who mint the token and pays for the transaction.
+ /// * `to` - The user who will own the token.
+ /// * `data` - Token data.
+ /// * `nesting_budget` - A budget that can be spent on nesting tokens.
fn create_multiple_items_ex(
&self,
sender: T::CrossAccountId,
data: CreateItemExData<T::CrossAccountId>,
nesting_budget: &dyn Budget,
) -> DispatchResultWithPostInfo;
+
+ /// Burn token.
+ ///
+ /// * `sender` - The user who owns the token.
+ /// * `token` - Token id that will burned.
+ /// * `amount` - The number of parts of the token that will be burned.
fn burn_item(
&self,
sender: T::CrossAccountId,
token: TokenId,
amount: u128,
) -> DispatchResultWithPostInfo;
+
+ /// Burn token and all nested tokens recursievly.
+ ///
+ /// * `sender` - The user who owns the token.
+ /// * `token` - Token id that will burned.
+ /// * `self_budget` - The budget that can be spent on burning tokens.
+ /// * `breadth_budget` - The budget that can be spent on burning nested tokens.
fn burn_item_recursively(
&self,
sender: T::CrossAccountId,
@@ -1296,43 +1566,95 @@
self_budget: &dyn Budget,
breadth_budget: &dyn Budget,
) -> DispatchResultWithPostInfo;
+
+ /// Set collection properties.
+ ///
+ /// * `sender` - Must be either the owner of the collection or its admin.
+ /// * `properties` - Properties to be set.
fn set_collection_properties(
&self,
sender: T::CrossAccountId,
properties: Vec<Property>,
) -> DispatchResultWithPostInfo;
+
+ /// Delete collection properties.
+ ///
+ /// * `sender` - Must be either the owner of the collection or its admin.
+ /// * `properties` - The properties to be removed.
fn delete_collection_properties(
&self,
sender: &T::CrossAccountId,
property_keys: Vec<PropertyKey>,
) -> DispatchResultWithPostInfo;
+
+ /// Set token properties.
+ ///
+ /// The appropriate [`PropertyPermission`] for the token property
+ /// must be set with [`Self::set_token_property_permissions`].
+ ///
+ /// * `sender` - Must be either the owner of the token or its admin.
+ /// * `token_id` - The token for which the properties are being set.
+ /// * `properties` - Properties to be set.
+ /// * `budget` - Budget for setting properties.
fn set_token_properties(
&self,
sender: T::CrossAccountId,
token_id: TokenId,
- property: Vec<Property>,
- nesting_budget: &dyn Budget,
+ properties: Vec<Property>,
+ budget: &dyn Budget,
) -> DispatchResultWithPostInfo;
+
+ /// Remove token properties.
+ ///
+ /// The appropriate [`PropertyPermission`] for the token property
+ /// must be set with [`Self::set_token_property_permissions`].
+ ///
+ /// * `sender` - Must be either the owner of the token or its admin.
+ /// * `token_id` - The token for which the properties are being remove.
+ /// * `property_keys` - Keys to remove corresponding properties.
+ /// * `budget` - Budget for removing properties.
fn delete_token_properties(
&self,
sender: T::CrossAccountId,
token_id: TokenId,
property_keys: Vec<PropertyKey>,
- nesting_budget: &dyn Budget,
+ budget: &dyn Budget,
) -> DispatchResultWithPostInfo;
+
+ /// Set token property permissions.
+ ///
+ /// * `sender` - Must be either the owner of the token or its admin.
+ /// * `token_id` - The token for which the properties are being set.
+ /// * `properties` - Properties to be set.
+ /// * `budget` - Budget for setting properties.
fn set_token_property_permissions(
&self,
sender: &T::CrossAccountId,
property_permissions: Vec<PropertyKeyPermission>,
) -> DispatchResultWithPostInfo;
+
+ /// Transfer amount of token pieces.
+ ///
+ /// * `sender` - Donor user.
+ /// * `to` - Recepient user.
+ /// * `token` - The token of which parts are being sent.
+ /// * `amount` - The number of parts of the token that will be transferred.
+ /// * `budget` - The maximum budget that can be spent on the transfer.
fn transfer(
&self,
sender: T::CrossAccountId,
to: T::CrossAccountId,
token: TokenId,
amount: u128,
- nesting_budget: &dyn Budget,
+ budget: &dyn Budget,
) -> DispatchResultWithPostInfo;
+
+ /// Grant access to another account to transfer parts of the token owned by the calling user via [Self::transfer_from].
+ ///
+ /// * `sender` - The user who grants access to the token.
+ /// * `spender` - The user to whom the rights are granted.
+ /// * `token` - The token to which access is granted.
+ /// * `amount` - The amount of pieces that another user can dispose of.
fn approve(
&self,
sender: T::CrossAccountId,
@@ -1340,6 +1662,17 @@
token: TokenId,
amount: u128,
) -> DispatchResultWithPostInfo;
+
+ /// Send parts of a token owned by another user.
+ ///
+ /// Before calling this method, you must grant rights to the calling user via [`Self::approve`].
+ ///
+ /// * `sender` - The user who must have access to the token (see [`Self::approve`]).
+ /// * `from` - The user who owns the token.
+ /// * `to` - Recepient user.
+ /// * `token` - The token of which parts are being sent.
+ /// * `amount` - The number of parts of the token that will be transferred.
+ /// * `budget` - The maximum budget that can be spent on the transfer.
fn transfer_from(
&self,
sender: T::CrossAccountId,
@@ -1347,67 +1680,140 @@
to: T::CrossAccountId,
token: TokenId,
amount: u128,
- nesting_budget: &dyn Budget,
+ budget: &dyn Budget,
) -> DispatchResultWithPostInfo;
+
+ /// Burn parts of a token owned by another user.
+ ///
+ /// Before calling this method, you must grant rights to the calling user via [`Self::approve`].
+ ///
+ /// * `sender` - The user who must have access to the token (see [`Self::approve`]).
+ /// * `from` - The user who owns the token.
+ /// * `token` - The token of which parts are being sent.
+ /// * `amount` - The number of parts of the token that will be transferred.
+ /// * `budget` - The maximum budget that can be spent on the burn.
fn burn_from(
&self,
sender: T::CrossAccountId,
from: T::CrossAccountId,
token: TokenId,
amount: u128,
- nesting_budget: &dyn Budget,
+ budget: &dyn Budget,
) -> DispatchResultWithPostInfo;
+ /// Check permission to nest token.
+ ///
+ /// * `sender` - The user who initiated the check.
+ /// * `from` - The token that is checked for embedding.
+ /// * `under` - Token under which to check.
+ /// * `budget` - The maximum budget that can be spent on the check.
fn check_nesting(
&self,
sender: T::CrossAccountId,
from: (CollectionId, TokenId),
under: TokenId,
- nesting_budget: &dyn Budget,
+ budget: &dyn Budget,
) -> DispatchResult;
+ /// Nest one token into another.
+ ///
+ /// * `under` - Token holder.
+ /// * `to_nest` - Nested token.
fn nest(&self, under: TokenId, to_nest: (CollectionId, TokenId));
+ /// Unnest token.
+ ///
+ /// * `under` - Token holder.
+ /// * `to_nest` - Token to unnest.
fn unnest(&self, under: TokenId, to_nest: (CollectionId, TokenId));
+ /// Get all user tokens.
+ ///
+ /// * `account` - Account for which you need to get tokens.
fn account_tokens(&self, account: T::CrossAccountId) -> Vec<TokenId>;
+
+ /// Get all the tokens in the collection.
fn collection_tokens(&self) -> Vec<TokenId>;
+
+ /// Check if the token exists.
+ ///
+ /// * `token` - Id token to check.
fn token_exists(&self, token: TokenId) -> bool;
+
+ /// Get the id of the last minted token.
fn last_token_id(&self) -> TokenId;
+ /// Get the owner of the token.
+ ///
+ /// * `token` - The token for which you need to find out the owner.
fn token_owner(&self, token: TokenId) -> Option<T::CrossAccountId>;
+
+ /// Get the value of the token property by key.
+ ///
+ /// * `token` - Token with the property to get.
+ /// * `key` - Property name.
fn token_property(&self, token_id: TokenId, key: &PropertyKey) -> Option<PropertyValue>;
- fn token_properties(&self, token_id: TokenId, keys: Option<Vec<PropertyKey>>) -> Vec<Property>;
+
+ /// Get a set of token properties by key vector.
+ ///
+ /// * `token` - Token with the property to get.
+ /// * `keys` - Vector of property keys. If this parameter is [None](sp_std::result::Result),
+ /// then all properties are returned.
+ fn token_properties(&self, token: TokenId, keys: Option<Vec<PropertyKey>>) -> Vec<Property>;
+
/// Amount of unique collection tokens
fn total_supply(&self) -> u32;
- /// Amount of different tokens account has (Applicable to nonfungible/refungible)
+
+ /// Amount of different tokens account has.
+ ///
+ /// * `account` - The account for which need to get the balance.
fn account_balance(&self, account: T::CrossAccountId) -> u32;
- /// Amount of specific token account have (Applicable to fungible/refungible)
+
+ /// Amount of specific token account have.
fn balance(&self, account: T::CrossAccountId, token: TokenId) -> u128;
+
/// Amount of token pieces
fn total_pieces(&self, token: TokenId) -> Option<u128>;
+
+ /// Get the number of parts of the token that a trusted user can manage.
+ ///
+ /// * `sender` - Trusted user.
+ /// * `spender` - Owner of the token.
+ /// * `token` - The token for which to get the value.
fn allowance(
&self,
sender: T::CrossAccountId,
spender: T::CrossAccountId,
token: TokenId,
) -> u128;
+
+ /// Get extension for RFT collection.
fn refungible_extensions(&self) -> Option<&dyn RefungibleExtensions<T>>;
}
+/// Extension for RFT collection.
pub trait RefungibleExtensions<T>
where
T: Config,
{
+ /// Change the number of parts of the token.
+ ///
+ /// When the value changes down, this function is equivalent to burning parts of the token.
+ ///
+ /// * `sender` - The user calling the repartition operation. Must be the owner of the token.
+ /// * `token` - The token for which you want to change the number of parts.
+ /// * `amount` - The new value of the parts of the token.
fn repartition(
&self,
- owner: &T::CrossAccountId,
+ sender: &T::CrossAccountId,
token: TokenId,
amount: u128,
) -> DispatchResultWithPostInfo;
}
-// Flexible enough for implementing CommonCollectionOperations
+/// Merge [`DispatchResult`] with [`Weight`] into [`DispatchResultWithPostInfo`].
+///
+/// Used for [`CommonCollectionOperations`] implementations and flexible enough to do so.
pub fn with_weight(res: DispatchResult, weight: Weight) -> DispatchResultWithPostInfo {
let post_info = PostDispatchInfo {
actual_weight: Some(weight),
pallets/evm-contract-helpers/src/stubs/ContractHelpers.rawdiffbeforeafterbothbinary blob — no preview
pallets/fungible/src/common.rsdiffbeforeafterboth--- a/pallets/fungible/src/common.rs
+++ b/pallets/fungible/src/common.rs
@@ -105,6 +105,8 @@
}
}
+/// Implementation of `CommonCollectionOperations` for `FungibleHandle`. It wraps FungibleHandle Pallete
+/// methods and adds weight info.
impl<T: Config> CommonCollectionOperations<T> for FungibleHandle<T> {
fn create_item(
&self,
pallets/fungible/src/erc.rsdiffbeforeafterboth--- a/pallets/fungible/src/erc.rs
+++ b/pallets/fungible/src/erc.rs
@@ -14,6 +14,8 @@
// You should have received a copy of the GNU General Public License
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+//! ERC-20 standart support implementation.
+
use core::char::{REPLACEMENT_CHARACTER, decode_utf16};
use core::convert::TryInto;
use evm_coder::{ToLog, execution::*, generate_stubgen, solidity_interface, types::*, weight};
pallets/fungible/src/lib.rsdiffbeforeafterboth--- a/pallets/fungible/src/lib.rs
+++ b/pallets/fungible/src/lib.rs
@@ -14,6 +14,68 @@
// You should have received a copy of the GNU General Public License
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+//! # Fungible Pallet
+//!
+//! The Fungible pallet provides functionality for dealing with fungible assets.
+//!
+//! - [`CreateItemData`]
+//! - [`Config`]
+//! - [`FungibleHandle`]
+//! - [`Pallet`]
+//! - [`TotalSupply`]
+//! - [`Balance`]
+//! - [`Allowance`]
+//! - [`Error`]
+//!
+//! ## Fungible tokens
+//!
+//! Fungible tokens or assets are divisible and non-unique. For instance,
+//! fiat currencies like the dollar are fungible: A $1 bill
+//! in New York City has the same value as a $1 bill in Miami.
+//! A fungible token can also be a cryptocurrency like Bitcoin: 1 BTC is worth 1 BTC,
+//! no matter where it is issued. Thus, the fungibility refers to a specific currency’s
+//! ability to maintain one standard value. As well, it needs to have uniform acceptance.
+//! This means that a currency’s history should not be able to affect its value,
+//! and this is due to the fact that each piece that is a part of the currency is equal
+//! in value when compared to every other piece of that exact same currency.
+//! In the world of cryptocurrencies, this is essentially a coin or a token
+//! that can be replaced by another identical coin or token, and they are
+//! both mutually interchangeable. A popular implementation of fungible tokens is
+//! the ERC-20 token standard.
+//!
+//! ### ERC-20
+//!
+//! The [ERC-20](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/) (Ethereum Request for Comments 20), proposed by Fabian Vogelsteller in November 2015,
+//! is a Token Standard that implements an API for tokens within Smart Contracts.
+//!
+//! Example functionalities ERC-20 provides:
+//!
+//! * transfer tokens from one account to another
+//! * get the current token balance of an account
+//! * get the total supply of the token available on the network
+//! * approve whether an amount of token from an account can be spent by a third-party account
+//!
+//! ## Overview
+//!
+//! The module provides functionality for asset management of fungible asset, supports ERC-20 standart, includes:
+//!
+//! * Asset Issuance
+//! * Asset Transferal
+//! * Asset Destruction
+//! * Delegated Asset Transfers
+//!
+//! **NOTE:** The created fungible asset always has `token_id` = 0.
+//! So `tokenA` and `tokenB` will have different `collection_id`.
+//!
+//! ### Implementations
+//!
+//! The Fungible pallet provides implementations for the following traits.
+//!
+//! - [`WithRecorder`](pallet_evm_coder_substrate::WithRecorder): Trait for EVM support
+//! - [`CommonCollectionOperations`](pallet_common::CommonCollectionOperations): Functions for dealing with collections
+//! - [`CommonWeightInfo`](pallet_common::CommonWeightInfo): Functions for retrieval of transaction weight
+//! - [`CommonEvmHandler`](pallet_common::erc::CommonEvmHandler): Function for handling EVM runtime calls
+
#![cfg_attr(not(feature = "std"), no_std)]
use core::ops::Deref;
@@ -57,13 +119,14 @@
pub enum Error<T> {
/// Not Fungible item data used to mint in Fungible collection.
NotFungibleDataUsedToMintFungibleCollectionToken,
- /// Not default id passed as TokenId argument
+ /// Not default id passed as TokenId argument.
+ /// The default value of TokenId for Fungible collection is 0.
FungibleItemsHaveNoId,
- /// Tried to set data for fungible item
+ /// Tried to set data for fungible item.
FungibleItemsDontHaveData,
- /// Fungible token does not support nested
+ /// Fungible token does not support nesting.
FungibleDisallowsNesting,
- /// Setting item properties is not allowed
+ /// Setting item properties is not allowed.
SettingPropertiesNotAllowed,
}
@@ -78,10 +141,12 @@
#[pallet::generate_store(pub(super) trait Store)]
pub struct Pallet<T>(_);
+ /// Total amount of fungible tokens inside a collection.
#[pallet::storage]
pub type TotalSupply<T: Config> =
StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u128, QueryKind = ValueQuery>;
+ /// Amount of tokens owned by an account inside a collection.
#[pallet::storage]
pub type Balance<T: Config> = StorageNMap<
Key = (
@@ -92,6 +157,7 @@
QueryKind = ValueQuery,
>;
+ /// Storage for delegated assets.
#[pallet::storage]
pub type Allowance<T: Config> = StorageNMap<
Key = (
@@ -104,14 +170,23 @@
>;
}
+/// Wrapper around untyped collection handle, asserting inner collection is of fungible type.
+/// Required for interaction with Fungible collections, type safety and implementation [`solidity_interface`][`evm_coder::solidity_interface`].
+
pub struct FungibleHandle<T: Config>(pallet_common::CollectionHandle<T>);
+
+/// Implementation of methods required for dispatching during runtime.
impl<T: Config> FungibleHandle<T> {
+ /// Casts [`CollectionHandle`][`pallet_common::CollectionHandle`] into [`FungibleHandle`].
pub fn cast(inner: pallet_common::CollectionHandle<T>) -> Self {
Self(inner)
}
+
+ /// Casts [`FungibleHandle`] into [`CollectionHandle`][`pallet_common::CollectionHandle`].
pub fn into_inner(self) -> pallet_common::CollectionHandle<T> {
self.0
}
+ /// Returns a mutable reference to the internal [`CollectionHandle`][`pallet_common::CollectionHandle`].
pub fn common_mut(&mut self) -> &mut pallet_common::CollectionHandle<T> {
&mut self.0
}
@@ -132,13 +207,17 @@
}
}
+/// Pallet implementation for fungible assets
impl<T: Config> Pallet<T> {
+ /// Initializes the collection. Returns [CollectionId] on success, [DispatchError] otherwise.
pub fn init_collection(
owner: T::CrossAccountId,
data: CreateCollectionData<T::AccountId>,
) -> Result<CollectionId, DispatchError> {
<PalletCommon<T>>::init_collection(owner, data, false)
}
+
+ /// Destroys a collection.
pub fn destroy_collection(
collection: FungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -159,10 +238,14 @@
Ok(())
}
+ ///Checks if collection has tokens. Return `true` if it has.
fn collection_has_tokens(collection_id: CollectionId) -> bool {
<TotalSupply<T>>::get(collection_id) != 0
}
+ /// Burns the specified amount of the token. If the token balance
+ /// or total supply is less than the given value,
+ /// it will return [DispatchError].
pub fn burn(
collection: &FungibleHandle<T>,
owner: &T::CrossAccountId,
@@ -207,6 +290,13 @@
Ok(())
}
+ /// Transfers the specified amount of tokens. Will check that
+ /// the transfer is allowed for the token.
+ ///
+ /// - `from`: Owner of tokens to transfer.
+ /// - `to`: Recepient of transfered tokens.
+ /// - `amount`: Amount of tokens to transfer.
+ /// - `collection`: Collection that contains the token
pub fn transfer(
collection: &FungibleHandle<T>,
from: &T::CrossAccountId,
@@ -277,6 +367,8 @@
Ok(())
}
+ /// Minting tokens for multiple IDs.
+ /// See [`create_item`][`Pallet::create_item`] for more details.
pub fn create_multiple_items(
collection: &FungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -378,6 +470,12 @@
));
}
+ /// Set allowance for the spender to `transfer` or `burn` owner's tokens.
+ ///
+ /// - `collection`: Collection that contains the token
+ /// - `owner`: Owner of tokens that sets the allowance.
+ /// - `spender`: Recipient of the allowance rights.
+ /// - `amount`: Amount of tokens the spender is allowed to `transfer` or `burn`.
pub fn set_allowance(
collection: &FungibleHandle<T>,
owner: &T::CrossAccountId,
@@ -402,6 +500,13 @@
Ok(())
}
+ /// Checks if a non-owner has (enough) allowance from the owner to perform operations on the tokens.
+ /// Returns the expected remaining allowance - it should be set manually if the transaction proceeds.
+ ///
+ /// - `collection`: Collection that contains the token.
+ /// - `spender`: CrossAccountId who has the allowance rights.
+ /// - `from`: The owner of the tokens who sets the allowance.
+ /// - `amount`: Amount of tokens by which the allowance sholud be reduced.
fn check_allowed(
collection: &FungibleHandle<T>,
spender: &T::CrossAccountId,
@@ -441,6 +546,11 @@
Ok(allowance)
}
+ /// Transfer fungible tokens from one account to another.
+ /// Same as the [`transfer`][`Pallet::transfer`] but spender doesn't needs to be an owner of the token pieces.
+ /// The owner should set allowance for the spender to transfer pieces.
+ /// See [`set_allowance`][`Pallet::set_allowance`] for more details.
+
pub fn transfer_from(
collection: &FungibleHandle<T>,
spender: &T::CrossAccountId,
@@ -460,6 +570,11 @@
Ok(())
}
+ /// Burn fungible tokens from the account.
+ ///
+ /// Same as the [`burn`][`Pallet::burn`] but spender doesn't need to be an owner of the tokens. The `from` should
+ /// set allowance for the spender to burn tokens.
+ /// See [`set_allowance`][`Pallet::set_allowance`] for more details.
pub fn burn_from(
collection: &FungibleHandle<T>,
spender: &T::CrossAccountId,
@@ -478,7 +593,13 @@
Ok(())
}
- /// Delegated to `create_multiple_items`
+ /// Creates fungible token.
+ ///
+ /// The sender should be the owner/admin of the collection or collection should be configured
+ /// to allow public minting.
+ ///
+ /// - `data`: Contains user who will become the owners of the tokens and amount
+ /// of tokens he will receive.
pub fn create_item(
collection: &FungibleHandle<T>,
sender: &T::CrossAccountId,
pallets/fungible/src/stubs/UniqueFungible.rawdiffbeforeafterbothbinary blob — no preview
pallets/fungible/src/stubs/UniqueFungible.soldiffbeforeafterboth--- a/pallets/fungible/src/stubs/UniqueFungible.sol
+++ b/pallets/fungible/src/stubs/UniqueFungible.sol
@@ -43,6 +43,233 @@
}
}
+// Selector: 7d9262e6
+contract Collection is Dummy, ERC165 {
+ // Set collection property.
+ //
+ // @param key Property key.
+ // @param value Propery value.
+ //
+ // Selector: setCollectionProperty(string,bytes) 2f073f66
+ function setCollectionProperty(string memory key, bytes memory value)
+ public
+ {
+ require(false, stub_error);
+ key;
+ value;
+ dummy = 0;
+ }
+
+ // Delete collection property.
+ //
+ // @param key Property key.
+ //
+ // Selector: deleteCollectionProperty(string) 7b7debce
+ function deleteCollectionProperty(string memory key) public {
+ require(false, stub_error);
+ key;
+ dummy = 0;
+ }
+
+ // Get collection property.
+ //
+ // @dev Throws error if key not found.
+ //
+ // @param key Property key.
+ // @return bytes The property corresponding to the key.
+ //
+ // Selector: collectionProperty(string) cf24fd6d
+ function collectionProperty(string memory key)
+ public
+ view
+ returns (bytes memory)
+ {
+ require(false, stub_error);
+ key;
+ dummy;
+ return hex"";
+ }
+
+ // Set the sponsor of the collection.
+ //
+ // @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
+ //
+ // @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.
+ //
+ // Selector: setCollectionSponsor(address) 7623402e
+ function setCollectionSponsor(address sponsor) public {
+ require(false, stub_error);
+ sponsor;
+ dummy = 0;
+ }
+
+ // Collection sponsorship confirmation.
+ //
+ // @dev After setting the sponsor for the collection, it must be confirmed with this function.
+ //
+ // Selector: confirmCollectionSponsorship() 3c50e97a
+ function confirmCollectionSponsorship() public {
+ require(false, stub_error);
+ dummy = 0;
+ }
+
+ // Set limits for the collection.
+ // @dev Throws error if limit not found.
+ // @param limit Name of the limit. Valid names:
+ // "accountTokenOwnershipLimit",
+ // "sponsoredDataSize",
+ // "sponsoredDataRateLimit",
+ // "tokenLimit",
+ // "sponsorTransferTimeout",
+ // "sponsorApproveTimeout"
+ // @param value Value of the limit.
+ //
+ // Selector: setCollectionLimit(string,uint32) 6a3841db
+ function setCollectionLimit(string memory limit, uint32 value) public {
+ require(false, stub_error);
+ limit;
+ value;
+ dummy = 0;
+ }
+
+ // Set limits for the collection.
+ // @dev Throws error if limit not found.
+ // @param limit Name of the limit. Valid names:
+ // "ownerCanTransfer",
+ // "ownerCanDestroy",
+ // "transfersEnabled"
+ // @param value Value of the limit.
+ //
+ // Selector: setCollectionLimit(string,bool) 993b7fba
+ function setCollectionLimit(string memory limit, bool value) public {
+ require(false, stub_error);
+ limit;
+ value;
+ dummy = 0;
+ }
+
+ // Get contract address.
+ //
+ // Selector: contractAddress() f6b4dfb4
+ function contractAddress() public view returns (address) {
+ require(false, stub_error);
+ dummy;
+ return 0x0000000000000000000000000000000000000000;
+ }
+
+ // Add collection admin by substrate address.
+ // @param new_admin Substrate administrator address.
+ //
+ // Selector: addCollectionAdminSubstrate(uint256) 5730062b
+ function addCollectionAdminSubstrate(uint256 newAdmin) public {
+ require(false, stub_error);
+ newAdmin;
+ dummy = 0;
+ }
+
+ // Remove collection admin by substrate address.
+ // @param admin Substrate administrator address.
+ //
+ // Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9
+ function removeCollectionAdminSubstrate(uint256 admin) public {
+ require(false, stub_error);
+ admin;
+ dummy = 0;
+ }
+
+ // Add collection admin.
+ // @param new_admin Address of the added administrator.
+ //
+ // Selector: addCollectionAdmin(address) 92e462c7
+ function addCollectionAdmin(address newAdmin) public {
+ require(false, stub_error);
+ newAdmin;
+ dummy = 0;
+ }
+
+ // Remove collection admin.
+ //
+ // @param new_admin Address of the removed administrator.
+ //
+ // Selector: removeCollectionAdmin(address) fafd7b42
+ function removeCollectionAdmin(address admin) public {
+ require(false, stub_error);
+ admin;
+ dummy = 0;
+ }
+
+ // Toggle accessibility of collection nesting.
+ //
+ // @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'
+ //
+ // Selector: setCollectionNesting(bool) 112d4586
+ function setCollectionNesting(bool enable) public {
+ require(false, stub_error);
+ enable;
+ dummy = 0;
+ }
+
+ // Toggle accessibility of collection nesting.
+ //
+ // @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'
+ // @param collections Addresses of collections that will be available for nesting.
+ //
+ // Selector: setCollectionNesting(bool,address[]) 64872396
+ function setCollectionNesting(bool enable, address[] memory collections)
+ public
+ {
+ require(false, stub_error);
+ enable;
+ collections;
+ dummy = 0;
+ }
+
+ // Set the collection access method.
+ // @param mode Access mode
+ // 0 for Normal
+ // 1 for AllowList
+ //
+ // Selector: setCollectionAccess(uint8) 41835d4c
+ function setCollectionAccess(uint8 mode) public {
+ require(false, stub_error);
+ mode;
+ dummy = 0;
+ }
+
+ // Add the user to the allowed list.
+ //
+ // @param user Address of a trusted user.
+ //
+ // Selector: addToCollectionAllowList(address) 67844fe6
+ function addToCollectionAllowList(address user) public {
+ require(false, stub_error);
+ user;
+ dummy = 0;
+ }
+
+ // Remove the user from the allowed list.
+ //
+ // @param user Address of a removed user.
+ //
+ // Selector: removeFromCollectionAllowList(address) 85c51acb
+ function removeFromCollectionAllowList(address user) public {
+ require(false, stub_error);
+ user;
+ dummy = 0;
+ }
+
+ // Switch permission for minting.
+ //
+ // @param mode Enable if "true".
+ //
+ // Selector: setCollectionMintMode(bool) 00018e84
+ function setCollectionMintMode(bool mode) public {
+ require(false, stub_error);
+ mode;
+ dummy = 0;
+ }
+}
+
// Selector: 942e8b22
contract ERC20 is Dummy, ERC165, ERC20Events {
// Selector: name() 06fdde03
@@ -124,76 +351,6 @@
spender;
dummy;
return 0;
- }
-}
-
-// Selector: c894dc35
-contract Collection is Dummy, ERC165 {
- // Selector: setCollectionProperty(string,bytes) 2f073f66
- function setCollectionProperty(string memory key, bytes memory value)
- public
- {
- require(false, stub_error);
- key;
- value;
- dummy = 0;
- }
-
- // Selector: deleteCollectionProperty(string) 7b7debce
- function deleteCollectionProperty(string memory key) public {
- require(false, stub_error);
- key;
- dummy = 0;
- }
-
- // Throws error if key not found
- //
- // Selector: collectionProperty(string) cf24fd6d
- function collectionProperty(string memory key)
- public
- view
- returns (bytes memory)
- {
- require(false, stub_error);
- key;
- dummy;
- return hex"";
- }
-
- // Selector: ethSetSponsor(address) 8f9af356
- function ethSetSponsor(address sponsor) public {
- require(false, stub_error);
- sponsor;
- dummy = 0;
- }
-
- // Selector: ethConfirmSponsorship() a8580d1a
- function ethConfirmSponsorship() public {
- require(false, stub_error);
- dummy = 0;
- }
-
- // Selector: setLimit(string,uint32) 68db30ca
- function setLimit(string memory limit, uint32 value) public {
- require(false, stub_error);
- limit;
- value;
- dummy = 0;
- }
-
- // Selector: setLimit(string,bool) ea67e4c2
- function setLimit(string memory limit, bool value) public {
- require(false, stub_error);
- limit;
- value;
- dummy = 0;
- }
-
- // Selector: contractAddress() f6b4dfb4
- function contractAddress() public view returns (address) {
- require(false, stub_error);
- dummy;
- return 0x0000000000000000000000000000000000000000;
}
}
pallets/inflation/src/lib.rsdiffbeforeafterboth--- a/pallets/inflation/src/lib.rs
+++ b/pallets/inflation/src/lib.rs
@@ -14,6 +14,20 @@
// You should have received a copy of the GNU General Public License
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+//! # Inflation
+//!
+//! The inflation pallet is designed to increase the number of tokens at certain intervals.
+//! With each iteration, increases the `total_issuance` value for the native token.
+//! Executing an `on_initialize` hook at the beginning of each block, causing inflation to begin.
+//!
+//! ## Interface
+//!
+//! ### Dispatchable Functions
+//!
+//! * `start_inflation` - This method sets the inflation start date. Can be only called once.
+//! Inflation start block can be backdated and will catch up. The method will create Treasury
+//! account if it does not exist and perform the first inflation deposit.
+
// #![recursion_limit = "1024"]
#![cfg_attr(not(feature = "std"), no_std)]
pallets/nonfungible/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/benchmarking.rs
+++ b/pallets/nonfungible/src/benchmarking.rs
@@ -183,7 +183,7 @@
value: property_value(),
}).collect::<Vec<_>>();
let item = create_max_item(&collection, &owner, owner.clone())?;
- }: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props, false, &Unlimited)?}
+ }: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), false, &Unlimited)?}
delete_token_properties {
let b in 0..MAX_PROPERTIES_PER_ITEM;
@@ -205,7 +205,7 @@
value: property_value(),
}).collect::<Vec<_>>();
let item = create_max_item(&collection, &owner, owner.clone())?;
- <Pallet<T>>::set_token_properties(&collection, &owner, item, props, false, &Unlimited)?;
+ <Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), false, &Unlimited)?;
let to_delete = (0..b).map(|k| property_key(k as usize)).collect::<Vec<_>>();
- }: {<Pallet<T>>::delete_token_properties(&collection, &owner, item, to_delete, &Unlimited)?}
+ }: {<Pallet<T>>::delete_token_properties(&collection, &owner, item, to_delete.into_iter(), &Unlimited)?}
}
pallets/nonfungible/src/common.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/common.rs
+++ b/pallets/nonfungible/src/common.rs
@@ -133,6 +133,8 @@
}
}
+/// Implementation of `CommonCollectionOperations` for `NonfungibleHandle`. It wraps Nonfungible Pallete
+/// methods and adds weight info.
impl<T: Config> CommonCollectionOperations<T> for NonfungibleHandle<T> {
fn create_item(
&self,
pallets/nonfungible/src/erc.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -14,6 +14,11 @@
// You should have received a copy of the GNU General Public License
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+//! # Nonfungible Pallet EVM API
+//!
+//! Provides ERC-721 standart support implementation and EVM API for unique extensions for Nonfungible Pallet.
+//! Method implementations are mostly doing parameter conversion and calling Nonfungible Pallet methods.
+
extern crate alloc;
use core::{
char::{REPLACEMENT_CHARACTER, decode_utf16},
@@ -40,8 +45,15 @@
SelfWeightOf, weights::WeightInfo, TokenProperties,
};
+/// @title A contract that allows to set and delete token properties and change token property permissions.
#[solidity_interface(name = "TokenProperties")]
impl<T: Config> NonfungibleHandle<T> {
+ /// @notice Set permissions for token property.
+ /// @dev Throws error if `msg.sender` is not admin or owner of the collection.
+ /// @param key Property key.
+ /// @param is_mutable Permission to mutate property.
+ /// @param collection_admin Permission to mutate property by collection admin if property is mutable.
+ /// @param token_owner Permission to mutate property by token owner if property is mutable.
fn set_token_property_permission(
&mut self,
caller: caller,
@@ -68,6 +80,11 @@
.map_err(dispatch_to_evm::<T>)
}
+ /// @notice Set token property value.
+ /// @dev Throws error if `msg.sender` has no permission to edit the property.
+ /// @param tokenId ID of the token.
+ /// @param key Property key.
+ /// @param value Property value.
fn set_property(
&mut self,
caller: caller,
@@ -96,6 +113,10 @@
.map_err(dispatch_to_evm::<T>)
}
+ /// @notice Delete token property value.
+ /// @dev Throws error if `msg.sender` has no permission to edit the property.
+ /// @param tokenId ID of the token.
+ /// @param key Property key.
fn delete_property(&mut self, token_id: uint256, caller: caller, key: string) -> Result<()> {
let caller = T::CrossAccountId::from_eth(caller);
let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
@@ -111,7 +132,11 @@
.map_err(dispatch_to_evm::<T>)
}
- /// Throws error if key not found
+ /// @notice Get token property value.
+ /// @dev Throws error if key not found
+ /// @param tokenId ID of the token.
+ /// @param key Property key.
+ /// @return Property value bytes
fn property(&self, token_id: uint256, key: string) -> Result<bytes> {
let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
let key = <Vec<u8>>::from(key)
@@ -127,6 +152,11 @@
#[derive(ToLog)]
pub enum ERC721Events {
+ /// @dev This emits when ownership of any NFT changes by any mechanism.
+ /// This event emits when NFTs are created (`from` == 0) and destroyed
+ /// (`to` == 0). Exception: during contract creation, any number of NFTs
+ /// may be created and assigned without emitting Transfer. At the time of
+ /// any transfer, the approved address for that NFT (if any) is reset to none.
Transfer {
#[indexed]
from: address,
@@ -135,6 +165,10 @@
#[indexed]
token_id: uint256,
},
+ /// @dev This emits when the approved address for an NFT is changed or
+ /// reaffirmed. The zero address indicates there is no approved address.
+ /// When a Transfer event emits, this also indicates that the approved
+ /// address for that NFT (if any) is reset to none.
Approval {
#[indexed]
owner: address,
@@ -143,6 +177,8 @@
#[indexed]
token_id: uint256,
},
+ /// @dev This emits when an operator is enabled or disabled for an owner.
+ /// The operator can manage all NFTs of the owner.
#[allow(dead_code)]
ApprovalForAll {
#[indexed]
@@ -159,19 +195,27 @@
MintingFinished {},
}
+/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
#[solidity_interface(name = "ERC721Metadata")]
impl<T: Config> NonfungibleHandle<T> {
+ /// @notice A descriptive name for a collection of NFTs in this contract
fn name(&self) -> Result<string> {
Ok(decode_utf16(self.name.iter().copied())
.map(|r| r.unwrap_or(REPLACEMENT_CHARACTER))
.collect::<string>())
}
+ /// @notice An abbreviated name for NFTs in this contract
fn symbol(&self) -> Result<string> {
Ok(string::from_utf8_lossy(&self.token_prefix).into())
}
- /// Returns token's const_metadata
+ /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
+ /// @dev Throws if `tokenId` is not a valid NFT. URIs are defined in RFC
+ /// 3986. The URI may point to a JSON file that conforms to the "ERC721
+ /// Metadata JSON Schema".
+ /// @return token's const_metadata
#[solidity(rename_selector = "tokenURI")]
fn token_uri(&self, token_id: uint256) -> Result<string> {
let key = token_uri_key();
@@ -192,32 +236,53 @@
}
}
+/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
+/// @dev See https://eips.ethereum.org/EIPS/eip-721
#[solidity_interface(name = "ERC721Enumerable")]
impl<T: Config> NonfungibleHandle<T> {
+ /// @notice Enumerate valid NFTs
+ /// @param index A counter less than `totalSupply()`
+ /// @return The token identifier for the `index`th NFT,
+ /// (sort order not specified)
fn token_by_index(&self, index: uint256) -> Result<uint256> {
Ok(index)
}
- /// Not implemented
+ /// @dev Not implemented
fn token_of_owner_by_index(&self, _owner: address, _index: uint256) -> Result<uint256> {
// TODO: Not implemetable
Err("not implemented".into())
}
+ /// @notice Count NFTs tracked by this contract
+ /// @return A count of valid NFTs tracked by this contract, where each one of
+ /// them has an assigned and queryable owner not equal to the zero address
fn total_supply(&self) -> Result<uint256> {
self.consume_store_reads(1)?;
Ok(<Pallet<T>>::total_supply(self).into())
}
}
+/// @title ERC-721 Non-Fungible Token Standard
+/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
#[solidity_interface(name = "ERC721", events(ERC721Events))]
impl<T: Config> NonfungibleHandle<T> {
+ /// @notice Count all NFTs assigned to an owner
+ /// @dev NFTs assigned to the zero address are considered invalid, and this
+ /// function throws for queries about the zero address.
+ /// @param owner An address for whom to query the balance
+ /// @return The number of NFTs owned by `owner`, possibly zero
fn balance_of(&self, owner: address) -> Result<uint256> {
self.consume_store_reads(1)?;
let owner = T::CrossAccountId::from_eth(owner);
let balance = <AccountBalance<T>>::get((self.id, owner));
Ok(balance.into())
}
+ /// @notice Find the owner of an NFT
+ /// @dev NFTs assigned to zero address are considered invalid, and queries
+ /// about them do throw.
+ /// @param tokenId The identifier for an NFT
+ /// @return The address of the owner of the NFT
fn owner_of(&self, token_id: uint256) -> Result<address> {
self.consume_store_reads(1)?;
let token: TokenId = token_id.try_into()?;
@@ -226,7 +291,7 @@
.owner
.as_eth())
}
- /// Not implemented
+ /// @dev Not implemented
fn safe_transfer_from_with_data(
&mut self,
_from: address,
@@ -238,7 +303,7 @@
// TODO: Not implemetable
Err("not implemented".into())
}
- /// Not implemented
+ /// @dev Not implemented
fn safe_transfer_from(
&mut self,
_from: address,
@@ -250,6 +315,16 @@
Err("not implemented".into())
}
+ /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
+ /// TO CONFIRM THAT `to` IS CAPABLE OF RECEIVING NFTS OR ELSE
+ /// THEY MAY BE PERMANENTLY LOST
+ /// @dev Throws unless `msg.sender` is the current owner or an authorized
+ /// operator for this NFT. Throws if `from` is not the current owner. Throws
+ /// if `to` is the zero address. Throws if `tokenId` is not a valid NFT.
+ /// @param from The current owner of the NFT
+ /// @param to The new owner
+ /// @param tokenId The NFT to transfer
+ /// @param _value Not used for an NFT
#[weight(<SelfWeightOf<T>>::transfer_from())]
fn transfer_from(
&mut self,
@@ -272,6 +347,12 @@
Ok(())
}
+ /// @notice Set or reaffirm the approved address for an NFT
+ /// @dev The zero address indicates there is no approved address.
+ /// @dev Throws unless `msg.sender` is the current NFT owner, or an authorized
+ /// operator of the current owner.
+ /// @param approved The new approved NFT controller
+ /// @param tokenId The NFT to approve
#[weight(<SelfWeightOf<T>>::approve())]
fn approve(
&mut self,
@@ -289,7 +370,7 @@
Ok(())
}
- /// Not implemented
+ /// @dev Not implemented
fn set_approval_for_all(
&mut self,
_caller: caller,
@@ -300,21 +381,26 @@
Err("not implemented".into())
}
- /// Not implemented
+ /// @dev Not implemented
fn get_approved(&self, _token_id: uint256) -> Result<address> {
// TODO: Not implemetable
Err("not implemented".into())
}
- /// Not implemented
+ /// @dev Not implemented
fn is_approved_for_all(&self, _owner: address, _operator: address) -> Result<address> {
// TODO: Not implemetable
Err("not implemented".into())
}
}
+/// @title ERC721 Token that can be irreversibly burned (destroyed).
#[solidity_interface(name = "ERC721Burnable")]
impl<T: Config> NonfungibleHandle<T> {
+ /// @notice Burns a specific ERC721 token.
+ /// @dev Throws unless `msg.sender` is the current NFT owner, or an authorized
+ /// operator of the current owner.
+ /// @param tokenId The NFT to approve
#[weight(<SelfWeightOf<T>>::burn_item())]
fn burn(&mut self, caller: caller, token_id: uint256) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -325,14 +411,18 @@
}
}
+/// @title ERC721 minting logic.
#[solidity_interface(name = "ERC721Mintable", events(ERC721MintableEvents))]
impl<T: Config> NonfungibleHandle<T> {
fn minting_finished(&self) -> Result<bool> {
Ok(false)
}
- /// `token_id` should be obtained with `next_token_id` method,
- /// unlike standard, you can't specify it manually
+ /// @notice Function to mint token.
+ /// @dev `tokenId` should be obtained with `nextTokenId` method,
+ /// unlike standard, you can't specify it manually
+ /// @param to The new owner
+ /// @param tokenId ID of the minted NFT
#[weight(<SelfWeightOf<T>>::create_item())]
fn mint(&mut self, caller: caller, to: address, token_id: uint256) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -364,8 +454,12 @@
Ok(true)
}
- /// `token_id` should be obtained with `next_token_id` method,
- /// unlike standard, you can't specify it manually
+ /// @notice Function to mint token with the given tokenUri.
+ /// @dev `tokenId` should be obtained with `nextTokenId` method,
+ /// unlike standard, you can't specify it manually
+ /// @param to The new owner
+ /// @param tokenId ID of the minted NFT
+ /// @param tokenUri Token URI that would be stored in the NFT properties
#[solidity(rename_selector = "mintWithTokenURI")]
#[weight(<SelfWeightOf<T>>::create_item())]
fn mint_with_token_uri(
@@ -420,7 +514,7 @@
Ok(true)
}
- /// Not implemented
+ /// @dev Not implemented
fn finish_minting(&mut self, _caller: caller) -> Result<bool> {
Err("not implementable".into())
}
@@ -449,8 +543,15 @@
false
}
+/// @title Unique extensions for ERC721.
#[solidity_interface(name = "ERC721UniqueExtensions")]
impl<T: Config> NonfungibleHandle<T> {
+ /// @notice Transfer ownership of an NFT
+ /// @dev Throws unless `msg.sender` is the current owner. Throws if `to`
+ /// is the zero address. Throws if `tokenId` is not a valid NFT.
+ /// @param to The new owner
+ /// @param tokenId The NFT to transfer
+ /// @param _value Not used for an NFT
#[weight(<SelfWeightOf<T>>::transfer())]
fn transfer(
&mut self,
@@ -470,6 +571,13 @@
Ok(())
}
+ /// @notice Burns a specific ERC721 token.
+ /// @dev Throws unless `msg.sender` is the current owner or an authorized
+ /// operator for this NFT. Throws if `from` is not the current owner. Throws
+ /// if `to` is the zero address. Throws if `tokenId` is not a valid NFT.
+ /// @param from The current owner of the NFT
+ /// @param tokenId The NFT to transfer
+ /// @param _value Not used for an NFT
#[weight(<SelfWeightOf<T>>::burn_from())]
fn burn_from(
&mut self,
@@ -490,6 +598,7 @@
Ok(())
}
+ /// @notice Returns next free NFT ID.
fn next_token_id(&self) -> Result<uint256> {
self.consume_store_reads(1)?;
Ok(<TokensMinted<T>>::get(self.id)
@@ -498,6 +607,11 @@
.into())
}
+ /// @notice Function to mint multiple tokens.
+ /// @dev `tokenIds` should be an array of consecutive numbers and first number
+ /// should be obtained with `nextTokenId` method
+ /// @param to The new owner
+ /// @param tokenIds IDs of the minted NFTs
#[weight(<SelfWeightOf<T>>::create_multiple_items(token_ids.len() as u32))]
fn mint_bulk(&mut self, caller: caller, to: address, token_ids: Vec<uint256>) -> Result<bool> {
let caller = T::CrossAccountId::from_eth(caller);
@@ -529,6 +643,11 @@
Ok(true)
}
+ /// @notice Function to mint multiple tokens with the given tokenUris.
+ /// @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive
+ /// numbers and first number should be obtained with `nextTokenId` method
+ /// @param to The new owner
+ /// @param tokens array of pairs of token ID and token URI for minted tokens
#[solidity(rename_selector = "mintBulkWithTokenURI")]
#[weight(<SelfWeightOf<T>>::create_multiple_items(tokens.len() as u32))]
fn mint_bulk_with_token_uri(
pallets/nonfungible/src/lib.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/lib.rs
+++ b/pallets/nonfungible/src/lib.rs
@@ -14,6 +14,80 @@
// You should have received a copy of the GNU General Public License
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+//! # Nonfungible Pallet
+//!
+//! The Nonfungible pallet provides functionality for handling nonfungible collections and tokens.
+//!
+//! - [`Config`]
+//! - [`NonfungibleHandle`]
+//! - [`Pallet`]
+//! - [`CommonWeights`]
+//!
+//! ## Overview
+//!
+//! The Nonfungible pallet provides functions for:
+//!
+//! - NFT collection creation and removal
+//! - Minting and burning of NFT tokens
+//! - Retrieving account balances
+//! - Transfering NFT tokens
+//! - Setting and checking allowance for NFT tokens
+//! - Setting properties and permissions for NFT collections and tokens
+//! - Nesting and unnesting tokens
+//!
+//! ### Terminology
+//!
+//! - **NFT token:** Non fungible token.
+//!
+//! - **NFT Collection:** A collection of NFT tokens. All NFT tokens are part of a collection.
+//! Each collection can define it's own properties, properties for it's tokens and set of permissions.
+//!
+//! - **Balance:** Number of NFT tokens owned by an account
+//!
+//! - **Allowance:** NFT tokens owned by one account that another account is allowed to make operations on
+//!
+//! - **Burning:** The process of “deleting” a token from a collection and from
+//! an account balance of the owner.
+//!
+//! - **Nesting:** Setting up parent-child relationship between tokens. Nested tokens are inhereting
+//! owner from their parent. There could be multiple levels of nesting. Token couldn't be nested in
+//! it's child token i.e. parent-child relationship graph shouldn't have cycles.
+//!
+//! - **Properties:** Key-Values pairs. Token properties are attached to a token. Collection properties are
+//! attached to a collection. Set of permissions could be defined for each property.
+//!
+//! ### Implementations
+//!
+//! The Nonfungible pallet provides implementations for the following traits. If these traits provide
+//! the functionality that you need, then you can avoid coupling with the Nonfungible pallet.
+//!
+//! - [`CommonWeightInfo`](pallet_common::CommonWeightInfo): Functions for retrieval of transaction weight
+//! - [`CommonCollectionOperations`](pallet_common::CommonCollectionOperations): Functions for dealing
+//! with collections
+//!
+//! ## Interface
+//!
+//! ### Dispatchable Functions
+//!
+//! - `init_collection` - Create NFT collection. NFT collection can be configured to allow or deny access for
+//! some accounts.
+//! - `destroy_collection` - Destroy exising NFT collection. There should be no tokens in the collection.
+//! - `burn` - Burn NFT token owned by account.
+//! - `transfer` - Transfer NFT token. Transfers should be enabled for NFT collection.
+//! Nests the NFT token if it is sent to another token.
+//! - `create_item` - Mint NFT token in collection. Sender should have permission to mint tokens.
+//! - `set_allowance` - Set allowance for another account.
+//! - `set_token_property` - Set token property value.
+//! - `delete_token_property` - Remove property from the token.
+//! - `set_collection_properties` - Set collection properties.
+//! - `delete_collection_properties` - Remove properties from the collection.
+//! - `set_property_permission` - Set collection property permission.
+//! - `set_token_property_permissions` - Set token property permissions.
+//!
+//! ## Assumptions
+//!
+//! * To perform operations on tokens sender should be in collection's allow list if collection access mode is `AllowList`.
+
#![cfg_attr(not(feature = "std"), no_std)]
use erc::ERC721Events;
@@ -102,13 +176,17 @@
#[pallet::generate_store(pub(super) trait Store)]
pub struct Pallet<T>(_);
+ /// Amount of tokens minted for collection.
#[pallet::storage]
pub type TokensMinted<T: Config> =
StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u32, QueryKind = ValueQuery>;
+
+ /// Amount of burnt tokens for collection.
#[pallet::storage]
pub type TokensBurnt<T: Config> =
StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u32, QueryKind = ValueQuery>;
+ /// Custom data serialized to bytes for token.
#[pallet::storage]
pub type TokenData<T: Config> = StorageNMap<
Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
@@ -116,6 +194,7 @@
QueryKind = OptionQuery,
>;
+ /// Key-Value map stored for token.
#[pallet::storage]
#[pallet::getter(fn token_properties)]
pub type TokenProperties<T: Config> = StorageNMap<
@@ -125,6 +204,8 @@
OnEmpty = up_data_structs::TokenProperties,
>;
+ /// Custom data that is serialized to bytes and attached to a token property.
+ /// Currently used to store RMRK data.
#[pallet::storage]
#[pallet::getter(fn token_aux_property)]
pub type TokenAuxProperties<T: Config> = StorageNMap<
@@ -138,7 +219,7 @@
QueryKind = OptionQuery,
>;
- /// Used to enumerate tokens owned by account
+ /// Used to enumerate tokens owned by account.
#[pallet::storage]
pub type Owned<T: Config> = StorageNMap<
Key = (
@@ -150,7 +231,7 @@
QueryKind = ValueQuery,
>;
- /// Used to enumerate token's children
+ /// Used to enumerate token's children.
#[pallet::storage]
#[pallet::getter(fn token_children)]
pub type TokenChildren<T: Config> = StorageNMap<
@@ -163,6 +244,7 @@
QueryKind = ValueQuery,
>;
+ /// Amount of tokens owned by account.
#[pallet::storage]
pub type AccountBalance<T: Config> = StorageNMap<
Key = (
@@ -173,6 +255,7 @@
QueryKind = ValueQuery,
>;
+ /// Allowance set by an owner for a spender for a token.
#[pallet::storage]
pub type Allowance<T: Config> = StorageNMap<
Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
@@ -273,13 +356,21 @@
}
impl<T: Config> Pallet<T> {
+ /// Get number of NFT tokens in collection.
pub fn total_supply(collection: &NonfungibleHandle<T>) -> u32 {
<TokensMinted<T>>::get(collection.id) - <TokensBurnt<T>>::get(collection.id)
}
+
+ /// Check that NFT token exists.
+ ///
+ /// - `token`: Token ID.
pub fn token_exists(collection: &NonfungibleHandle<T>, token: TokenId) -> bool {
<TokenData<T>>::contains_key((collection.id, token))
}
+ /// Set the token property with the scope.
+ ///
+ /// - `property`: Contains key-value pair.
pub fn set_scoped_token_property(
collection_id: CollectionId,
token_id: TokenId,
@@ -294,6 +385,7 @@
Ok(())
}
+ /// Batch operation to set multiple properties with the same scope.
pub fn set_scoped_token_properties(
collection_id: CollectionId,
token_id: TokenId,
@@ -308,6 +400,9 @@
Ok(())
}
+ /// Add or edit auxiliary data for the property.
+ ///
+ /// - `f`: function that adds or edits auxiliary data.
pub fn try_mutate_token_aux_property<R, E>(
collection_id: CollectionId,
token_id: TokenId,
@@ -318,6 +413,7 @@
<TokenAuxProperties<T>>::try_mutate((collection_id, token_id, scope, key), f)
}
+ /// Remove auxiliary data for the property.
pub fn remove_token_aux_property(
collection_id: CollectionId,
token_id: TokenId,
@@ -327,6 +423,9 @@
<TokenAuxProperties<T>>::remove((collection_id, token_id, scope, key));
}
+ /// Get all auxiliary data in a given scope.
+ ///
+ /// Returns iterator over Property Key - Data pairs.
pub fn iterate_token_aux_properties(
collection_id: CollectionId,
token_id: TokenId,
@@ -335,6 +434,7 @@
<TokenAuxProperties<T>>::iter_prefix((collection_id, token_id, scope))
}
+ /// Get ID of the last minted token
pub fn current_token_id(collection_id: CollectionId) -> TokenId {
TokenId(<TokensMinted<T>>::get(collection_id))
}
@@ -342,6 +442,11 @@
// unchecked calls skips any permission checks
impl<T: Config> Pallet<T> {
+ /// Create NFT collection
+ ///
+ /// `init_collection` will take non-refundable deposit for collection creation.
+ ///
+ /// - `data`: Contains settings for collection limits and permissions.
pub fn init_collection(
owner: T::CrossAccountId,
data: CreateCollectionData<T::AccountId>,
@@ -349,6 +454,11 @@
) -> Result<CollectionId, DispatchError> {
<PalletCommon<T>>::init_collection(owner, data, is_external)
}
+
+ /// Destroy NFT collection
+ ///
+ /// `destroy_collection` will throw error if collection contains any tokens.
+ /// Only owner can destroy collection.
pub fn destroy_collection(
collection: NonfungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -373,6 +483,15 @@
Ok(())
}
+ /// Burn NFT token
+ ///
+ /// `burn` removes `token` from the `collection`, from it's owner and from the parent token
+ /// if the token is nested.
+ /// Only the owner can `burn` the token. The `token` shouldn't have any nested tokens.
+ /// Also removes all corresponding properties and auxiliary properties.
+ ///
+ /// - `token`: Token that should be burned
+ /// - `collection`: Collection that contains the token
pub fn burn(
collection: &NonfungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -442,6 +561,12 @@
Ok(())
}
+ /// Same as [`burn`] but burns all the tokens that are nested in the token first
+ ///
+ /// - `self_budget`: Limit for searching children in depth.
+ /// - `breadth_budget`: Limit of breadth of searching children.
+ ///
+ /// [`burn`]: struct.Pallet.html#method.burn
#[transactional]
pub fn burn_recursively(
collection: &NonfungibleHandle<T>,
@@ -481,6 +606,14 @@
})
}
+ /// Batch operation to add, edit or remove properties for the token
+ ///
+ /// All affected properties should have mutable permission and sender should have
+ /// permission to edit those properties.
+ ///
+ /// - `nesting_budget`: Limit for searching parents in depth to check ownership.
+ /// - `is_token_create`: Indicates that method is called during token initialization.
+ /// Allows to bypass ownership check.
#[transactional]
fn modify_token_properties(
collection: &NonfungibleHandle<T>,
@@ -574,6 +707,11 @@
Ok(())
}
+ /// Batch operation to add or edit properties for the token
+ ///
+ /// Same as [`modify_token_properties`] but doesn't allow to remove properties
+ ///
+ /// [`modify_token_properties`]: struct.Pallet.html#method.modify_token_properties
pub fn set_token_properties(
collection: &NonfungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -592,6 +730,11 @@
)
}
+ /// Add or edit single property for the token
+ ///
+ /// Calls [`set_token_properties`] internally
+ ///
+ /// [`set_token_properties`]: struct.Pallet.html#method.set_token_properties
pub fn set_token_property(
collection: &NonfungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -611,6 +754,11 @@
)
}
+ /// Batch operation to remove properties from the token
+ ///
+ /// Same as [`modify_token_properties`] but doesn't allow to add or edit properties
+ ///
+ /// [`modify_token_properties`]: struct.Pallet.html#method.modify_token_properties
pub fn delete_token_properties(
collection: &NonfungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -630,6 +778,11 @@
)
}
+ /// Remove single property from the token
+ ///
+ /// Calls [`delete_token_properties`] internally
+ ///
+ /// [`delete_token_properties`]: struct.Pallet.html#method.delete_token_properties
pub fn delete_token_property(
collection: &NonfungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -646,6 +799,7 @@
)
}
+ /// Add or edit properties for the collection
pub fn set_collection_properties(
collection: &NonfungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -654,6 +808,7 @@
<PalletCommon<T>>::set_collection_properties(collection, sender, properties)
}
+ /// Remove properties from the collection
pub fn delete_collection_properties(
collection: &CollectionHandle<T>,
sender: &T::CrossAccountId,
@@ -662,6 +817,9 @@
<PalletCommon<T>>::delete_collection_properties(collection, sender, property_keys)
}
+ /// Set property permissions for the token.
+ ///
+ /// Sender should be the owner or admin of token's collection.
pub fn set_token_property_permissions(
collection: &CollectionHandle<T>,
sender: &T::CrossAccountId,
@@ -670,6 +828,9 @@
<PalletCommon<T>>::set_token_property_permissions(collection, sender, property_permissions)
}
+ /// Set property permissions for the collection.
+ ///
+ /// Sender should be the owner or admin of the collection.
pub fn set_property_permission(
collection: &CollectionHandle<T>,
sender: &T::CrossAccountId,
@@ -678,6 +839,15 @@
<PalletCommon<T>>::set_property_permission(collection, sender, permission)
}
+ /// Transfer NFT token from one account to another.
+ ///
+ /// `from` account stops being the owner and `to` account becomes the owner of the token.
+ /// If `to` is token than `to` becomes owner of the token and the token become nested.
+ /// Unnests token from previous parent if it was nested before.
+ /// Removes allowance for the token if there was any.
+ /// Throws if transfers aren't allowed for collection or if receiver reached token ownership limit.
+ ///
+ /// - `nesting_budget`: Limit for token nesting depth
pub fn transfer(
collection: &NonfungibleHandle<T>,
from: &T::CrossAccountId,
@@ -769,6 +939,16 @@
Ok(())
}
+ /// Batch operation to mint multiple NFT tokens.
+ ///
+ /// The sender should be the owner/admin of the collection or collection should be configured
+ /// to allow public minting.
+ /// Throws if amount of tokens reached it's limit for the collection or if caller reached
+ /// token ownership limit.
+ ///
+ /// - `data`: Contains list of token properties and users who will become the owners of the
+ /// corresponging tokens.
+ /// - `nesting_budget`: Limit for token nesting depth
pub fn create_multiple_items(
collection: &NonfungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -953,6 +1133,9 @@
}
}
+ /// Set allowance for the spender to `transfer` or `burn` sender's token.
+ ///
+ /// - `token`: Token the spender is allowed to `transfer` or `burn`.
pub fn set_allowance(
collection: &NonfungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -985,6 +1168,7 @@
Ok(())
}
+ /// Checks allowance for the spender to use the token.
fn check_allowed(
collection: &NonfungibleHandle<T>,
spender: &T::CrossAccountId,
@@ -1027,6 +1211,12 @@
Ok(())
}
+ /// Transfer NFT token from one account to another.
+ ///
+ /// Same as the [`transfer`] but spender doesn't needs to be the owner of the token.
+ /// The owner should set allowance for the spender to transfer token.
+ ///
+ /// [`transfer`]: struct.Pallet.html#method.transfer
pub fn transfer_from(
collection: &NonfungibleHandle<T>,
spender: &T::CrossAccountId,
@@ -1043,6 +1233,12 @@
Self::transfer(collection, from, to, token, nesting_budget)
}
+ /// Burn NFT token for `from` account.
+ ///
+ /// Same as the [`burn`] but spender doesn't need to be an owner of the token. The owner should
+ /// set allowance for the spender to burn token.
+ ///
+ /// [`burn`]: struct.Pallet.html#method.burn
pub fn burn_from(
collection: &NonfungibleHandle<T>,
spender: &T::CrossAccountId,
@@ -1057,6 +1253,8 @@
Self::burn(collection, from, token)
}
+ /// Check that `from` token could be nested in `under` token.
+ ///
pub fn check_nesting(
handle: &NonfungibleHandle<T>,
sender: T::CrossAccountId,
@@ -1126,7 +1324,11 @@
.collect()
}
- /// Delegated to `create_multiple_items`
+ /// Mint single NFT token.
+ ///
+ /// Delegated to [`create_multiple_items`]
+ ///
+ /// [`create_multiple_items`]: struct.Pallet.html#method.create_multiple_items
pub fn create_item(
collection: &NonfungibleHandle<T>,
sender: &T::CrossAccountId,
pallets/nonfungible/src/stubs/UniqueNFT.rawdiffbeforeafterbothbinary blob — no preview
pallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -53,6 +53,13 @@
// Selector: 41369377
contract TokenProperties is Dummy, ERC165 {
+ // @notice Set permissions for token property.
+ // @dev Throws error if `msg.sender` is not admin or owner of the collection.
+ // @param key Property key.
+ // @param is_mutable Permission to mutate property.
+ // @param collection_admin Permission to mutate property by collection admin if property is mutable.
+ // @param token_owner Permission to mutate property by token owner if property is mutable.
+ //
// Selector: setTokenPropertyPermission(string,bool,bool,bool) 222d97fa
function setTokenPropertyPermission(
string memory key,
@@ -68,6 +75,12 @@
dummy = 0;
}
+ // @notice Set token property value.
+ // @dev Throws error if `msg.sender` has no permission to edit the property.
+ // @param tokenId ID of the token.
+ // @param key Property key.
+ // @param value Property value.
+ //
// Selector: setProperty(uint256,string,bytes) 1752d67b
function setProperty(
uint256 tokenId,
@@ -81,6 +94,11 @@
dummy = 0;
}
+ // @notice Delete token property value.
+ // @dev Throws error if `msg.sender` has no permission to edit the property.
+ // @param tokenId ID of the token.
+ // @param key Property key.
+ //
// Selector: deleteProperty(uint256,string) 066111d1
function deleteProperty(uint256 tokenId, string memory key) public {
require(false, stub_error);
@@ -89,7 +107,11 @@
dummy = 0;
}
- // Throws error if key not found
+ // @notice Get token property value.
+ // @dev Throws error if key not found
+ // @param tokenId ID of the token.
+ // @param key Property key.
+ // @return Property value bytes
//
// Selector: property(uint256,string) 7228c327
function property(uint256 tokenId, string memory key)
@@ -107,6 +129,11 @@
// Selector: 42966c68
contract ERC721Burnable is Dummy, ERC165 {
+ // @notice Burns a specific ERC721 token.
+ // @dev Throws unless `msg.sender` is the current NFT owner, or an authorized
+ // operator of the current owner.
+ // @param tokenId The NFT to approve
+ //
// Selector: burn(uint256) 42966c68
function burn(uint256 tokenId) public {
require(false, stub_error);
@@ -117,6 +144,12 @@
// Selector: 58800161
contract ERC721 is Dummy, ERC165, ERC721Events {
+ // @notice Count all NFTs assigned to an owner
+ // @dev NFTs assigned to the zero address are considered invalid, and this
+ // function throws for queries about the zero address.
+ // @param owner An address for whom to query the balance
+ // @return The number of NFTs owned by `owner`, possibly zero
+ //
// Selector: balanceOf(address) 70a08231
function balanceOf(address owner) public view returns (uint256) {
require(false, stub_error);
@@ -125,6 +158,12 @@
return 0;
}
+ // @notice Find the owner of an NFT
+ // @dev NFTs assigned to zero address are considered invalid, and queries
+ // about them do throw.
+ // @param tokenId The identifier for an NFT
+ // @return The address of the owner of the NFT
+ //
// Selector: ownerOf(uint256) 6352211e
function ownerOf(uint256 tokenId) public view returns (address) {
require(false, stub_error);
@@ -133,7 +172,7 @@
return 0x0000000000000000000000000000000000000000;
}
- // Not implemented
+ // @dev Not implemented
//
// Selector: safeTransferFromWithData(address,address,uint256,bytes) 60a11672
function safeTransferFromWithData(
@@ -150,7 +189,7 @@
dummy = 0;
}
- // Not implemented
+ // @dev Not implemented
//
// Selector: safeTransferFrom(address,address,uint256) 42842e0e
function safeTransferFrom(
@@ -165,6 +204,17 @@
dummy = 0;
}
+ // @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
+ // TO CONFIRM THAT `to` IS CAPABLE OF RECEIVING NFTS OR ELSE
+ // THEY MAY BE PERMANENTLY LOST
+ // @dev Throws unless `msg.sender` is the current owner or an authorized
+ // operator for this NFT. Throws if `from` is not the current owner. Throws
+ // if `to` is the zero address. Throws if `tokenId` is not a valid NFT.
+ // @param from The current owner of the NFT
+ // @param to The new owner
+ // @param tokenId The NFT to transfer
+ // @param _value Not used for an NFT
+ //
// Selector: transferFrom(address,address,uint256) 23b872dd
function transferFrom(
address from,
@@ -178,6 +228,13 @@
dummy = 0;
}
+ // @notice Set or reaffirm the approved address for an NFT
+ // @dev The zero address indicates there is no approved address.
+ // @dev Throws unless `msg.sender` is the current NFT owner, or an authorized
+ // operator of the current owner.
+ // @param approved The new approved NFT controller
+ // @param tokenId The NFT to approve
+ //
// Selector: approve(address,uint256) 095ea7b3
function approve(address approved, uint256 tokenId) public {
require(false, stub_error);
@@ -186,7 +243,7 @@
dummy = 0;
}
- // Not implemented
+ // @dev Not implemented
//
// Selector: setApprovalForAll(address,bool) a22cb465
function setApprovalForAll(address operator, bool approved) public {
@@ -196,7 +253,7 @@
dummy = 0;
}
- // Not implemented
+ // @dev Not implemented
//
// Selector: getApproved(uint256) 081812fc
function getApproved(uint256 tokenId) public view returns (address) {
@@ -206,7 +263,7 @@
return 0x0000000000000000000000000000000000000000;
}
- // Not implemented
+ // @dev Not implemented
//
// Selector: isApprovedForAll(address,address) e985e9c5
function isApprovedForAll(address owner, address operator)
@@ -224,6 +281,8 @@
// Selector: 5b5e139f
contract ERC721Metadata is Dummy, ERC165 {
+ // @notice A descriptive name for a collection of NFTs in this contract
+ //
// Selector: name() 06fdde03
function name() public view returns (string memory) {
require(false, stub_error);
@@ -231,6 +290,8 @@
return "";
}
+ // @notice An abbreviated name for NFTs in this contract
+ //
// Selector: symbol() 95d89b41
function symbol() public view returns (string memory) {
require(false, stub_error);
@@ -238,7 +299,11 @@
return "";
}
- // Returns token's const_metadata
+ // @notice A distinct Uniform Resource Identifier (URI) for a given asset.
+ // @dev Throws if `tokenId` is not a valid NFT. URIs are defined in RFC
+ // 3986. The URI may point to a JSON file that conforms to the "ERC721
+ // Metadata JSON Schema".
+ // @return token's const_metadata
//
// Selector: tokenURI(uint256) c87b56dd
function tokenURI(uint256 tokenId) public view returns (string memory) {
@@ -258,8 +323,11 @@
return false;
}
- // `token_id` should be obtained with `next_token_id` method,
- // unlike standard, you can't specify it manually
+ // @notice Function to mint token.
+ // @dev `tokenId` should be obtained with `nextTokenId` method,
+ // unlike standard, you can't specify it manually
+ // @param to The new owner
+ // @param tokenId ID of the minted NFT
//
// Selector: mint(address,uint256) 40c10f19
function mint(address to, uint256 tokenId) public returns (bool) {
@@ -270,8 +338,12 @@
return false;
}
- // `token_id` should be obtained with `next_token_id` method,
- // unlike standard, you can't specify it manually
+ // @notice Function to mint token with the given tokenUri.
+ // @dev `tokenId` should be obtained with `nextTokenId` method,
+ // unlike standard, you can't specify it manually
+ // @param to The new owner
+ // @param tokenId ID of the minted NFT
+ // @param tokenUri Token URI that would be stored in the NFT properties
//
// Selector: mintWithTokenURI(address,uint256,string) 50bb4e7f
function mintWithTokenURI(
@@ -287,7 +359,7 @@
return false;
}
- // Not implemented
+ // @dev Not implemented
//
// Selector: finishMinting() 7d64bcb4
function finishMinting() public returns (bool) {
@@ -299,6 +371,11 @@
// Selector: 780e9d63
contract ERC721Enumerable is Dummy, ERC165 {
+ // @notice Enumerate valid NFTs
+ // @param index A counter less than `totalSupply()`
+ // @return The token identifier for the `index`th NFT,
+ // (sort order not specified)
+ //
// Selector: tokenByIndex(uint256) 4f6ccce7
function tokenByIndex(uint256 index) public view returns (uint256) {
require(false, stub_error);
@@ -307,7 +384,7 @@
return 0;
}
- // Not implemented
+ // @dev Not implemented
//
// Selector: tokenOfOwnerByIndex(address,uint256) 2f745c59
function tokenOfOwnerByIndex(address owner, uint256 index)
@@ -322,6 +399,10 @@
return 0;
}
+ // @notice Count NFTs tracked by this contract
+ // @return A count of valid NFTs tracked by this contract, where each one of
+ // them has an assigned and queryable owner not equal to the zero address
+ //
// Selector: totalSupply() 18160ddd
function totalSupply() public view returns (uint256) {
require(false, stub_error);
@@ -332,6 +413,11 @@
// Selector: 7d9262e6
contract Collection is Dummy, ERC165 {
+ // Set collection property.
+ //
+ // @param key Property key.
+ // @param value Propery value.
+ //
// Selector: setCollectionProperty(string,bytes) 2f073f66
function setCollectionProperty(string memory key, bytes memory value)
public
@@ -342,6 +428,10 @@
dummy = 0;
}
+ // Delete collection property.
+ //
+ // @param key Property key.
+ //
// Selector: deleteCollectionProperty(string) 7b7debce
function deleteCollectionProperty(string memory key) public {
require(false, stub_error);
@@ -349,8 +439,13 @@
dummy = 0;
}
- // Throws error if key not found
+ // Get collection property.
+ //
+ // @dev Throws error if key not found.
//
+ // @param key Property key.
+ // @return bytes The property corresponding to the key.
+ //
// Selector: collectionProperty(string) cf24fd6d
function collectionProperty(string memory key)
public
@@ -363,6 +458,12 @@
return hex"";
}
+ // Set the sponsor of the collection.
+ //
+ // @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
+ //
+ // @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.
+ //
// Selector: setCollectionSponsor(address) 7623402e
function setCollectionSponsor(address sponsor) public {
require(false, stub_error);
@@ -370,12 +471,27 @@
dummy = 0;
}
+ // Collection sponsorship confirmation.
+ //
+ // @dev After setting the sponsor for the collection, it must be confirmed with this function.
+ //
// Selector: confirmCollectionSponsorship() 3c50e97a
function confirmCollectionSponsorship() public {
require(false, stub_error);
dummy = 0;
}
+ // Set limits for the collection.
+ // @dev Throws error if limit not found.
+ // @param limit Name of the limit. Valid names:
+ // "accountTokenOwnershipLimit",
+ // "sponsoredDataSize",
+ // "sponsoredDataRateLimit",
+ // "tokenLimit",
+ // "sponsorTransferTimeout",
+ // "sponsorApproveTimeout"
+ // @param value Value of the limit.
+ //
// Selector: setCollectionLimit(string,uint32) 6a3841db
function setCollectionLimit(string memory limit, uint32 value) public {
require(false, stub_error);
@@ -384,6 +500,14 @@
dummy = 0;
}
+ // Set limits for the collection.
+ // @dev Throws error if limit not found.
+ // @param limit Name of the limit. Valid names:
+ // "ownerCanTransfer",
+ // "ownerCanDestroy",
+ // "transfersEnabled"
+ // @param value Value of the limit.
+ //
// Selector: setCollectionLimit(string,bool) 993b7fba
function setCollectionLimit(string memory limit, bool value) public {
require(false, stub_error);
@@ -392,6 +516,8 @@
dummy = 0;
}
+ // Get contract address.
+ //
// Selector: contractAddress() f6b4dfb4
function contractAddress() public view returns (address) {
require(false, stub_error);
@@ -399,34 +525,51 @@
return 0x0000000000000000000000000000000000000000;
}
+ // Add collection admin by substrate address.
+ // @param new_admin Substrate administrator address.
+ //
// Selector: addCollectionAdminSubstrate(uint256) 5730062b
- function addCollectionAdminSubstrate(uint256 newAdmin) public view {
+ function addCollectionAdminSubstrate(uint256 newAdmin) public {
require(false, stub_error);
newAdmin;
- dummy;
+ dummy = 0;
}
+ // Remove collection admin by substrate address.
+ // @param admin Substrate administrator address.
+ //
// Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9
- function removeCollectionAdminSubstrate(uint256 newAdmin) public view {
+ function removeCollectionAdminSubstrate(uint256 admin) public {
require(false, stub_error);
- newAdmin;
- dummy;
+ admin;
+ dummy = 0;
}
+ // Add collection admin.
+ // @param new_admin Address of the added administrator.
+ //
// Selector: addCollectionAdmin(address) 92e462c7
- function addCollectionAdmin(address newAdmin) public view {
+ function addCollectionAdmin(address newAdmin) public {
require(false, stub_error);
newAdmin;
- dummy;
+ dummy = 0;
}
+ // Remove collection admin.
+ //
+ // @param new_admin Address of the removed administrator.
+ //
// Selector: removeCollectionAdmin(address) fafd7b42
- function removeCollectionAdmin(address admin) public view {
+ function removeCollectionAdmin(address admin) public {
require(false, stub_error);
admin;
- dummy;
+ dummy = 0;
}
+ // Toggle accessibility of collection nesting.
+ //
+ // @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'
+ //
// Selector: setCollectionNesting(bool) 112d4586
function setCollectionNesting(bool enable) public {
require(false, stub_error);
@@ -434,6 +577,11 @@
dummy = 0;
}
+ // Toggle accessibility of collection nesting.
+ //
+ // @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'
+ // @param collections Addresses of collections that will be available for nesting.
+ //
// Selector: setCollectionNesting(bool,address[]) 64872396
function setCollectionNesting(bool enable, address[] memory collections)
public
@@ -444,6 +592,11 @@
dummy = 0;
}
+ // Set the collection access method.
+ // @param mode Access mode
+ // 0 for Normal
+ // 1 for AllowList
+ //
// Selector: setCollectionAccess(uint8) 41835d4c
function setCollectionAccess(uint8 mode) public {
require(false, stub_error);
@@ -451,20 +604,32 @@
dummy = 0;
}
+ // Add the user to the allowed list.
+ //
+ // @param user Address of a trusted user.
+ //
// Selector: addToCollectionAllowList(address) 67844fe6
- function addToCollectionAllowList(address user) public view {
+ function addToCollectionAllowList(address user) public {
require(false, stub_error);
user;
- dummy;
+ dummy = 0;
}
+ // Remove the user from the allowed list.
+ //
+ // @param user Address of a removed user.
+ //
// Selector: removeFromCollectionAllowList(address) 85c51acb
- function removeFromCollectionAllowList(address user) public view {
+ function removeFromCollectionAllowList(address user) public {
require(false, stub_error);
user;
- dummy;
+ dummy = 0;
}
+ // Switch permission for minting.
+ //
+ // @param mode Enable if "true".
+ //
// Selector: setCollectionMintMode(bool) 00018e84
function setCollectionMintMode(bool mode) public {
require(false, stub_error);
@@ -475,6 +640,13 @@
// Selector: d74d154f
contract ERC721UniqueExtensions is Dummy, ERC165 {
+ // @notice Transfer ownership of an NFT
+ // @dev Throws unless `msg.sender` is the current owner. Throws if `to`
+ // is the zero address. Throws if `tokenId` is not a valid NFT.
+ // @param to The new owner
+ // @param tokenId The NFT to transfer
+ // @param _value Not used for an NFT
+ //
// Selector: transfer(address,uint256) a9059cbb
function transfer(address to, uint256 tokenId) public {
require(false, stub_error);
@@ -483,6 +655,14 @@
dummy = 0;
}
+ // @notice Burns a specific ERC721 token.
+ // @dev Throws unless `msg.sender` is the current owner or an authorized
+ // operator for this NFT. Throws if `from` is not the current owner. Throws
+ // if `to` is the zero address. Throws if `tokenId` is not a valid NFT.
+ // @param from The current owner of the NFT
+ // @param tokenId The NFT to transfer
+ // @param _value Not used for an NFT
+ //
// Selector: burnFrom(address,uint256) 79cc6790
function burnFrom(address from, uint256 tokenId) public {
require(false, stub_error);
@@ -491,6 +671,8 @@
dummy = 0;
}
+ // @notice Returns next free NFT ID.
+ //
// Selector: nextTokenId() 75794a3c
function nextTokenId() public view returns (uint256) {
require(false, stub_error);
@@ -498,6 +680,12 @@
return 0;
}
+ // @notice Function to mint multiple tokens.
+ // @dev `tokenIds` should be an array of consecutive numbers and first number
+ // should be obtained with `nextTokenId` method
+ // @param to The new owner
+ // @param tokenIds IDs of the minted NFTs
+ //
// Selector: mintBulk(address,uint256[]) 44a9945e
function mintBulk(address to, uint256[] memory tokenIds)
public
@@ -510,6 +698,12 @@
return false;
}
+ // @notice Function to mint multiple tokens with the given tokenUris.
+ // @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive
+ // numbers and first number should be obtained with `nextTokenId` method
+ // @param to The new owner
+ // @param tokens array of pairs of token ID and token URI for minted tokens
+ //
// Selector: mintBulkWithTokenURI(address,(uint256,string)[]) 36543006
function mintBulkWithTokenURI(address to, Tuple0[] memory tokens)
public
pallets/nonfungible/src/weights.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/weights.rs
+++ b/pallets/nonfungible/src/weights.rs
@@ -3,7 +3,7 @@
//! Autogenerated weights for pallet_nonfungible
//!
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2022-06-15, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! DATE: 2022-07-20, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024
// Executed Command:
@@ -56,7 +56,7 @@
// Storage: Nonfungible TokenData (r:0 w:1)
// Storage: Nonfungible Owned (r:0 w:1)
fn create_item() -> Weight {
- (24_135_000 as Weight)
+ (20_328_000 as Weight)
.saturating_add(T::DbWeight::get().reads(2 as Weight))
.saturating_add(T::DbWeight::get().writes(4 as Weight))
}
@@ -65,9 +65,9 @@
// Storage: Nonfungible TokenData (r:0 w:4)
// Storage: Nonfungible Owned (r:0 w:4)
fn create_multiple_items(b: u32, ) -> Weight {
- (21_952_000 as Weight)
- // Standard Error: 5_000
- .saturating_add((4_727_000 as Weight).saturating_mul(b as Weight))
+ (10_134_000 as Weight)
+ // Standard Error: 3_000
+ .saturating_add((4_927_000 as Weight).saturating_mul(b as Weight))
.saturating_add(T::DbWeight::get().reads(2 as Weight))
.saturating_add(T::DbWeight::get().writes(2 as Weight))
.saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(b as Weight)))
@@ -77,9 +77,9 @@
// Storage: Nonfungible TokenData (r:0 w:4)
// Storage: Nonfungible Owned (r:0 w:4)
fn create_multiple_items_ex(b: u32, ) -> Weight {
- (10_432_000 as Weight)
- // Standard Error: 6_000
- .saturating_add((7_383_000 as Weight).saturating_mul(b as Weight))
+ (5_710_000 as Weight)
+ // Standard Error: 4_000
+ .saturating_add((7_578_000 as Weight).saturating_mul(b as Weight))
.saturating_add(T::DbWeight::get().reads(1 as Weight))
.saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
.saturating_add(T::DbWeight::get().writes(1 as Weight))
@@ -93,7 +93,7 @@
// Storage: Nonfungible Owned (r:0 w:1)
// Storage: Nonfungible TokenProperties (r:0 w:1)
fn burn_item() -> Weight {
- (29_798_000 as Weight)
+ (28_433_000 as Weight)
.saturating_add(T::DbWeight::get().reads(5 as Weight))
.saturating_add(T::DbWeight::get().writes(5 as Weight))
}
@@ -105,7 +105,7 @@
// Storage: Nonfungible Owned (r:0 w:1)
// Storage: Nonfungible TokenProperties (r:0 w:1)
fn burn_recursively_self_raw() -> Weight {
- (37_955_000 as Weight)
+ (34_435_000 as Weight)
.saturating_add(T::DbWeight::get().reads(5 as Weight))
.saturating_add(T::DbWeight::get().writes(5 as Weight))
}
@@ -119,8 +119,8 @@
// Storage: Common CollectionById (r:1 w:0)
fn burn_recursively_breadth_plus_self_plus_self_per_each_raw(b: u32, ) -> Weight {
(0 as Weight)
- // Standard Error: 1_349_000
- .saturating_add((275_145_000 as Weight).saturating_mul(b as Weight))
+ // Standard Error: 1_539_000
+ .saturating_add((304_456_000 as Weight).saturating_mul(b as Weight))
.saturating_add(T::DbWeight::get().reads(7 as Weight))
.saturating_add(T::DbWeight::get().reads((4 as Weight).saturating_mul(b as Weight)))
.saturating_add(T::DbWeight::get().writes(6 as Weight))
@@ -131,14 +131,14 @@
// Storage: Nonfungible Allowance (r:1 w:0)
// Storage: Nonfungible Owned (r:0 w:2)
fn transfer() -> Weight {
- (27_867_000 as Weight)
+ (24_376_000 as Weight)
.saturating_add(T::DbWeight::get().reads(4 as Weight))
.saturating_add(T::DbWeight::get().writes(5 as Weight))
}
// Storage: Nonfungible TokenData (r:1 w:0)
// Storage: Nonfungible Allowance (r:1 w:1)
fn approve() -> Weight {
- (18_824_000 as Weight)
+ (15_890_000 as Weight)
.saturating_add(T::DbWeight::get().reads(2 as Weight))
.saturating_add(T::DbWeight::get().writes(1 as Weight))
}
@@ -147,7 +147,7 @@
// Storage: Nonfungible AccountBalance (r:2 w:2)
// Storage: Nonfungible Owned (r:0 w:2)
fn transfer_from() -> Weight {
- (32_879_000 as Weight)
+ (28_634_000 as Weight)
.saturating_add(T::DbWeight::get().reads(4 as Weight))
.saturating_add(T::DbWeight::get().writes(6 as Weight))
}
@@ -159,7 +159,7 @@
// Storage: Nonfungible Owned (r:0 w:1)
// Storage: Nonfungible TokenProperties (r:0 w:1)
fn burn_from() -> Weight {
- (37_061_000 as Weight)
+ (32_201_000 as Weight)
.saturating_add(T::DbWeight::get().reads(5 as Weight))
.saturating_add(T::DbWeight::get().writes(6 as Weight))
}
@@ -167,28 +167,26 @@
fn set_token_property_permissions(b: u32, ) -> Weight {
(0 as Weight)
// Standard Error: 57_000
- .saturating_add((15_149_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add((15_232_000 as Weight).saturating_mul(b as Weight))
.saturating_add(T::DbWeight::get().reads(1 as Weight))
.saturating_add(T::DbWeight::get().writes(1 as Weight))
}
// Storage: Common CollectionPropertyPermissions (r:1 w:0)
- // Storage: Nonfungible TokenData (r:1 w:0)
// Storage: Nonfungible TokenProperties (r:1 w:1)
fn set_token_properties(b: u32, ) -> Weight {
(0 as Weight)
- // Standard Error: 2_278_000
- .saturating_add((409_613_000 as Weight).saturating_mul(b as Weight))
- .saturating_add(T::DbWeight::get().reads(3 as Weight))
+ // Standard Error: 1_648_000
+ .saturating_add((288_654_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add(T::DbWeight::get().reads(2 as Weight))
.saturating_add(T::DbWeight::get().writes(1 as Weight))
}
// Storage: Common CollectionPropertyPermissions (r:1 w:0)
- // Storage: Nonfungible TokenData (r:1 w:0)
// Storage: Nonfungible TokenProperties (r:1 w:1)
fn delete_token_properties(b: u32, ) -> Weight {
(0 as Weight)
- // Standard Error: 2_234_000
- .saturating_add((408_185_000 as Weight).saturating_mul(b as Weight))
- .saturating_add(T::DbWeight::get().reads(3 as Weight))
+ // Standard Error: 1_632_000
+ .saturating_add((289_190_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add(T::DbWeight::get().reads(2 as Weight))
.saturating_add(T::DbWeight::get().writes(1 as Weight))
}
}
@@ -200,7 +198,7 @@
// Storage: Nonfungible TokenData (r:0 w:1)
// Storage: Nonfungible Owned (r:0 w:1)
fn create_item() -> Weight {
- (24_135_000 as Weight)
+ (20_328_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(2 as Weight))
.saturating_add(RocksDbWeight::get().writes(4 as Weight))
}
@@ -209,9 +207,9 @@
// Storage: Nonfungible TokenData (r:0 w:4)
// Storage: Nonfungible Owned (r:0 w:4)
fn create_multiple_items(b: u32, ) -> Weight {
- (21_952_000 as Weight)
- // Standard Error: 5_000
- .saturating_add((4_727_000 as Weight).saturating_mul(b as Weight))
+ (10_134_000 as Weight)
+ // Standard Error: 3_000
+ .saturating_add((4_927_000 as Weight).saturating_mul(b as Weight))
.saturating_add(RocksDbWeight::get().reads(2 as Weight))
.saturating_add(RocksDbWeight::get().writes(2 as Weight))
.saturating_add(RocksDbWeight::get().writes((2 as Weight).saturating_mul(b as Weight)))
@@ -221,9 +219,9 @@
// Storage: Nonfungible TokenData (r:0 w:4)
// Storage: Nonfungible Owned (r:0 w:4)
fn create_multiple_items_ex(b: u32, ) -> Weight {
- (10_432_000 as Weight)
- // Standard Error: 6_000
- .saturating_add((7_383_000 as Weight).saturating_mul(b as Weight))
+ (5_710_000 as Weight)
+ // Standard Error: 4_000
+ .saturating_add((7_578_000 as Weight).saturating_mul(b as Weight))
.saturating_add(RocksDbWeight::get().reads(1 as Weight))
.saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
.saturating_add(RocksDbWeight::get().writes(1 as Weight))
@@ -237,7 +235,7 @@
// Storage: Nonfungible Owned (r:0 w:1)
// Storage: Nonfungible TokenProperties (r:0 w:1)
fn burn_item() -> Weight {
- (29_798_000 as Weight)
+ (28_433_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(5 as Weight))
.saturating_add(RocksDbWeight::get().writes(5 as Weight))
}
@@ -249,7 +247,7 @@
// Storage: Nonfungible Owned (r:0 w:1)
// Storage: Nonfungible TokenProperties (r:0 w:1)
fn burn_recursively_self_raw() -> Weight {
- (37_955_000 as Weight)
+ (34_435_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(5 as Weight))
.saturating_add(RocksDbWeight::get().writes(5 as Weight))
}
@@ -263,8 +261,8 @@
// Storage: Common CollectionById (r:1 w:0)
fn burn_recursively_breadth_plus_self_plus_self_per_each_raw(b: u32, ) -> Weight {
(0 as Weight)
- // Standard Error: 1_349_000
- .saturating_add((275_145_000 as Weight).saturating_mul(b as Weight))
+ // Standard Error: 1_539_000
+ .saturating_add((304_456_000 as Weight).saturating_mul(b as Weight))
.saturating_add(RocksDbWeight::get().reads(7 as Weight))
.saturating_add(RocksDbWeight::get().reads((4 as Weight).saturating_mul(b as Weight)))
.saturating_add(RocksDbWeight::get().writes(6 as Weight))
@@ -275,14 +273,14 @@
// Storage: Nonfungible Allowance (r:1 w:0)
// Storage: Nonfungible Owned (r:0 w:2)
fn transfer() -> Weight {
- (27_867_000 as Weight)
+ (24_376_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(4 as Weight))
.saturating_add(RocksDbWeight::get().writes(5 as Weight))
}
// Storage: Nonfungible TokenData (r:1 w:0)
// Storage: Nonfungible Allowance (r:1 w:1)
fn approve() -> Weight {
- (18_824_000 as Weight)
+ (15_890_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(2 as Weight))
.saturating_add(RocksDbWeight::get().writes(1 as Weight))
}
@@ -291,7 +289,7 @@
// Storage: Nonfungible AccountBalance (r:2 w:2)
// Storage: Nonfungible Owned (r:0 w:2)
fn transfer_from() -> Weight {
- (32_879_000 as Weight)
+ (28_634_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(4 as Weight))
.saturating_add(RocksDbWeight::get().writes(6 as Weight))
}
@@ -303,7 +301,7 @@
// Storage: Nonfungible Owned (r:0 w:1)
// Storage: Nonfungible TokenProperties (r:0 w:1)
fn burn_from() -> Weight {
- (37_061_000 as Weight)
+ (32_201_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(5 as Weight))
.saturating_add(RocksDbWeight::get().writes(6 as Weight))
}
@@ -311,28 +309,26 @@
fn set_token_property_permissions(b: u32, ) -> Weight {
(0 as Weight)
// Standard Error: 57_000
- .saturating_add((15_149_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add((15_232_000 as Weight).saturating_mul(b as Weight))
.saturating_add(RocksDbWeight::get().reads(1 as Weight))
.saturating_add(RocksDbWeight::get().writes(1 as Weight))
}
// Storage: Common CollectionPropertyPermissions (r:1 w:0)
- // Storage: Nonfungible TokenData (r:1 w:0)
// Storage: Nonfungible TokenProperties (r:1 w:1)
fn set_token_properties(b: u32, ) -> Weight {
(0 as Weight)
- // Standard Error: 2_278_000
- .saturating_add((409_613_000 as Weight).saturating_mul(b as Weight))
- .saturating_add(RocksDbWeight::get().reads(3 as Weight))
+ // Standard Error: 1_648_000
+ .saturating_add((288_654_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add(RocksDbWeight::get().reads(2 as Weight))
.saturating_add(RocksDbWeight::get().writes(1 as Weight))
}
// Storage: Common CollectionPropertyPermissions (r:1 w:0)
- // Storage: Nonfungible TokenData (r:1 w:0)
// Storage: Nonfungible TokenProperties (r:1 w:1)
fn delete_token_properties(b: u32, ) -> Weight {
(0 as Weight)
- // Standard Error: 2_234_000
- .saturating_add((408_185_000 as Weight).saturating_mul(b as Weight))
- .saturating_add(RocksDbWeight::get().reads(3 as Weight))
+ // Standard Error: 1_632_000
+ .saturating_add((289_190_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add(RocksDbWeight::get().reads(2 as Weight))
.saturating_add(RocksDbWeight::get().writes(1 as Weight))
}
}
pallets/refungible/Cargo.tomldiffbeforeafterboth--- a/pallets/refungible/Cargo.toml
+++ b/pallets/refungible/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "pallet-refungible"
-version = "0.1.0"
+version = "0.1.1"
license = "GPLv3"
edition = "2021"
pallets/refungible/Changelog.mddiffbeforeafterboth--- /dev/null
+++ b/pallets/refungible/Changelog.md
@@ -0,0 +1,3 @@
+### 0.1.1
+---
+* Added support for properties for RFT collections and tokens.
pallets/refungible/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/refungible/src/benchmarking.rs
+++ b/pallets/refungible/src/benchmarking.rs
@@ -18,9 +18,12 @@
use crate::{Pallet, Config, RefungibleHandle};
use sp_std::prelude::*;
-use pallet_common::benchmarking::{create_collection_raw, create_data};
+use pallet_common::benchmarking::{create_collection_raw, property_key, property_value, create_data};
use frame_benchmarking::{benchmarks, account};
-use up_data_structs::{CollectionMode, MAX_ITEMS_PER_BATCH, CUSTOM_DATA_LIMIT, budget::Unlimited};
+use up_data_structs::{
+ CollectionMode, MAX_ITEMS_PER_BATCH, MAX_PROPERTIES_PER_ITEM, CUSTOM_DATA_LIMIT,
+ budget::Unlimited,
+};
use pallet_common::bench_init;
use core::convert::TryInto;
use core::iter::IntoIterator;
@@ -38,6 +41,7 @@
.collect::<BTreeMap<_, _>>()
.try_into()
.unwrap(),
+ properties: Default::default(),
}
}
fn create_max_item<T: Config>(
@@ -204,6 +208,68 @@
<Pallet<T>>::set_allowance(&collection, &sender, &burner, item, 200)?;
}: {<Pallet<T>>::burn_from(&collection, &burner, &sender, item, 200, &Unlimited)?}
+ set_token_property_permissions {
+ let b in 0..MAX_PROPERTIES_PER_ITEM;
+ bench_init!{
+ owner: sub; collection: collection(owner);
+ owner: cross_from_sub;
+ };
+ let perms = (0..b).map(|k| PropertyKeyPermission {
+ key: property_key(k as usize),
+ permission: PropertyPermission {
+ mutable: false,
+ collection_admin: false,
+ token_owner: false,
+ },
+ }).collect::<Vec<_>>();
+ }: {<Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?}
+
+ set_token_properties {
+ let b in 0..MAX_PROPERTIES_PER_ITEM;
+ bench_init!{
+ owner: sub; collection: collection(owner);
+ owner: cross_from_sub;
+ };
+ let perms = (0..b).map(|k| PropertyKeyPermission {
+ key: property_key(k as usize),
+ permission: PropertyPermission {
+ mutable: false,
+ collection_admin: true,
+ token_owner: true,
+ },
+ }).collect::<Vec<_>>();
+ <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;
+ let props = (0..b).map(|k| Property {
+ key: property_key(k as usize),
+ value: property_value(),
+ }).collect::<Vec<_>>();
+ let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?;
+ }: {<Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), false, &Unlimited)?}
+
+ delete_token_properties {
+ let b in 0..MAX_PROPERTIES_PER_ITEM;
+ bench_init!{
+ owner: sub; collection: collection(owner);
+ owner: cross_from_sub;
+ };
+ let perms = (0..b).map(|k| PropertyKeyPermission {
+ key: property_key(k as usize),
+ permission: PropertyPermission {
+ mutable: true,
+ collection_admin: true,
+ token_owner: true,
+ },
+ }).collect::<Vec<_>>();
+ <Pallet<T>>::set_token_property_permissions(&collection, &owner, perms)?;
+ let props = (0..b).map(|k| Property {
+ key: property_key(k as usize),
+ value: property_value(),
+ }).collect::<Vec<_>>();
+ let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?;
+ <Pallet<T>>::set_token_properties(&collection, &owner, item, props.into_iter(), false, &Unlimited)?;
+ let to_delete = (0..b).map(|k| property_key(k as usize)).collect::<Vec<_>>();
+ }: {<Pallet<T>>::delete_token_properties(&collection, &owner, item, to_delete.into_iter(), &Unlimited)?}
+
repartition_item {
bench_init!{
owner: sub; collection: collection(owner);
pallets/refungible/src/common.rsdiffbeforeafterboth--- a/pallets/refungible/src/common.rs
+++ b/pallets/refungible/src/common.rs
@@ -20,9 +20,12 @@
use frame_support::{dispatch::DispatchResultWithPostInfo, ensure, fail, weights::Weight, traits::Get};
use up_data_structs::{
CollectionId, TokenId, CreateItemExData, CreateRefungibleExData, budget::Budget, Property,
- PropertyKey, PropertyValue, PropertyKeyPermission, CreateItemData,
+ PropertyKey, PropertyValue, PropertyKeyPermission, CreateItemData, CollectionPropertiesVec,
};
-use pallet_common::{CommonCollectionOperations, CommonWeightInfo, RefungibleExtensions, with_weight};
+use pallet_common::{
+ CommonCollectionOperations, CommonWeightInfo, RefungibleExtensions, with_weight,
+ weights::WeightInfo as _,
+};
use pallet_structure::Error as StructureError;
use sp_runtime::{DispatchError};
use sp_std::{vec::Vec, vec};
@@ -41,6 +44,14 @@
};
}
+fn properties_weight<T: Config>(properties: &CollectionPropertiesVec) -> u64 {
+ if properties.len() > 0 {
+ <CommonWeights<T>>::set_token_properties(properties.len() as u32)
+ } else {
+ 0
+ }
+}
+
pub struct CommonWeights<T: Config>(PhantomData<T>);
impl<T: Config> CommonWeightInfo<T::CrossAccountId> for CommonWeights<T> {
fn create_item() -> Weight {
@@ -48,16 +59,31 @@
}
fn create_multiple_items(data: &[CreateItemData]) -> Weight {
- <SelfWeightOf<T>>::create_multiple_items(data.len() as u32)
+ <SelfWeightOf<T>>::create_multiple_items(data.len() as u32).saturating_add(
+ data.iter()
+ .map(|data| match data {
+ CreateItemData::ReFungible(rft_data) => {
+ properties_weight::<T>(&rft_data.properties)
+ }
+ _ => 0,
+ })
+ .fold(0, |a, b| a.saturating_add(b)),
+ )
}
fn create_multiple_items_ex(call: &CreateItemExData<T::CrossAccountId>) -> Weight {
match call {
CreateItemExData::RefungibleMultipleOwners(i) => {
<SelfWeightOf<T>>::create_multiple_items_ex_multiple_owners(i.users.len() as u32)
+ .saturating_add(properties_weight::<T>(&i.properties))
}
CreateItemExData::RefungibleMultipleItems(i) => {
<SelfWeightOf<T>>::create_multiple_items_ex_multiple_items(i.len() as u32)
+ .saturating_add(
+ i.iter()
+ .map(|d| properties_weight::<T>(&d.properties))
+ .fold(0, |a, b| a.saturating_add(b)),
+ )
}
_ => 0,
}
@@ -67,29 +93,24 @@
max_weight_of!(burn_item_partial(), burn_item_fully())
}
- fn set_collection_properties(_amount: u32) -> Weight {
- // Error
- 0
+ fn set_collection_properties(amount: u32) -> Weight {
+ <pallet_common::SelfWeightOf<T>>::set_collection_properties(amount)
}
- fn delete_collection_properties(_amount: u32) -> Weight {
- // Error
- 0
+ fn delete_collection_properties(amount: u32) -> Weight {
+ <pallet_common::SelfWeightOf<T>>::delete_collection_properties(amount)
}
- fn set_token_properties(_amount: u32) -> Weight {
- // Error
- 0
+ fn set_token_properties(amount: u32) -> Weight {
+ <SelfWeightOf<T>>::set_token_properties(amount)
}
- fn delete_token_properties(_amount: u32) -> Weight {
- // Error
- 0
+ fn delete_token_properties(amount: u32) -> Weight {
+ <SelfWeightOf<T>>::delete_token_properties(amount)
}
- fn set_token_property_permissions(_amount: u32) -> Weight {
- // Error
- 0
+ fn set_token_property_permissions(amount: u32) -> Weight {
+ <SelfWeightOf<T>>::set_token_property_permissions(amount)
}
fn transfer() -> Weight {
@@ -140,11 +161,14 @@
out.insert(to.clone(), data.pieces);
out.try_into().expect("limit > 0")
},
+ properties: data.properties,
}),
_ => fail!(<Error<T>>::NotRefungibleDataUsedToMintFungibleCollectionToken),
}
}
+/// Implementation of `CommonCollectionOperations` for `RefungibleHandle`. It wraps Refungible Pallete
+/// methods and adds weight info.
impl<T: Config> CommonCollectionOperations<T> for RefungibleHandle<T> {
fn create_item(
&self,
@@ -295,46 +319,85 @@
fn set_collection_properties(
&self,
- _sender: T::CrossAccountId,
- _property: Vec<Property>,
+ sender: T::CrossAccountId,
+ properties: Vec<Property>,
) -> DispatchResultWithPostInfo {
- fail!(<Error<T>>::SettingPropertiesNotAllowed)
+ let weight = <CommonWeights<T>>::set_collection_properties(properties.len() as u32);
+
+ with_weight(
+ <Pallet<T>>::set_collection_properties(self, &sender, properties),
+ weight,
+ )
}
fn delete_collection_properties(
&self,
- _sender: &T::CrossAccountId,
- _property_keys: Vec<PropertyKey>,
+ sender: &T::CrossAccountId,
+ property_keys: Vec<PropertyKey>,
) -> DispatchResultWithPostInfo {
- fail!(<Error<T>>::SettingPropertiesNotAllowed)
+ let weight = <CommonWeights<T>>::delete_collection_properties(property_keys.len() as u32);
+
+ with_weight(
+ <Pallet<T>>::delete_collection_properties(self, sender, property_keys),
+ weight,
+ )
}
fn set_token_properties(
&self,
- _sender: T::CrossAccountId,
- _token_id: TokenId,
- _property: Vec<Property>,
- _nesting_budget: &dyn Budget,
+ sender: T::CrossAccountId,
+ token_id: TokenId,
+ properties: Vec<Property>,
+ nesting_budget: &dyn Budget,
) -> DispatchResultWithPostInfo {
- fail!(<Error<T>>::SettingPropertiesNotAllowed)
+ let weight = <CommonWeights<T>>::set_token_properties(properties.len() as u32);
+
+ with_weight(
+ <Pallet<T>>::set_token_properties(
+ self,
+ &sender,
+ token_id,
+ properties.into_iter(),
+ false,
+ nesting_budget,
+ ),
+ weight,
+ )
}
fn set_token_property_permissions(
&self,
- _sender: &T::CrossAccountId,
- _property_permissions: Vec<PropertyKeyPermission>,
+ sender: &T::CrossAccountId,
+ property_permissions: Vec<PropertyKeyPermission>,
) -> DispatchResultWithPostInfo {
- fail!(<Error<T>>::SettingPropertiesNotAllowed)
+ let weight =
+ <CommonWeights<T>>::set_token_property_permissions(property_permissions.len() as u32);
+
+ with_weight(
+ <Pallet<T>>::set_token_property_permissions(self, sender, property_permissions),
+ weight,
+ )
}
fn delete_token_properties(
&self,
- _sender: T::CrossAccountId,
- _token_id: TokenId,
- _property_keys: Vec<PropertyKey>,
- _nesting_budget: &dyn Budget,
+ sender: T::CrossAccountId,
+ token_id: TokenId,
+ property_keys: Vec<PropertyKey>,
+ nesting_budget: &dyn Budget,
) -> DispatchResultWithPostInfo {
- fail!(<Error<T>>::SettingPropertiesNotAllowed)
+ let weight = <CommonWeights<T>>::delete_token_properties(property_keys.len() as u32);
+
+ with_weight(
+ <Pallet<T>>::delete_token_properties(
+ self,
+ &sender,
+ token_id,
+ property_keys.into_iter(),
+ nesting_budget,
+ ),
+ weight,
+ )
}
fn check_nesting(
@@ -371,8 +434,8 @@
TokenId(<TokensMinted<T>>::get(self.id))
}
- fn token_owner(&self, _token: TokenId) -> Option<T::CrossAccountId> {
- None
+ fn token_owner(&self, token: TokenId) -> Option<T::CrossAccountId> {
+ <Pallet<T>>::token_owner(self.id, token)
}
fn token_property(&self, _token_id: TokenId, _key: &PropertyKey) -> Option<PropertyValue> {
pallets/refungible/src/lib.rsdiffbeforeafterboth--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -14,17 +14,93 @@
// You should have received a copy of the GNU General Public License
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+//! # Refungible Pallet
+//!
+//! The Refungible pallet provides functionality for handling refungible collections and tokens.
+//!
+//! - [`Config`]
+//! - [`RefungibleHandle`]
+//! - [`Pallet`]
+//! - [`CommonWeights`]
+//!
+//! ## Overview
+//!
+//! The Refungible pallet provides functions for:
+//!
+//! - RFT collection creation and removal
+//! - Minting and burning of RFT tokens
+//! - Partition and repartition of RFT tokens
+//! - Retrieving number of pieces of RFT token
+//! - Retrieving account balances
+//! - Transfering RFT token pieces
+//! - Burning RFT token pieces
+//! - Setting and checking allowance for RFT tokens
+//!
+//! ### Terminology
+//!
+//! - **RFT token:** Non fungible token that was partitioned to pieces. If an account owns all
+//! of the RFT token pieces than it owns the RFT token and can repartition it.
+//!
+//! - **RFT Collection:** A collection of RFT tokens. All RFT tokens are part of a collection.
+//! Each collection has its own settings and set of permissions.
+//!
+//! - **RFT token piece:** A fungible part of an RFT token.
+//!
+//! - **Balance:** RFT token pieces owned by an account
+//!
+//! - **Allowance:** Maximum number of RFT token pieces that one account is allowed to
+//! transfer from the balance of another account
+//!
+//! - **Burning:** The process of “deleting” a token from a collection or removing token pieces from
+//! an account balance.
+//!
+//! ### Implementations
+//!
+//! The Refungible pallet provides implementations for the following traits. If these traits provide
+//! the functionality that you need, then you can avoid coupling with the Refungible pallet.
+//!
+//! - [`CommonWeightInfo`](pallet_common::CommonWeightInfo): Functions for retrieval of transaction weight
+//! - [`CommonCollectionOperations`](pallet_common::CommonCollectionOperations): Functions for dealing
+//! with collections
+//! - [`RefungibleExtensions`](pallet_common::RefungibleExtensions): Functions specific for refungible
+//! collection
+//!
+//! ## Interface
+//!
+//! ### Dispatchable Functions
+//!
+//! - `init_collection` - Create RFT collection. RFT collection can be configured to allow or deny access for
+//! some accounts.
+//! - `destroy_collection` - Destroy exising RFT collection. There should be no tokens in the collection.
+//! - `burn` - Burn some amount of RFT token pieces owned by account. Burns the RFT token if no pieces left.
+//! - `transfer` - Transfer some amount of RFT token pieces. Transfers should be enabled for RFT collection.
+//! Nests the RFT token if RFT token pieces are sent to another token.
+//! - `create_item` - Mint RFT token in collection. Sender should have permission to mint tokens.
+//! - `set_allowance` - Set allowance for another account to transfer balance from sender's account.
+//! - `repartition` - Repartition token to selected number of pieces. Sender should own all existing pieces.
+//!
+//! ## Assumptions
+//!
+//! * Total number of pieces for one token shouldn't exceed `up_data_structs::MAX_REFUNGIBLE_PIECES`.
+//! * Total number of tokens of all types shouldn't be greater than `up_data_structs::MAX_TOKEN_PREFIX_LENGTH`.
+//! * Sender should be in collection's allow list to perform operations on tokens.
+
#![cfg_attr(not(feature = "std"), no_std)]
-use frame_support::{ensure, BoundedVec};
+use frame_support::{ensure, fail, BoundedVec, transactional, storage::with_transaction};
use up_data_structs::{
AccessMode, CollectionId, CustomDataLimit, MAX_REFUNGIBLE_PIECES, TokenId,
CreateCollectionData, CreateRefungibleExData, mapping::TokenAddressMapping, budget::Budget,
+ Property, PropertyScope, TrySetProperty, PropertyKey, PropertyValue, PropertyPermission,
+ PropertyKeyPermission,
};
use pallet_evm::account::CrossAccountId;
-use pallet_common::{Error as CommonError, Event as CommonEvent, Pallet as PalletCommon};
+use pallet_common::{
+ Error as CommonError, Event as CommonEvent, Pallet as PalletCommon,
+ CommonCollectionOperations as _,
+};
use pallet_structure::Pallet as PalletStructure;
-use sp_runtime::{ArithmeticError, DispatchError, DispatchResult};
+use sp_runtime::{ArithmeticError, DispatchError, DispatchResult, TransactionOutcome};
use sp_std::{vec::Vec, vec, collections::btree_map::BTreeMap};
use core::ops::Deref;
use codec::{Encode, Decode, MaxEncodedLen};
@@ -86,13 +162,17 @@
#[pallet::generate_store(pub(super) trait Store)]
pub struct Pallet<T>(_);
+ /// Amount of tokens minted for collection
#[pallet::storage]
pub type TokensMinted<T: Config> =
StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u32, QueryKind = ValueQuery>;
+
+ /// Amount of burnt tokens for collection
#[pallet::storage]
pub type TokensBurnt<T: Config> =
StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u32, QueryKind = ValueQuery>;
+ /// Custom data serialized to bytes for token
#[pallet::storage]
pub type TokenData<T: Config> = StorageNMap<
Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
@@ -101,6 +181,16 @@
>;
#[pallet::storage]
+ #[pallet::getter(fn token_properties)]
+ pub type TokenProperties<T: Config> = StorageNMap<
+ Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
+ Value = up_data_structs::Properties,
+ QueryKind = ValueQuery,
+ OnEmpty = up_data_structs::TokenProperties,
+ >;
+
+ /// Total amount of pieces for token
+ #[pallet::storage]
pub type TotalSupply<T: Config> = StorageNMap<
Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
Value = u128,
@@ -119,6 +209,7 @@
QueryKind = ValueQuery,
>;
+ /// Amount of tokens owned by account
#[pallet::storage]
pub type AccountBalance<T: Config> = StorageNMap<
Key = (
@@ -130,6 +221,7 @@
QueryKind = ValueQuery,
>;
+ /// Amount of token pieces owned by account
#[pallet::storage]
pub type Balance<T: Config> = StorageNMap<
Key = (
@@ -142,6 +234,7 @@
QueryKind = ValueQuery,
>;
+ /// Allowance set by an owner for a spender for a token
#[pallet::storage]
pub type Allowance<T: Config> = StorageNMap<
Key = (
@@ -188,22 +281,65 @@
}
impl<T: Config> Pallet<T> {
+ /// Get number of RFT tokens in collection
pub fn total_supply(collection: &RefungibleHandle<T>) -> u32 {
<TokensMinted<T>>::get(collection.id) - <TokensBurnt<T>>::get(collection.id)
}
+
+ /// Check that RFT token exists
+ ///
+ /// - `token`: Token ID.
pub fn token_exists(collection: &RefungibleHandle<T>, token: TokenId) -> bool {
<TotalSupply<T>>::contains_key((collection.id, token))
}
+
+ pub fn set_scoped_token_property(
+ collection_id: CollectionId,
+ token_id: TokenId,
+ scope: PropertyScope,
+ property: Property,
+ ) -> DispatchResult {
+ TokenProperties::<T>::try_mutate((collection_id, token_id), |properties| {
+ properties.try_scoped_set(scope, property.key, property.value)
+ })
+ .map_err(<CommonError<T>>::from)?;
+
+ Ok(())
+ }
+
+ pub fn set_scoped_token_properties(
+ collection_id: CollectionId,
+ token_id: TokenId,
+ scope: PropertyScope,
+ properties: impl Iterator<Item = Property>,
+ ) -> DispatchResult {
+ TokenProperties::<T>::try_mutate((collection_id, token_id), |stored_properties| {
+ stored_properties.try_scoped_set_from_iter(scope, properties)
+ })
+ .map_err(<CommonError<T>>::from)?;
+
+ Ok(())
+ }
}
// unchecked calls skips any permission checks
impl<T: Config> Pallet<T> {
+ /// Create RFT collection
+ ///
+ /// `init_collection` will take non-refundable deposit for collection creation.
+ ///
+ /// - `data`: Contains settings for collection limits and permissions.
pub fn init_collection(
owner: T::CrossAccountId,
data: CreateCollectionData<T::AccountId>,
) -> Result<CollectionId, DispatchError> {
<PalletCommon<T>>::init_collection(owner, data, false)
}
+
+ /// Destroy RFT collection
+ ///
+ /// `destroy_collection` will throw error if collection contains any tokens.
+ /// Only owner can destroy collection.
pub fn destroy_collection(
collection: RefungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -235,13 +371,17 @@
.is_some()
}
- pub fn burn_token(collection: &RefungibleHandle<T>, token_id: TokenId) -> DispatchResult {
+ pub fn burn_token_unchecked(
+ collection: &RefungibleHandle<T>,
+ token_id: TokenId,
+ ) -> DispatchResult {
let burnt = <TokensBurnt<T>>::get(collection.id)
.checked_add(1)
.ok_or(ArithmeticError::Overflow)?;
<TokensBurnt<T>>::insert(collection.id, burnt);
<TokenData<T>>::remove((collection.id, token_id));
+ <TokenProperties<T>>::remove((collection.id, token_id));
<TotalSupply<T>>::remove((collection.id, token_id));
<Balance<T>>::remove_prefix((collection.id, token_id), None);
<Allowance<T>>::remove_prefix((collection.id, token_id), None);
@@ -249,6 +389,17 @@
Ok(())
}
+ /// Burn RFT token pieces
+ ///
+ /// `burn` will decrease total amount of token pieces and amount owned by sender.
+ /// `burn` can be called even if there are multiple owners of the RFT token.
+ /// If sender wouldn't have any pieces left after `burn` than she will stop being
+ /// one of the owners of the token. If there is no account that owns any pieces of
+ /// the token than token will be burned too.
+ ///
+ /// - `amount`: Amount of token pieces to burn.
+ /// - `token`: Token who's pieces should be burned
+ /// - `collection`: Collection that contains the token
pub fn burn(
collection: &RefungibleHandle<T>,
owner: &T::CrossAccountId,
@@ -276,7 +427,7 @@
<Owned<T>>::remove((collection.id, owner, token));
<PalletStructure<T>>::unnest_if_nested(owner, collection.id, token);
<AccountBalance<T>>::insert((collection.id, owner), account_balance);
- Self::burn_token(collection, token)?;
+ Self::burn_token_unchecked(collection, token)?;
<PalletCommon<T>>::deposit_event(CommonEvent::ItemDestroyed(
collection.id,
token,
@@ -319,6 +470,179 @@
Ok(())
}
+ #[transactional]
+ fn modify_token_properties(
+ collection: &RefungibleHandle<T>,
+ sender: &T::CrossAccountId,
+ token_id: TokenId,
+ properties: impl Iterator<Item = (PropertyKey, Option<PropertyValue>)>,
+ is_token_create: bool,
+ nesting_budget: &dyn Budget,
+ ) -> DispatchResult {
+ let is_collection_admin = || collection.is_owner_or_admin(sender);
+ let is_token_owner = || -> Result<bool, DispatchError> {
+ let balance = collection.balance(sender.clone(), token_id);
+ let total_pieces: u128 =
+ Self::total_pieces(collection.id, token_id).unwrap_or(u128::MAX);
+ if balance != total_pieces {
+ return Ok(false);
+ }
+
+ let is_bundle_owner = <PalletStructure<T>>::check_indirectly_owned(
+ sender.clone(),
+ collection.id,
+ token_id,
+ None,
+ nesting_budget,
+ )?;
+
+ Ok(is_bundle_owner)
+ };
+
+ for (key, value) in properties {
+ let permission = <PalletCommon<T>>::property_permissions(collection.id)
+ .get(&key)
+ .cloned()
+ .unwrap_or_else(PropertyPermission::none);
+
+ let is_property_exists = TokenProperties::<T>::get((collection.id, token_id))
+ .get(&key)
+ .is_some();
+
+ match permission {
+ PropertyPermission { mutable: false, .. } if is_property_exists => {
+ return Err(<CommonError<T>>::NoPermission.into());
+ }
+
+ PropertyPermission {
+ collection_admin,
+ token_owner,
+ ..
+ } => {
+ //TODO: investigate threats during public minting.
+ let is_token_create =
+ is_token_create && (collection_admin || token_owner) && value.is_some();
+ if !(is_token_create
+ || (collection_admin && is_collection_admin())
+ || (token_owner && is_token_owner()?))
+ {
+ fail!(<CommonError<T>>::NoPermission);
+ }
+ }
+ }
+
+ match value {
+ Some(value) => {
+ <TokenProperties<T>>::try_mutate((collection.id, token_id), |properties| {
+ properties.try_set(key.clone(), value)
+ })
+ .map_err(<CommonError<T>>::from)?;
+
+ <PalletCommon<T>>::deposit_event(CommonEvent::TokenPropertySet(
+ collection.id,
+ token_id,
+ key,
+ ));
+ }
+ None => {
+ <TokenProperties<T>>::try_mutate((collection.id, token_id), |properties| {
+ properties.remove(&key)
+ })
+ .map_err(<CommonError<T>>::from)?;
+
+ <PalletCommon<T>>::deposit_event(CommonEvent::TokenPropertyDeleted(
+ collection.id,
+ token_id,
+ key,
+ ));
+ }
+ }
+ }
+
+ Ok(())
+ }
+
+ pub fn set_token_properties(
+ collection: &RefungibleHandle<T>,
+ sender: &T::CrossAccountId,
+ token_id: TokenId,
+ properties: impl Iterator<Item = Property>,
+ is_token_create: bool,
+ nesting_budget: &dyn Budget,
+ ) -> DispatchResult {
+ Self::modify_token_properties(
+ collection,
+ sender,
+ token_id,
+ properties.map(|p| (p.key, Some(p.value))),
+ is_token_create,
+ nesting_budget,
+ )
+ }
+
+ pub fn set_token_property(
+ collection: &RefungibleHandle<T>,
+ sender: &T::CrossAccountId,
+ token_id: TokenId,
+ property: Property,
+ nesting_budget: &dyn Budget,
+ ) -> DispatchResult {
+ let is_token_create = false;
+
+ Self::set_token_properties(
+ collection,
+ sender,
+ token_id,
+ [property].into_iter(),
+ is_token_create,
+ nesting_budget,
+ )
+ }
+
+ pub fn delete_token_properties(
+ collection: &RefungibleHandle<T>,
+ sender: &T::CrossAccountId,
+ token_id: TokenId,
+ property_keys: impl Iterator<Item = PropertyKey>,
+ nesting_budget: &dyn Budget,
+ ) -> DispatchResult {
+ let is_token_create = false;
+
+ Self::modify_token_properties(
+ collection,
+ sender,
+ token_id,
+ property_keys.into_iter().map(|key| (key, None)),
+ is_token_create,
+ nesting_budget,
+ )
+ }
+
+ pub fn delete_token_property(
+ collection: &RefungibleHandle<T>,
+ sender: &T::CrossAccountId,
+ token_id: TokenId,
+ property_key: PropertyKey,
+ nesting_budget: &dyn Budget,
+ ) -> DispatchResult {
+ Self::delete_token_properties(
+ collection,
+ sender,
+ token_id,
+ [property_key].into_iter(),
+ nesting_budget,
+ )
+ }
+
+ /// Transfer RFT token pieces from one account to another.
+ ///
+ /// If the sender is no longer owns any pieces after the `transfer` than she stops being an owner of the token.
+ ///
+ /// - `from`: Owner of token pieces to transfer.
+ /// - `to`: Recepient of transfered token pieces.
+ /// - `amount`: Amount of token pieces to transfer.
+ /// - `token`: Token whos pieces should be transfered
+ /// - `collection`: Collection that contains the token
pub fn transfer(
collection: &RefungibleHandle<T>,
from: &T::CrossAccountId,
@@ -423,6 +747,11 @@
Ok(())
}
+ /// Batched operation to create multiple RFT tokens.
+ ///
+ /// Same as `create_item` but creates multiple tokens.
+ ///
+ /// - `data`: Same as 'data` in `create_item` but contains data for multiple tokens.
pub fn create_multiple_items(
collection: &RefungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -507,32 +836,58 @@
// =========
+ with_transaction(|| {
+ for (i, data) in data.iter().enumerate() {
+ let token_id = first_token_id + i as u32 + 1;
+ <TotalSupply<T>>::insert((collection.id, token_id), totals[i]);
+
+ <TokenData<T>>::insert(
+ (collection.id, token_id),
+ ItemData {
+ const_data: data.const_data.clone(),
+ },
+ );
+
+ for (user, amount) in data.users.iter() {
+ if *amount == 0 {
+ continue;
+ }
+ <Balance<T>>::insert((collection.id, token_id, &user), amount);
+ <Owned<T>>::insert((collection.id, &user, TokenId(token_id)), true);
+ <PalletStructure<T>>::nest_if_sent_to_token_unchecked(
+ user,
+ collection.id,
+ TokenId(token_id),
+ );
+ }
+
+ if let Err(e) = Self::set_token_properties(
+ collection,
+ sender,
+ TokenId(token_id),
+ data.properties.clone().into_iter(),
+ true,
+ nesting_budget,
+ ) {
+ return TransactionOutcome::Rollback(Err(e));
+ }
+ }
+ TransactionOutcome::Commit(Ok(()))
+ })?;
+
<TokensMinted<T>>::insert(collection.id, tokens_minted);
+
for (account, balance) in balances {
<AccountBalance<T>>::insert((collection.id, account), balance);
}
+
for (i, token) in data.into_iter().enumerate() {
let token_id = first_token_id + i as u32 + 1;
- <TotalSupply<T>>::insert((collection.id, token_id), totals[i]);
- <TokenData<T>>::insert(
- (collection.id, token_id),
- ItemData {
- const_data: token.const_data,
- },
- );
-
for (user, amount) in token.users.into_iter() {
if amount == 0 {
continue;
}
- <Balance<T>>::insert((collection.id, token_id, &user), amount);
- <Owned<T>>::insert((collection.id, &user, TokenId(token_id)), true);
- <PalletStructure<T>>::nest_if_sent_to_token_unchecked(
- &user,
- collection.id,
- TokenId(token_id),
- );
// TODO: ERC20 transfer event
<PalletCommon<T>>::deposit_event(CommonEvent::ItemCreated(
@@ -568,6 +923,9 @@
))
}
+ /// Set allowance for the spender to `transfer` or `burn` sender's token pieces.
+ ///
+ /// - `amount`: Amount of token pieces the spender is allowed to `transfer` or `burn.
pub fn set_allowance(
collection: &RefungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -636,6 +994,12 @@
Ok(allowance)
}
+ /// Transfer RFT token pieces from one account to another.
+ ///
+ /// Same as the [`transfer`] but spender doesn't needs to be an owner of the token pieces.
+ /// The owner should set allowance for the spender to transfer pieces.
+ ///
+ /// [`transfer`]: struct.Pallet.html#method.transfer
pub fn transfer_from(
collection: &RefungibleHandle<T>,
spender: &T::CrossAccountId,
@@ -657,6 +1021,12 @@
Ok(())
}
+ /// Burn RFT token pieces from the account.
+ ///
+ /// Same as the [`burn`] but spender doesn't need to be an owner of the token pieces. The owner should
+ /// set allowance for the spender to burn pieces
+ ///
+ /// [`burn`]: struct.Pallet.html#method.burn
pub fn burn_from(
collection: &RefungibleHandle<T>,
spender: &T::CrossAccountId,
@@ -677,7 +1047,13 @@
Ok(())
}
- /// Delegated to `create_multiple_items`
+ /// Create RFT token.
+ ///
+ /// The sender should be the owner/admin of the collection or collection should be configured
+ /// to allow public minting.
+ ///
+ /// - `data`: Contains list of users who will become the owners of the token pieces and amount
+ /// of token pieces they will receive.
pub fn create_item(
collection: &RefungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -687,6 +1063,13 @@
Self::create_multiple_items(collection, sender, vec![data], nesting_budget)
}
+ /// Repartition RFT token.
+ ///
+ /// `repartition` will set token balance of the sender and total amount of token pieces.
+ /// Sender should own all of the token pieces. `repartition' could be done even if some
+ /// token pieces were burned before.
+ ///
+ /// - `amount`: Total amount of token pieces that the token will have after `repartition`.
pub fn repartition(
collection: &RefungibleHandle<T>,
owner: &T::CrossAccountId,
@@ -699,10 +1082,10 @@
);
ensure!(amount > 0, <CommonError<T>>::TokenValueTooLow);
// Ensure user owns all pieces
- let total_supply = <TotalSupply<T>>::get((collection.id, token));
+ let total_pieces = Self::total_pieces(collection.id, token).unwrap_or(u128::MAX);
let balance = <Balance<T>>::get((collection.id, token, owner));
ensure!(
- total_supply == balance,
+ total_pieces == balance,
<Error<T>>::RepartitionWhileNotOwningAllPieces
);
@@ -711,7 +1094,44 @@
Ok(())
}
+ fn token_owner(collection_id: CollectionId, token_id: TokenId) -> Option<T::CrossAccountId> {
+ let mut owner = None;
+ let mut count = 0;
+ for key in Balance::<T>::iter_key_prefix((collection_id, token_id)) {
+ count += 1;
+ if count > 1 {
+ return None;
+ }
+ owner = Some(key);
+ }
+ owner
+ }
+
fn total_pieces(collection_id: CollectionId, token_id: TokenId) -> Option<u128> {
<TotalSupply<T>>::try_get((collection_id, token_id)).ok()
}
+
+ pub fn set_collection_properties(
+ collection: &RefungibleHandle<T>,
+ sender: &T::CrossAccountId,
+ properties: Vec<Property>,
+ ) -> DispatchResult {
+ <PalletCommon<T>>::set_collection_properties(collection, sender, properties)
+ }
+
+ pub fn delete_collection_properties(
+ collection: &RefungibleHandle<T>,
+ sender: &T::CrossAccountId,
+ property_keys: Vec<PropertyKey>,
+ ) -> DispatchResult {
+ <PalletCommon<T>>::delete_collection_properties(collection, sender, property_keys)
+ }
+
+ pub fn set_token_property_permissions(
+ collection: &RefungibleHandle<T>,
+ sender: &T::CrossAccountId,
+ property_permissions: Vec<PropertyKeyPermission>,
+ ) -> DispatchResult {
+ <PalletCommon<T>>::set_token_property_permissions(collection, sender, property_permissions)
+ }
}
pallets/refungible/src/weights.rsdiffbeforeafterboth--- a/pallets/refungible/src/weights.rs
+++ b/pallets/refungible/src/weights.rs
@@ -3,7 +3,7 @@
//! Autogenerated weights for pallet_refungible
//!
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2022-06-27, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! DATE: 2022-07-20, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024
// Executed Command:
@@ -49,6 +49,9 @@
fn transfer_from_removing() -> Weight;
fn transfer_from_creating_removing() -> Weight;
fn burn_from() -> Weight;
+ fn set_token_property_permissions(b: u32, ) -> Weight;
+ fn set_token_properties(b: u32, ) -> Weight;
+ fn delete_token_properties(b: u32, ) -> Weight;
fn repartition_item() -> Weight;
}
@@ -62,7 +65,7 @@
// Storage: Refungible TokenData (r:0 w:1)
// Storage: Refungible Owned (r:0 w:1)
fn create_item() -> Weight {
- (17_553_000 as Weight)
+ (21_310_000 as Weight)
.saturating_add(T::DbWeight::get().reads(2 as Weight))
.saturating_add(T::DbWeight::get().writes(6 as Weight))
}
@@ -73,9 +76,9 @@
// Storage: Refungible TokenData (r:0 w:4)
// Storage: Refungible Owned (r:0 w:4)
fn create_multiple_items(b: u32, ) -> Weight {
- (10_654_000 as Weight)
- // Standard Error: 1_000
- .saturating_add((5_114_000 as Weight).saturating_mul(b as Weight))
+ (9_552_000 as Weight)
+ // Standard Error: 2_000
+ .saturating_add((7_056_000 as Weight).saturating_mul(b as Weight))
.saturating_add(T::DbWeight::get().reads(2 as Weight))
.saturating_add(T::DbWeight::get().writes(2 as Weight))
.saturating_add(T::DbWeight::get().writes((4 as Weight).saturating_mul(b as Weight)))
@@ -87,9 +90,9 @@
// Storage: Refungible TokenData (r:0 w:4)
// Storage: Refungible Owned (r:0 w:4)
fn create_multiple_items_ex_multiple_items(b: u32, ) -> Weight {
- (3_587_000 as Weight)
+ (4_857_000 as Weight)
// Standard Error: 2_000
- .saturating_add((7_931_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add((9_838_000 as Weight).saturating_mul(b as Weight))
.saturating_add(T::DbWeight::get().reads(1 as Weight))
.saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
.saturating_add(T::DbWeight::get().writes(1 as Weight))
@@ -102,9 +105,9 @@
// Storage: Refungible Balance (r:0 w:4)
// Storage: Refungible Owned (r:0 w:4)
fn create_multiple_items_ex_multiple_owners(b: u32, ) -> Weight {
- (1_980_000 as Weight)
+ (11_335_000 as Weight)
// Standard Error: 2_000
- .saturating_add((6_305_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add((6_784_000 as Weight).saturating_mul(b as Weight))
.saturating_add(T::DbWeight::get().reads(1 as Weight))
.saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
.saturating_add(T::DbWeight::get().writes(3 as Weight))
@@ -115,7 +118,7 @@
// Storage: Refungible AccountBalance (r:1 w:1)
// Storage: Refungible Owned (r:0 w:1)
fn burn_item_partial() -> Weight {
- (21_010_000 as Weight)
+ (21_239_000 as Weight)
.saturating_add(T::DbWeight::get().reads(3 as Weight))
.saturating_add(T::DbWeight::get().writes(4 as Weight))
}
@@ -125,14 +128,15 @@
// Storage: Refungible TokensBurnt (r:1 w:1)
// Storage: Refungible TokenData (r:0 w:1)
// Storage: Refungible Owned (r:0 w:1)
+ // Storage: Refungible TokenProperties (r:0 w:1)
fn burn_item_fully() -> Weight {
- (28_413_000 as Weight)
+ (29_426_000 as Weight)
.saturating_add(T::DbWeight::get().reads(4 as Weight))
- .saturating_add(T::DbWeight::get().writes(6 as Weight))
+ .saturating_add(T::DbWeight::get().writes(7 as Weight))
}
// Storage: Refungible Balance (r:2 w:2)
fn transfer_normal() -> Weight {
- (17_513_000 as Weight)
+ (17_743_000 as Weight)
.saturating_add(T::DbWeight::get().reads(2 as Weight))
.saturating_add(T::DbWeight::get().writes(2 as Weight))
}
@@ -140,7 +144,7 @@
// Storage: Refungible AccountBalance (r:1 w:1)
// Storage: Refungible Owned (r:0 w:1)
fn transfer_creating() -> Weight {
- (20_469_000 as Weight)
+ (20_699_000 as Weight)
.saturating_add(T::DbWeight::get().reads(3 as Weight))
.saturating_add(T::DbWeight::get().writes(4 as Weight))
}
@@ -148,7 +152,7 @@
// Storage: Refungible AccountBalance (r:1 w:1)
// Storage: Refungible Owned (r:0 w:1)
fn transfer_removing() -> Weight {
- (22_472_000 as Weight)
+ (22_833_000 as Weight)
.saturating_add(T::DbWeight::get().reads(3 as Weight))
.saturating_add(T::DbWeight::get().writes(4 as Weight))
}
@@ -156,21 +160,21 @@
// Storage: Refungible AccountBalance (r:2 w:2)
// Storage: Refungible Owned (r:0 w:2)
fn transfer_creating_removing() -> Weight {
- (24_866_000 as Weight)
+ (24_936_000 as Weight)
.saturating_add(T::DbWeight::get().reads(4 as Weight))
.saturating_add(T::DbWeight::get().writes(6 as Weight))
}
// Storage: Refungible Balance (r:1 w:0)
// Storage: Refungible Allowance (r:0 w:1)
fn approve() -> Weight {
- (13_475_000 as Weight)
+ (13_446_000 as Weight)
.saturating_add(T::DbWeight::get().reads(1 as Weight))
.saturating_add(T::DbWeight::get().writes(1 as Weight))
}
// Storage: Refungible Allowance (r:1 w:1)
// Storage: Refungible Balance (r:2 w:2)
fn transfer_from_normal() -> Weight {
- (24_707_000 as Weight)
+ (24_777_000 as Weight)
.saturating_add(T::DbWeight::get().reads(3 as Weight))
.saturating_add(T::DbWeight::get().writes(3 as Weight))
}
@@ -179,7 +183,7 @@
// Storage: Refungible AccountBalance (r:1 w:1)
// Storage: Refungible Owned (r:0 w:1)
fn transfer_from_creating() -> Weight {
- (27_812_000 as Weight)
+ (28_483_000 as Weight)
.saturating_add(T::DbWeight::get().reads(4 as Weight))
.saturating_add(T::DbWeight::get().writes(5 as Weight))
}
@@ -188,7 +192,7 @@
// Storage: Refungible AccountBalance (r:1 w:1)
// Storage: Refungible Owned (r:0 w:1)
fn transfer_from_removing() -> Weight {
- (29_966_000 as Weight)
+ (29_896_000 as Weight)
.saturating_add(T::DbWeight::get().reads(4 as Weight))
.saturating_add(T::DbWeight::get().writes(5 as Weight))
}
@@ -197,7 +201,7 @@
// Storage: Refungible AccountBalance (r:2 w:2)
// Storage: Refungible Owned (r:0 w:2)
fn transfer_from_creating_removing() -> Weight {
- (31_660_000 as Weight)
+ (32_070_000 as Weight)
.saturating_add(T::DbWeight::get().reads(5 as Weight))
.saturating_add(T::DbWeight::get().writes(7 as Weight))
}
@@ -208,15 +212,42 @@
// Storage: Refungible TokensBurnt (r:1 w:1)
// Storage: Refungible TokenData (r:0 w:1)
// Storage: Refungible Owned (r:0 w:1)
+ // Storage: Refungible TokenProperties (r:0 w:1)
fn burn_from() -> Weight {
- (36_248_000 as Weight)
+ (36_789_000 as Weight)
.saturating_add(T::DbWeight::get().reads(5 as Weight))
- .saturating_add(T::DbWeight::get().writes(7 as Weight))
+ .saturating_add(T::DbWeight::get().writes(8 as Weight))
+ }
+ // Storage: Common CollectionPropertyPermissions (r:1 w:1)
+ fn set_token_property_permissions(b: u32, ) -> Weight {
+ (0 as Weight)
+ // Standard Error: 62_000
+ .saturating_add((15_803_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionPropertyPermissions (r:1 w:0)
+ // Storage: Refungible TokenProperties (r:1 w:1)
+ fn set_token_properties(b: u32, ) -> Weight {
+ (0 as Weight)
+ // Standard Error: 1_668_000
+ .saturating_add((302_308_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add(T::DbWeight::get().reads(2 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionPropertyPermissions (r:1 w:0)
+ // Storage: Refungible TokenProperties (r:1 w:1)
+ fn delete_token_properties(b: u32, ) -> Weight {
+ (0 as Weight)
+ // Standard Error: 1_619_000
+ .saturating_add((294_574_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add(T::DbWeight::get().reads(2 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
}
// Storage: Refungible TotalSupply (r:1 w:1)
// Storage: Refungible Balance (r:1 w:1)
fn repartition_item() -> Weight {
- (8_226_000 as Weight)
+ (8_325_000 as Weight)
.saturating_add(T::DbWeight::get().reads(2 as Weight))
.saturating_add(T::DbWeight::get().writes(2 as Weight))
}
@@ -231,7 +262,7 @@
// Storage: Refungible TokenData (r:0 w:1)
// Storage: Refungible Owned (r:0 w:1)
fn create_item() -> Weight {
- (17_553_000 as Weight)
+ (21_310_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(2 as Weight))
.saturating_add(RocksDbWeight::get().writes(6 as Weight))
}
@@ -242,9 +273,9 @@
// Storage: Refungible TokenData (r:0 w:4)
// Storage: Refungible Owned (r:0 w:4)
fn create_multiple_items(b: u32, ) -> Weight {
- (10_654_000 as Weight)
- // Standard Error: 1_000
- .saturating_add((5_114_000 as Weight).saturating_mul(b as Weight))
+ (9_552_000 as Weight)
+ // Standard Error: 2_000
+ .saturating_add((7_056_000 as Weight).saturating_mul(b as Weight))
.saturating_add(RocksDbWeight::get().reads(2 as Weight))
.saturating_add(RocksDbWeight::get().writes(2 as Weight))
.saturating_add(RocksDbWeight::get().writes((4 as Weight).saturating_mul(b as Weight)))
@@ -256,9 +287,9 @@
// Storage: Refungible TokenData (r:0 w:4)
// Storage: Refungible Owned (r:0 w:4)
fn create_multiple_items_ex_multiple_items(b: u32, ) -> Weight {
- (3_587_000 as Weight)
+ (4_857_000 as Weight)
// Standard Error: 2_000
- .saturating_add((7_931_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add((9_838_000 as Weight).saturating_mul(b as Weight))
.saturating_add(RocksDbWeight::get().reads(1 as Weight))
.saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
.saturating_add(RocksDbWeight::get().writes(1 as Weight))
@@ -271,9 +302,9 @@
// Storage: Refungible Balance (r:0 w:4)
// Storage: Refungible Owned (r:0 w:4)
fn create_multiple_items_ex_multiple_owners(b: u32, ) -> Weight {
- (1_980_000 as Weight)
+ (11_335_000 as Weight)
// Standard Error: 2_000
- .saturating_add((6_305_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add((6_784_000 as Weight).saturating_mul(b as Weight))
.saturating_add(RocksDbWeight::get().reads(1 as Weight))
.saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
.saturating_add(RocksDbWeight::get().writes(3 as Weight))
@@ -284,7 +315,7 @@
// Storage: Refungible AccountBalance (r:1 w:1)
// Storage: Refungible Owned (r:0 w:1)
fn burn_item_partial() -> Weight {
- (21_010_000 as Weight)
+ (21_239_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(3 as Weight))
.saturating_add(RocksDbWeight::get().writes(4 as Weight))
}
@@ -294,14 +325,15 @@
// Storage: Refungible TokensBurnt (r:1 w:1)
// Storage: Refungible TokenData (r:0 w:1)
// Storage: Refungible Owned (r:0 w:1)
+ // Storage: Refungible TokenProperties (r:0 w:1)
fn burn_item_fully() -> Weight {
- (28_413_000 as Weight)
+ (29_426_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(4 as Weight))
- .saturating_add(RocksDbWeight::get().writes(6 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(7 as Weight))
}
// Storage: Refungible Balance (r:2 w:2)
fn transfer_normal() -> Weight {
- (17_513_000 as Weight)
+ (17_743_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(2 as Weight))
.saturating_add(RocksDbWeight::get().writes(2 as Weight))
}
@@ -309,7 +341,7 @@
// Storage: Refungible AccountBalance (r:1 w:1)
// Storage: Refungible Owned (r:0 w:1)
fn transfer_creating() -> Weight {
- (20_469_000 as Weight)
+ (20_699_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(3 as Weight))
.saturating_add(RocksDbWeight::get().writes(4 as Weight))
}
@@ -317,7 +349,7 @@
// Storage: Refungible AccountBalance (r:1 w:1)
// Storage: Refungible Owned (r:0 w:1)
fn transfer_removing() -> Weight {
- (22_472_000 as Weight)
+ (22_833_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(3 as Weight))
.saturating_add(RocksDbWeight::get().writes(4 as Weight))
}
@@ -325,21 +357,21 @@
// Storage: Refungible AccountBalance (r:2 w:2)
// Storage: Refungible Owned (r:0 w:2)
fn transfer_creating_removing() -> Weight {
- (24_866_000 as Weight)
+ (24_936_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(4 as Weight))
.saturating_add(RocksDbWeight::get().writes(6 as Weight))
}
// Storage: Refungible Balance (r:1 w:0)
// Storage: Refungible Allowance (r:0 w:1)
fn approve() -> Weight {
- (13_475_000 as Weight)
+ (13_446_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(1 as Weight))
.saturating_add(RocksDbWeight::get().writes(1 as Weight))
}
// Storage: Refungible Allowance (r:1 w:1)
// Storage: Refungible Balance (r:2 w:2)
fn transfer_from_normal() -> Weight {
- (24_707_000 as Weight)
+ (24_777_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(3 as Weight))
.saturating_add(RocksDbWeight::get().writes(3 as Weight))
}
@@ -348,7 +380,7 @@
// Storage: Refungible AccountBalance (r:1 w:1)
// Storage: Refungible Owned (r:0 w:1)
fn transfer_from_creating() -> Weight {
- (27_812_000 as Weight)
+ (28_483_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(4 as Weight))
.saturating_add(RocksDbWeight::get().writes(5 as Weight))
}
@@ -357,7 +389,7 @@
// Storage: Refungible AccountBalance (r:1 w:1)
// Storage: Refungible Owned (r:0 w:1)
fn transfer_from_removing() -> Weight {
- (29_966_000 as Weight)
+ (29_896_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(4 as Weight))
.saturating_add(RocksDbWeight::get().writes(5 as Weight))
}
@@ -366,7 +398,7 @@
// Storage: Refungible AccountBalance (r:2 w:2)
// Storage: Refungible Owned (r:0 w:2)
fn transfer_from_creating_removing() -> Weight {
- (31_660_000 as Weight)
+ (32_070_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(5 as Weight))
.saturating_add(RocksDbWeight::get().writes(7 as Weight))
}
@@ -377,15 +409,42 @@
// Storage: Refungible TokensBurnt (r:1 w:1)
// Storage: Refungible TokenData (r:0 w:1)
// Storage: Refungible Owned (r:0 w:1)
+ // Storage: Refungible TokenProperties (r:0 w:1)
fn burn_from() -> Weight {
- (36_248_000 as Weight)
+ (36_789_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(5 as Weight))
- .saturating_add(RocksDbWeight::get().writes(7 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(8 as Weight))
+ }
+ // Storage: Common CollectionPropertyPermissions (r:1 w:1)
+ fn set_token_property_permissions(b: u32, ) -> Weight {
+ (0 as Weight)
+ // Standard Error: 62_000
+ .saturating_add((15_803_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionPropertyPermissions (r:1 w:0)
+ // Storage: Refungible TokenProperties (r:1 w:1)
+ fn set_token_properties(b: u32, ) -> Weight {
+ (0 as Weight)
+ // Standard Error: 1_668_000
+ .saturating_add((302_308_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add(RocksDbWeight::get().reads(2 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
}
+ // Storage: Common CollectionPropertyPermissions (r:1 w:0)
+ // Storage: Refungible TokenProperties (r:1 w:1)
+ fn delete_token_properties(b: u32, ) -> Weight {
+ (0 as Weight)
+ // Standard Error: 1_619_000
+ .saturating_add((294_574_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add(RocksDbWeight::get().reads(2 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
// Storage: Refungible TotalSupply (r:1 w:1)
// Storage: Refungible Balance (r:1 w:1)
fn repartition_item() -> Weight {
- (8_226_000 as Weight)
+ (8_325_000 as Weight)
.saturating_add(RocksDbWeight::get().reads(2 as Weight))
.saturating_add(RocksDbWeight::get().writes(2 as Weight))
}
pallets/scheduler/src/lib.rsdiffbeforeafterboth--- a/pallets/scheduler/src/lib.rs
+++ b/pallets/scheduler/src/lib.rs
@@ -152,7 +152,6 @@
pub use preimage_provider::PreimageProviderAndMaybeRecipient;
-/// Weight templates for calculating actual fees
pub(crate) trait MarginalWeightInfo: WeightInfo {
fn item(periodic: bool, named: bool, resolved: Option<bool>) -> Weight {
match (periodic, named, resolved) {
@@ -259,7 +258,7 @@
/// If `Some` then the number of blocks to postpone execution for when the item is delayed.
type NoPreimagePostponement: Get<Option<Self::BlockNumber>>;
- /// Sponsoring function. In this version sposorship is disabled
+ /// Sponsoring function.
// type SponsorshipHandler: SponsorshipHandler<Self::AccountId, <Self as Config>::Call>;
/// The helper type used for custom transaction fee logic.
@@ -268,7 +267,6 @@
/// A Scheduler-Runtime interface for finer payment handling.
pub trait DispatchCall<T: frame_system::Config + Config, SelfContainedSignedInfo> {
- /// Lock balance required for transaction payment
fn reserve_balance(
id: ScheduledId,
sponsor: <T as frame_system::Config>::AccountId,
@@ -292,7 +290,6 @@
TransactionValidityError,
>;
- /// Cancel schedule reservation and unlock balance
fn cancel_reserve(
id: ScheduledId,
sponsor: <T as frame_system::Config>::AccountId,
@@ -436,7 +433,6 @@
continue;
}
- // Sender is the account who signed transaction
let sender = ensure_signed(
<<T as Config>::Origin as From<T::PalletsOrigin>>::from(s.origin.clone())
.into(),
@@ -500,6 +496,7 @@
}
/// Weight should be 0, because transaction already paid
0
+ //total_weight
}
}
pallets/structure/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/structure/src/benchmarking.rs
+++ b/pallets/structure/src/benchmarking.rs
@@ -1,3 +1,19 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
use super::*;
use frame_benchmarking::{benchmarks, account};
pallets/structure/src/lib.rsdiffbeforeafterboth--- a/pallets/structure/src/lib.rs
+++ b/pallets/structure/src/lib.rs
@@ -1,3 +1,56 @@
+// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.
+// This file is part of Unique Network.
+
+// Unique Network is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Unique Network is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
+
+//! # Structure Pallet
+//!
+//! The Structure pallet provides functionality for handling tokens nesting an unnesting.
+//!
+//! - [`Config`]
+//! - [`Pallet`]
+//!
+//! ## Overview
+//!
+//! The Structure pallet provides functions for:
+//!
+//! - Searching for token parents, children and owners. Actual implementation of searching for
+//! parent/child is done by pallets corresponding to token's collection type.
+//! - Nesting and unnesting tokens. Actual implementation of nesting is done by pallets corresponding
+//! to token's collection type.
+//!
+//! ### Terminology
+//!
+//! - **Nesting:** Setting up parent-child relationship between tokens. Nested tokens are inhereting
+//! owner from their parent. There could be multiple levels of nesting. Token couldn't be nested in
+//! it's child token i.e. parent-child relationship graph shouldn't have
+//!
+//! - **Parent:** Token that current token is nested in.
+//!
+//! - **Owner:** Account that owns the token and all nested tokens.
+//!
+//! ## Interface
+//!
+//! ### Available Functions
+//!
+//! - `find_parent` - Find parent of the token. It could be an account or another token.
+//! - `parent_chain` - Find chain of parents of the token.
+//! - `find_topmost_owner` - Find account or token in the end of the chain of parents.
+//! - `check_nesting` - Check if the token could be nested in the other token
+//! - `nest_if_sent_to_token` - Nest the token in the other token
+//! - `unnest_if_nested` - Unnest the token from the other token
+
#![cfg_attr(not(feature = "std"), no_std)]
use pallet_common::CommonCollectionOperations;
@@ -82,6 +135,12 @@
}
impl<T: Config> Pallet<T> {
+ /// Find account owning the `token` or a token that the `token` is nested in.
+ ///
+ /// Returns the enum that have three variants:
+ /// - [`User`](crate::Parent<T>::User): Contains account.
+ /// - [`Token`](crate::Parent<T>::Token): Contains token id and collection id.
+ /// - [`TokenNotFound`](crate::Parent<T>::TokenNotFound): Indicates that parent was not found
pub fn find_parent(
collection: CollectionId,
token: TokenId,
@@ -103,6 +162,11 @@
})
}
+ /// Get the chain of parents of a token in the nesting hierarchy
+ ///
+ /// Returns an iterator of addresses of the owning tokens and the owning account,
+ /// starting from the immediate parent token, ending with the account.
+ /// Returns error if cycle is detected.
pub fn parent_chain(
mut collection: CollectionId,
mut token: TokenId,
@@ -133,6 +197,8 @@
/// Try to dereference address, until finding top level owner
///
/// May return token address if parent token not yet exists
+ ///
+ /// - `budget`: Limit for searching parents in depth.
pub fn find_topmost_owner(
collection: CollectionId,
token: TokenId,
@@ -149,6 +215,10 @@
})
}
+ /// Find the topmost parent and check that assigning `for_nest` token as a child for
+ /// `token` wouldn't create a cycle.
+ ///
+ /// - `budget`: Limit for searching parents in depth.
pub fn get_checked_topmost_owner(
collection: CollectionId,
token: TokenId,
@@ -177,6 +247,10 @@
Err(<Error<T>>::DepthLimit.into())
}
+ /// Burn token and all of it's nested tokens
+ ///
+ /// - `self_budget`: Limit for searching children in depth.
+ /// - `breadth_budget`: Limit of breadth of searching children.
pub fn burn_item_recursively(
from: T::CrossAccountId,
collection: CollectionId,
@@ -190,7 +264,13 @@
dispatch.burn_item_recursively(from.clone(), token, self_budget, breadth_budget)
}
- /// Check if token indirectly owned by specified user
+ /// Check if `token` indirectly owned by `user`
+ ///
+ /// Returns `true` if `user` is `token`'s owner. Or If token is provided as `user` then
+ /// check that `user` and `token` have same owner.
+ /// Checks that assigning `for_nest` token as a child for `token` wouldn't create a cycle.
+ ///
+ /// - `budget`: Limit for searching parents in depth.
pub fn check_indirectly_owned(
user: T::CrossAccountId,
collection: CollectionId,
@@ -207,6 +287,12 @@
.map(|indirect_owner| indirect_owner == target_parent)
}
+ /// Checks that `under` is valid token and that `token_id` could be nested under it
+ /// and that `from` is `under`'s owner
+ ///
+ /// Returns OK if `under` is not a token
+ ///
+ /// - `nesting_budget`: Limit for searching parents in depth.
pub fn check_nesting(
from: T::CrossAccountId,
under: &T::CrossAccountId,
@@ -219,6 +305,11 @@
})
}
+ /// Nests `token_id` under `under` token
+ ///
+ /// Returns OK if `under` is not a token. Checks that nesting is possible.
+ ///
+ /// - `nesting_budget`: Limit for searching parents in depth.
pub fn nest_if_sent_to_token(
from: T::CrossAccountId,
under: &T::CrossAccountId,
@@ -235,6 +326,9 @@
})
}
+ /// Nests `token_id` under `owner` token
+ ///
+ /// Caller should check that nesting wouldn't cause recursion in nesting
pub fn nest_if_sent_to_token_unchecked(
owner: &T::CrossAccountId,
collection_id: CollectionId,
@@ -245,6 +339,7 @@
});
}
+ /// Unnests `token_id` from `owner`.
pub fn unnest_if_nested(
owner: &T::CrossAccountId,
collection_id: CollectionId,
pallets/unique/src/eth/stubs/CollectionHelpers.rawdiffbeforeafterbothbinary blob — no preview
primitives/data-structs/Cargo.tomldiffbeforeafterboth--- a/primitives/data-structs/Cargo.toml
+++ b/primitives/data-structs/Cargo.toml
@@ -6,7 +6,7 @@
license = 'GPLv3'
homepage = "https://unique.network"
repository = 'https://github.com/UniqueNetwork/unique-chain'
-version = '0.1.0'
+version = '0.1.1'
[dependencies]
scale-info = { version = "2.0.1", default-features = false, features = [
primitives/data-structs/Changelog.mddiffbeforeafterboth--- /dev/null
+++ b/primitives/data-structs/Changelog.md
@@ -0,0 +1,3 @@
+### 0.1.1
+---
+* Added fields with properties to `CreateReFungibleData` and `CreateRefungibleExData`.
\ No newline at end of file
primitives/data-structs/src/lib.rsdiffbeforeafterboth--- a/primitives/data-structs/src/lib.rs
+++ b/primitives/data-structs/src/lib.rs
@@ -534,7 +534,12 @@
#[cfg_attr(feature = "serde1", serde(with = "bounded::vec_serde"))]
#[derivative(Debug(format_with = "bounded::vec_debug"))]
pub const_data: BoundedVec<u8, CustomDataLimit>,
+
pub pieces: u128,
+
+ #[cfg_attr(feature = "serde1", serde(with = "bounded::vec_serde"))]
+ #[derivative(Debug(format_with = "bounded::vec_debug"))]
+ pub properties: CollectionPropertiesVec,
}
#[derive(Encode, Decode, Debug, Clone, PartialEq, TypeInfo, MaxEncodedLen)]
@@ -568,6 +573,8 @@
pub const_data: BoundedVec<u8, CustomDataLimit>,
#[derivative(Debug(format_with = "bounded::map_debug"))]
pub users: BoundedBTreeMap<CrossAccountId, u128, ConstU32<MAX_ITEMS_PER_BATCH>>,
+ #[derivative(Debug(format_with = "bounded::vec_debug"))]
+ pub properties: CollectionPropertiesVec,
}
#[derive(Encode, Decode, MaxEncodedLen, PartialEq, Clone, TypeInfo, Derivative)]
runtime/opal/src/lib.rsdiffbeforeafterboth--- a/runtime/opal/src/lib.rs
+++ b/runtime/opal/src/lib.rs
@@ -707,7 +707,6 @@
pub type Barrier = (
TakeWeightCredit,
AllowTopLevelPaidExecutionFrom<Everything>,
- AllowUnpaidExecutionFrom<ParentOrParentsUnitPlurality>,
// ^^^ Parent & its unit plurality gets free execution
);
runtime/quartz/src/lib.rsdiffbeforeafterboth--- a/runtime/quartz/src/lib.rs
+++ b/runtime/quartz/src/lib.rs
@@ -706,7 +706,6 @@
pub type Barrier = (
TakeWeightCredit,
AllowTopLevelPaidExecutionFrom<Everything>,
- AllowUnpaidExecutionFrom<ParentOrParentsUnitPlurality>,
// ^^^ Parent & its unit plurality gets free execution
);
runtime/unique/src/lib.rsdiffbeforeafterboth--- a/runtime/unique/src/lib.rs
+++ b/runtime/unique/src/lib.rs
@@ -705,7 +705,6 @@
pub type Barrier = (
TakeWeightCredit,
AllowTopLevelPaidExecutionFrom<Everything>,
- AllowUnpaidExecutionFrom<ParentOrParentsUnitPlurality>,
// ^^^ Parent & its unit plurality gets free execution
);
tests/src/createMultipleItems.test.tsdiffbeforeafterboth--- a/tests/src/createMultipleItems.test.ts
+++ b/tests/src/createMultipleItems.test.ts
@@ -376,14 +376,26 @@
// ReFungible
const collectionIdReFungible =
await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});
- const argsReFungible = [
- {ReFungible: ['1'.repeat(2049), 10]},
- {ReFungible: ['2'.repeat(2049), 10]},
- {ReFungible: ['3'.repeat(2049), 10]},
- ];
- const createMultipleItemsTxFungible = api.tx.unique
- .createMultipleItems(collectionIdReFungible, normalizeAccountId(alice.address), argsReFungible);
- await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTxFungible)).to.be.rejected;
+ {
+ const argsReFungible = [
+ {ReFungible: ['1'.repeat(2049), 10, []]},
+ {ReFungible: ['2'.repeat(2049), 10, []]},
+ {ReFungible: ['3'.repeat(2049), 10, []]},
+ ];
+ const createMultipleItemsTxFungible = api.tx.unique
+ .createMultipleItems(collectionIdReFungible, normalizeAccountId(alice.address), argsReFungible);
+ await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTxFungible)).to.be.rejected;
+ }
+ {
+ const argsReFungible = [
+ {ReFungible: {properties: [{key: 'key', value: 'A'.repeat(32769)}]}},
+ {ReFungible: {properties: [{key: 'key', value: 'B'.repeat(32769)}]}},
+ {ReFungible: {properties: [{key: 'key', value: 'C'.repeat(32769)}]}},
+ ];
+ const createMultipleItemsTxFungible = api.tx.unique
+ .createMultipleItems(collectionIdReFungible, normalizeAccountId(alice.address), argsReFungible);
+ await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTxFungible)).to.be.rejected;
+ }
});
});
tests/src/eth/api/UniqueFungible.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueFungible.sol
+++ b/tests/src/eth/api/UniqueFungible.sol
@@ -28,6 +28,154 @@
function burnFrom(address from, uint256 amount) external returns (bool);
}
+// Selector: 7d9262e6
+interface Collection is Dummy, ERC165 {
+ // Set collection property.
+ //
+ // @param key Property key.
+ // @param value Propery value.
+ //
+ // Selector: setCollectionProperty(string,bytes) 2f073f66
+ function setCollectionProperty(string memory key, bytes memory value)
+ external;
+
+ // Delete collection property.
+ //
+ // @param key Property key.
+ //
+ // Selector: deleteCollectionProperty(string) 7b7debce
+ function deleteCollectionProperty(string memory key) external;
+
+ // Get collection property.
+ //
+ // @dev Throws error if key not found.
+ //
+ // @param key Property key.
+ // @return bytes The property corresponding to the key.
+ //
+ // Selector: collectionProperty(string) cf24fd6d
+ function collectionProperty(string memory key)
+ external
+ view
+ returns (bytes memory);
+
+ // Set the sponsor of the collection.
+ //
+ // @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
+ //
+ // @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.
+ //
+ // Selector: setCollectionSponsor(address) 7623402e
+ function setCollectionSponsor(address sponsor) external;
+
+ // Collection sponsorship confirmation.
+ //
+ // @dev After setting the sponsor for the collection, it must be confirmed with this function.
+ //
+ // Selector: confirmCollectionSponsorship() 3c50e97a
+ function confirmCollectionSponsorship() external;
+
+ // Set limits for the collection.
+ // @dev Throws error if limit not found.
+ // @param limit Name of the limit. Valid names:
+ // "accountTokenOwnershipLimit",
+ // "sponsoredDataSize",
+ // "sponsoredDataRateLimit",
+ // "tokenLimit",
+ // "sponsorTransferTimeout",
+ // "sponsorApproveTimeout"
+ // @param value Value of the limit.
+ //
+ // Selector: setCollectionLimit(string,uint32) 6a3841db
+ function setCollectionLimit(string memory limit, uint32 value) external;
+
+ // Set limits for the collection.
+ // @dev Throws error if limit not found.
+ // @param limit Name of the limit. Valid names:
+ // "ownerCanTransfer",
+ // "ownerCanDestroy",
+ // "transfersEnabled"
+ // @param value Value of the limit.
+ //
+ // Selector: setCollectionLimit(string,bool) 993b7fba
+ function setCollectionLimit(string memory limit, bool value) external;
+
+ // Get contract address.
+ //
+ // Selector: contractAddress() f6b4dfb4
+ function contractAddress() external view returns (address);
+
+ // Add collection admin by substrate address.
+ // @param new_admin Substrate administrator address.
+ //
+ // Selector: addCollectionAdminSubstrate(uint256) 5730062b
+ function addCollectionAdminSubstrate(uint256 newAdmin) external;
+
+ // Remove collection admin by substrate address.
+ // @param admin Substrate administrator address.
+ //
+ // Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9
+ function removeCollectionAdminSubstrate(uint256 admin) external;
+
+ // Add collection admin.
+ // @param new_admin Address of the added administrator.
+ //
+ // Selector: addCollectionAdmin(address) 92e462c7
+ function addCollectionAdmin(address newAdmin) external;
+
+ // Remove collection admin.
+ //
+ // @param new_admin Address of the removed administrator.
+ //
+ // Selector: removeCollectionAdmin(address) fafd7b42
+ function removeCollectionAdmin(address admin) external;
+
+ // Toggle accessibility of collection nesting.
+ //
+ // @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'
+ //
+ // Selector: setCollectionNesting(bool) 112d4586
+ function setCollectionNesting(bool enable) external;
+
+ // Toggle accessibility of collection nesting.
+ //
+ // @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'
+ // @param collections Addresses of collections that will be available for nesting.
+ //
+ // Selector: setCollectionNesting(bool,address[]) 64872396
+ function setCollectionNesting(bool enable, address[] memory collections)
+ external;
+
+ // Set the collection access method.
+ // @param mode Access mode
+ // 0 for Normal
+ // 1 for AllowList
+ //
+ // Selector: setCollectionAccess(uint8) 41835d4c
+ function setCollectionAccess(uint8 mode) external;
+
+ // Add the user to the allowed list.
+ //
+ // @param user Address of a trusted user.
+ //
+ // Selector: addToCollectionAllowList(address) 67844fe6
+ function addToCollectionAllowList(address user) external;
+
+ // Remove the user from the allowed list.
+ //
+ // @param user Address of a removed user.
+ //
+ // Selector: removeFromCollectionAllowList(address) 85c51acb
+ function removeFromCollectionAllowList(address user) external;
+
+ // Switch permission for minting.
+ //
+ // @param mode Enable if "true".
+ //
+ // Selector: setCollectionMintMode(bool) 00018e84
+ function setCollectionMintMode(bool mode) external;
+}
+
// Selector: 942e8b22
interface ERC20 is Dummy, ERC165, ERC20Events {
// Selector: name() 06fdde03
@@ -63,39 +211,6 @@
external
view
returns (uint256);
-}
-
-// Selector: c894dc35
-interface Collection is Dummy, ERC165 {
- // Selector: setCollectionProperty(string,bytes) 2f073f66
- function setCollectionProperty(string memory key, bytes memory value)
- external;
-
- // Selector: deleteCollectionProperty(string) 7b7debce
- function deleteCollectionProperty(string memory key) external;
-
- // Throws error if key not found
- //
- // Selector: collectionProperty(string) cf24fd6d
- function collectionProperty(string memory key)
- external
- view
- returns (bytes memory);
-
- // Selector: ethSetSponsor(address) 8f9af356
- function ethSetSponsor(address sponsor) external;
-
- // Selector: ethConfirmSponsorship() a8580d1a
- function ethConfirmSponsorship() external;
-
- // Selector: setLimit(string,uint32) 68db30ca
- function setLimit(string memory limit, uint32 value) external;
-
- // Selector: setLimit(string,bool) ea67e4c2
- function setLimit(string memory limit, bool value) external;
-
- // Selector: contractAddress() f6b4dfb4
- function contractAddress() external view returns (address);
}
interface UniqueFungible is
tests/src/eth/api/UniqueNFT.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -44,6 +44,13 @@
// Selector: 41369377
interface TokenProperties is Dummy, ERC165 {
+ // @notice Set permissions for token property.
+ // @dev Throws error if `msg.sender` is not admin or owner of the collection.
+ // @param key Property key.
+ // @param is_mutable Permission to mutate property.
+ // @param collection_admin Permission to mutate property by collection admin if property is mutable.
+ // @param token_owner Permission to mutate property by token owner if property is mutable.
+ //
// Selector: setTokenPropertyPermission(string,bool,bool,bool) 222d97fa
function setTokenPropertyPermission(
string memory key,
@@ -52,6 +59,12 @@
bool tokenOwner
) external;
+ // @notice Set token property value.
+ // @dev Throws error if `msg.sender` has no permission to edit the property.
+ // @param tokenId ID of the token.
+ // @param key Property key.
+ // @param value Property value.
+ //
// Selector: setProperty(uint256,string,bytes) 1752d67b
function setProperty(
uint256 tokenId,
@@ -59,10 +72,19 @@
bytes memory value
) external;
+ // @notice Delete token property value.
+ // @dev Throws error if `msg.sender` has no permission to edit the property.
+ // @param tokenId ID of the token.
+ // @param key Property key.
+ //
// Selector: deleteProperty(uint256,string) 066111d1
function deleteProperty(uint256 tokenId, string memory key) external;
- // Throws error if key not found
+ // @notice Get token property value.
+ // @dev Throws error if key not found
+ // @param tokenId ID of the token.
+ // @param key Property key.
+ // @return Property value bytes
//
// Selector: property(uint256,string) 7228c327
function property(uint256 tokenId, string memory key)
@@ -73,19 +95,36 @@
// Selector: 42966c68
interface ERC721Burnable is Dummy, ERC165 {
+ // @notice Burns a specific ERC721 token.
+ // @dev Throws unless `msg.sender` is the current NFT owner, or an authorized
+ // operator of the current owner.
+ // @param tokenId The NFT to approve
+ //
// Selector: burn(uint256) 42966c68
function burn(uint256 tokenId) external;
}
// Selector: 58800161
interface ERC721 is Dummy, ERC165, ERC721Events {
+ // @notice Count all NFTs assigned to an owner
+ // @dev NFTs assigned to the zero address are considered invalid, and this
+ // function throws for queries about the zero address.
+ // @param owner An address for whom to query the balance
+ // @return The number of NFTs owned by `owner`, possibly zero
+ //
// Selector: balanceOf(address) 70a08231
function balanceOf(address owner) external view returns (uint256);
+ // @notice Find the owner of an NFT
+ // @dev NFTs assigned to zero address are considered invalid, and queries
+ // about them do throw.
+ // @param tokenId The identifier for an NFT
+ // @return The address of the owner of the NFT
+ //
// Selector: ownerOf(uint256) 6352211e
function ownerOf(uint256 tokenId) external view returns (address);
- // Not implemented
+ // @dev Not implemented
//
// Selector: safeTransferFromWithData(address,address,uint256,bytes) 60a11672
function safeTransferFromWithData(
@@ -95,7 +134,7 @@
bytes memory data
) external;
- // Not implemented
+ // @dev Not implemented
//
// Selector: safeTransferFrom(address,address,uint256) 42842e0e
function safeTransferFrom(
@@ -104,6 +143,17 @@
uint256 tokenId
) external;
+ // @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
+ // TO CONFIRM THAT `to` IS CAPABLE OF RECEIVING NFTS OR ELSE
+ // THEY MAY BE PERMANENTLY LOST
+ // @dev Throws unless `msg.sender` is the current owner or an authorized
+ // operator for this NFT. Throws if `from` is not the current owner. Throws
+ // if `to` is the zero address. Throws if `tokenId` is not a valid NFT.
+ // @param from The current owner of the NFT
+ // @param to The new owner
+ // @param tokenId The NFT to transfer
+ // @param _value Not used for an NFT
+ //
// Selector: transferFrom(address,address,uint256) 23b872dd
function transferFrom(
address from,
@@ -111,20 +161,27 @@
uint256 tokenId
) external;
+ // @notice Set or reaffirm the approved address for an NFT
+ // @dev The zero address indicates there is no approved address.
+ // @dev Throws unless `msg.sender` is the current NFT owner, or an authorized
+ // operator of the current owner.
+ // @param approved The new approved NFT controller
+ // @param tokenId The NFT to approve
+ //
// Selector: approve(address,uint256) 095ea7b3
function approve(address approved, uint256 tokenId) external;
- // Not implemented
+ // @dev Not implemented
//
// Selector: setApprovalForAll(address,bool) a22cb465
function setApprovalForAll(address operator, bool approved) external;
- // Not implemented
+ // @dev Not implemented
//
// Selector: getApproved(uint256) 081812fc
function getApproved(uint256 tokenId) external view returns (address);
- // Not implemented
+ // @dev Not implemented
//
// Selector: isApprovedForAll(address,address) e985e9c5
function isApprovedForAll(address owner, address operator)
@@ -135,13 +192,21 @@
// Selector: 5b5e139f
interface ERC721Metadata is Dummy, ERC165 {
+ // @notice A descriptive name for a collection of NFTs in this contract
+ //
// Selector: name() 06fdde03
function name() external view returns (string memory);
+ // @notice An abbreviated name for NFTs in this contract
+ //
// Selector: symbol() 95d89b41
function symbol() external view returns (string memory);
- // Returns token's const_metadata
+ // @notice A distinct Uniform Resource Identifier (URI) for a given asset.
+ // @dev Throws if `tokenId` is not a valid NFT. URIs are defined in RFC
+ // 3986. The URI may point to a JSON file that conforms to the "ERC721
+ // Metadata JSON Schema".
+ // @return token's const_metadata
//
// Selector: tokenURI(uint256) c87b56dd
function tokenURI(uint256 tokenId) external view returns (string memory);
@@ -152,14 +217,21 @@
// Selector: mintingFinished() 05d2035b
function mintingFinished() external view returns (bool);
- // `token_id` should be obtained with `next_token_id` method,
- // unlike standard, you can't specify it manually
+ // @notice Function to mint token.
+ // @dev `tokenId` should be obtained with `nextTokenId` method,
+ // unlike standard, you can't specify it manually
+ // @param to The new owner
+ // @param tokenId ID of the minted NFT
//
// Selector: mint(address,uint256) 40c10f19
function mint(address to, uint256 tokenId) external returns (bool);
- // `token_id` should be obtained with `next_token_id` method,
- // unlike standard, you can't specify it manually
+ // @notice Function to mint token with the given tokenUri.
+ // @dev `tokenId` should be obtained with `nextTokenId` method,
+ // unlike standard, you can't specify it manually
+ // @param to The new owner
+ // @param tokenId ID of the minted NFT
+ // @param tokenUri Token URI that would be stored in the NFT properties
//
// Selector: mintWithTokenURI(address,uint256,string) 50bb4e7f
function mintWithTokenURI(
@@ -168,7 +240,7 @@
string memory tokenUri
) external returns (bool);
- // Not implemented
+ // @dev Not implemented
//
// Selector: finishMinting() 7d64bcb4
function finishMinting() external returns (bool);
@@ -176,10 +248,15 @@
// Selector: 780e9d63
interface ERC721Enumerable is Dummy, ERC165 {
+ // @notice Enumerate valid NFTs
+ // @param index A counter less than `totalSupply()`
+ // @return The token identifier for the `index`th NFT,
+ // (sort order not specified)
+ //
// Selector: tokenByIndex(uint256) 4f6ccce7
function tokenByIndex(uint256 index) external view returns (uint256);
- // Not implemented
+ // @dev Not implemented
//
// Selector: tokenOfOwnerByIndex(address,uint256) 2f745c59
function tokenOfOwnerByIndex(address owner, uint256 index)
@@ -187,20 +264,38 @@
view
returns (uint256);
+ // @notice Count NFTs tracked by this contract
+ // @return A count of valid NFTs tracked by this contract, where each one of
+ // them has an assigned and queryable owner not equal to the zero address
+ //
// Selector: totalSupply() 18160ddd
function totalSupply() external view returns (uint256);
}
// Selector: 7d9262e6
interface Collection is Dummy, ERC165 {
+ // Set collection property.
+ //
+ // @param key Property key.
+ // @param value Propery value.
+ //
// Selector: setCollectionProperty(string,bytes) 2f073f66
function setCollectionProperty(string memory key, bytes memory value)
external;
+ // Delete collection property.
+ //
+ // @param key Property key.
+ //
// Selector: deleteCollectionProperty(string) 7b7debce
function deleteCollectionProperty(string memory key) external;
- // Throws error if key not found
+ // Get collection property.
+ //
+ // @dev Throws error if key not found.
+ //
+ // @param key Property key.
+ // @return bytes The property corresponding to the key.
//
// Selector: collectionProperty(string) cf24fd6d
function collectionProperty(string memory key)
@@ -208,69 +303,168 @@
view
returns (bytes memory);
+ // Set the sponsor of the collection.
+ //
+ // @dev In order for sponsorship to work, it must be confirmed on behalf of the sponsor.
+ //
+ // @param sponsor Address of the sponsor from whose account funds will be debited for operations with the contract.
+ //
// Selector: setCollectionSponsor(address) 7623402e
function setCollectionSponsor(address sponsor) external;
+ // Collection sponsorship confirmation.
+ //
+ // @dev After setting the sponsor for the collection, it must be confirmed with this function.
+ //
// Selector: confirmCollectionSponsorship() 3c50e97a
function confirmCollectionSponsorship() external;
+ // Set limits for the collection.
+ // @dev Throws error if limit not found.
+ // @param limit Name of the limit. Valid names:
+ // "accountTokenOwnershipLimit",
+ // "sponsoredDataSize",
+ // "sponsoredDataRateLimit",
+ // "tokenLimit",
+ // "sponsorTransferTimeout",
+ // "sponsorApproveTimeout"
+ // @param value Value of the limit.
+ //
// Selector: setCollectionLimit(string,uint32) 6a3841db
function setCollectionLimit(string memory limit, uint32 value) external;
+ // Set limits for the collection.
+ // @dev Throws error if limit not found.
+ // @param limit Name of the limit. Valid names:
+ // "ownerCanTransfer",
+ // "ownerCanDestroy",
+ // "transfersEnabled"
+ // @param value Value of the limit.
+ //
// Selector: setCollectionLimit(string,bool) 993b7fba
function setCollectionLimit(string memory limit, bool value) external;
+ // Get contract address.
+ //
// Selector: contractAddress() f6b4dfb4
function contractAddress() external view returns (address);
+ // Add collection admin by substrate address.
+ // @param new_admin Substrate administrator address.
+ //
// Selector: addCollectionAdminSubstrate(uint256) 5730062b
- function addCollectionAdminSubstrate(uint256 newAdmin) external view;
+ function addCollectionAdminSubstrate(uint256 newAdmin) external;
+ // Remove collection admin by substrate address.
+ // @param admin Substrate administrator address.
+ //
// Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9
- function removeCollectionAdminSubstrate(uint256 newAdmin) external view;
+ function removeCollectionAdminSubstrate(uint256 admin) external;
+ // Add collection admin.
+ // @param new_admin Address of the added administrator.
+ //
// Selector: addCollectionAdmin(address) 92e462c7
- function addCollectionAdmin(address newAdmin) external view;
+ function addCollectionAdmin(address newAdmin) external;
+ // Remove collection admin.
+ //
+ // @param new_admin Address of the removed administrator.
+ //
// Selector: removeCollectionAdmin(address) fafd7b42
- function removeCollectionAdmin(address admin) external view;
+ function removeCollectionAdmin(address admin) external;
+ // Toggle accessibility of collection nesting.
+ //
+ // @param enable If "true" degenerates to nesting: 'Owner' else to nesting: 'Disabled'
+ //
// Selector: setCollectionNesting(bool) 112d4586
function setCollectionNesting(bool enable) external;
+ // Toggle accessibility of collection nesting.
+ //
+ // @param enable If "true" degenerates to nesting: {OwnerRestricted: [1, 2, 3]} else to nesting: 'Disabled'
+ // @param collections Addresses of collections that will be available for nesting.
+ //
// Selector: setCollectionNesting(bool,address[]) 64872396
function setCollectionNesting(bool enable, address[] memory collections)
external;
+ // Set the collection access method.
+ // @param mode Access mode
+ // 0 for Normal
+ // 1 for AllowList
+ //
// Selector: setCollectionAccess(uint8) 41835d4c
function setCollectionAccess(uint8 mode) external;
+ // Add the user to the allowed list.
+ //
+ // @param user Address of a trusted user.
+ //
// Selector: addToCollectionAllowList(address) 67844fe6
- function addToCollectionAllowList(address user) external view;
+ function addToCollectionAllowList(address user) external;
+ // Remove the user from the allowed list.
+ //
+ // @param user Address of a removed user.
+ //
// Selector: removeFromCollectionAllowList(address) 85c51acb
- function removeFromCollectionAllowList(address user) external view;
+ function removeFromCollectionAllowList(address user) external;
+ // Switch permission for minting.
+ //
+ // @param mode Enable if "true".
+ //
// Selector: setCollectionMintMode(bool) 00018e84
function setCollectionMintMode(bool mode) external;
}
// Selector: d74d154f
interface ERC721UniqueExtensions is Dummy, ERC165 {
+ // @notice Transfer ownership of an NFT
+ // @dev Throws unless `msg.sender` is the current owner. Throws if `to`
+ // is the zero address. Throws if `tokenId` is not a valid NFT.
+ // @param to The new owner
+ // @param tokenId The NFT to transfer
+ // @param _value Not used for an NFT
+ //
// Selector: transfer(address,uint256) a9059cbb
function transfer(address to, uint256 tokenId) external;
+ // @notice Burns a specific ERC721 token.
+ // @dev Throws unless `msg.sender` is the current owner or an authorized
+ // operator for this NFT. Throws if `from` is not the current owner. Throws
+ // if `to` is the zero address. Throws if `tokenId` is not a valid NFT.
+ // @param from The current owner of the NFT
+ // @param tokenId The NFT to transfer
+ // @param _value Not used for an NFT
+ //
// Selector: burnFrom(address,uint256) 79cc6790
function burnFrom(address from, uint256 tokenId) external;
+ // @notice Returns next free NFT ID.
+ //
// Selector: nextTokenId() 75794a3c
function nextTokenId() external view returns (uint256);
+ // @notice Function to mint multiple tokens.
+ // @dev `tokenIds` should be an array of consecutive numbers and first number
+ // should be obtained with `nextTokenId` method
+ // @param to The new owner
+ // @param tokenIds IDs of the minted NFTs
+ //
// Selector: mintBulk(address,uint256[]) 44a9945e
function mintBulk(address to, uint256[] memory tokenIds)
external
returns (bool);
+ // @notice Function to mint multiple tokens with the given tokenUris.
+ // @dev `tokenIds` is array of pairs of token ID and token URI. Token IDs should be consecutive
+ // numbers and first number should be obtained with `nextTokenId` method
+ // @param to The new owner
+ // @param tokens array of pairs of token ID and token URI for minted tokens
+ //
// Selector: mintBulkWithTokenURI(address,(uint256,string)[]) 36543006
function mintBulkWithTokenURI(address to, Tuple0[] memory tokens)
external
tests/src/eth/fungibleAbi.jsondiffbeforeafterboth--- a/tests/src/eth/fungibleAbi.json
+++ b/tests/src/eth/fungibleAbi.json
@@ -51,6 +51,33 @@
},
{
"inputs": [
+ { "internalType": "address", "name": "newAdmin", "type": "address" }
+ ],
+ "name": "addCollectionAdmin",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ { "internalType": "uint256", "name": "newAdmin", "type": "uint256" }
+ ],
+ "name": "addCollectionAdminSubstrate",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ { "internalType": "address", "name": "user", "type": "address" }
+ ],
+ "name": "addToCollectionAllowList",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
{ "internalType": "address", "name": "owner", "type": "address" },
{ "internalType": "address", "name": "spender", "type": "address" }
],
@@ -97,6 +124,13 @@
},
{
"inputs": [],
+ "name": "confirmCollectionSponsorship",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
"name": "contractAddress",
"outputs": [{ "internalType": "address", "name": "", "type": "address" }],
"stateMutability": "view",
@@ -118,43 +152,51 @@
},
{
"inputs": [],
- "name": "ethConfirmSponsorship",
- "outputs": [],
- "stateMutability": "nonpayable",
+ "name": "name",
+ "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
+ "stateMutability": "view",
"type": "function"
},
{
"inputs": [
- { "internalType": "address", "name": "sponsor", "type": "address" }
+ { "internalType": "address", "name": "admin", "type": "address" }
],
- "name": "ethSetSponsor",
+ "name": "removeCollectionAdmin",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
- "inputs": [],
- "name": "name",
- "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
- "stateMutability": "view",
+ "inputs": [
+ { "internalType": "uint256", "name": "admin", "type": "uint256" }
+ ],
+ "name": "removeCollectionAdminSubstrate",
+ "outputs": [],
+ "stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
- { "internalType": "string", "name": "key", "type": "string" },
- { "internalType": "bytes", "name": "value", "type": "bytes" }
+ { "internalType": "address", "name": "user", "type": "address" }
],
- "name": "setCollectionProperty",
+ "name": "removeFromCollectionAllowList",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
+ "inputs": [{ "internalType": "uint8", "name": "mode", "type": "uint8" }],
+ "name": "setCollectionAccess",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
"inputs": [
{ "internalType": "string", "name": "limit", "type": "string" },
{ "internalType": "uint32", "name": "value", "type": "uint32" }
],
- "name": "setLimit",
+ "name": "setCollectionLimit",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -164,7 +206,54 @@
{ "internalType": "string", "name": "limit", "type": "string" },
{ "internalType": "bool", "name": "value", "type": "bool" }
],
- "name": "setLimit",
+ "name": "setCollectionLimit",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [{ "internalType": "bool", "name": "mode", "type": "bool" }],
+ "name": "setCollectionMintMode",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [{ "internalType": "bool", "name": "enable", "type": "bool" }],
+ "name": "setCollectionNesting",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ { "internalType": "bool", "name": "enable", "type": "bool" },
+ {
+ "internalType": "address[]",
+ "name": "collections",
+ "type": "address[]"
+ }
+ ],
+ "name": "setCollectionNesting",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ { "internalType": "string", "name": "key", "type": "string" },
+ { "internalType": "bytes", "name": "value", "type": "bytes" }
+ ],
+ "name": "setCollectionProperty",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ { "internalType": "address", "name": "sponsor", "type": "address" }
+ ],
+ "name": "setCollectionSponsor",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
tests/src/eth/nonFungibleAbi.jsondiffbeforeafterboth--- a/tests/src/eth/nonFungibleAbi.json
+++ b/tests/src/eth/nonFungibleAbi.json
@@ -86,7 +86,7 @@
],
"name": "addCollectionAdmin",
"outputs": [],
- "stateMutability": "view",
+ "stateMutability": "nonpayable",
"type": "function"
},
{
@@ -95,7 +95,7 @@
],
"name": "addCollectionAdminSubstrate",
"outputs": [],
- "stateMutability": "view",
+ "stateMutability": "nonpayable",
"type": "function"
},
{
@@ -104,7 +104,7 @@
],
"name": "addToCollectionAllowList",
"outputs": [],
- "stateMutability": "view",
+ "stateMutability": "nonpayable",
"type": "function"
},
{
@@ -304,16 +304,16 @@
],
"name": "removeCollectionAdmin",
"outputs": [],
- "stateMutability": "view",
+ "stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
- { "internalType": "uint256", "name": "newAdmin", "type": "uint256" }
+ { "internalType": "uint256", "name": "admin", "type": "uint256" }
],
"name": "removeCollectionAdminSubstrate",
"outputs": [],
- "stateMutability": "view",
+ "stateMutability": "nonpayable",
"type": "function"
},
{
@@ -322,7 +322,7 @@
],
"name": "removeFromCollectionAllowList",
"outputs": [],
- "stateMutability": "view",
+ "stateMutability": "nonpayable",
"type": "function"
},
{
tests/src/interfaces/augment-api-errors.tsdiffbeforeafterboth--- a/tests/src/interfaces/augment-api-errors.ts
+++ b/tests/src/interfaces/augment-api-errors.ts
@@ -277,15 +277,16 @@
};
fungible: {
/**
- * Fungible token does not support nested
+ * Fungible token does not support nesting.
**/
FungibleDisallowsNesting: AugmentedError<ApiType>;
/**
- * Tried to set data for fungible item
+ * Tried to set data for fungible item.
**/
FungibleItemsDontHaveData: AugmentedError<ApiType>;
/**
- * Not default id passed as TokenId argument
+ * Not default id passed as TokenId argument.
+ * The default value of TokenId for Fungible collection is 0.
**/
FungibleItemsHaveNoId: AugmentedError<ApiType>;
/**
@@ -293,7 +294,7 @@
**/
NotFungibleDataUsedToMintFungibleCollectionToken: AugmentedError<ApiType>;
/**
- * Setting item properties is not allowed
+ * Setting item properties is not allowed.
**/
SettingPropertiesNotAllowed: AugmentedError<ApiType>;
/**
tests/src/interfaces/augment-api-query.tsdiffbeforeafterboth--- a/tests/src/interfaces/augment-api-query.ts
+++ b/tests/src/interfaces/augment-api-query.ts
@@ -187,8 +187,17 @@
[key: string]: QueryableStorageEntry<ApiType>;
};
fungible: {
+ /**
+ * Storage for delegated assets.
+ **/
allowance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, arg3: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u128>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr]>;
+ /**
+ * Amount of tokens owned by an account inside a collection.
+ **/
balance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u128>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
+ /**
+ * Total amount of fungible tokens inside a collection.
+ **/
totalSupply: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<u128>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
/**
* Generic query
@@ -400,16 +409,35 @@
[key: string]: QueryableStorageEntry<ApiType>;
};
refungible: {
+ /**
+ * Amount of tokens owned by account
+ **/
accountBalance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u32>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
+ /**
+ * Allowance set by an owner for a spender for a token
+ **/
allowance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array, arg3: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, arg4: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u128>, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr]>;
+ /**
+ * Amount of token pieces owned by account
+ **/
balance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array, arg3: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u128>, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
/**
* Used to enumerate tokens owned by account
**/
owned: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, arg3: u32 | AnyNumber | Uint8Array) => Observable<bool>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, u32]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr, u32]>;
+ /**
+ * Custom data serialized to bytes for token
+ **/
tokenData: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<PalletRefungibleItemData>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
+ tokenProperties: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<UpDataStructsProperties>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
tokensBurnt: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<u32>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
+ /**
+ * Amount of tokens minted for collection
+ **/
tokensMinted: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<u32>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
+ /**
+ * Total amount of pieces for token
+ **/
totalSupply: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<u128>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
/**
* Generic query
tests/src/interfaces/default/types.tsdiffbeforeafterboth--- a/tests/src/interfaces/default/types.ts
+++ b/tests/src/interfaces/default/types.ts
@@ -2461,12 +2461,14 @@
export interface UpDataStructsCreateReFungibleData extends Struct {
readonly constData: Bytes;
readonly pieces: u128;
+ readonly properties: Vec<UpDataStructsProperty>;
}
/** @name UpDataStructsCreateRefungibleExData */
export interface UpDataStructsCreateRefungibleExData extends Struct {
readonly constData: Bytes;
readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;
+ readonly properties: Vec<UpDataStructsProperty>;
}
/** @name UpDataStructsNestingPermissions */
tests/src/interfaces/lookup.tsdiffbeforeafterboth--- a/tests/src/interfaces/lookup.ts
+++ b/tests/src/interfaces/lookup.ts
@@ -1502,7 +1502,8 @@
**/
UpDataStructsCreateReFungibleData: {
constData: 'Bytes',
- pieces: 'u128'
+ pieces: 'u128',
+ properties: 'Vec<UpDataStructsProperty>'
},
/**
* Lookup193: up_data_structs::CreateItemExData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
@@ -1527,7 +1528,8 @@
**/
UpDataStructsCreateRefungibleExData: {
constData: 'Bytes',
- users: 'BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>'
+ users: 'BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>',
+ properties: 'Vec<UpDataStructsProperty>'
},
/**
* Lookup204: pallet_unique_scheduler::pallet::Call<T>
tests/src/interfaces/types-lookup.tsdiffbeforeafterboth1// Auto-generated via `yarn polkadot-types-from-defs`, do not edit2/* eslint-disable */34declare module '@polkadot/types/lookup' {5 import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';6 import type { ITuple } from '@polkadot/types-codec/types';7 import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime';8 import type { Event } from '@polkadot/types/interfaces/system';910 /** @name PolkadotPrimitivesV2PersistedValidationData (2) */11 export interface PolkadotPrimitivesV2PersistedValidationData extends Struct {12 readonly parentHead: Bytes;13 readonly relayParentNumber: u32;14 readonly relayParentStorageRoot: H256;15 readonly maxPovSize: u32;16 }1718 /** @name PolkadotPrimitivesV2UpgradeRestriction (9) */19 export interface PolkadotPrimitivesV2UpgradeRestriction extends Enum {20 readonly isPresent: boolean;21 readonly type: 'Present';22 }2324 /** @name SpTrieStorageProof (10) */25 export interface SpTrieStorageProof extends Struct {26 readonly trieNodes: BTreeSet<Bytes>;27 }2829 /** @name CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot (13) */30 export interface CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot extends Struct {31 readonly dmqMqcHead: H256;32 readonly relayDispatchQueueSize: ITuple<[u32, u32]>;33 readonly ingressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;34 readonly egressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;35 }3637 /** @name PolkadotPrimitivesV2AbridgedHrmpChannel (18) */38 export interface PolkadotPrimitivesV2AbridgedHrmpChannel extends Struct {39 readonly maxCapacity: u32;40 readonly maxTotalSize: u32;41 readonly maxMessageSize: u32;42 readonly msgCount: u32;43 readonly totalSize: u32;44 readonly mqcHead: Option<H256>;45 }4647 /** @name PolkadotPrimitivesV2AbridgedHostConfiguration (20) */48 export interface PolkadotPrimitivesV2AbridgedHostConfiguration extends Struct {49 readonly maxCodeSize: u32;50 readonly maxHeadDataSize: u32;51 readonly maxUpwardQueueCount: u32;52 readonly maxUpwardQueueSize: u32;53 readonly maxUpwardMessageSize: u32;54 readonly maxUpwardMessageNumPerCandidate: u32;55 readonly hrmpMaxMessageNumPerCandidate: u32;56 readonly validationUpgradeCooldown: u32;57 readonly validationUpgradeDelay: u32;58 }5960 /** @name PolkadotCorePrimitivesOutboundHrmpMessage (26) */61 export interface PolkadotCorePrimitivesOutboundHrmpMessage extends Struct {62 readonly recipient: u32;63 readonly data: Bytes;64 }6566 /** @name CumulusPalletParachainSystemCall (28) */67 export interface CumulusPalletParachainSystemCall extends Enum {68 readonly isSetValidationData: boolean;69 readonly asSetValidationData: {70 readonly data: CumulusPrimitivesParachainInherentParachainInherentData;71 } & Struct;72 readonly isSudoSendUpwardMessage: boolean;73 readonly asSudoSendUpwardMessage: {74 readonly message: Bytes;75 } & Struct;76 readonly isAuthorizeUpgrade: boolean;77 readonly asAuthorizeUpgrade: {78 readonly codeHash: H256;79 } & Struct;80 readonly isEnactAuthorizedUpgrade: boolean;81 readonly asEnactAuthorizedUpgrade: {82 readonly code: Bytes;83 } & Struct;84 readonly type: 'SetValidationData' | 'SudoSendUpwardMessage' | 'AuthorizeUpgrade' | 'EnactAuthorizedUpgrade';85 }8687 /** @name CumulusPrimitivesParachainInherentParachainInherentData (29) */88 export interface CumulusPrimitivesParachainInherentParachainInherentData extends Struct {89 readonly validationData: PolkadotPrimitivesV2PersistedValidationData;90 readonly relayChainState: SpTrieStorageProof;91 readonly downwardMessages: Vec<PolkadotCorePrimitivesInboundDownwardMessage>;92 readonly horizontalMessages: BTreeMap<u32, Vec<PolkadotCorePrimitivesInboundHrmpMessage>>;93 }9495 /** @name PolkadotCorePrimitivesInboundDownwardMessage (31) */96 export interface PolkadotCorePrimitivesInboundDownwardMessage extends Struct {97 readonly sentAt: u32;98 readonly msg: Bytes;99 }100101 /** @name PolkadotCorePrimitivesInboundHrmpMessage (34) */102 export interface PolkadotCorePrimitivesInboundHrmpMessage extends Struct {103 readonly sentAt: u32;104 readonly data: Bytes;105 }106107 /** @name CumulusPalletParachainSystemEvent (37) */108 export interface CumulusPalletParachainSystemEvent extends Enum {109 readonly isValidationFunctionStored: boolean;110 readonly isValidationFunctionApplied: boolean;111 readonly asValidationFunctionApplied: {112 readonly relayChainBlockNum: u32;113 } & Struct;114 readonly isValidationFunctionDiscarded: boolean;115 readonly isUpgradeAuthorized: boolean;116 readonly asUpgradeAuthorized: {117 readonly codeHash: H256;118 } & Struct;119 readonly isDownwardMessagesReceived: boolean;120 readonly asDownwardMessagesReceived: {121 readonly count: u32;122 } & Struct;123 readonly isDownwardMessagesProcessed: boolean;124 readonly asDownwardMessagesProcessed: {125 readonly weightUsed: u64;126 readonly dmqHead: H256;127 } & Struct;128 readonly type: 'ValidationFunctionStored' | 'ValidationFunctionApplied' | 'ValidationFunctionDiscarded' | 'UpgradeAuthorized' | 'DownwardMessagesReceived' | 'DownwardMessagesProcessed';129 }130131 /** @name CumulusPalletParachainSystemError (38) */132 export interface CumulusPalletParachainSystemError extends Enum {133 readonly isOverlappingUpgrades: boolean;134 readonly isProhibitedByPolkadot: boolean;135 readonly isTooBig: boolean;136 readonly isValidationDataNotAvailable: boolean;137 readonly isHostConfigurationNotAvailable: boolean;138 readonly isNotScheduled: boolean;139 readonly isNothingAuthorized: boolean;140 readonly isUnauthorized: boolean;141 readonly type: 'OverlappingUpgrades' | 'ProhibitedByPolkadot' | 'TooBig' | 'ValidationDataNotAvailable' | 'HostConfigurationNotAvailable' | 'NotScheduled' | 'NothingAuthorized' | 'Unauthorized';142 }143144 /** @name PalletBalancesAccountData (41) */145 export interface PalletBalancesAccountData extends Struct {146 readonly free: u128;147 readonly reserved: u128;148 readonly miscFrozen: u128;149 readonly feeFrozen: u128;150 }151152 /** @name PalletBalancesBalanceLock (43) */153 export interface PalletBalancesBalanceLock extends Struct {154 readonly id: U8aFixed;155 readonly amount: u128;156 readonly reasons: PalletBalancesReasons;157 }158159 /** @name PalletBalancesReasons (45) */160 export interface PalletBalancesReasons extends Enum {161 readonly isFee: boolean;162 readonly isMisc: boolean;163 readonly isAll: boolean;164 readonly type: 'Fee' | 'Misc' | 'All';165 }166167 /** @name PalletBalancesReserveData (48) */168 export interface PalletBalancesReserveData extends Struct {169 readonly id: U8aFixed;170 readonly amount: u128;171 }172173 /** @name PalletBalancesReleases (51) */174 export interface PalletBalancesReleases extends Enum {175 readonly isV100: boolean;176 readonly isV200: boolean;177 readonly type: 'V100' | 'V200';178 }179180 /** @name PalletBalancesCall (52) */181 export interface PalletBalancesCall extends Enum {182 readonly isTransfer: boolean;183 readonly asTransfer: {184 readonly dest: MultiAddress;185 readonly value: Compact<u128>;186 } & Struct;187 readonly isSetBalance: boolean;188 readonly asSetBalance: {189 readonly who: MultiAddress;190 readonly newFree: Compact<u128>;191 readonly newReserved: Compact<u128>;192 } & Struct;193 readonly isForceTransfer: boolean;194 readonly asForceTransfer: {195 readonly source: MultiAddress;196 readonly dest: MultiAddress;197 readonly value: Compact<u128>;198 } & Struct;199 readonly isTransferKeepAlive: boolean;200 readonly asTransferKeepAlive: {201 readonly dest: MultiAddress;202 readonly value: Compact<u128>;203 } & Struct;204 readonly isTransferAll: boolean;205 readonly asTransferAll: {206 readonly dest: MultiAddress;207 readonly keepAlive: bool;208 } & Struct;209 readonly isForceUnreserve: boolean;210 readonly asForceUnreserve: {211 readonly who: MultiAddress;212 readonly amount: u128;213 } & Struct;214 readonly type: 'Transfer' | 'SetBalance' | 'ForceTransfer' | 'TransferKeepAlive' | 'TransferAll' | 'ForceUnreserve';215 }216217 /** @name PalletBalancesEvent (58) */218 export interface PalletBalancesEvent extends Enum {219 readonly isEndowed: boolean;220 readonly asEndowed: {221 readonly account: AccountId32;222 readonly freeBalance: u128;223 } & Struct;224 readonly isDustLost: boolean;225 readonly asDustLost: {226 readonly account: AccountId32;227 readonly amount: u128;228 } & Struct;229 readonly isTransfer: boolean;230 readonly asTransfer: {231 readonly from: AccountId32;232 readonly to: AccountId32;233 readonly amount: u128;234 } & Struct;235 readonly isBalanceSet: boolean;236 readonly asBalanceSet: {237 readonly who: AccountId32;238 readonly free: u128;239 readonly reserved: u128;240 } & Struct;241 readonly isReserved: boolean;242 readonly asReserved: {243 readonly who: AccountId32;244 readonly amount: u128;245 } & Struct;246 readonly isUnreserved: boolean;247 readonly asUnreserved: {248 readonly who: AccountId32;249 readonly amount: u128;250 } & Struct;251 readonly isReserveRepatriated: boolean;252 readonly asReserveRepatriated: {253 readonly from: AccountId32;254 readonly to: AccountId32;255 readonly amount: u128;256 readonly destinationStatus: FrameSupportTokensMiscBalanceStatus;257 } & Struct;258 readonly isDeposit: boolean;259 readonly asDeposit: {260 readonly who: AccountId32;261 readonly amount: u128;262 } & Struct;263 readonly isWithdraw: boolean;264 readonly asWithdraw: {265 readonly who: AccountId32;266 readonly amount: u128;267 } & Struct;268 readonly isSlashed: boolean;269 readonly asSlashed: {270 readonly who: AccountId32;271 readonly amount: u128;272 } & Struct;273 readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'BalanceSet' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'Deposit' | 'Withdraw' | 'Slashed';274 }275276 /** @name FrameSupportTokensMiscBalanceStatus (59) */277 export interface FrameSupportTokensMiscBalanceStatus extends Enum {278 readonly isFree: boolean;279 readonly isReserved: boolean;280 readonly type: 'Free' | 'Reserved';281 }282283 /** @name PalletBalancesError (60) */284 export interface PalletBalancesError extends Enum {285 readonly isVestingBalance: boolean;286 readonly isLiquidityRestrictions: boolean;287 readonly isInsufficientBalance: boolean;288 readonly isExistentialDeposit: boolean;289 readonly isKeepAlive: boolean;290 readonly isExistingVestingSchedule: boolean;291 readonly isDeadAccount: boolean;292 readonly isTooManyReserves: boolean;293 readonly type: 'VestingBalance' | 'LiquidityRestrictions' | 'InsufficientBalance' | 'ExistentialDeposit' | 'KeepAlive' | 'ExistingVestingSchedule' | 'DeadAccount' | 'TooManyReserves';294 }295296 /** @name PalletTimestampCall (63) */297 export interface PalletTimestampCall extends Enum {298 readonly isSet: boolean;299 readonly asSet: {300 readonly now: Compact<u64>;301 } & Struct;302 readonly type: 'Set';303 }304305 /** @name PalletTransactionPaymentReleases (66) */306 export interface PalletTransactionPaymentReleases extends Enum {307 readonly isV1Ancient: boolean;308 readonly isV2: boolean;309 readonly type: 'V1Ancient' | 'V2';310 }311312 /** @name PalletTreasuryProposal (67) */313 export interface PalletTreasuryProposal extends Struct {314 readonly proposer: AccountId32;315 readonly value: u128;316 readonly beneficiary: AccountId32;317 readonly bond: u128;318 }319320 /** @name PalletTreasuryCall (70) */321 export interface PalletTreasuryCall extends Enum {322 readonly isProposeSpend: boolean;323 readonly asProposeSpend: {324 readonly value: Compact<u128>;325 readonly beneficiary: MultiAddress;326 } & Struct;327 readonly isRejectProposal: boolean;328 readonly asRejectProposal: {329 readonly proposalId: Compact<u32>;330 } & Struct;331 readonly isApproveProposal: boolean;332 readonly asApproveProposal: {333 readonly proposalId: Compact<u32>;334 } & Struct;335 readonly isRemoveApproval: boolean;336 readonly asRemoveApproval: {337 readonly proposalId: Compact<u32>;338 } & Struct;339 readonly type: 'ProposeSpend' | 'RejectProposal' | 'ApproveProposal' | 'RemoveApproval';340 }341342 /** @name PalletTreasuryEvent (72) */343 export interface PalletTreasuryEvent extends Enum {344 readonly isProposed: boolean;345 readonly asProposed: {346 readonly proposalIndex: u32;347 } & Struct;348 readonly isSpending: boolean;349 readonly asSpending: {350 readonly budgetRemaining: u128;351 } & Struct;352 readonly isAwarded: boolean;353 readonly asAwarded: {354 readonly proposalIndex: u32;355 readonly award: u128;356 readonly account: AccountId32;357 } & Struct;358 readonly isRejected: boolean;359 readonly asRejected: {360 readonly proposalIndex: u32;361 readonly slashed: u128;362 } & Struct;363 readonly isBurnt: boolean;364 readonly asBurnt: {365 readonly burntFunds: u128;366 } & Struct;367 readonly isRollover: boolean;368 readonly asRollover: {369 readonly rolloverBalance: u128;370 } & Struct;371 readonly isDeposit: boolean;372 readonly asDeposit: {373 readonly value: u128;374 } & Struct;375 readonly type: 'Proposed' | 'Spending' | 'Awarded' | 'Rejected' | 'Burnt' | 'Rollover' | 'Deposit';376 }377378 /** @name FrameSupportPalletId (75) */379 export interface FrameSupportPalletId extends U8aFixed {}380381 /** @name PalletTreasuryError (76) */382 export interface PalletTreasuryError extends Enum {383 readonly isInsufficientProposersBalance: boolean;384 readonly isInvalidIndex: boolean;385 readonly isTooManyApprovals: boolean;386 readonly isProposalNotApproved: boolean;387 readonly type: 'InsufficientProposersBalance' | 'InvalidIndex' | 'TooManyApprovals' | 'ProposalNotApproved';388 }389390 /** @name PalletSudoCall (77) */391 export interface PalletSudoCall extends Enum {392 readonly isSudo: boolean;393 readonly asSudo: {394 readonly call: Call;395 } & Struct;396 readonly isSudoUncheckedWeight: boolean;397 readonly asSudoUncheckedWeight: {398 readonly call: Call;399 readonly weight: u64;400 } & Struct;401 readonly isSetKey: boolean;402 readonly asSetKey: {403 readonly new_: MultiAddress;404 } & Struct;405 readonly isSudoAs: boolean;406 readonly asSudoAs: {407 readonly who: MultiAddress;408 readonly call: Call;409 } & Struct;410 readonly type: 'Sudo' | 'SudoUncheckedWeight' | 'SetKey' | 'SudoAs';411 }412413 /** @name FrameSystemCall (79) */414 export interface FrameSystemCall extends Enum {415 readonly isFillBlock: boolean;416 readonly asFillBlock: {417 readonly ratio: Perbill;418 } & Struct;419 readonly isRemark: boolean;420 readonly asRemark: {421 readonly remark: Bytes;422 } & Struct;423 readonly isSetHeapPages: boolean;424 readonly asSetHeapPages: {425 readonly pages: u64;426 } & Struct;427 readonly isSetCode: boolean;428 readonly asSetCode: {429 readonly code: Bytes;430 } & Struct;431 readonly isSetCodeWithoutChecks: boolean;432 readonly asSetCodeWithoutChecks: {433 readonly code: Bytes;434 } & Struct;435 readonly isSetStorage: boolean;436 readonly asSetStorage: {437 readonly items: Vec<ITuple<[Bytes, Bytes]>>;438 } & Struct;439 readonly isKillStorage: boolean;440 readonly asKillStorage: {441 readonly keys_: Vec<Bytes>;442 } & Struct;443 readonly isKillPrefix: boolean;444 readonly asKillPrefix: {445 readonly prefix: Bytes;446 readonly subkeys: u32;447 } & Struct;448 readonly isRemarkWithEvent: boolean;449 readonly asRemarkWithEvent: {450 readonly remark: Bytes;451 } & Struct;452 readonly type: 'FillBlock' | 'Remark' | 'SetHeapPages' | 'SetCode' | 'SetCodeWithoutChecks' | 'SetStorage' | 'KillStorage' | 'KillPrefix' | 'RemarkWithEvent';453 }454455 /** @name OrmlVestingModuleCall (83) */456 export interface OrmlVestingModuleCall extends Enum {457 readonly isClaim: boolean;458 readonly isVestedTransfer: boolean;459 readonly asVestedTransfer: {460 readonly dest: MultiAddress;461 readonly schedule: OrmlVestingVestingSchedule;462 } & Struct;463 readonly isUpdateVestingSchedules: boolean;464 readonly asUpdateVestingSchedules: {465 readonly who: MultiAddress;466 readonly vestingSchedules: Vec<OrmlVestingVestingSchedule>;467 } & Struct;468 readonly isClaimFor: boolean;469 readonly asClaimFor: {470 readonly dest: MultiAddress;471 } & Struct;472 readonly type: 'Claim' | 'VestedTransfer' | 'UpdateVestingSchedules' | 'ClaimFor';473 }474475 /** @name OrmlVestingVestingSchedule (84) */476 export interface OrmlVestingVestingSchedule extends Struct {477 readonly start: u32;478 readonly period: u32;479 readonly periodCount: u32;480 readonly perPeriod: Compact<u128>;481 }482483 /** @name CumulusPalletXcmpQueueCall (86) */484 export interface CumulusPalletXcmpQueueCall extends Enum {485 readonly isServiceOverweight: boolean;486 readonly asServiceOverweight: {487 readonly index: u64;488 readonly weightLimit: u64;489 } & Struct;490 readonly isSuspendXcmExecution: boolean;491 readonly isResumeXcmExecution: boolean;492 readonly isUpdateSuspendThreshold: boolean;493 readonly asUpdateSuspendThreshold: {494 readonly new_: u32;495 } & Struct;496 readonly isUpdateDropThreshold: boolean;497 readonly asUpdateDropThreshold: {498 readonly new_: u32;499 } & Struct;500 readonly isUpdateResumeThreshold: boolean;501 readonly asUpdateResumeThreshold: {502 readonly new_: u32;503 } & Struct;504 readonly isUpdateThresholdWeight: boolean;505 readonly asUpdateThresholdWeight: {506 readonly new_: u64;507 } & Struct;508 readonly isUpdateWeightRestrictDecay: boolean;509 readonly asUpdateWeightRestrictDecay: {510 readonly new_: u64;511 } & Struct;512 readonly isUpdateXcmpMaxIndividualWeight: boolean;513 readonly asUpdateXcmpMaxIndividualWeight: {514 readonly new_: u64;515 } & Struct;516 readonly type: 'ServiceOverweight' | 'SuspendXcmExecution' | 'ResumeXcmExecution' | 'UpdateSuspendThreshold' | 'UpdateDropThreshold' | 'UpdateResumeThreshold' | 'UpdateThresholdWeight' | 'UpdateWeightRestrictDecay' | 'UpdateXcmpMaxIndividualWeight';517 }518519 /** @name PalletXcmCall (87) */520 export interface PalletXcmCall extends Enum {521 readonly isSend: boolean;522 readonly asSend: {523 readonly dest: XcmVersionedMultiLocation;524 readonly message: XcmVersionedXcm;525 } & Struct;526 readonly isTeleportAssets: boolean;527 readonly asTeleportAssets: {528 readonly dest: XcmVersionedMultiLocation;529 readonly beneficiary: XcmVersionedMultiLocation;530 readonly assets: XcmVersionedMultiAssets;531 readonly feeAssetItem: u32;532 } & Struct;533 readonly isReserveTransferAssets: boolean;534 readonly asReserveTransferAssets: {535 readonly dest: XcmVersionedMultiLocation;536 readonly beneficiary: XcmVersionedMultiLocation;537 readonly assets: XcmVersionedMultiAssets;538 readonly feeAssetItem: u32;539 } & Struct;540 readonly isExecute: boolean;541 readonly asExecute: {542 readonly message: XcmVersionedXcm;543 readonly maxWeight: u64;544 } & Struct;545 readonly isForceXcmVersion: boolean;546 readonly asForceXcmVersion: {547 readonly location: XcmV1MultiLocation;548 readonly xcmVersion: u32;549 } & Struct;550 readonly isForceDefaultXcmVersion: boolean;551 readonly asForceDefaultXcmVersion: {552 readonly maybeXcmVersion: Option<u32>;553 } & Struct;554 readonly isForceSubscribeVersionNotify: boolean;555 readonly asForceSubscribeVersionNotify: {556 readonly location: XcmVersionedMultiLocation;557 } & Struct;558 readonly isForceUnsubscribeVersionNotify: boolean;559 readonly asForceUnsubscribeVersionNotify: {560 readonly location: XcmVersionedMultiLocation;561 } & Struct;562 readonly isLimitedReserveTransferAssets: boolean;563 readonly asLimitedReserveTransferAssets: {564 readonly dest: XcmVersionedMultiLocation;565 readonly beneficiary: XcmVersionedMultiLocation;566 readonly assets: XcmVersionedMultiAssets;567 readonly feeAssetItem: u32;568 readonly weightLimit: XcmV2WeightLimit;569 } & Struct;570 readonly isLimitedTeleportAssets: boolean;571 readonly asLimitedTeleportAssets: {572 readonly dest: XcmVersionedMultiLocation;573 readonly beneficiary: XcmVersionedMultiLocation;574 readonly assets: XcmVersionedMultiAssets;575 readonly feeAssetItem: u32;576 readonly weightLimit: XcmV2WeightLimit;577 } & Struct;578 readonly type: 'Send' | 'TeleportAssets' | 'ReserveTransferAssets' | 'Execute' | 'ForceXcmVersion' | 'ForceDefaultXcmVersion' | 'ForceSubscribeVersionNotify' | 'ForceUnsubscribeVersionNotify' | 'LimitedReserveTransferAssets' | 'LimitedTeleportAssets';579 }580581 /** @name XcmVersionedMultiLocation (88) */582 export interface XcmVersionedMultiLocation extends Enum {583 readonly isV0: boolean;584 readonly asV0: XcmV0MultiLocation;585 readonly isV1: boolean;586 readonly asV1: XcmV1MultiLocation;587 readonly type: 'V0' | 'V1';588 }589590 /** @name XcmV0MultiLocation (89) */591 export interface XcmV0MultiLocation extends Enum {592 readonly isNull: boolean;593 readonly isX1: boolean;594 readonly asX1: XcmV0Junction;595 readonly isX2: boolean;596 readonly asX2: ITuple<[XcmV0Junction, XcmV0Junction]>;597 readonly isX3: boolean;598 readonly asX3: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction]>;599 readonly isX4: boolean;600 readonly asX4: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;601 readonly isX5: boolean;602 readonly asX5: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;603 readonly isX6: boolean;604 readonly asX6: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;605 readonly isX7: boolean;606 readonly asX7: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;607 readonly isX8: boolean;608 readonly asX8: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;609 readonly type: 'Null' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';610 }611612 /** @name XcmV0Junction (90) */613 export interface XcmV0Junction extends Enum {614 readonly isParent: boolean;615 readonly isParachain: boolean;616 readonly asParachain: Compact<u32>;617 readonly isAccountId32: boolean;618 readonly asAccountId32: {619 readonly network: XcmV0JunctionNetworkId;620 readonly id: U8aFixed;621 } & Struct;622 readonly isAccountIndex64: boolean;623 readonly asAccountIndex64: {624 readonly network: XcmV0JunctionNetworkId;625 readonly index: Compact<u64>;626 } & Struct;627 readonly isAccountKey20: boolean;628 readonly asAccountKey20: {629 readonly network: XcmV0JunctionNetworkId;630 readonly key: U8aFixed;631 } & Struct;632 readonly isPalletInstance: boolean;633 readonly asPalletInstance: u8;634 readonly isGeneralIndex: boolean;635 readonly asGeneralIndex: Compact<u128>;636 readonly isGeneralKey: boolean;637 readonly asGeneralKey: Bytes;638 readonly isOnlyChild: boolean;639 readonly isPlurality: boolean;640 readonly asPlurality: {641 readonly id: XcmV0JunctionBodyId;642 readonly part: XcmV0JunctionBodyPart;643 } & Struct;644 readonly type: 'Parent' | 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';645 }646647 /** @name XcmV0JunctionNetworkId (91) */648 export interface XcmV0JunctionNetworkId extends Enum {649 readonly isAny: boolean;650 readonly isNamed: boolean;651 readonly asNamed: Bytes;652 readonly isPolkadot: boolean;653 readonly isKusama: boolean;654 readonly type: 'Any' | 'Named' | 'Polkadot' | 'Kusama';655 }656657 /** @name XcmV0JunctionBodyId (92) */658 export interface XcmV0JunctionBodyId extends Enum {659 readonly isUnit: boolean;660 readonly isNamed: boolean;661 readonly asNamed: Bytes;662 readonly isIndex: boolean;663 readonly asIndex: Compact<u32>;664 readonly isExecutive: boolean;665 readonly isTechnical: boolean;666 readonly isLegislative: boolean;667 readonly isJudicial: boolean;668 readonly type: 'Unit' | 'Named' | 'Index' | 'Executive' | 'Technical' | 'Legislative' | 'Judicial';669 }670671 /** @name XcmV0JunctionBodyPart (93) */672 export interface XcmV0JunctionBodyPart extends Enum {673 readonly isVoice: boolean;674 readonly isMembers: boolean;675 readonly asMembers: {676 readonly count: Compact<u32>;677 } & Struct;678 readonly isFraction: boolean;679 readonly asFraction: {680 readonly nom: Compact<u32>;681 readonly denom: Compact<u32>;682 } & Struct;683 readonly isAtLeastProportion: boolean;684 readonly asAtLeastProportion: {685 readonly nom: Compact<u32>;686 readonly denom: Compact<u32>;687 } & Struct;688 readonly isMoreThanProportion: boolean;689 readonly asMoreThanProportion: {690 readonly nom: Compact<u32>;691 readonly denom: Compact<u32>;692 } & Struct;693 readonly type: 'Voice' | 'Members' | 'Fraction' | 'AtLeastProportion' | 'MoreThanProportion';694 }695696 /** @name XcmV1MultiLocation (94) */697 export interface XcmV1MultiLocation extends Struct {698 readonly parents: u8;699 readonly interior: XcmV1MultilocationJunctions;700 }701702 /** @name XcmV1MultilocationJunctions (95) */703 export interface XcmV1MultilocationJunctions extends Enum {704 readonly isHere: boolean;705 readonly isX1: boolean;706 readonly asX1: XcmV1Junction;707 readonly isX2: boolean;708 readonly asX2: ITuple<[XcmV1Junction, XcmV1Junction]>;709 readonly isX3: boolean;710 readonly asX3: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction]>;711 readonly isX4: boolean;712 readonly asX4: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;713 readonly isX5: boolean;714 readonly asX5: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;715 readonly isX6: boolean;716 readonly asX6: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;717 readonly isX7: boolean;718 readonly asX7: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;719 readonly isX8: boolean;720 readonly asX8: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;721 readonly type: 'Here' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';722 }723724 /** @name XcmV1Junction (96) */725 export interface XcmV1Junction extends Enum {726 readonly isParachain: boolean;727 readonly asParachain: Compact<u32>;728 readonly isAccountId32: boolean;729 readonly asAccountId32: {730 readonly network: XcmV0JunctionNetworkId;731 readonly id: U8aFixed;732 } & Struct;733 readonly isAccountIndex64: boolean;734 readonly asAccountIndex64: {735 readonly network: XcmV0JunctionNetworkId;736 readonly index: Compact<u64>;737 } & Struct;738 readonly isAccountKey20: boolean;739 readonly asAccountKey20: {740 readonly network: XcmV0JunctionNetworkId;741 readonly key: U8aFixed;742 } & Struct;743 readonly isPalletInstance: boolean;744 readonly asPalletInstance: u8;745 readonly isGeneralIndex: boolean;746 readonly asGeneralIndex: Compact<u128>;747 readonly isGeneralKey: boolean;748 readonly asGeneralKey: Bytes;749 readonly isOnlyChild: boolean;750 readonly isPlurality: boolean;751 readonly asPlurality: {752 readonly id: XcmV0JunctionBodyId;753 readonly part: XcmV0JunctionBodyPart;754 } & Struct;755 readonly type: 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';756 }757758 /** @name XcmVersionedXcm (97) */759 export interface XcmVersionedXcm extends Enum {760 readonly isV0: boolean;761 readonly asV0: XcmV0Xcm;762 readonly isV1: boolean;763 readonly asV1: XcmV1Xcm;764 readonly isV2: boolean;765 readonly asV2: XcmV2Xcm;766 readonly type: 'V0' | 'V1' | 'V2';767 }768769 /** @name XcmV0Xcm (98) */770 export interface XcmV0Xcm extends Enum {771 readonly isWithdrawAsset: boolean;772 readonly asWithdrawAsset: {773 readonly assets: Vec<XcmV0MultiAsset>;774 readonly effects: Vec<XcmV0Order>;775 } & Struct;776 readonly isReserveAssetDeposit: boolean;777 readonly asReserveAssetDeposit: {778 readonly assets: Vec<XcmV0MultiAsset>;779 readonly effects: Vec<XcmV0Order>;780 } & Struct;781 readonly isTeleportAsset: boolean;782 readonly asTeleportAsset: {783 readonly assets: Vec<XcmV0MultiAsset>;784 readonly effects: Vec<XcmV0Order>;785 } & Struct;786 readonly isQueryResponse: boolean;787 readonly asQueryResponse: {788 readonly queryId: Compact<u64>;789 readonly response: XcmV0Response;790 } & Struct;791 readonly isTransferAsset: boolean;792 readonly asTransferAsset: {793 readonly assets: Vec<XcmV0MultiAsset>;794 readonly dest: XcmV0MultiLocation;795 } & Struct;796 readonly isTransferReserveAsset: boolean;797 readonly asTransferReserveAsset: {798 readonly assets: Vec<XcmV0MultiAsset>;799 readonly dest: XcmV0MultiLocation;800 readonly effects: Vec<XcmV0Order>;801 } & Struct;802 readonly isTransact: boolean;803 readonly asTransact: {804 readonly originType: XcmV0OriginKind;805 readonly requireWeightAtMost: u64;806 readonly call: XcmDoubleEncoded;807 } & Struct;808 readonly isHrmpNewChannelOpenRequest: boolean;809 readonly asHrmpNewChannelOpenRequest: {810 readonly sender: Compact<u32>;811 readonly maxMessageSize: Compact<u32>;812 readonly maxCapacity: Compact<u32>;813 } & Struct;814 readonly isHrmpChannelAccepted: boolean;815 readonly asHrmpChannelAccepted: {816 readonly recipient: Compact<u32>;817 } & Struct;818 readonly isHrmpChannelClosing: boolean;819 readonly asHrmpChannelClosing: {820 readonly initiator: Compact<u32>;821 readonly sender: Compact<u32>;822 readonly recipient: Compact<u32>;823 } & Struct;824 readonly isRelayedFrom: boolean;825 readonly asRelayedFrom: {826 readonly who: XcmV0MultiLocation;827 readonly message: XcmV0Xcm;828 } & Struct;829 readonly type: 'WithdrawAsset' | 'ReserveAssetDeposit' | 'TeleportAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom';830 }831832 /** @name XcmV0MultiAsset (100) */833 export interface XcmV0MultiAsset extends Enum {834 readonly isNone: boolean;835 readonly isAll: boolean;836 readonly isAllFungible: boolean;837 readonly isAllNonFungible: boolean;838 readonly isAllAbstractFungible: boolean;839 readonly asAllAbstractFungible: {840 readonly id: Bytes;841 } & Struct;842 readonly isAllAbstractNonFungible: boolean;843 readonly asAllAbstractNonFungible: {844 readonly class: Bytes;845 } & Struct;846 readonly isAllConcreteFungible: boolean;847 readonly asAllConcreteFungible: {848 readonly id: XcmV0MultiLocation;849 } & Struct;850 readonly isAllConcreteNonFungible: boolean;851 readonly asAllConcreteNonFungible: {852 readonly class: XcmV0MultiLocation;853 } & Struct;854 readonly isAbstractFungible: boolean;855 readonly asAbstractFungible: {856 readonly id: Bytes;857 readonly amount: Compact<u128>;858 } & Struct;859 readonly isAbstractNonFungible: boolean;860 readonly asAbstractNonFungible: {861 readonly class: Bytes;862 readonly instance: XcmV1MultiassetAssetInstance;863 } & Struct;864 readonly isConcreteFungible: boolean;865 readonly asConcreteFungible: {866 readonly id: XcmV0MultiLocation;867 readonly amount: Compact<u128>;868 } & Struct;869 readonly isConcreteNonFungible: boolean;870 readonly asConcreteNonFungible: {871 readonly class: XcmV0MultiLocation;872 readonly instance: XcmV1MultiassetAssetInstance;873 } & Struct;874 readonly type: 'None' | 'All' | 'AllFungible' | 'AllNonFungible' | 'AllAbstractFungible' | 'AllAbstractNonFungible' | 'AllConcreteFungible' | 'AllConcreteNonFungible' | 'AbstractFungible' | 'AbstractNonFungible' | 'ConcreteFungible' | 'ConcreteNonFungible';875 }876877 /** @name XcmV1MultiassetAssetInstance (101) */878 export interface XcmV1MultiassetAssetInstance extends Enum {879 readonly isUndefined: boolean;880 readonly isIndex: boolean;881 readonly asIndex: Compact<u128>;882 readonly isArray4: boolean;883 readonly asArray4: U8aFixed;884 readonly isArray8: boolean;885 readonly asArray8: U8aFixed;886 readonly isArray16: boolean;887 readonly asArray16: U8aFixed;888 readonly isArray32: boolean;889 readonly asArray32: U8aFixed;890 readonly isBlob: boolean;891 readonly asBlob: Bytes;892 readonly type: 'Undefined' | 'Index' | 'Array4' | 'Array8' | 'Array16' | 'Array32' | 'Blob';893 }894895 /** @name XcmV0Order (104) */896 export interface XcmV0Order extends Enum {897 readonly isNull: boolean;898 readonly isDepositAsset: boolean;899 readonly asDepositAsset: {900 readonly assets: Vec<XcmV0MultiAsset>;901 readonly dest: XcmV0MultiLocation;902 } & Struct;903 readonly isDepositReserveAsset: boolean;904 readonly asDepositReserveAsset: {905 readonly assets: Vec<XcmV0MultiAsset>;906 readonly dest: XcmV0MultiLocation;907 readonly effects: Vec<XcmV0Order>;908 } & Struct;909 readonly isExchangeAsset: boolean;910 readonly asExchangeAsset: {911 readonly give: Vec<XcmV0MultiAsset>;912 readonly receive: Vec<XcmV0MultiAsset>;913 } & Struct;914 readonly isInitiateReserveWithdraw: boolean;915 readonly asInitiateReserveWithdraw: {916 readonly assets: Vec<XcmV0MultiAsset>;917 readonly reserve: XcmV0MultiLocation;918 readonly effects: Vec<XcmV0Order>;919 } & Struct;920 readonly isInitiateTeleport: boolean;921 readonly asInitiateTeleport: {922 readonly assets: Vec<XcmV0MultiAsset>;923 readonly dest: XcmV0MultiLocation;924 readonly effects: Vec<XcmV0Order>;925 } & Struct;926 readonly isQueryHolding: boolean;927 readonly asQueryHolding: {928 readonly queryId: Compact<u64>;929 readonly dest: XcmV0MultiLocation;930 readonly assets: Vec<XcmV0MultiAsset>;931 } & Struct;932 readonly isBuyExecution: boolean;933 readonly asBuyExecution: {934 readonly fees: XcmV0MultiAsset;935 readonly weight: u64;936 readonly debt: u64;937 readonly haltOnError: bool;938 readonly xcm: Vec<XcmV0Xcm>;939 } & Struct;940 readonly type: 'Null' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';941 }942943 /** @name XcmV0Response (106) */944 export interface XcmV0Response extends Enum {945 readonly isAssets: boolean;946 readonly asAssets: Vec<XcmV0MultiAsset>;947 readonly type: 'Assets';948 }949950 /** @name XcmV0OriginKind (107) */951 export interface XcmV0OriginKind extends Enum {952 readonly isNative: boolean;953 readonly isSovereignAccount: boolean;954 readonly isSuperuser: boolean;955 readonly isXcm: boolean;956 readonly type: 'Native' | 'SovereignAccount' | 'Superuser' | 'Xcm';957 }958959 /** @name XcmDoubleEncoded (108) */960 export interface XcmDoubleEncoded extends Struct {961 readonly encoded: Bytes;962 }963964 /** @name XcmV1Xcm (109) */965 export interface XcmV1Xcm extends Enum {966 readonly isWithdrawAsset: boolean;967 readonly asWithdrawAsset: {968 readonly assets: XcmV1MultiassetMultiAssets;969 readonly effects: Vec<XcmV1Order>;970 } & Struct;971 readonly isReserveAssetDeposited: boolean;972 readonly asReserveAssetDeposited: {973 readonly assets: XcmV1MultiassetMultiAssets;974 readonly effects: Vec<XcmV1Order>;975 } & Struct;976 readonly isReceiveTeleportedAsset: boolean;977 readonly asReceiveTeleportedAsset: {978 readonly assets: XcmV1MultiassetMultiAssets;979 readonly effects: Vec<XcmV1Order>;980 } & Struct;981 readonly isQueryResponse: boolean;982 readonly asQueryResponse: {983 readonly queryId: Compact<u64>;984 readonly response: XcmV1Response;985 } & Struct;986 readonly isTransferAsset: boolean;987 readonly asTransferAsset: {988 readonly assets: XcmV1MultiassetMultiAssets;989 readonly beneficiary: XcmV1MultiLocation;990 } & Struct;991 readonly isTransferReserveAsset: boolean;992 readonly asTransferReserveAsset: {993 readonly assets: XcmV1MultiassetMultiAssets;994 readonly dest: XcmV1MultiLocation;995 readonly effects: Vec<XcmV1Order>;996 } & Struct;997 readonly isTransact: boolean;998 readonly asTransact: {999 readonly originType: XcmV0OriginKind;1000 readonly requireWeightAtMost: u64;1001 readonly call: XcmDoubleEncoded;1002 } & Struct;1003 readonly isHrmpNewChannelOpenRequest: boolean;1004 readonly asHrmpNewChannelOpenRequest: {1005 readonly sender: Compact<u32>;1006 readonly maxMessageSize: Compact<u32>;1007 readonly maxCapacity: Compact<u32>;1008 } & Struct;1009 readonly isHrmpChannelAccepted: boolean;1010 readonly asHrmpChannelAccepted: {1011 readonly recipient: Compact<u32>;1012 } & Struct;1013 readonly isHrmpChannelClosing: boolean;1014 readonly asHrmpChannelClosing: {1015 readonly initiator: Compact<u32>;1016 readonly sender: Compact<u32>;1017 readonly recipient: Compact<u32>;1018 } & Struct;1019 readonly isRelayedFrom: boolean;1020 readonly asRelayedFrom: {1021 readonly who: XcmV1MultilocationJunctions;1022 readonly message: XcmV1Xcm;1023 } & Struct;1024 readonly isSubscribeVersion: boolean;1025 readonly asSubscribeVersion: {1026 readonly queryId: Compact<u64>;1027 readonly maxResponseWeight: Compact<u64>;1028 } & Struct;1029 readonly isUnsubscribeVersion: boolean;1030 readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom' | 'SubscribeVersion' | 'UnsubscribeVersion';1031 }10321033 /** @name XcmV1MultiassetMultiAssets (110) */1034 export interface XcmV1MultiassetMultiAssets extends Vec<XcmV1MultiAsset> {}10351036 /** @name XcmV1MultiAsset (112) */1037 export interface XcmV1MultiAsset extends Struct {1038 readonly id: XcmV1MultiassetAssetId;1039 readonly fun: XcmV1MultiassetFungibility;1040 }10411042 /** @name XcmV1MultiassetAssetId (113) */1043 export interface XcmV1MultiassetAssetId extends Enum {1044 readonly isConcrete: boolean;1045 readonly asConcrete: XcmV1MultiLocation;1046 readonly isAbstract: boolean;1047 readonly asAbstract: Bytes;1048 readonly type: 'Concrete' | 'Abstract';1049 }10501051 /** @name XcmV1MultiassetFungibility (114) */1052 export interface XcmV1MultiassetFungibility extends Enum {1053 readonly isFungible: boolean;1054 readonly asFungible: Compact<u128>;1055 readonly isNonFungible: boolean;1056 readonly asNonFungible: XcmV1MultiassetAssetInstance;1057 readonly type: 'Fungible' | 'NonFungible';1058 }10591060 /** @name XcmV1Order (116) */1061 export interface XcmV1Order extends Enum {1062 readonly isNoop: boolean;1063 readonly isDepositAsset: boolean;1064 readonly asDepositAsset: {1065 readonly assets: XcmV1MultiassetMultiAssetFilter;1066 readonly maxAssets: u32;1067 readonly beneficiary: XcmV1MultiLocation;1068 } & Struct;1069 readonly isDepositReserveAsset: boolean;1070 readonly asDepositReserveAsset: {1071 readonly assets: XcmV1MultiassetMultiAssetFilter;1072 readonly maxAssets: u32;1073 readonly dest: XcmV1MultiLocation;1074 readonly effects: Vec<XcmV1Order>;1075 } & Struct;1076 readonly isExchangeAsset: boolean;1077 readonly asExchangeAsset: {1078 readonly give: XcmV1MultiassetMultiAssetFilter;1079 readonly receive: XcmV1MultiassetMultiAssets;1080 } & Struct;1081 readonly isInitiateReserveWithdraw: boolean;1082 readonly asInitiateReserveWithdraw: {1083 readonly assets: XcmV1MultiassetMultiAssetFilter;1084 readonly reserve: XcmV1MultiLocation;1085 readonly effects: Vec<XcmV1Order>;1086 } & Struct;1087 readonly isInitiateTeleport: boolean;1088 readonly asInitiateTeleport: {1089 readonly assets: XcmV1MultiassetMultiAssetFilter;1090 readonly dest: XcmV1MultiLocation;1091 readonly effects: Vec<XcmV1Order>;1092 } & Struct;1093 readonly isQueryHolding: boolean;1094 readonly asQueryHolding: {1095 readonly queryId: Compact<u64>;1096 readonly dest: XcmV1MultiLocation;1097 readonly assets: XcmV1MultiassetMultiAssetFilter;1098 } & Struct;1099 readonly isBuyExecution: boolean;1100 readonly asBuyExecution: {1101 readonly fees: XcmV1MultiAsset;1102 readonly weight: u64;1103 readonly debt: u64;1104 readonly haltOnError: bool;1105 readonly instructions: Vec<XcmV1Xcm>;1106 } & Struct;1107 readonly type: 'Noop' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';1108 }11091110 /** @name XcmV1MultiassetMultiAssetFilter (117) */1111 export interface XcmV1MultiassetMultiAssetFilter extends Enum {1112 readonly isDefinite: boolean;1113 readonly asDefinite: XcmV1MultiassetMultiAssets;1114 readonly isWild: boolean;1115 readonly asWild: XcmV1MultiassetWildMultiAsset;1116 readonly type: 'Definite' | 'Wild';1117 }11181119 /** @name XcmV1MultiassetWildMultiAsset (118) */1120 export interface XcmV1MultiassetWildMultiAsset extends Enum {1121 readonly isAll: boolean;1122 readonly isAllOf: boolean;1123 readonly asAllOf: {1124 readonly id: XcmV1MultiassetAssetId;1125 readonly fun: XcmV1MultiassetWildFungibility;1126 } & Struct;1127 readonly type: 'All' | 'AllOf';1128 }11291130 /** @name XcmV1MultiassetWildFungibility (119) */1131 export interface XcmV1MultiassetWildFungibility extends Enum {1132 readonly isFungible: boolean;1133 readonly isNonFungible: boolean;1134 readonly type: 'Fungible' | 'NonFungible';1135 }11361137 /** @name XcmV1Response (121) */1138 export interface XcmV1Response extends Enum {1139 readonly isAssets: boolean;1140 readonly asAssets: XcmV1MultiassetMultiAssets;1141 readonly isVersion: boolean;1142 readonly asVersion: u32;1143 readonly type: 'Assets' | 'Version';1144 }11451146 /** @name XcmV2Xcm (122) */1147 export interface XcmV2Xcm extends Vec<XcmV2Instruction> {}11481149 /** @name XcmV2Instruction (124) */1150 export interface XcmV2Instruction extends Enum {1151 readonly isWithdrawAsset: boolean;1152 readonly asWithdrawAsset: XcmV1MultiassetMultiAssets;1153 readonly isReserveAssetDeposited: boolean;1154 readonly asReserveAssetDeposited: XcmV1MultiassetMultiAssets;1155 readonly isReceiveTeleportedAsset: boolean;1156 readonly asReceiveTeleportedAsset: XcmV1MultiassetMultiAssets;1157 readonly isQueryResponse: boolean;1158 readonly asQueryResponse: {1159 readonly queryId: Compact<u64>;1160 readonly response: XcmV2Response;1161 readonly maxWeight: Compact<u64>;1162 } & Struct;1163 readonly isTransferAsset: boolean;1164 readonly asTransferAsset: {1165 readonly assets: XcmV1MultiassetMultiAssets;1166 readonly beneficiary: XcmV1MultiLocation;1167 } & Struct;1168 readonly isTransferReserveAsset: boolean;1169 readonly asTransferReserveAsset: {1170 readonly assets: XcmV1MultiassetMultiAssets;1171 readonly dest: XcmV1MultiLocation;1172 readonly xcm: XcmV2Xcm;1173 } & Struct;1174 readonly isTransact: boolean;1175 readonly asTransact: {1176 readonly originType: XcmV0OriginKind;1177 readonly requireWeightAtMost: Compact<u64>;1178 readonly call: XcmDoubleEncoded;1179 } & Struct;1180 readonly isHrmpNewChannelOpenRequest: boolean;1181 readonly asHrmpNewChannelOpenRequest: {1182 readonly sender: Compact<u32>;1183 readonly maxMessageSize: Compact<u32>;1184 readonly maxCapacity: Compact<u32>;1185 } & Struct;1186 readonly isHrmpChannelAccepted: boolean;1187 readonly asHrmpChannelAccepted: {1188 readonly recipient: Compact<u32>;1189 } & Struct;1190 readonly isHrmpChannelClosing: boolean;1191 readonly asHrmpChannelClosing: {1192 readonly initiator: Compact<u32>;1193 readonly sender: Compact<u32>;1194 readonly recipient: Compact<u32>;1195 } & Struct;1196 readonly isClearOrigin: boolean;1197 readonly isDescendOrigin: boolean;1198 readonly asDescendOrigin: XcmV1MultilocationJunctions;1199 readonly isReportError: boolean;1200 readonly asReportError: {1201 readonly queryId: Compact<u64>;1202 readonly dest: XcmV1MultiLocation;1203 readonly maxResponseWeight: Compact<u64>;1204 } & Struct;1205 readonly isDepositAsset: boolean;1206 readonly asDepositAsset: {1207 readonly assets: XcmV1MultiassetMultiAssetFilter;1208 readonly maxAssets: Compact<u32>;1209 readonly beneficiary: XcmV1MultiLocation;1210 } & Struct;1211 readonly isDepositReserveAsset: boolean;1212 readonly asDepositReserveAsset: {1213 readonly assets: XcmV1MultiassetMultiAssetFilter;1214 readonly maxAssets: Compact<u32>;1215 readonly dest: XcmV1MultiLocation;1216 readonly xcm: XcmV2Xcm;1217 } & Struct;1218 readonly isExchangeAsset: boolean;1219 readonly asExchangeAsset: {1220 readonly give: XcmV1MultiassetMultiAssetFilter;1221 readonly receive: XcmV1MultiassetMultiAssets;1222 } & Struct;1223 readonly isInitiateReserveWithdraw: boolean;1224 readonly asInitiateReserveWithdraw: {1225 readonly assets: XcmV1MultiassetMultiAssetFilter;1226 readonly reserve: XcmV1MultiLocation;1227 readonly xcm: XcmV2Xcm;1228 } & Struct;1229 readonly isInitiateTeleport: boolean;1230 readonly asInitiateTeleport: {1231 readonly assets: XcmV1MultiassetMultiAssetFilter;1232 readonly dest: XcmV1MultiLocation;1233 readonly xcm: XcmV2Xcm;1234 } & Struct;1235 readonly isQueryHolding: boolean;1236 readonly asQueryHolding: {1237 readonly queryId: Compact<u64>;1238 readonly dest: XcmV1MultiLocation;1239 readonly assets: XcmV1MultiassetMultiAssetFilter;1240 readonly maxResponseWeight: Compact<u64>;1241 } & Struct;1242 readonly isBuyExecution: boolean;1243 readonly asBuyExecution: {1244 readonly fees: XcmV1MultiAsset;1245 readonly weightLimit: XcmV2WeightLimit;1246 } & Struct;1247 readonly isRefundSurplus: boolean;1248 readonly isSetErrorHandler: boolean;1249 readonly asSetErrorHandler: XcmV2Xcm;1250 readonly isSetAppendix: boolean;1251 readonly asSetAppendix: XcmV2Xcm;1252 readonly isClearError: boolean;1253 readonly isClaimAsset: boolean;1254 readonly asClaimAsset: {1255 readonly assets: XcmV1MultiassetMultiAssets;1256 readonly ticket: XcmV1MultiLocation;1257 } & Struct;1258 readonly isTrap: boolean;1259 readonly asTrap: Compact<u64>;1260 readonly isSubscribeVersion: boolean;1261 readonly asSubscribeVersion: {1262 readonly queryId: Compact<u64>;1263 readonly maxResponseWeight: Compact<u64>;1264 } & Struct;1265 readonly isUnsubscribeVersion: boolean;1266 readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'ClearOrigin' | 'DescendOrigin' | 'ReportError' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution' | 'RefundSurplus' | 'SetErrorHandler' | 'SetAppendix' | 'ClearError' | 'ClaimAsset' | 'Trap' | 'SubscribeVersion' | 'UnsubscribeVersion';1267 }12681269 /** @name XcmV2Response (125) */1270 export interface XcmV2Response extends Enum {1271 readonly isNull: boolean;1272 readonly isAssets: boolean;1273 readonly asAssets: XcmV1MultiassetMultiAssets;1274 readonly isExecutionResult: boolean;1275 readonly asExecutionResult: Option<ITuple<[u32, XcmV2TraitsError]>>;1276 readonly isVersion: boolean;1277 readonly asVersion: u32;1278 readonly type: 'Null' | 'Assets' | 'ExecutionResult' | 'Version';1279 }12801281 /** @name XcmV2TraitsError (128) */1282 export interface XcmV2TraitsError extends Enum {1283 readonly isOverflow: boolean;1284 readonly isUnimplemented: boolean;1285 readonly isUntrustedReserveLocation: boolean;1286 readonly isUntrustedTeleportLocation: boolean;1287 readonly isMultiLocationFull: boolean;1288 readonly isMultiLocationNotInvertible: boolean;1289 readonly isBadOrigin: boolean;1290 readonly isInvalidLocation: boolean;1291 readonly isAssetNotFound: boolean;1292 readonly isFailedToTransactAsset: boolean;1293 readonly isNotWithdrawable: boolean;1294 readonly isLocationCannotHold: boolean;1295 readonly isExceedsMaxMessageSize: boolean;1296 readonly isDestinationUnsupported: boolean;1297 readonly isTransport: boolean;1298 readonly isUnroutable: boolean;1299 readonly isUnknownClaim: boolean;1300 readonly isFailedToDecode: boolean;1301 readonly isMaxWeightInvalid: boolean;1302 readonly isNotHoldingFees: boolean;1303 readonly isTooExpensive: boolean;1304 readonly isTrap: boolean;1305 readonly asTrap: u64;1306 readonly isUnhandledXcmVersion: boolean;1307 readonly isWeightLimitReached: boolean;1308 readonly asWeightLimitReached: u64;1309 readonly isBarrier: boolean;1310 readonly isWeightNotComputable: boolean;1311 readonly type: 'Overflow' | 'Unimplemented' | 'UntrustedReserveLocation' | 'UntrustedTeleportLocation' | 'MultiLocationFull' | 'MultiLocationNotInvertible' | 'BadOrigin' | 'InvalidLocation' | 'AssetNotFound' | 'FailedToTransactAsset' | 'NotWithdrawable' | 'LocationCannotHold' | 'ExceedsMaxMessageSize' | 'DestinationUnsupported' | 'Transport' | 'Unroutable' | 'UnknownClaim' | 'FailedToDecode' | 'MaxWeightInvalid' | 'NotHoldingFees' | 'TooExpensive' | 'Trap' | 'UnhandledXcmVersion' | 'WeightLimitReached' | 'Barrier' | 'WeightNotComputable';1312 }13131314 /** @name XcmV2WeightLimit (129) */1315 export interface XcmV2WeightLimit extends Enum {1316 readonly isUnlimited: boolean;1317 readonly isLimited: boolean;1318 readonly asLimited: Compact<u64>;1319 readonly type: 'Unlimited' | 'Limited';1320 }13211322 /** @name XcmVersionedMultiAssets (130) */1323 export interface XcmVersionedMultiAssets extends Enum {1324 readonly isV0: boolean;1325 readonly asV0: Vec<XcmV0MultiAsset>;1326 readonly isV1: boolean;1327 readonly asV1: XcmV1MultiassetMultiAssets;1328 readonly type: 'V0' | 'V1';1329 }13301331 /** @name CumulusPalletXcmCall (145) */1332 export type CumulusPalletXcmCall = Null;13331334 /** @name CumulusPalletDmpQueueCall (146) */1335 export interface CumulusPalletDmpQueueCall extends Enum {1336 readonly isServiceOverweight: boolean;1337 readonly asServiceOverweight: {1338 readonly index: u64;1339 readonly weightLimit: u64;1340 } & Struct;1341 readonly type: 'ServiceOverweight';1342 }13431344 /** @name PalletInflationCall (147) */1345 export interface PalletInflationCall extends Enum {1346 readonly isStartInflation: boolean;1347 readonly asStartInflation: {1348 readonly inflationStartRelayBlock: u32;1349 } & Struct;1350 readonly type: 'StartInflation';1351 }13521353 /** @name PalletUniqueCall (148) */1354 export interface PalletUniqueCall extends Enum {1355 readonly isCreateCollection: boolean;1356 readonly asCreateCollection: {1357 readonly collectionName: Vec<u16>;1358 readonly collectionDescription: Vec<u16>;1359 readonly tokenPrefix: Bytes;1360 readonly mode: UpDataStructsCollectionMode;1361 } & Struct;1362 readonly isCreateCollectionEx: boolean;1363 readonly asCreateCollectionEx: {1364 readonly data: UpDataStructsCreateCollectionData;1365 } & Struct;1366 readonly isDestroyCollection: boolean;1367 readonly asDestroyCollection: {1368 readonly collectionId: u32;1369 } & Struct;1370 readonly isAddToAllowList: boolean;1371 readonly asAddToAllowList: {1372 readonly collectionId: u32;1373 readonly address: PalletEvmAccountBasicCrossAccountIdRepr;1374 } & Struct;1375 readonly isRemoveFromAllowList: boolean;1376 readonly asRemoveFromAllowList: {1377 readonly collectionId: u32;1378 readonly address: PalletEvmAccountBasicCrossAccountIdRepr;1379 } & Struct;1380 readonly isChangeCollectionOwner: boolean;1381 readonly asChangeCollectionOwner: {1382 readonly collectionId: u32;1383 readonly newOwner: AccountId32;1384 } & Struct;1385 readonly isAddCollectionAdmin: boolean;1386 readonly asAddCollectionAdmin: {1387 readonly collectionId: u32;1388 readonly newAdminId: PalletEvmAccountBasicCrossAccountIdRepr;1389 } & Struct;1390 readonly isRemoveCollectionAdmin: boolean;1391 readonly asRemoveCollectionAdmin: {1392 readonly collectionId: u32;1393 readonly accountId: PalletEvmAccountBasicCrossAccountIdRepr;1394 } & Struct;1395 readonly isSetCollectionSponsor: boolean;1396 readonly asSetCollectionSponsor: {1397 readonly collectionId: u32;1398 readonly newSponsor: AccountId32;1399 } & Struct;1400 readonly isConfirmSponsorship: boolean;1401 readonly asConfirmSponsorship: {1402 readonly collectionId: u32;1403 } & Struct;1404 readonly isRemoveCollectionSponsor: boolean;1405 readonly asRemoveCollectionSponsor: {1406 readonly collectionId: u32;1407 } & Struct;1408 readonly isCreateItem: boolean;1409 readonly asCreateItem: {1410 readonly collectionId: u32;1411 readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1412 readonly data: UpDataStructsCreateItemData;1413 } & Struct;1414 readonly isCreateMultipleItems: boolean;1415 readonly asCreateMultipleItems: {1416 readonly collectionId: u32;1417 readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1418 readonly itemsData: Vec<UpDataStructsCreateItemData>;1419 } & Struct;1420 readonly isSetCollectionProperties: boolean;1421 readonly asSetCollectionProperties: {1422 readonly collectionId: u32;1423 readonly properties: Vec<UpDataStructsProperty>;1424 } & Struct;1425 readonly isDeleteCollectionProperties: boolean;1426 readonly asDeleteCollectionProperties: {1427 readonly collectionId: u32;1428 readonly propertyKeys: Vec<Bytes>;1429 } & Struct;1430 readonly isSetTokenProperties: boolean;1431 readonly asSetTokenProperties: {1432 readonly collectionId: u32;1433 readonly tokenId: u32;1434 readonly properties: Vec<UpDataStructsProperty>;1435 } & Struct;1436 readonly isDeleteTokenProperties: boolean;1437 readonly asDeleteTokenProperties: {1438 readonly collectionId: u32;1439 readonly tokenId: u32;1440 readonly propertyKeys: Vec<Bytes>;1441 } & Struct;1442 readonly isSetTokenPropertyPermissions: boolean;1443 readonly asSetTokenPropertyPermissions: {1444 readonly collectionId: u32;1445 readonly propertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;1446 } & Struct;1447 readonly isCreateMultipleItemsEx: boolean;1448 readonly asCreateMultipleItemsEx: {1449 readonly collectionId: u32;1450 readonly data: UpDataStructsCreateItemExData;1451 } & Struct;1452 readonly isSetTransfersEnabledFlag: boolean;1453 readonly asSetTransfersEnabledFlag: {1454 readonly collectionId: u32;1455 readonly value: bool;1456 } & Struct;1457 readonly isBurnItem: boolean;1458 readonly asBurnItem: {1459 readonly collectionId: u32;1460 readonly itemId: u32;1461 readonly value: u128;1462 } & Struct;1463 readonly isBurnFrom: boolean;1464 readonly asBurnFrom: {1465 readonly collectionId: u32;1466 readonly from: PalletEvmAccountBasicCrossAccountIdRepr;1467 readonly itemId: u32;1468 readonly value: u128;1469 } & Struct;1470 readonly isTransfer: boolean;1471 readonly asTransfer: {1472 readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;1473 readonly collectionId: u32;1474 readonly itemId: u32;1475 readonly value: u128;1476 } & Struct;1477 readonly isApprove: boolean;1478 readonly asApprove: {1479 readonly spender: PalletEvmAccountBasicCrossAccountIdRepr;1480 readonly collectionId: u32;1481 readonly itemId: u32;1482 readonly amount: u128;1483 } & Struct;1484 readonly isTransferFrom: boolean;1485 readonly asTransferFrom: {1486 readonly from: PalletEvmAccountBasicCrossAccountIdRepr;1487 readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;1488 readonly collectionId: u32;1489 readonly itemId: u32;1490 readonly value: u128;1491 } & Struct;1492 readonly isSetCollectionLimits: boolean;1493 readonly asSetCollectionLimits: {1494 readonly collectionId: u32;1495 readonly newLimit: UpDataStructsCollectionLimits;1496 } & Struct;1497 readonly isSetCollectionPermissions: boolean;1498 readonly asSetCollectionPermissions: {1499 readonly collectionId: u32;1500 readonly newLimit: UpDataStructsCollectionPermissions;1501 } & Struct;1502 readonly isRepartition: boolean;1503 readonly asRepartition: {1504 readonly collectionId: u32;1505 readonly token: u32;1506 readonly amount: u128;1507 } & Struct;1508 readonly type: 'CreateCollection' | 'CreateCollectionEx' | 'DestroyCollection' | 'AddToAllowList' | 'RemoveFromAllowList' | 'ChangeCollectionOwner' | 'AddCollectionAdmin' | 'RemoveCollectionAdmin' | 'SetCollectionSponsor' | 'ConfirmSponsorship' | 'RemoveCollectionSponsor' | 'CreateItem' | 'CreateMultipleItems' | 'SetCollectionProperties' | 'DeleteCollectionProperties' | 'SetTokenProperties' | 'DeleteTokenProperties' | 'SetTokenPropertyPermissions' | 'CreateMultipleItemsEx' | 'SetTransfersEnabledFlag' | 'BurnItem' | 'BurnFrom' | 'Transfer' | 'Approve' | 'TransferFrom' | 'SetCollectionLimits' | 'SetCollectionPermissions' | 'Repartition';1509 }15101511 /** @name UpDataStructsCollectionMode (154) */1512 export interface UpDataStructsCollectionMode extends Enum {1513 readonly isNft: boolean;1514 readonly isFungible: boolean;1515 readonly asFungible: u8;1516 readonly isReFungible: boolean;1517 readonly type: 'Nft' | 'Fungible' | 'ReFungible';1518 }15191520 /** @name UpDataStructsCreateCollectionData (155) */1521 export interface UpDataStructsCreateCollectionData extends Struct {1522 readonly mode: UpDataStructsCollectionMode;1523 readonly access: Option<UpDataStructsAccessMode>;1524 readonly name: Vec<u16>;1525 readonly description: Vec<u16>;1526 readonly tokenPrefix: Bytes;1527 readonly pendingSponsor: Option<AccountId32>;1528 readonly limits: Option<UpDataStructsCollectionLimits>;1529 readonly permissions: Option<UpDataStructsCollectionPermissions>;1530 readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;1531 readonly properties: Vec<UpDataStructsProperty>;1532 }15331534 /** @name UpDataStructsAccessMode (157) */1535 export interface UpDataStructsAccessMode extends Enum {1536 readonly isNormal: boolean;1537 readonly isAllowList: boolean;1538 readonly type: 'Normal' | 'AllowList';1539 }15401541 /** @name UpDataStructsCollectionLimits (160) */1542 export interface UpDataStructsCollectionLimits extends Struct {1543 readonly accountTokenOwnershipLimit: Option<u32>;1544 readonly sponsoredDataSize: Option<u32>;1545 readonly sponsoredDataRateLimit: Option<UpDataStructsSponsoringRateLimit>;1546 readonly tokenLimit: Option<u32>;1547 readonly sponsorTransferTimeout: Option<u32>;1548 readonly sponsorApproveTimeout: Option<u32>;1549 readonly ownerCanTransfer: Option<bool>;1550 readonly ownerCanDestroy: Option<bool>;1551 readonly transfersEnabled: Option<bool>;1552 }15531554 /** @name UpDataStructsSponsoringRateLimit (162) */1555 export interface UpDataStructsSponsoringRateLimit extends Enum {1556 readonly isSponsoringDisabled: boolean;1557 readonly isBlocks: boolean;1558 readonly asBlocks: u32;1559 readonly type: 'SponsoringDisabled' | 'Blocks';1560 }15611562 /** @name UpDataStructsCollectionPermissions (165) */1563 export interface UpDataStructsCollectionPermissions extends Struct {1564 readonly access: Option<UpDataStructsAccessMode>;1565 readonly mintMode: Option<bool>;1566 readonly nesting: Option<UpDataStructsNestingPermissions>;1567 }15681569 /** @name UpDataStructsNestingPermissions (167) */1570 export interface UpDataStructsNestingPermissions extends Struct {1571 readonly tokenOwner: bool;1572 readonly collectionAdmin: bool;1573 readonly restricted: Option<UpDataStructsOwnerRestrictedSet>;1574 }15751576 /** @name UpDataStructsOwnerRestrictedSet (169) */1577 export interface UpDataStructsOwnerRestrictedSet extends BTreeSet<u32> {}15781579 /** @name UpDataStructsPropertyKeyPermission (175) */1580 export interface UpDataStructsPropertyKeyPermission extends Struct {1581 readonly key: Bytes;1582 readonly permission: UpDataStructsPropertyPermission;1583 }15841585 /** @name UpDataStructsPropertyPermission (177) */1586 export interface UpDataStructsPropertyPermission extends Struct {1587 readonly mutable: bool;1588 readonly collectionAdmin: bool;1589 readonly tokenOwner: bool;1590 }15911592 /** @name UpDataStructsProperty (180) */1593 export interface UpDataStructsProperty extends Struct {1594 readonly key: Bytes;1595 readonly value: Bytes;1596 }15971598 /** @name PalletEvmAccountBasicCrossAccountIdRepr (183) */1599 export interface PalletEvmAccountBasicCrossAccountIdRepr extends Enum {1600 readonly isSubstrate: boolean;1601 readonly asSubstrate: AccountId32;1602 readonly isEthereum: boolean;1603 readonly asEthereum: H160;1604 readonly type: 'Substrate' | 'Ethereum';1605 }16061607 /** @name UpDataStructsCreateItemData (185) */1608 export interface UpDataStructsCreateItemData extends Enum {1609 readonly isNft: boolean;1610 readonly asNft: UpDataStructsCreateNftData;1611 readonly isFungible: boolean;1612 readonly asFungible: UpDataStructsCreateFungibleData;1613 readonly isReFungible: boolean;1614 readonly asReFungible: UpDataStructsCreateReFungibleData;1615 readonly type: 'Nft' | 'Fungible' | 'ReFungible';1616 }16171618 /** @name UpDataStructsCreateNftData (186) */1619 export interface UpDataStructsCreateNftData extends Struct {1620 readonly properties: Vec<UpDataStructsProperty>;1621 }16221623 /** @name UpDataStructsCreateFungibleData (187) */1624 export interface UpDataStructsCreateFungibleData extends Struct {1625 readonly value: u128;1626 }16271628 /** @name UpDataStructsCreateReFungibleData (188) */1629 export interface UpDataStructsCreateReFungibleData extends Struct {1630 readonly constData: Bytes;1631 readonly pieces: u128;1632 }16331634 /** @name UpDataStructsCreateItemExData (193) */1635 export interface UpDataStructsCreateItemExData extends Enum {1636 readonly isNft: boolean;1637 readonly asNft: Vec<UpDataStructsCreateNftExData>;1638 readonly isFungible: boolean;1639 readonly asFungible: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;1640 readonly isRefungibleMultipleItems: boolean;1641 readonly asRefungibleMultipleItems: Vec<UpDataStructsCreateRefungibleExData>;1642 readonly isRefungibleMultipleOwners: boolean;1643 readonly asRefungibleMultipleOwners: UpDataStructsCreateRefungibleExData;1644 readonly type: 'Nft' | 'Fungible' | 'RefungibleMultipleItems' | 'RefungibleMultipleOwners';1645 }16461647 /** @name UpDataStructsCreateNftExData (195) */1648 export interface UpDataStructsCreateNftExData extends Struct {1649 readonly properties: Vec<UpDataStructsProperty>;1650 readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1651 }16521653 /** @name UpDataStructsCreateRefungibleExData (202) */1654 export interface UpDataStructsCreateRefungibleExData extends Struct {1655 readonly constData: Bytes;1656 readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;1657 }16581659 /** @name PalletUniqueSchedulerCall (204) */1660 export interface PalletUniqueSchedulerCall extends Enum {1661 readonly isScheduleNamed: boolean;1662 readonly asScheduleNamed: {1663 readonly id: U8aFixed;1664 readonly when: u32;1665 readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1666 readonly priority: u8;1667 readonly call: FrameSupportScheduleMaybeHashed;1668 } & Struct;1669 readonly isCancelNamed: boolean;1670 readonly asCancelNamed: {1671 readonly id: U8aFixed;1672 } & Struct;1673 readonly isScheduleNamedAfter: boolean;1674 readonly asScheduleNamedAfter: {1675 readonly id: U8aFixed;1676 readonly after: u32;1677 readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1678 readonly priority: u8;1679 readonly call: FrameSupportScheduleMaybeHashed;1680 } & Struct;1681 readonly type: 'ScheduleNamed' | 'CancelNamed' | 'ScheduleNamedAfter';1682 }16831684 /** @name FrameSupportScheduleMaybeHashed (206) */1685 export interface FrameSupportScheduleMaybeHashed extends Enum {1686 readonly isValue: boolean;1687 readonly asValue: Call;1688 readonly isHash: boolean;1689 readonly asHash: H256;1690 readonly type: 'Value' | 'Hash';1691 }16921693 /** @name PalletTemplateTransactionPaymentCall (207) */1694 export type PalletTemplateTransactionPaymentCall = Null;16951696 /** @name PalletStructureCall (208) */1697 export type PalletStructureCall = Null;16981699 /** @name PalletRmrkCoreCall (209) */1700 export interface PalletRmrkCoreCall extends Enum {1701 readonly isCreateCollection: boolean;1702 readonly asCreateCollection: {1703 readonly metadata: Bytes;1704 readonly max: Option<u32>;1705 readonly symbol: Bytes;1706 } & Struct;1707 readonly isDestroyCollection: boolean;1708 readonly asDestroyCollection: {1709 readonly collectionId: u32;1710 } & Struct;1711 readonly isChangeCollectionIssuer: boolean;1712 readonly asChangeCollectionIssuer: {1713 readonly collectionId: u32;1714 readonly newIssuer: MultiAddress;1715 } & Struct;1716 readonly isLockCollection: boolean;1717 readonly asLockCollection: {1718 readonly collectionId: u32;1719 } & Struct;1720 readonly isMintNft: boolean;1721 readonly asMintNft: {1722 readonly owner: Option<AccountId32>;1723 readonly collectionId: u32;1724 readonly recipient: Option<AccountId32>;1725 readonly royaltyAmount: Option<Permill>;1726 readonly metadata: Bytes;1727 readonly transferable: bool;1728 readonly resources: Option<Vec<RmrkTraitsResourceResourceTypes>>;1729 } & Struct;1730 readonly isBurnNft: boolean;1731 readonly asBurnNft: {1732 readonly collectionId: u32;1733 readonly nftId: u32;1734 readonly maxBurns: u32;1735 } & Struct;1736 readonly isSend: boolean;1737 readonly asSend: {1738 readonly rmrkCollectionId: u32;1739 readonly rmrkNftId: u32;1740 readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1741 } & Struct;1742 readonly isAcceptNft: boolean;1743 readonly asAcceptNft: {1744 readonly rmrkCollectionId: u32;1745 readonly rmrkNftId: u32;1746 readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1747 } & Struct;1748 readonly isRejectNft: boolean;1749 readonly asRejectNft: {1750 readonly rmrkCollectionId: u32;1751 readonly rmrkNftId: u32;1752 } & Struct;1753 readonly isAcceptResource: boolean;1754 readonly asAcceptResource: {1755 readonly rmrkCollectionId: u32;1756 readonly rmrkNftId: u32;1757 readonly resourceId: u32;1758 } & Struct;1759 readonly isAcceptResourceRemoval: boolean;1760 readonly asAcceptResourceRemoval: {1761 readonly rmrkCollectionId: u32;1762 readonly rmrkNftId: u32;1763 readonly resourceId: u32;1764 } & Struct;1765 readonly isSetProperty: boolean;1766 readonly asSetProperty: {1767 readonly rmrkCollectionId: Compact<u32>;1768 readonly maybeNftId: Option<u32>;1769 readonly key: Bytes;1770 readonly value: Bytes;1771 } & Struct;1772 readonly isSetPriority: boolean;1773 readonly asSetPriority: {1774 readonly rmrkCollectionId: u32;1775 readonly rmrkNftId: u32;1776 readonly priorities: Vec<u32>;1777 } & Struct;1778 readonly isAddBasicResource: boolean;1779 readonly asAddBasicResource: {1780 readonly rmrkCollectionId: u32;1781 readonly nftId: u32;1782 readonly resource: RmrkTraitsResourceBasicResource;1783 } & Struct;1784 readonly isAddComposableResource: boolean;1785 readonly asAddComposableResource: {1786 readonly rmrkCollectionId: u32;1787 readonly nftId: u32;1788 readonly resource: RmrkTraitsResourceComposableResource;1789 } & Struct;1790 readonly isAddSlotResource: boolean;1791 readonly asAddSlotResource: {1792 readonly rmrkCollectionId: u32;1793 readonly nftId: u32;1794 readonly resource: RmrkTraitsResourceSlotResource;1795 } & Struct;1796 readonly isRemoveResource: boolean;1797 readonly asRemoveResource: {1798 readonly rmrkCollectionId: u32;1799 readonly nftId: u32;1800 readonly resourceId: u32;1801 } & Struct;1802 readonly type: 'CreateCollection' | 'DestroyCollection' | 'ChangeCollectionIssuer' | 'LockCollection' | 'MintNft' | 'BurnNft' | 'Send' | 'AcceptNft' | 'RejectNft' | 'AcceptResource' | 'AcceptResourceRemoval' | 'SetProperty' | 'SetPriority' | 'AddBasicResource' | 'AddComposableResource' | 'AddSlotResource' | 'RemoveResource';1803 }18041805 /** @name RmrkTraitsResourceResourceTypes (215) */1806 export interface RmrkTraitsResourceResourceTypes extends Enum {1807 readonly isBasic: boolean;1808 readonly asBasic: RmrkTraitsResourceBasicResource;1809 readonly isComposable: boolean;1810 readonly asComposable: RmrkTraitsResourceComposableResource;1811 readonly isSlot: boolean;1812 readonly asSlot: RmrkTraitsResourceSlotResource;1813 readonly type: 'Basic' | 'Composable' | 'Slot';1814 }18151816 /** @name RmrkTraitsResourceBasicResource (217) */1817 export interface RmrkTraitsResourceBasicResource extends Struct {1818 readonly src: Option<Bytes>;1819 readonly metadata: Option<Bytes>;1820 readonly license: Option<Bytes>;1821 readonly thumb: Option<Bytes>;1822 }18231824 /** @name RmrkTraitsResourceComposableResource (219) */1825 export interface RmrkTraitsResourceComposableResource extends Struct {1826 readonly parts: Vec<u32>;1827 readonly base: u32;1828 readonly src: Option<Bytes>;1829 readonly metadata: Option<Bytes>;1830 readonly license: Option<Bytes>;1831 readonly thumb: Option<Bytes>;1832 }18331834 /** @name RmrkTraitsResourceSlotResource (220) */1835 export interface RmrkTraitsResourceSlotResource extends Struct {1836 readonly base: u32;1837 readonly src: Option<Bytes>;1838 readonly metadata: Option<Bytes>;1839 readonly slot: u32;1840 readonly license: Option<Bytes>;1841 readonly thumb: Option<Bytes>;1842 }18431844 /** @name RmrkTraitsNftAccountIdOrCollectionNftTuple (222) */1845 export interface RmrkTraitsNftAccountIdOrCollectionNftTuple extends Enum {1846 readonly isAccountId: boolean;1847 readonly asAccountId: AccountId32;1848 readonly isCollectionAndNftTuple: boolean;1849 readonly asCollectionAndNftTuple: ITuple<[u32, u32]>;1850 readonly type: 'AccountId' | 'CollectionAndNftTuple';1851 }18521853 /** @name PalletRmrkEquipCall (226) */1854 export interface PalletRmrkEquipCall extends Enum {1855 readonly isCreateBase: boolean;1856 readonly asCreateBase: {1857 readonly baseType: Bytes;1858 readonly symbol: Bytes;1859 readonly parts: Vec<RmrkTraitsPartPartType>;1860 } & Struct;1861 readonly isThemeAdd: boolean;1862 readonly asThemeAdd: {1863 readonly baseId: u32;1864 readonly theme: RmrkTraitsTheme;1865 } & Struct;1866 readonly isEquippable: boolean;1867 readonly asEquippable: {1868 readonly baseId: u32;1869 readonly slotId: u32;1870 readonly equippables: RmrkTraitsPartEquippableList;1871 } & Struct;1872 readonly type: 'CreateBase' | 'ThemeAdd' | 'Equippable';1873 }18741875 /** @name RmrkTraitsPartPartType (229) */1876 export interface RmrkTraitsPartPartType extends Enum {1877 readonly isFixedPart: boolean;1878 readonly asFixedPart: RmrkTraitsPartFixedPart;1879 readonly isSlotPart: boolean;1880 readonly asSlotPart: RmrkTraitsPartSlotPart;1881 readonly type: 'FixedPart' | 'SlotPart';1882 }18831884 /** @name RmrkTraitsPartFixedPart (231) */1885 export interface RmrkTraitsPartFixedPart extends Struct {1886 readonly id: u32;1887 readonly z: u32;1888 readonly src: Bytes;1889 }18901891 /** @name RmrkTraitsPartSlotPart (232) */1892 export interface RmrkTraitsPartSlotPart extends Struct {1893 readonly id: u32;1894 readonly equippable: RmrkTraitsPartEquippableList;1895 readonly src: Bytes;1896 readonly z: u32;1897 }18981899 /** @name RmrkTraitsPartEquippableList (233) */1900 export interface RmrkTraitsPartEquippableList extends Enum {1901 readonly isAll: boolean;1902 readonly isEmpty: boolean;1903 readonly isCustom: boolean;1904 readonly asCustom: Vec<u32>;1905 readonly type: 'All' | 'Empty' | 'Custom';1906 }19071908 /** @name RmrkTraitsTheme (235) */1909 export interface RmrkTraitsTheme extends Struct {1910 readonly name: Bytes;1911 readonly properties: Vec<RmrkTraitsThemeThemeProperty>;1912 readonly inherit: bool;1913 }19141915 /** @name RmrkTraitsThemeThemeProperty (237) */1916 export interface RmrkTraitsThemeThemeProperty extends Struct {1917 readonly key: Bytes;1918 readonly value: Bytes;1919 }19201921 /** @name PalletEvmCall (239) */1922 export interface PalletEvmCall extends Enum {1923 readonly isWithdraw: boolean;1924 readonly asWithdraw: {1925 readonly address: H160;1926 readonly value: u128;1927 } & Struct;1928 readonly isCall: boolean;1929 readonly asCall: {1930 readonly source: H160;1931 readonly target: H160;1932 readonly input: Bytes;1933 readonly value: U256;1934 readonly gasLimit: u64;1935 readonly maxFeePerGas: U256;1936 readonly maxPriorityFeePerGas: Option<U256>;1937 readonly nonce: Option<U256>;1938 readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1939 } & Struct;1940 readonly isCreate: boolean;1941 readonly asCreate: {1942 readonly source: H160;1943 readonly init: Bytes;1944 readonly value: U256;1945 readonly gasLimit: u64;1946 readonly maxFeePerGas: U256;1947 readonly maxPriorityFeePerGas: Option<U256>;1948 readonly nonce: Option<U256>;1949 readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1950 } & Struct;1951 readonly isCreate2: boolean;1952 readonly asCreate2: {1953 readonly source: H160;1954 readonly init: Bytes;1955 readonly salt: H256;1956 readonly value: U256;1957 readonly gasLimit: u64;1958 readonly maxFeePerGas: U256;1959 readonly maxPriorityFeePerGas: Option<U256>;1960 readonly nonce: Option<U256>;1961 readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1962 } & Struct;1963 readonly type: 'Withdraw' | 'Call' | 'Create' | 'Create2';1964 }19651966 /** @name PalletEthereumCall (245) */1967 export interface PalletEthereumCall extends Enum {1968 readonly isTransact: boolean;1969 readonly asTransact: {1970 readonly transaction: EthereumTransactionTransactionV2;1971 } & Struct;1972 readonly type: 'Transact';1973 }19741975 /** @name EthereumTransactionTransactionV2 (246) */1976 export interface EthereumTransactionTransactionV2 extends Enum {1977 readonly isLegacy: boolean;1978 readonly asLegacy: EthereumTransactionLegacyTransaction;1979 readonly isEip2930: boolean;1980 readonly asEip2930: EthereumTransactionEip2930Transaction;1981 readonly isEip1559: boolean;1982 readonly asEip1559: EthereumTransactionEip1559Transaction;1983 readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';1984 }19851986 /** @name EthereumTransactionLegacyTransaction (247) */1987 export interface EthereumTransactionLegacyTransaction extends Struct {1988 readonly nonce: U256;1989 readonly gasPrice: U256;1990 readonly gasLimit: U256;1991 readonly action: EthereumTransactionTransactionAction;1992 readonly value: U256;1993 readonly input: Bytes;1994 readonly signature: EthereumTransactionTransactionSignature;1995 }19961997 /** @name EthereumTransactionTransactionAction (248) */1998 export interface EthereumTransactionTransactionAction extends Enum {1999 readonly isCall: boolean;2000 readonly asCall: H160;2001 readonly isCreate: boolean;2002 readonly type: 'Call' | 'Create';2003 }20042005 /** @name EthereumTransactionTransactionSignature (249) */2006 export interface EthereumTransactionTransactionSignature extends Struct {2007 readonly v: u64;2008 readonly r: H256;2009 readonly s: H256;2010 }20112012 /** @name EthereumTransactionEip2930Transaction (251) */2013 export interface EthereumTransactionEip2930Transaction extends Struct {2014 readonly chainId: u64;2015 readonly nonce: U256;2016 readonly gasPrice: U256;2017 readonly gasLimit: U256;2018 readonly action: EthereumTransactionTransactionAction;2019 readonly value: U256;2020 readonly input: Bytes;2021 readonly accessList: Vec<EthereumTransactionAccessListItem>;2022 readonly oddYParity: bool;2023 readonly r: H256;2024 readonly s: H256;2025 }20262027 /** @name EthereumTransactionAccessListItem (253) */2028 export interface EthereumTransactionAccessListItem extends Struct {2029 readonly address: H160;2030 readonly storageKeys: Vec<H256>;2031 }20322033 /** @name EthereumTransactionEip1559Transaction (254) */2034 export interface EthereumTransactionEip1559Transaction extends Struct {2035 readonly chainId: u64;2036 readonly nonce: U256;2037 readonly maxPriorityFeePerGas: U256;2038 readonly maxFeePerGas: U256;2039 readonly gasLimit: U256;2040 readonly action: EthereumTransactionTransactionAction;2041 readonly value: U256;2042 readonly input: Bytes;2043 readonly accessList: Vec<EthereumTransactionAccessListItem>;2044 readonly oddYParity: bool;2045 readonly r: H256;2046 readonly s: H256;2047 }20482049 /** @name PalletEvmMigrationCall (255) */2050 export interface PalletEvmMigrationCall extends Enum {2051 readonly isBegin: boolean;2052 readonly asBegin: {2053 readonly address: H160;2054 } & Struct;2055 readonly isSetData: boolean;2056 readonly asSetData: {2057 readonly address: H160;2058 readonly data: Vec<ITuple<[H256, H256]>>;2059 } & Struct;2060 readonly isFinish: boolean;2061 readonly asFinish: {2062 readonly address: H160;2063 readonly code: Bytes;2064 } & Struct;2065 readonly type: 'Begin' | 'SetData' | 'Finish';2066 }20672068 /** @name PalletSudoEvent (258) */2069 export interface PalletSudoEvent extends Enum {2070 readonly isSudid: boolean;2071 readonly asSudid: {2072 readonly sudoResult: Result<Null, SpRuntimeDispatchError>;2073 } & Struct;2074 readonly isKeyChanged: boolean;2075 readonly asKeyChanged: {2076 readonly oldSudoer: Option<AccountId32>;2077 } & Struct;2078 readonly isSudoAsDone: boolean;2079 readonly asSudoAsDone: {2080 readonly sudoResult: Result<Null, SpRuntimeDispatchError>;2081 } & Struct;2082 readonly type: 'Sudid' | 'KeyChanged' | 'SudoAsDone';2083 }20842085 /** @name SpRuntimeDispatchError (260) */2086 export interface SpRuntimeDispatchError extends Enum {2087 readonly isOther: boolean;2088 readonly isCannotLookup: boolean;2089 readonly isBadOrigin: boolean;2090 readonly isModule: boolean;2091 readonly asModule: SpRuntimeModuleError;2092 readonly isConsumerRemaining: boolean;2093 readonly isNoProviders: boolean;2094 readonly isTooManyConsumers: boolean;2095 readonly isToken: boolean;2096 readonly asToken: SpRuntimeTokenError;2097 readonly isArithmetic: boolean;2098 readonly asArithmetic: SpRuntimeArithmeticError;2099 readonly isTransactional: boolean;2100 readonly asTransactional: SpRuntimeTransactionalError;2101 readonly type: 'Other' | 'CannotLookup' | 'BadOrigin' | 'Module' | 'ConsumerRemaining' | 'NoProviders' | 'TooManyConsumers' | 'Token' | 'Arithmetic' | 'Transactional';2102 }21032104 /** @name SpRuntimeModuleError (261) */2105 export interface SpRuntimeModuleError extends Struct {2106 readonly index: u8;2107 readonly error: U8aFixed;2108 }21092110 /** @name SpRuntimeTokenError (262) */2111 export interface SpRuntimeTokenError extends Enum {2112 readonly isNoFunds: boolean;2113 readonly isWouldDie: boolean;2114 readonly isBelowMinimum: boolean;2115 readonly isCannotCreate: boolean;2116 readonly isUnknownAsset: boolean;2117 readonly isFrozen: boolean;2118 readonly isUnsupported: boolean;2119 readonly type: 'NoFunds' | 'WouldDie' | 'BelowMinimum' | 'CannotCreate' | 'UnknownAsset' | 'Frozen' | 'Unsupported';2120 }21212122 /** @name SpRuntimeArithmeticError (263) */2123 export interface SpRuntimeArithmeticError extends Enum {2124 readonly isUnderflow: boolean;2125 readonly isOverflow: boolean;2126 readonly isDivisionByZero: boolean;2127 readonly type: 'Underflow' | 'Overflow' | 'DivisionByZero';2128 }21292130 /** @name SpRuntimeTransactionalError (264) */2131 export interface SpRuntimeTransactionalError extends Enum {2132 readonly isLimitReached: boolean;2133 readonly isNoLayer: boolean;2134 readonly type: 'LimitReached' | 'NoLayer';2135 }21362137 /** @name PalletSudoError (265) */2138 export interface PalletSudoError extends Enum {2139 readonly isRequireSudo: boolean;2140 readonly type: 'RequireSudo';2141 }21422143 /** @name FrameSystemAccountInfo (266) */2144 export interface FrameSystemAccountInfo extends Struct {2145 readonly nonce: u32;2146 readonly consumers: u32;2147 readonly providers: u32;2148 readonly sufficients: u32;2149 readonly data: PalletBalancesAccountData;2150 }21512152 /** @name FrameSupportWeightsPerDispatchClassU64 (267) */2153 export interface FrameSupportWeightsPerDispatchClassU64 extends Struct {2154 readonly normal: u64;2155 readonly operational: u64;2156 readonly mandatory: u64;2157 }21582159 /** @name SpRuntimeDigest (268) */2160 export interface SpRuntimeDigest extends Struct {2161 readonly logs: Vec<SpRuntimeDigestDigestItem>;2162 }21632164 /** @name SpRuntimeDigestDigestItem (270) */2165 export interface SpRuntimeDigestDigestItem extends Enum {2166 readonly isOther: boolean;2167 readonly asOther: Bytes;2168 readonly isConsensus: boolean;2169 readonly asConsensus: ITuple<[U8aFixed, Bytes]>;2170 readonly isSeal: boolean;2171 readonly asSeal: ITuple<[U8aFixed, Bytes]>;2172 readonly isPreRuntime: boolean;2173 readonly asPreRuntime: ITuple<[U8aFixed, Bytes]>;2174 readonly isRuntimeEnvironmentUpdated: boolean;2175 readonly type: 'Other' | 'Consensus' | 'Seal' | 'PreRuntime' | 'RuntimeEnvironmentUpdated';2176 }21772178 /** @name FrameSystemEventRecord (272) */2179 export interface FrameSystemEventRecord extends Struct {2180 readonly phase: FrameSystemPhase;2181 readonly event: Event;2182 readonly topics: Vec<H256>;2183 }21842185 /** @name FrameSystemEvent (274) */2186 export interface FrameSystemEvent extends Enum {2187 readonly isExtrinsicSuccess: boolean;2188 readonly asExtrinsicSuccess: {2189 readonly dispatchInfo: FrameSupportWeightsDispatchInfo;2190 } & Struct;2191 readonly isExtrinsicFailed: boolean;2192 readonly asExtrinsicFailed: {2193 readonly dispatchError: SpRuntimeDispatchError;2194 readonly dispatchInfo: FrameSupportWeightsDispatchInfo;2195 } & Struct;2196 readonly isCodeUpdated: boolean;2197 readonly isNewAccount: boolean;2198 readonly asNewAccount: {2199 readonly account: AccountId32;2200 } & Struct;2201 readonly isKilledAccount: boolean;2202 readonly asKilledAccount: {2203 readonly account: AccountId32;2204 } & Struct;2205 readonly isRemarked: boolean;2206 readonly asRemarked: {2207 readonly sender: AccountId32;2208 readonly hash_: H256;2209 } & Struct;2210 readonly type: 'ExtrinsicSuccess' | 'ExtrinsicFailed' | 'CodeUpdated' | 'NewAccount' | 'KilledAccount' | 'Remarked';2211 }22122213 /** @name FrameSupportWeightsDispatchInfo (275) */2214 export interface FrameSupportWeightsDispatchInfo extends Struct {2215 readonly weight: u64;2216 readonly class: FrameSupportWeightsDispatchClass;2217 readonly paysFee: FrameSupportWeightsPays;2218 }22192220 /** @name FrameSupportWeightsDispatchClass (276) */2221 export interface FrameSupportWeightsDispatchClass extends Enum {2222 readonly isNormal: boolean;2223 readonly isOperational: boolean;2224 readonly isMandatory: boolean;2225 readonly type: 'Normal' | 'Operational' | 'Mandatory';2226 }22272228 /** @name FrameSupportWeightsPays (277) */2229 export interface FrameSupportWeightsPays extends Enum {2230 readonly isYes: boolean;2231 readonly isNo: boolean;2232 readonly type: 'Yes' | 'No';2233 }22342235 /** @name OrmlVestingModuleEvent (278) */2236 export interface OrmlVestingModuleEvent extends Enum {2237 readonly isVestingScheduleAdded: boolean;2238 readonly asVestingScheduleAdded: {2239 readonly from: AccountId32;2240 readonly to: AccountId32;2241 readonly vestingSchedule: OrmlVestingVestingSchedule;2242 } & Struct;2243 readonly isClaimed: boolean;2244 readonly asClaimed: {2245 readonly who: AccountId32;2246 readonly amount: u128;2247 } & Struct;2248 readonly isVestingSchedulesUpdated: boolean;2249 readonly asVestingSchedulesUpdated: {2250 readonly who: AccountId32;2251 } & Struct;2252 readonly type: 'VestingScheduleAdded' | 'Claimed' | 'VestingSchedulesUpdated';2253 }22542255 /** @name CumulusPalletXcmpQueueEvent (279) */2256 export interface CumulusPalletXcmpQueueEvent extends Enum {2257 readonly isSuccess: boolean;2258 readonly asSuccess: Option<H256>;2259 readonly isFail: boolean;2260 readonly asFail: ITuple<[Option<H256>, XcmV2TraitsError]>;2261 readonly isBadVersion: boolean;2262 readonly asBadVersion: Option<H256>;2263 readonly isBadFormat: boolean;2264 readonly asBadFormat: Option<H256>;2265 readonly isUpwardMessageSent: boolean;2266 readonly asUpwardMessageSent: Option<H256>;2267 readonly isXcmpMessageSent: boolean;2268 readonly asXcmpMessageSent: Option<H256>;2269 readonly isOverweightEnqueued: boolean;2270 readonly asOverweightEnqueued: ITuple<[u32, u32, u64, u64]>;2271 readonly isOverweightServiced: boolean;2272 readonly asOverweightServiced: ITuple<[u64, u64]>;2273 readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced';2274 }22752276 /** @name PalletXcmEvent (280) */2277 export interface PalletXcmEvent extends Enum {2278 readonly isAttempted: boolean;2279 readonly asAttempted: XcmV2TraitsOutcome;2280 readonly isSent: boolean;2281 readonly asSent: ITuple<[XcmV1MultiLocation, XcmV1MultiLocation, XcmV2Xcm]>;2282 readonly isUnexpectedResponse: boolean;2283 readonly asUnexpectedResponse: ITuple<[XcmV1MultiLocation, u64]>;2284 readonly isResponseReady: boolean;2285 readonly asResponseReady: ITuple<[u64, XcmV2Response]>;2286 readonly isNotified: boolean;2287 readonly asNotified: ITuple<[u64, u8, u8]>;2288 readonly isNotifyOverweight: boolean;2289 readonly asNotifyOverweight: ITuple<[u64, u8, u8, u64, u64]>;2290 readonly isNotifyDispatchError: boolean;2291 readonly asNotifyDispatchError: ITuple<[u64, u8, u8]>;2292 readonly isNotifyDecodeFailed: boolean;2293 readonly asNotifyDecodeFailed: ITuple<[u64, u8, u8]>;2294 readonly isInvalidResponder: boolean;2295 readonly asInvalidResponder: ITuple<[XcmV1MultiLocation, u64, Option<XcmV1MultiLocation>]>;2296 readonly isInvalidResponderVersion: boolean;2297 readonly asInvalidResponderVersion: ITuple<[XcmV1MultiLocation, u64]>;2298 readonly isResponseTaken: boolean;2299 readonly asResponseTaken: u64;2300 readonly isAssetsTrapped: boolean;2301 readonly asAssetsTrapped: ITuple<[H256, XcmV1MultiLocation, XcmVersionedMultiAssets]>;2302 readonly isVersionChangeNotified: boolean;2303 readonly asVersionChangeNotified: ITuple<[XcmV1MultiLocation, u32]>;2304 readonly isSupportedVersionChanged: boolean;2305 readonly asSupportedVersionChanged: ITuple<[XcmV1MultiLocation, u32]>;2306 readonly isNotifyTargetSendFail: boolean;2307 readonly asNotifyTargetSendFail: ITuple<[XcmV1MultiLocation, u64, XcmV2TraitsError]>;2308 readonly isNotifyTargetMigrationFail: boolean;2309 readonly asNotifyTargetMigrationFail: ITuple<[XcmVersionedMultiLocation, u64]>;2310 readonly type: 'Attempted' | 'Sent' | 'UnexpectedResponse' | 'ResponseReady' | 'Notified' | 'NotifyOverweight' | 'NotifyDispatchError' | 'NotifyDecodeFailed' | 'InvalidResponder' | 'InvalidResponderVersion' | 'ResponseTaken' | 'AssetsTrapped' | 'VersionChangeNotified' | 'SupportedVersionChanged' | 'NotifyTargetSendFail' | 'NotifyTargetMigrationFail';2311 }23122313 /** @name XcmV2TraitsOutcome (281) */2314 export interface XcmV2TraitsOutcome extends Enum {2315 readonly isComplete: boolean;2316 readonly asComplete: u64;2317 readonly isIncomplete: boolean;2318 readonly asIncomplete: ITuple<[u64, XcmV2TraitsError]>;2319 readonly isError: boolean;2320 readonly asError: XcmV2TraitsError;2321 readonly type: 'Complete' | 'Incomplete' | 'Error';2322 }23232324 /** @name CumulusPalletXcmEvent (283) */2325 export interface CumulusPalletXcmEvent extends Enum {2326 readonly isInvalidFormat: boolean;2327 readonly asInvalidFormat: U8aFixed;2328 readonly isUnsupportedVersion: boolean;2329 readonly asUnsupportedVersion: U8aFixed;2330 readonly isExecutedDownward: boolean;2331 readonly asExecutedDownward: ITuple<[U8aFixed, XcmV2TraitsOutcome]>;2332 readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward';2333 }23342335 /** @name CumulusPalletDmpQueueEvent (284) */2336 export interface CumulusPalletDmpQueueEvent extends Enum {2337 readonly isInvalidFormat: boolean;2338 readonly asInvalidFormat: {2339 readonly messageId: U8aFixed;2340 } & Struct;2341 readonly isUnsupportedVersion: boolean;2342 readonly asUnsupportedVersion: {2343 readonly messageId: U8aFixed;2344 } & Struct;2345 readonly isExecutedDownward: boolean;2346 readonly asExecutedDownward: {2347 readonly messageId: U8aFixed;2348 readonly outcome: XcmV2TraitsOutcome;2349 } & Struct;2350 readonly isWeightExhausted: boolean;2351 readonly asWeightExhausted: {2352 readonly messageId: U8aFixed;2353 readonly remainingWeight: u64;2354 readonly requiredWeight: u64;2355 } & Struct;2356 readonly isOverweightEnqueued: boolean;2357 readonly asOverweightEnqueued: {2358 readonly messageId: U8aFixed;2359 readonly overweightIndex: u64;2360 readonly requiredWeight: u64;2361 } & Struct;2362 readonly isOverweightServiced: boolean;2363 readonly asOverweightServiced: {2364 readonly overweightIndex: u64;2365 readonly weightUsed: u64;2366 } & Struct;2367 readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced';2368 }23692370 /** @name PalletUniqueRawEvent (285) */2371 export interface PalletUniqueRawEvent extends Enum {2372 readonly isCollectionSponsorRemoved: boolean;2373 readonly asCollectionSponsorRemoved: u32;2374 readonly isCollectionAdminAdded: boolean;2375 readonly asCollectionAdminAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2376 readonly isCollectionOwnedChanged: boolean;2377 readonly asCollectionOwnedChanged: ITuple<[u32, AccountId32]>;2378 readonly isCollectionSponsorSet: boolean;2379 readonly asCollectionSponsorSet: ITuple<[u32, AccountId32]>;2380 readonly isSponsorshipConfirmed: boolean;2381 readonly asSponsorshipConfirmed: ITuple<[u32, AccountId32]>;2382 readonly isCollectionAdminRemoved: boolean;2383 readonly asCollectionAdminRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2384 readonly isAllowListAddressRemoved: boolean;2385 readonly asAllowListAddressRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2386 readonly isAllowListAddressAdded: boolean;2387 readonly asAllowListAddressAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2388 readonly isCollectionLimitSet: boolean;2389 readonly asCollectionLimitSet: u32;2390 readonly isCollectionPermissionSet: boolean;2391 readonly asCollectionPermissionSet: u32;2392 readonly type: 'CollectionSponsorRemoved' | 'CollectionAdminAdded' | 'CollectionOwnedChanged' | 'CollectionSponsorSet' | 'SponsorshipConfirmed' | 'CollectionAdminRemoved' | 'AllowListAddressRemoved' | 'AllowListAddressAdded' | 'CollectionLimitSet' | 'CollectionPermissionSet';2393 }23942395 /** @name PalletUniqueSchedulerEvent (286) */2396 export interface PalletUniqueSchedulerEvent extends Enum {2397 readonly isScheduled: boolean;2398 readonly asScheduled: {2399 readonly when: u32;2400 readonly index: u32;2401 } & Struct;2402 readonly isCanceled: boolean;2403 readonly asCanceled: {2404 readonly when: u32;2405 readonly index: u32;2406 } & Struct;2407 readonly isDispatched: boolean;2408 readonly asDispatched: {2409 readonly task: ITuple<[u32, u32]>;2410 readonly id: Option<U8aFixed>;2411 readonly result: Result<Null, SpRuntimeDispatchError>;2412 } & Struct;2413 readonly isCallLookupFailed: boolean;2414 readonly asCallLookupFailed: {2415 readonly task: ITuple<[u32, u32]>;2416 readonly id: Option<U8aFixed>;2417 readonly error: FrameSupportScheduleLookupError;2418 } & Struct;2419 readonly type: 'Scheduled' | 'Canceled' | 'Dispatched' | 'CallLookupFailed';2420 }24212422 /** @name FrameSupportScheduleLookupError (288) */2423 export interface FrameSupportScheduleLookupError extends Enum {2424 readonly isUnknown: boolean;2425 readonly isBadFormat: boolean;2426 readonly type: 'Unknown' | 'BadFormat';2427 }24282429 /** @name PalletCommonEvent (289) */2430 export interface PalletCommonEvent extends Enum {2431 readonly isCollectionCreated: boolean;2432 readonly asCollectionCreated: ITuple<[u32, u8, AccountId32]>;2433 readonly isCollectionDestroyed: boolean;2434 readonly asCollectionDestroyed: u32;2435 readonly isItemCreated: boolean;2436 readonly asItemCreated: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2437 readonly isItemDestroyed: boolean;2438 readonly asItemDestroyed: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2439 readonly isTransfer: boolean;2440 readonly asTransfer: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2441 readonly isApproved: boolean;2442 readonly asApproved: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2443 readonly isCollectionPropertySet: boolean;2444 readonly asCollectionPropertySet: ITuple<[u32, Bytes]>;2445 readonly isCollectionPropertyDeleted: boolean;2446 readonly asCollectionPropertyDeleted: ITuple<[u32, Bytes]>;2447 readonly isTokenPropertySet: boolean;2448 readonly asTokenPropertySet: ITuple<[u32, u32, Bytes]>;2449 readonly isTokenPropertyDeleted: boolean;2450 readonly asTokenPropertyDeleted: ITuple<[u32, u32, Bytes]>;2451 readonly isPropertyPermissionSet: boolean;2452 readonly asPropertyPermissionSet: ITuple<[u32, Bytes]>;2453 readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'ItemCreated' | 'ItemDestroyed' | 'Transfer' | 'Approved' | 'CollectionPropertySet' | 'CollectionPropertyDeleted' | 'TokenPropertySet' | 'TokenPropertyDeleted' | 'PropertyPermissionSet';2454 }24552456 /** @name PalletStructureEvent (290) */2457 export interface PalletStructureEvent extends Enum {2458 readonly isExecuted: boolean;2459 readonly asExecuted: Result<Null, SpRuntimeDispatchError>;2460 readonly type: 'Executed';2461 }24622463 /** @name PalletRmrkCoreEvent (291) */2464 export interface PalletRmrkCoreEvent extends Enum {2465 readonly isCollectionCreated: boolean;2466 readonly asCollectionCreated: {2467 readonly issuer: AccountId32;2468 readonly collectionId: u32;2469 } & Struct;2470 readonly isCollectionDestroyed: boolean;2471 readonly asCollectionDestroyed: {2472 readonly issuer: AccountId32;2473 readonly collectionId: u32;2474 } & Struct;2475 readonly isIssuerChanged: boolean;2476 readonly asIssuerChanged: {2477 readonly oldIssuer: AccountId32;2478 readonly newIssuer: AccountId32;2479 readonly collectionId: u32;2480 } & Struct;2481 readonly isCollectionLocked: boolean;2482 readonly asCollectionLocked: {2483 readonly issuer: AccountId32;2484 readonly collectionId: u32;2485 } & Struct;2486 readonly isNftMinted: boolean;2487 readonly asNftMinted: {2488 readonly owner: AccountId32;2489 readonly collectionId: u32;2490 readonly nftId: u32;2491 } & Struct;2492 readonly isNftBurned: boolean;2493 readonly asNftBurned: {2494 readonly owner: AccountId32;2495 readonly nftId: u32;2496 } & Struct;2497 readonly isNftSent: boolean;2498 readonly asNftSent: {2499 readonly sender: AccountId32;2500 readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;2501 readonly collectionId: u32;2502 readonly nftId: u32;2503 readonly approvalRequired: bool;2504 } & Struct;2505 readonly isNftAccepted: boolean;2506 readonly asNftAccepted: {2507 readonly sender: AccountId32;2508 readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;2509 readonly collectionId: u32;2510 readonly nftId: u32;2511 } & Struct;2512 readonly isNftRejected: boolean;2513 readonly asNftRejected: {2514 readonly sender: AccountId32;2515 readonly collectionId: u32;2516 readonly nftId: u32;2517 } & Struct;2518 readonly isPropertySet: boolean;2519 readonly asPropertySet: {2520 readonly collectionId: u32;2521 readonly maybeNftId: Option<u32>;2522 readonly key: Bytes;2523 readonly value: Bytes;2524 } & Struct;2525 readonly isResourceAdded: boolean;2526 readonly asResourceAdded: {2527 readonly nftId: u32;2528 readonly resourceId: u32;2529 } & Struct;2530 readonly isResourceRemoval: boolean;2531 readonly asResourceRemoval: {2532 readonly nftId: u32;2533 readonly resourceId: u32;2534 } & Struct;2535 readonly isResourceAccepted: boolean;2536 readonly asResourceAccepted: {2537 readonly nftId: u32;2538 readonly resourceId: u32;2539 } & Struct;2540 readonly isResourceRemovalAccepted: boolean;2541 readonly asResourceRemovalAccepted: {2542 readonly nftId: u32;2543 readonly resourceId: u32;2544 } & Struct;2545 readonly isPrioritySet: boolean;2546 readonly asPrioritySet: {2547 readonly collectionId: u32;2548 readonly nftId: u32;2549 } & Struct;2550 readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'IssuerChanged' | 'CollectionLocked' | 'NftMinted' | 'NftBurned' | 'NftSent' | 'NftAccepted' | 'NftRejected' | 'PropertySet' | 'ResourceAdded' | 'ResourceRemoval' | 'ResourceAccepted' | 'ResourceRemovalAccepted' | 'PrioritySet';2551 }25522553 /** @name PalletRmrkEquipEvent (292) */2554 export interface PalletRmrkEquipEvent extends Enum {2555 readonly isBaseCreated: boolean;2556 readonly asBaseCreated: {2557 readonly issuer: AccountId32;2558 readonly baseId: u32;2559 } & Struct;2560 readonly isEquippablesUpdated: boolean;2561 readonly asEquippablesUpdated: {2562 readonly baseId: u32;2563 readonly slotId: u32;2564 } & Struct;2565 readonly type: 'BaseCreated' | 'EquippablesUpdated';2566 }25672568 /** @name PalletEvmEvent (293) */2569 export interface PalletEvmEvent extends Enum {2570 readonly isLog: boolean;2571 readonly asLog: EthereumLog;2572 readonly isCreated: boolean;2573 readonly asCreated: H160;2574 readonly isCreatedFailed: boolean;2575 readonly asCreatedFailed: H160;2576 readonly isExecuted: boolean;2577 readonly asExecuted: H160;2578 readonly isExecutedFailed: boolean;2579 readonly asExecutedFailed: H160;2580 readonly isBalanceDeposit: boolean;2581 readonly asBalanceDeposit: ITuple<[AccountId32, H160, U256]>;2582 readonly isBalanceWithdraw: boolean;2583 readonly asBalanceWithdraw: ITuple<[AccountId32, H160, U256]>;2584 readonly type: 'Log' | 'Created' | 'CreatedFailed' | 'Executed' | 'ExecutedFailed' | 'BalanceDeposit' | 'BalanceWithdraw';2585 }25862587 /** @name EthereumLog (294) */2588 export interface EthereumLog extends Struct {2589 readonly address: H160;2590 readonly topics: Vec<H256>;2591 readonly data: Bytes;2592 }25932594 /** @name PalletEthereumEvent (295) */2595 export interface PalletEthereumEvent extends Enum {2596 readonly isExecuted: boolean;2597 readonly asExecuted: ITuple<[H160, H160, H256, EvmCoreErrorExitReason]>;2598 readonly type: 'Executed';2599 }26002601 /** @name EvmCoreErrorExitReason (296) */2602 export interface EvmCoreErrorExitReason extends Enum {2603 readonly isSucceed: boolean;2604 readonly asSucceed: EvmCoreErrorExitSucceed;2605 readonly isError: boolean;2606 readonly asError: EvmCoreErrorExitError;2607 readonly isRevert: boolean;2608 readonly asRevert: EvmCoreErrorExitRevert;2609 readonly isFatal: boolean;2610 readonly asFatal: EvmCoreErrorExitFatal;2611 readonly type: 'Succeed' | 'Error' | 'Revert' | 'Fatal';2612 }26132614 /** @name EvmCoreErrorExitSucceed (297) */2615 export interface EvmCoreErrorExitSucceed extends Enum {2616 readonly isStopped: boolean;2617 readonly isReturned: boolean;2618 readonly isSuicided: boolean;2619 readonly type: 'Stopped' | 'Returned' | 'Suicided';2620 }26212622 /** @name EvmCoreErrorExitError (298) */2623 export interface EvmCoreErrorExitError extends Enum {2624 readonly isStackUnderflow: boolean;2625 readonly isStackOverflow: boolean;2626 readonly isInvalidJump: boolean;2627 readonly isInvalidRange: boolean;2628 readonly isDesignatedInvalid: boolean;2629 readonly isCallTooDeep: boolean;2630 readonly isCreateCollision: boolean;2631 readonly isCreateContractLimit: boolean;2632 readonly isOutOfOffset: boolean;2633 readonly isOutOfGas: boolean;2634 readonly isOutOfFund: boolean;2635 readonly isPcUnderflow: boolean;2636 readonly isCreateEmpty: boolean;2637 readonly isOther: boolean;2638 readonly asOther: Text;2639 readonly isInvalidCode: boolean;2640 readonly type: 'StackUnderflow' | 'StackOverflow' | 'InvalidJump' | 'InvalidRange' | 'DesignatedInvalid' | 'CallTooDeep' | 'CreateCollision' | 'CreateContractLimit' | 'OutOfOffset' | 'OutOfGas' | 'OutOfFund' | 'PcUnderflow' | 'CreateEmpty' | 'Other' | 'InvalidCode';2641 }26422643 /** @name EvmCoreErrorExitRevert (301) */2644 export interface EvmCoreErrorExitRevert extends Enum {2645 readonly isReverted: boolean;2646 readonly type: 'Reverted';2647 }26482649 /** @name EvmCoreErrorExitFatal (302) */2650 export interface EvmCoreErrorExitFatal extends Enum {2651 readonly isNotSupported: boolean;2652 readonly isUnhandledInterrupt: boolean;2653 readonly isCallErrorAsFatal: boolean;2654 readonly asCallErrorAsFatal: EvmCoreErrorExitError;2655 readonly isOther: boolean;2656 readonly asOther: Text;2657 readonly type: 'NotSupported' | 'UnhandledInterrupt' | 'CallErrorAsFatal' | 'Other';2658 }26592660 /** @name FrameSystemPhase (303) */2661 export interface FrameSystemPhase extends Enum {2662 readonly isApplyExtrinsic: boolean;2663 readonly asApplyExtrinsic: u32;2664 readonly isFinalization: boolean;2665 readonly isInitialization: boolean;2666 readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization';2667 }26682669 /** @name FrameSystemLastRuntimeUpgradeInfo (305) */2670 export interface FrameSystemLastRuntimeUpgradeInfo extends Struct {2671 readonly specVersion: Compact<u32>;2672 readonly specName: Text;2673 }26742675 /** @name FrameSystemLimitsBlockWeights (306) */2676 export interface FrameSystemLimitsBlockWeights extends Struct {2677 readonly baseBlock: u64;2678 readonly maxBlock: u64;2679 readonly perClass: FrameSupportWeightsPerDispatchClassWeightsPerClass;2680 }26812682 /** @name FrameSupportWeightsPerDispatchClassWeightsPerClass (307) */2683 export interface FrameSupportWeightsPerDispatchClassWeightsPerClass extends Struct {2684 readonly normal: FrameSystemLimitsWeightsPerClass;2685 readonly operational: FrameSystemLimitsWeightsPerClass;2686 readonly mandatory: FrameSystemLimitsWeightsPerClass;2687 }26882689 /** @name FrameSystemLimitsWeightsPerClass (308) */2690 export interface FrameSystemLimitsWeightsPerClass extends Struct {2691 readonly baseExtrinsic: u64;2692 readonly maxExtrinsic: Option<u64>;2693 readonly maxTotal: Option<u64>;2694 readonly reserved: Option<u64>;2695 }26962697 /** @name FrameSystemLimitsBlockLength (310) */2698 export interface FrameSystemLimitsBlockLength extends Struct {2699 readonly max: FrameSupportWeightsPerDispatchClassU32;2700 }27012702 /** @name FrameSupportWeightsPerDispatchClassU32 (311) */2703 export interface FrameSupportWeightsPerDispatchClassU32 extends Struct {2704 readonly normal: u32;2705 readonly operational: u32;2706 readonly mandatory: u32;2707 }27082709 /** @name FrameSupportWeightsRuntimeDbWeight (312) */2710 export interface FrameSupportWeightsRuntimeDbWeight extends Struct {2711 readonly read: u64;2712 readonly write: u64;2713 }27142715 /** @name SpVersionRuntimeVersion (313) */2716 export interface SpVersionRuntimeVersion extends Struct {2717 readonly specName: Text;2718 readonly implName: Text;2719 readonly authoringVersion: u32;2720 readonly specVersion: u32;2721 readonly implVersion: u32;2722 readonly apis: Vec<ITuple<[U8aFixed, u32]>>;2723 readonly transactionVersion: u32;2724 readonly stateVersion: u8;2725 }27262727 /** @name FrameSystemError (317) */2728 export interface FrameSystemError extends Enum {2729 readonly isInvalidSpecName: boolean;2730 readonly isSpecVersionNeedsToIncrease: boolean;2731 readonly isFailedToExtractRuntimeVersion: boolean;2732 readonly isNonDefaultComposite: boolean;2733 readonly isNonZeroRefCount: boolean;2734 readonly isCallFiltered: boolean;2735 readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered';2736 }27372738 /** @name OrmlVestingModuleError (319) */2739 export interface OrmlVestingModuleError extends Enum {2740 readonly isZeroVestingPeriod: boolean;2741 readonly isZeroVestingPeriodCount: boolean;2742 readonly isInsufficientBalanceToLock: boolean;2743 readonly isTooManyVestingSchedules: boolean;2744 readonly isAmountLow: boolean;2745 readonly isMaxVestingSchedulesExceeded: boolean;2746 readonly type: 'ZeroVestingPeriod' | 'ZeroVestingPeriodCount' | 'InsufficientBalanceToLock' | 'TooManyVestingSchedules' | 'AmountLow' | 'MaxVestingSchedulesExceeded';2747 }27482749 /** @name CumulusPalletXcmpQueueInboundChannelDetails (321) */2750 export interface CumulusPalletXcmpQueueInboundChannelDetails extends Struct {2751 readonly sender: u32;2752 readonly state: CumulusPalletXcmpQueueInboundState;2753 readonly messageMetadata: Vec<ITuple<[u32, PolkadotParachainPrimitivesXcmpMessageFormat]>>;2754 }27552756 /** @name CumulusPalletXcmpQueueInboundState (322) */2757 export interface CumulusPalletXcmpQueueInboundState extends Enum {2758 readonly isOk: boolean;2759 readonly isSuspended: boolean;2760 readonly type: 'Ok' | 'Suspended';2761 }27622763 /** @name PolkadotParachainPrimitivesXcmpMessageFormat (325) */2764 export interface PolkadotParachainPrimitivesXcmpMessageFormat extends Enum {2765 readonly isConcatenatedVersionedXcm: boolean;2766 readonly isConcatenatedEncodedBlob: boolean;2767 readonly isSignals: boolean;2768 readonly type: 'ConcatenatedVersionedXcm' | 'ConcatenatedEncodedBlob' | 'Signals';2769 }27702771 /** @name CumulusPalletXcmpQueueOutboundChannelDetails (328) */2772 export interface CumulusPalletXcmpQueueOutboundChannelDetails extends Struct {2773 readonly recipient: u32;2774 readonly state: CumulusPalletXcmpQueueOutboundState;2775 readonly signalsExist: bool;2776 readonly firstIndex: u16;2777 readonly lastIndex: u16;2778 }27792780 /** @name CumulusPalletXcmpQueueOutboundState (329) */2781 export interface CumulusPalletXcmpQueueOutboundState extends Enum {2782 readonly isOk: boolean;2783 readonly isSuspended: boolean;2784 readonly type: 'Ok' | 'Suspended';2785 }27862787 /** @name CumulusPalletXcmpQueueQueueConfigData (331) */2788 export interface CumulusPalletXcmpQueueQueueConfigData extends Struct {2789 readonly suspendThreshold: u32;2790 readonly dropThreshold: u32;2791 readonly resumeThreshold: u32;2792 readonly thresholdWeight: u64;2793 readonly weightRestrictDecay: u64;2794 readonly xcmpMaxIndividualWeight: u64;2795 }27962797 /** @name CumulusPalletXcmpQueueError (333) */2798 export interface CumulusPalletXcmpQueueError extends Enum {2799 readonly isFailedToSend: boolean;2800 readonly isBadXcmOrigin: boolean;2801 readonly isBadXcm: boolean;2802 readonly isBadOverweightIndex: boolean;2803 readonly isWeightOverLimit: boolean;2804 readonly type: 'FailedToSend' | 'BadXcmOrigin' | 'BadXcm' | 'BadOverweightIndex' | 'WeightOverLimit';2805 }28062807 /** @name PalletXcmError (334) */2808 export interface PalletXcmError extends Enum {2809 readonly isUnreachable: boolean;2810 readonly isSendFailure: boolean;2811 readonly isFiltered: boolean;2812 readonly isUnweighableMessage: boolean;2813 readonly isDestinationNotInvertible: boolean;2814 readonly isEmpty: boolean;2815 readonly isCannotReanchor: boolean;2816 readonly isTooManyAssets: boolean;2817 readonly isInvalidOrigin: boolean;2818 readonly isBadVersion: boolean;2819 readonly isBadLocation: boolean;2820 readonly isNoSubscription: boolean;2821 readonly isAlreadySubscribed: boolean;2822 readonly type: 'Unreachable' | 'SendFailure' | 'Filtered' | 'UnweighableMessage' | 'DestinationNotInvertible' | 'Empty' | 'CannotReanchor' | 'TooManyAssets' | 'InvalidOrigin' | 'BadVersion' | 'BadLocation' | 'NoSubscription' | 'AlreadySubscribed';2823 }28242825 /** @name CumulusPalletXcmError (335) */2826 export type CumulusPalletXcmError = Null;28272828 /** @name CumulusPalletDmpQueueConfigData (336) */2829 export interface CumulusPalletDmpQueueConfigData extends Struct {2830 readonly maxIndividual: u64;2831 }28322833 /** @name CumulusPalletDmpQueuePageIndexData (337) */2834 export interface CumulusPalletDmpQueuePageIndexData extends Struct {2835 readonly beginUsed: u32;2836 readonly endUsed: u32;2837 readonly overweightCount: u64;2838 }28392840 /** @name CumulusPalletDmpQueueError (340) */2841 export interface CumulusPalletDmpQueueError extends Enum {2842 readonly isUnknown: boolean;2843 readonly isOverLimit: boolean;2844 readonly type: 'Unknown' | 'OverLimit';2845 }28462847 /** @name PalletUniqueError (344) */2848 export interface PalletUniqueError extends Enum {2849 readonly isCollectionDecimalPointLimitExceeded: boolean;2850 readonly isConfirmUnsetSponsorFail: boolean;2851 readonly isEmptyArgument: boolean;2852 readonly isRepartitionCalledOnNonRefungibleCollection: boolean;2853 readonly type: 'CollectionDecimalPointLimitExceeded' | 'ConfirmUnsetSponsorFail' | 'EmptyArgument' | 'RepartitionCalledOnNonRefungibleCollection';2854 }28552856 /** @name PalletUniqueSchedulerScheduledV3 (347) */2857 export interface PalletUniqueSchedulerScheduledV3 extends Struct {2858 readonly maybeId: Option<U8aFixed>;2859 readonly priority: u8;2860 readonly call: FrameSupportScheduleMaybeHashed;2861 readonly maybePeriodic: Option<ITuple<[u32, u32]>>;2862 readonly origin: OpalRuntimeOriginCaller;2863 }28642865 /** @name OpalRuntimeOriginCaller (348) */2866 export interface OpalRuntimeOriginCaller extends Enum {2867 readonly isVoid: boolean;2868 readonly isSystem: boolean;2869 readonly asSystem: FrameSupportDispatchRawOrigin;2870 readonly isPolkadotXcm: boolean;2871 readonly asPolkadotXcm: PalletXcmOrigin;2872 readonly isCumulusXcm: boolean;2873 readonly asCumulusXcm: CumulusPalletXcmOrigin;2874 readonly isEthereum: boolean;2875 readonly asEthereum: PalletEthereumRawOrigin;2876 readonly type: 'Void' | 'System' | 'PolkadotXcm' | 'CumulusXcm' | 'Ethereum';2877 }28782879 /** @name FrameSupportDispatchRawOrigin (349) */2880 export interface FrameSupportDispatchRawOrigin extends Enum {2881 readonly isRoot: boolean;2882 readonly isSigned: boolean;2883 readonly asSigned: AccountId32;2884 readonly isNone: boolean;2885 readonly type: 'Root' | 'Signed' | 'None';2886 }28872888 /** @name PalletXcmOrigin (350) */2889 export interface PalletXcmOrigin extends Enum {2890 readonly isXcm: boolean;2891 readonly asXcm: XcmV1MultiLocation;2892 readonly isResponse: boolean;2893 readonly asResponse: XcmV1MultiLocation;2894 readonly type: 'Xcm' | 'Response';2895 }28962897 /** @name CumulusPalletXcmOrigin (351) */2898 export interface CumulusPalletXcmOrigin extends Enum {2899 readonly isRelay: boolean;2900 readonly isSiblingParachain: boolean;2901 readonly asSiblingParachain: u32;2902 readonly type: 'Relay' | 'SiblingParachain';2903 }29042905 /** @name PalletEthereumRawOrigin (352) */2906 export interface PalletEthereumRawOrigin extends Enum {2907 readonly isEthereumTransaction: boolean;2908 readonly asEthereumTransaction: H160;2909 readonly type: 'EthereumTransaction';2910 }29112912 /** @name SpCoreVoid (353) */2913 export type SpCoreVoid = Null;29142915 /** @name PalletUniqueSchedulerError (354) */2916 export interface PalletUniqueSchedulerError extends Enum {2917 readonly isFailedToSchedule: boolean;2918 readonly isNotFound: boolean;2919 readonly isTargetBlockNumberInPast: boolean;2920 readonly isRescheduleNoChange: boolean;2921 readonly type: 'FailedToSchedule' | 'NotFound' | 'TargetBlockNumberInPast' | 'RescheduleNoChange';2922 }29232924 /** @name UpDataStructsCollection (355) */2925 export interface UpDataStructsCollection extends Struct {2926 readonly owner: AccountId32;2927 readonly mode: UpDataStructsCollectionMode;2928 readonly name: Vec<u16>;2929 readonly description: Vec<u16>;2930 readonly tokenPrefix: Bytes;2931 readonly sponsorship: UpDataStructsSponsorshipState;2932 readonly limits: UpDataStructsCollectionLimits;2933 readonly permissions: UpDataStructsCollectionPermissions;2934 readonly externalCollection: bool;2935 }29362937 /** @name UpDataStructsSponsorshipState (356) */2938 export interface UpDataStructsSponsorshipState extends Enum {2939 readonly isDisabled: boolean;2940 readonly isUnconfirmed: boolean;2941 readonly asUnconfirmed: AccountId32;2942 readonly isConfirmed: boolean;2943 readonly asConfirmed: AccountId32;2944 readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';2945 }29462947 /** @name UpDataStructsProperties (357) */2948 export interface UpDataStructsProperties extends Struct {2949 readonly map: UpDataStructsPropertiesMapBoundedVec;2950 readonly consumedSpace: u32;2951 readonly spaceLimit: u32;2952 }29532954 /** @name UpDataStructsPropertiesMapBoundedVec (358) */2955 export interface UpDataStructsPropertiesMapBoundedVec extends BTreeMap<Bytes, Bytes> {}29562957 /** @name UpDataStructsPropertiesMapPropertyPermission (363) */2958 export interface UpDataStructsPropertiesMapPropertyPermission extends BTreeMap<Bytes, UpDataStructsPropertyPermission> {}29592960 /** @name UpDataStructsCollectionStats (370) */2961 export interface UpDataStructsCollectionStats extends Struct {2962 readonly created: u32;2963 readonly destroyed: u32;2964 readonly alive: u32;2965 }29662967 /** @name UpDataStructsTokenChild (371) */2968 export interface UpDataStructsTokenChild extends Struct {2969 readonly token: u32;2970 readonly collection: u32;2971 }29722973 /** @name PhantomTypeUpDataStructs (372) */2974 export interface PhantomTypeUpDataStructs extends Vec<ITuple<[UpDataStructsTokenData, UpDataStructsRpcCollection, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftNftInfo, RmrkTraitsResourceResourceInfo, RmrkTraitsPropertyPropertyInfo, RmrkTraitsBaseBaseInfo, RmrkTraitsPartPartType, RmrkTraitsTheme, RmrkTraitsNftNftChild]>> {}29752976 /** @name UpDataStructsTokenData (374) */2977 export interface UpDataStructsTokenData extends Struct {2978 readonly properties: Vec<UpDataStructsProperty>;2979 readonly owner: Option<PalletEvmAccountBasicCrossAccountIdRepr>;2980 readonly pieces: u128;2981 }29822983 /** @name UpDataStructsRpcCollection (376) */2984 export interface UpDataStructsRpcCollection extends Struct {2985 readonly owner: AccountId32;2986 readonly mode: UpDataStructsCollectionMode;2987 readonly name: Vec<u16>;2988 readonly description: Vec<u16>;2989 readonly tokenPrefix: Bytes;2990 readonly sponsorship: UpDataStructsSponsorshipState;2991 readonly limits: UpDataStructsCollectionLimits;2992 readonly permissions: UpDataStructsCollectionPermissions;2993 readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2994 readonly properties: Vec<UpDataStructsProperty>;2995 readonly readOnly: bool;2996 }29972998 /** @name RmrkTraitsCollectionCollectionInfo (377) */2999 export interface RmrkTraitsCollectionCollectionInfo extends Struct {3000 readonly issuer: AccountId32;3001 readonly metadata: Bytes;3002 readonly max: Option<u32>;3003 readonly symbol: Bytes;3004 readonly nftsCount: u32;3005 }30063007 /** @name RmrkTraitsNftNftInfo (378) */3008 export interface RmrkTraitsNftNftInfo extends Struct {3009 readonly owner: RmrkTraitsNftAccountIdOrCollectionNftTuple;3010 readonly royalty: Option<RmrkTraitsNftRoyaltyInfo>;3011 readonly metadata: Bytes;3012 readonly equipped: bool;3013 readonly pending: bool;3014 }30153016 /** @name RmrkTraitsNftRoyaltyInfo (380) */3017 export interface RmrkTraitsNftRoyaltyInfo extends Struct {3018 readonly recipient: AccountId32;3019 readonly amount: Permill;3020 }30213022 /** @name RmrkTraitsResourceResourceInfo (381) */3023 export interface RmrkTraitsResourceResourceInfo extends Struct {3024 readonly id: u32;3025 readonly resource: RmrkTraitsResourceResourceTypes;3026 readonly pending: bool;3027 readonly pendingRemoval: bool;3028 }30293030 /** @name RmrkTraitsPropertyPropertyInfo (382) */3031 export interface RmrkTraitsPropertyPropertyInfo extends Struct {3032 readonly key: Bytes;3033 readonly value: Bytes;3034 }30353036 /** @name RmrkTraitsBaseBaseInfo (383) */3037 export interface RmrkTraitsBaseBaseInfo extends Struct {3038 readonly issuer: AccountId32;3039 readonly baseType: Bytes;3040 readonly symbol: Bytes;3041 }30423043 /** @name RmrkTraitsNftNftChild (384) */3044 export interface RmrkTraitsNftNftChild extends Struct {3045 readonly collectionId: u32;3046 readonly nftId: u32;3047 }30483049 /** @name PalletCommonError (386) */3050 export interface PalletCommonError extends Enum {3051 readonly isCollectionNotFound: boolean;3052 readonly isMustBeTokenOwner: boolean;3053 readonly isNoPermission: boolean;3054 readonly isCantDestroyNotEmptyCollection: boolean;3055 readonly isPublicMintingNotAllowed: boolean;3056 readonly isAddressNotInAllowlist: boolean;3057 readonly isCollectionNameLimitExceeded: boolean;3058 readonly isCollectionDescriptionLimitExceeded: boolean;3059 readonly isCollectionTokenPrefixLimitExceeded: boolean;3060 readonly isTotalCollectionsLimitExceeded: boolean;3061 readonly isCollectionAdminCountExceeded: boolean;3062 readonly isCollectionLimitBoundsExceeded: boolean;3063 readonly isOwnerPermissionsCantBeReverted: boolean;3064 readonly isTransferNotAllowed: boolean;3065 readonly isAccountTokenLimitExceeded: boolean;3066 readonly isCollectionTokenLimitExceeded: boolean;3067 readonly isMetadataFlagFrozen: boolean;3068 readonly isTokenNotFound: boolean;3069 readonly isTokenValueTooLow: boolean;3070 readonly isApprovedValueTooLow: boolean;3071 readonly isCantApproveMoreThanOwned: boolean;3072 readonly isAddressIsZero: boolean;3073 readonly isUnsupportedOperation: boolean;3074 readonly isNotSufficientFounds: boolean;3075 readonly isUserIsNotAllowedToNest: boolean;3076 readonly isSourceCollectionIsNotAllowedToNest: boolean;3077 readonly isCollectionFieldSizeExceeded: boolean;3078 readonly isNoSpaceForProperty: boolean;3079 readonly isPropertyLimitReached: boolean;3080 readonly isPropertyKeyIsTooLong: boolean;3081 readonly isInvalidCharacterInPropertyKey: boolean;3082 readonly isEmptyPropertyKey: boolean;3083 readonly isCollectionIsExternal: boolean;3084 readonly isCollectionIsInternal: boolean;3085 readonly type: 'CollectionNotFound' | 'MustBeTokenOwner' | 'NoPermission' | 'CantDestroyNotEmptyCollection' | 'PublicMintingNotAllowed' | 'AddressNotInAllowlist' | 'CollectionNameLimitExceeded' | 'CollectionDescriptionLimitExceeded' | 'CollectionTokenPrefixLimitExceeded' | 'TotalCollectionsLimitExceeded' | 'CollectionAdminCountExceeded' | 'CollectionLimitBoundsExceeded' | 'OwnerPermissionsCantBeReverted' | 'TransferNotAllowed' | 'AccountTokenLimitExceeded' | 'CollectionTokenLimitExceeded' | 'MetadataFlagFrozen' | 'TokenNotFound' | 'TokenValueTooLow' | 'ApprovedValueTooLow' | 'CantApproveMoreThanOwned' | 'AddressIsZero' | 'UnsupportedOperation' | 'NotSufficientFounds' | 'UserIsNotAllowedToNest' | 'SourceCollectionIsNotAllowedToNest' | 'CollectionFieldSizeExceeded' | 'NoSpaceForProperty' | 'PropertyLimitReached' | 'PropertyKeyIsTooLong' | 'InvalidCharacterInPropertyKey' | 'EmptyPropertyKey' | 'CollectionIsExternal' | 'CollectionIsInternal';3086 }30873088 /** @name PalletFungibleError (388) */3089 export interface PalletFungibleError extends Enum {3090 readonly isNotFungibleDataUsedToMintFungibleCollectionToken: boolean;3091 readonly isFungibleItemsHaveNoId: boolean;3092 readonly isFungibleItemsDontHaveData: boolean;3093 readonly isFungibleDisallowsNesting: boolean;3094 readonly isSettingPropertiesNotAllowed: boolean;3095 readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';3096 }30973098 /** @name PalletRefungibleItemData (389) */3099 export interface PalletRefungibleItemData extends Struct {3100 readonly constData: Bytes;3101 }31023103 /** @name PalletRefungibleError (393) */3104 export interface PalletRefungibleError extends Enum {3105 readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;3106 readonly isWrongRefungiblePieces: boolean;3107 readonly isRepartitionWhileNotOwningAllPieces: boolean;3108 readonly isRefungibleDisallowsNesting: boolean;3109 readonly isSettingPropertiesNotAllowed: boolean;3110 readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';3111 }31123113 /** @name PalletNonfungibleItemData (394) */3114 export interface PalletNonfungibleItemData extends Struct {3115 readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;3116 }31173118 /** @name UpDataStructsPropertyScope (396) */3119 export interface UpDataStructsPropertyScope extends Enum {3120 readonly isNone: boolean;3121 readonly isRmrk: boolean;3122 readonly type: 'None' | 'Rmrk';3123 }31243125 /** @name PalletNonfungibleError (398) */3126 export interface PalletNonfungibleError extends Enum {3127 readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean;3128 readonly isNonfungibleItemsHaveNoAmount: boolean;3129 readonly isCantBurnNftWithChildren: boolean;3130 readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren';3131 }31323133 /** @name PalletStructureError (399) */3134 export interface PalletStructureError extends Enum {3135 readonly isOuroborosDetected: boolean;3136 readonly isDepthLimit: boolean;3137 readonly isBreadthLimit: boolean;3138 readonly isTokenNotFound: boolean;3139 readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound';3140 }31413142 /** @name PalletRmrkCoreError (400) */3143 export interface PalletRmrkCoreError extends Enum {3144 readonly isCorruptedCollectionType: boolean;3145 readonly isNftTypeEncodeError: boolean;3146 readonly isRmrkPropertyKeyIsTooLong: boolean;3147 readonly isRmrkPropertyValueIsTooLong: boolean;3148 readonly isRmrkPropertyIsNotFound: boolean;3149 readonly isUnableToDecodeRmrkData: boolean;3150 readonly isCollectionNotEmpty: boolean;3151 readonly isNoAvailableCollectionId: boolean;3152 readonly isNoAvailableNftId: boolean;3153 readonly isCollectionUnknown: boolean;3154 readonly isNoPermission: boolean;3155 readonly isNonTransferable: boolean;3156 readonly isCollectionFullOrLocked: boolean;3157 readonly isResourceDoesntExist: boolean;3158 readonly isCannotSendToDescendentOrSelf: boolean;3159 readonly isCannotAcceptNonOwnedNft: boolean;3160 readonly isCannotRejectNonOwnedNft: boolean;3161 readonly isCannotRejectNonPendingNft: boolean;3162 readonly isResourceNotPending: boolean;3163 readonly isNoAvailableResourceId: boolean;3164 readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId';3165 }31663167 /** @name PalletRmrkEquipError (402) */3168 export interface PalletRmrkEquipError extends Enum {3169 readonly isPermissionError: boolean;3170 readonly isNoAvailableBaseId: boolean;3171 readonly isNoAvailablePartId: boolean;3172 readonly isBaseDoesntExist: boolean;3173 readonly isNeedsDefaultThemeFirst: boolean;3174 readonly isPartDoesntExist: boolean;3175 readonly isNoEquippableOnFixedPart: boolean;3176 readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart';3177 }31783179 /** @name PalletEvmError (405) */3180 export interface PalletEvmError extends Enum {3181 readonly isBalanceLow: boolean;3182 readonly isFeeOverflow: boolean;3183 readonly isPaymentOverflow: boolean;3184 readonly isWithdrawFailed: boolean;3185 readonly isGasPriceTooLow: boolean;3186 readonly isInvalidNonce: boolean;3187 readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce';3188 }31893190 /** @name FpRpcTransactionStatus (408) */3191 export interface FpRpcTransactionStatus extends Struct {3192 readonly transactionHash: H256;3193 readonly transactionIndex: u32;3194 readonly from: H160;3195 readonly to: Option<H160>;3196 readonly contractAddress: Option<H160>;3197 readonly logs: Vec<EthereumLog>;3198 readonly logsBloom: EthbloomBloom;3199 }32003201 /** @name EthbloomBloom (410) */3202 export interface EthbloomBloom extends U8aFixed {}32033204 /** @name EthereumReceiptReceiptV3 (412) */3205 export interface EthereumReceiptReceiptV3 extends Enum {3206 readonly isLegacy: boolean;3207 readonly asLegacy: EthereumReceiptEip658ReceiptData;3208 readonly isEip2930: boolean;3209 readonly asEip2930: EthereumReceiptEip658ReceiptData;3210 readonly isEip1559: boolean;3211 readonly asEip1559: EthereumReceiptEip658ReceiptData;3212 readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';3213 }32143215 /** @name EthereumReceiptEip658ReceiptData (413) */3216 export interface EthereumReceiptEip658ReceiptData extends Struct {3217 readonly statusCode: u8;3218 readonly usedGas: U256;3219 readonly logsBloom: EthbloomBloom;3220 readonly logs: Vec<EthereumLog>;3221 }32223223 /** @name EthereumBlock (414) */3224 export interface EthereumBlock extends Struct {3225 readonly header: EthereumHeader;3226 readonly transactions: Vec<EthereumTransactionTransactionV2>;3227 readonly ommers: Vec<EthereumHeader>;3228 }32293230 /** @name EthereumHeader (415) */3231 export interface EthereumHeader extends Struct {3232 readonly parentHash: H256;3233 readonly ommersHash: H256;3234 readonly beneficiary: H160;3235 readonly stateRoot: H256;3236 readonly transactionsRoot: H256;3237 readonly receiptsRoot: H256;3238 readonly logsBloom: EthbloomBloom;3239 readonly difficulty: U256;3240 readonly number: U256;3241 readonly gasLimit: U256;3242 readonly gasUsed: U256;3243 readonly timestamp: u64;3244 readonly extraData: Bytes;3245 readonly mixHash: H256;3246 readonly nonce: EthereumTypesHashH64;3247 }32483249 /** @name EthereumTypesHashH64 (416) */3250 export interface EthereumTypesHashH64 extends U8aFixed {}32513252 /** @name PalletEthereumError (421) */3253 export interface PalletEthereumError extends Enum {3254 readonly isInvalidSignature: boolean;3255 readonly isPreLogExists: boolean;3256 readonly type: 'InvalidSignature' | 'PreLogExists';3257 }32583259 /** @name PalletEvmCoderSubstrateError (422) */3260 export interface PalletEvmCoderSubstrateError extends Enum {3261 readonly isOutOfGas: boolean;3262 readonly isOutOfFund: boolean;3263 readonly type: 'OutOfGas' | 'OutOfFund';3264 }32653266 /** @name PalletEvmContractHelpersSponsoringModeT (423) */3267 export interface PalletEvmContractHelpersSponsoringModeT extends Enum {3268 readonly isDisabled: boolean;3269 readonly isAllowlisted: boolean;3270 readonly isGenerous: boolean;3271 readonly type: 'Disabled' | 'Allowlisted' | 'Generous';3272 }32733274 /** @name PalletEvmContractHelpersError (425) */3275 export interface PalletEvmContractHelpersError extends Enum {3276 readonly isNoPermission: boolean;3277 readonly type: 'NoPermission';3278 }32793280 /** @name PalletEvmMigrationError (426) */3281 export interface PalletEvmMigrationError extends Enum {3282 readonly isAccountNotEmpty: boolean;3283 readonly isAccountIsNotMigrating: boolean;3284 readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating';3285 }32863287 /** @name SpRuntimeMultiSignature (428) */3288 export interface SpRuntimeMultiSignature extends Enum {3289 readonly isEd25519: boolean;3290 readonly asEd25519: SpCoreEd25519Signature;3291 readonly isSr25519: boolean;3292 readonly asSr25519: SpCoreSr25519Signature;3293 readonly isEcdsa: boolean;3294 readonly asEcdsa: SpCoreEcdsaSignature;3295 readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa';3296 }32973298 /** @name SpCoreEd25519Signature (429) */3299 export interface SpCoreEd25519Signature extends U8aFixed {}33003301 /** @name SpCoreSr25519Signature (431) */3302 export interface SpCoreSr25519Signature extends U8aFixed {}33033304 /** @name SpCoreEcdsaSignature (432) */3305 export interface SpCoreEcdsaSignature extends U8aFixed {}33063307 /** @name FrameSystemExtensionsCheckSpecVersion (435) */3308 export type FrameSystemExtensionsCheckSpecVersion = Null;33093310 /** @name FrameSystemExtensionsCheckGenesis (436) */3311 export type FrameSystemExtensionsCheckGenesis = Null;33123313 /** @name FrameSystemExtensionsCheckNonce (439) */3314 export interface FrameSystemExtensionsCheckNonce extends Compact<u32> {}33153316 /** @name FrameSystemExtensionsCheckWeight (440) */3317 export type FrameSystemExtensionsCheckWeight = Null;33183319 /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (441) */3320 export interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact<u128> {}33213322 /** @name OpalRuntimeRuntime (442) */3323 export type OpalRuntimeRuntime = Null;33243325 /** @name PalletEthereumFakeTransactionFinalizer (443) */3326 export type PalletEthereumFakeTransactionFinalizer = Null;33273328} // declare moduletests/src/nesting/properties.test.tsdiffbeforeafterboth--- a/tests/src/nesting/properties.test.ts
+++ b/tests/src/nesting/properties.test.ts
@@ -2,6 +2,7 @@
import usingApi, {executeTransaction} from '../substrate/substrate-api';
import {
addCollectionAdminExpectSuccess,
+ CollectionMode,
createCollectionExpectSuccess,
setCollectionPermissionsExpectSuccess,
createItemExpectSuccess,
@@ -23,9 +24,9 @@
});
});
- it('Makes sure collectionById supplies required fields', async () => {
+ async function testMakeSureSuppliesRequired(mode: CollectionMode) {
await usingApi(async api => {
- const collectionId = await createCollectionExpectSuccess();
+ const collectionId = await createCollectionExpectSuccess({mode: mode});
const collectionOption = await api.rpc.unique.collectionById(collectionId);
expect(collectionOption.isSome).to.be.true;
@@ -57,7 +58,15 @@
expect(collection.tokenPropertyPermissions.toHuman()).to.be.deep.equal(propertyPermissions);
expect(collection.properties.toHuman()).to.be.deep.equal(collectionProperties);
});
+ }
+
+ it('Makes sure collectionById supplies required fields for NFT', async () => {
+ await testMakeSureSuppliesRequired({type: 'NFT'});
});
+
+ it('Makes sure collectionById supplies required fields for ReFungible', async () => {
+ await testMakeSureSuppliesRequired({type: 'ReFungible'});
+ });
});
// ---------- COLLECTION PROPERTIES
@@ -79,9 +88,10 @@
});
});
- it('Sets properties for a collection', async () => {
+
+ async function testSetsPropertiesForCollection(mode: string) {
await usingApi(async api => {
- const events = await executeTransaction(api, bob, api.tx.unique.createCollectionEx({mode: 'NFT'}));
+ const events = await executeTransaction(api, bob, api.tx.unique.createCollectionEx({mode: mode}));
const {collectionId} = getCreateCollectionResult(events);
// As owner
@@ -106,48 +116,54 @@
{key: 'black_hole', value: ''},
]);
});
+ }
+ it('Sets properties for a NFT collection', async () => {
+ await testSetsPropertiesForCollection('NFT');
});
+ it('Sets properties for a ReFungible collection', async () => {
+ await testSetsPropertiesForCollection('ReFungible');
+ });
- it('Check valid names for collection properties keys', async () => {
+ async function testCheckValidNames(mode: string) {
await usingApi(async api => {
- const events = await executeTransaction(api, bob, api.tx.unique.createCollectionEx({mode: 'NFT'}));
+ const events = await executeTransaction(api, bob, api.tx.unique.createCollectionEx({mode: mode}));
const {collectionId} = getCreateCollectionResult(events);
-
+
// alpha symbols
await expect(executeTransaction(
api,
bob,
api.tx.unique.setCollectionProperties(collectionId, [{key: 'alpha'}]),
)).to.not.be.rejected;
-
+
// numeric symbols
await expect(executeTransaction(
api,
bob,
api.tx.unique.setCollectionProperties(collectionId, [{key: '123'}]),
)).to.not.be.rejected;
-
+
// underscore symbol
await expect(executeTransaction(
api,
bob,
api.tx.unique.setCollectionProperties(collectionId, [{key: 'black_hole'}]),
)).to.not.be.rejected;
-
+
// dash symbol
await expect(executeTransaction(
api,
bob,
api.tx.unique.setCollectionProperties(collectionId, [{key: 'semi-automatic'}]),
)).to.not.be.rejected;
-
+
// underscore symbol
await expect(executeTransaction(
api,
bob,
api.tx.unique.setCollectionProperties(collectionId, [{key: 'build.rs'}]),
)).to.not.be.rejected;
-
+
const propertyKeys = ['alpha', '123', 'black_hole', 'semi-automatic', 'build.rs'];
const properties = (await api.rpc.unique.collectionProperties(collectionId, propertyKeys)).toHuman();
expect(properties).to.be.deep.equal([
@@ -158,54 +174,72 @@
{key: 'build.rs', value: ''},
]);
});
+ }
+ it('Check valid names for NFT collection properties keys', async () => {
+ await testCheckValidNames('NFT');
+ });
+ it('Check valid names for ReFungible collection properties keys', async () => {
+ await testCheckValidNames('ReFungible');
});
- it('Changes properties of a collection', async () => {
+ async function testChangesProperties(mode: CollectionMode) {
await usingApi(async api => {
- const collection = await createCollectionExpectSuccess();
-
+ const collection = await createCollectionExpectSuccess({mode: mode});
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.setCollectionProperties(collection, [{key: 'electron', value: 'come bond'}, {key: 'black_hole'}]),
)).to.not.be.rejected;
-
+
// Mutate the properties
await expect(executeTransaction(
api,
alice,
api.tx.unique.setCollectionProperties(collection, [{key: 'electron', value: 'bonded'}, {key: 'black_hole', value: 'LIGO'}]),
)).to.not.be.rejected;
-
+
const properties = (await api.rpc.unique.collectionProperties(collection, ['electron', 'black_hole'])).toHuman();
expect(properties).to.be.deep.equal([
{key: 'electron', value: 'bonded'},
{key: 'black_hole', value: 'LIGO'},
]);
});
+ }
+ it('Changes properties of a NFT collection', async () => {
+ await testChangesProperties({type: 'NFT'});
+ });
+ it('Changes properties of a ReFungible collection', async () => {
+ await testChangesProperties({type: 'ReFungible'});
});
- it('Deletes properties of a collection', async () => {
+ async function testDeleteProperties(mode: CollectionMode) {
await usingApi(async api => {
- const collection = await createCollectionExpectSuccess();
-
+ const collection = await createCollectionExpectSuccess({mode: mode});
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.setCollectionProperties(collection, [{key: 'electron', value: 'come bond'}, {key: 'black_hole', value: 'LIGO'}]),
)).to.not.be.rejected;
-
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.deleteCollectionProperties(collection, ['electron']),
)).to.not.be.rejected;
-
+
const properties = (await api.rpc.unique.collectionProperties(collection, ['electron', 'black_hole'])).toHuman();
expect(properties).to.be.deep.equal([
{key: 'black_hole', value: 'LIGO'},
]);
- });
+ });
+ }
+ it('Deletes properties of a NFT collection', async () => {
+ await testDeleteProperties({type: 'NFT'});
+ });
+ it('Deletes properties of a ReFungible collection', async () => {
+ await testDeleteProperties({type: 'ReFungible'});
});
});
@@ -217,10 +251,10 @@
});
});
- it('Fails to set properties in a collection if not its onwer/administrator', async () => {
+ async function testFailsSetPropertiesIfNotOwnerOrAdmin(mode: CollectionMode) {
await usingApi(async api => {
- const collection = await createCollectionExpectSuccess();
-
+ const collection = await createCollectionExpectSuccess({mode: mode});
+
await expect(executeTransaction(
api,
bob,
@@ -230,14 +264,20 @@
const properties = (await api.query.common.collectionProperties(collection)).toJSON();
expect(properties.map).to.be.empty;
expect(properties.consumedSpace).to.equal(0);
- });
+ });
+ }
+ it('Fails to set properties in a NFT collection if not its onwer/administrator', async () => {
+ await testFailsSetPropertiesIfNotOwnerOrAdmin({type: 'NFT'});
});
+ it('Fails to set properties in a ReFungible collection if not its onwer/administrator', async () => {
+ await testFailsSetPropertiesIfNotOwnerOrAdmin({type: 'ReFungible'});
+ });
- it('Fails to set properties that exceed the limits', async () => {
+ async function testFailsSetPropertiesThatExeedLimits(mode: CollectionMode) {
await usingApi(async api => {
- const collection = await createCollectionExpectSuccess();
+ const collection = await createCollectionExpectSuccess({mode: mode});
const spaceLimit = (await api.query.common.collectionProperties(collection)).toJSON().spaceLimit as number;
-
+
// Mute the general tx parsing error, too many bytes to process
{
console.error = () => {};
@@ -247,10 +287,10 @@
api.tx.unique.setCollectionProperties(collection, [{key: 'electron', value: 'low high '.repeat(Math.ceil(spaceLimit! / 9))}]),
)).to.be.rejected;
}
-
+
let properties = (await api.rpc.unique.collectionProperties(collection, ['electron'])).toJSON();
expect(properties).to.be.empty;
-
+
await expect(executeTransaction(
api,
alice,
@@ -259,16 +299,22 @@
{key: 'black_hole', value: '0'.repeat(Math.ceil(spaceLimit! / 2))},
]),
)).to.be.rejectedWith(/common\.NoSpaceForProperty/);
-
+
properties = (await api.rpc.unique.collectionProperties(collection, ['electron', 'black hole'])).toJSON();
expect(properties).to.be.empty;
- });
+ });
+ }
+ it('Fails to set properties that exceed the limits (NFT)', async () => {
+ await testFailsSetPropertiesThatExeedLimits({type: 'NFT'});
+ });
+ it('Fails to set properties that exceed the limits (ReFungible)', async () => {
+ await testFailsSetPropertiesThatExeedLimits({type: 'ReFungible'});
});
- it('Fails to set more properties than it is allowed', async () => {
+ async function testFailsSetMorePropertiesThanAllowed(mode: CollectionMode) {
await usingApi(async api => {
- const collection = await createCollectionExpectSuccess();
-
+ const collection = await createCollectionExpectSuccess({mode: mode});
+
const propertiesToBeSet = [];
for (let i = 0; i < 65; i++) {
propertiesToBeSet.push({
@@ -276,29 +322,35 @@
value: Math.random() > 0.5 ? 'high' : 'low',
});
}
-
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.setCollectionProperties(collection, propertiesToBeSet),
)).to.be.rejectedWith(/common\.PropertyLimitReached/);
-
+
const properties = (await api.query.common.collectionProperties(collection)).toJSON();
expect(properties.map).to.be.empty;
expect(properties.consumedSpace).to.equal(0);
- });
+ });
+ }
+ it('Fails to set more properties than it is allowed (NFT)', async () => {
+ await testFailsSetMorePropertiesThanAllowed({type: 'NFT'});
});
-
- it('Fails to set properties with invalid names', async () => {
+ it('Fails to set more properties than it is allowed (ReFungible)', async () => {
+ await testFailsSetMorePropertiesThanAllowed({type: 'ReFungible'});
+ });
+
+ async function testFailsSetPropertiesWithInvalidNames(mode: CollectionMode) {
await usingApi(async api => {
- const collection = await createCollectionExpectSuccess();
-
+ const collection = await createCollectionExpectSuccess({mode: mode});
+
const invalidProperties = [
[{key: 'electron', value: 'negative'}, {key: 'string theory', value: 'understandable'}],
[{key: 'Mr/Sandman', value: 'Bring me a gene'}],
[{key: 'déjà vu', value: 'hmm...'}],
];
-
+
for (let i = 0; i < invalidProperties.length; i++) {
await expect(executeTransaction(
api,
@@ -306,13 +358,13 @@
api.tx.unique.setCollectionProperties(collection, invalidProperties[i]),
), `on rejecting the new badly-named property #${i}`).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/);
}
-
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.setCollectionProperties(collection, [{key: '', value: 'nothing must not exist'}]),
), 'on rejecting an unnamed property').to.be.rejectedWith(/common\.EmptyPropertyKey/);
-
+
await expect(executeTransaction(
api,
alice,
@@ -320,14 +372,14 @@
{key: 'CRISPR-Cas9', value: 'rewriting nature!'},
]),
), 'on setting the correctly-but-still-badly-named property').to.not.be.rejected;
-
+
const keys = invalidProperties.flatMap(propertySet => propertySet.map(property => property.key)).concat('CRISPR-Cas9').concat('');
-
+
const properties = (await api.rpc.unique.collectionProperties(collection, keys)).toHuman();
expect(properties).to.be.deep.equal([
{key: 'CRISPR-Cas9', value: 'rewriting nature!'},
]);
-
+
for (let i = 0; i < invalidProperties.length; i++) {
await expect(executeTransaction(
api,
@@ -336,7 +388,13 @@
), `on trying to delete the non-existent badly-named property #${i}`).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/);
}
});
+ }
+ it('Fails to set properties with invalid names (NFT)', async () => {
+ await testFailsSetPropertiesWithInvalidNames({type: 'NFT'});
});
+ it('Fails to set properties with invalid names (ReFungible)', async () => {
+ await testFailsSetPropertiesWithInvalidNames({type: 'ReFungible'});
+ });
});
// ---------- ACCESS RIGHTS
@@ -357,54 +415,66 @@
});
});
- it('Sets access rights to properties of a collection', async () => {
+ async function testSetsAccessRightsToProperties(mode: CollectionMode) {
await usingApi(async api => {
- const collection = await createCollectionExpectSuccess();
-
+ const collection = await createCollectionExpectSuccess({mode: mode});
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: true}}]),
)).to.not.be.rejected;
-
+
await addCollectionAdminExpectSuccess(alice, collection, bob.address);
-
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'mindgame', permission: {collectionAdmin: true, tokenOwner: false}}]),
)).to.not.be.rejected;
-
+
const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery', 'mindgame'])).toHuman();
expect(propertyRights).to.be.deep.equal([
{key: 'skullduggery', permission: {'mutable': true, 'collectionAdmin': false, 'tokenOwner': false}},
{key: 'mindgame', permission: {'mutable': false, 'collectionAdmin': true, 'tokenOwner': false}},
]);
- });
+ });
+ }
+ it('Sets access rights to properties of a collection (NFT)', async () => {
+ await testSetsAccessRightsToProperties({type: 'NFT'});
});
+ it('Sets access rights to properties of a collection (ReFungible)', async () => {
+ await testSetsAccessRightsToProperties({type: 'ReFungible'});
+ });
- it('Changes access rights to properties of a collection', async () => {
+ async function testChangesAccessRightsToProperty(mode: CollectionMode) {
await usingApi(async api => {
- const collection = await createCollectionExpectSuccess();
-
+ const collection = await createCollectionExpectSuccess({mode: mode});
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: true, collectionAdmin: true}}]),
)).to.not.be.rejected;
-
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}]),
)).to.not.be.rejected;
-
+
const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery'])).toHuman();
expect(propertyRights).to.be.deep.equal([
{key: 'skullduggery', permission: {'mutable': false, 'collectionAdmin': false, 'tokenOwner': true}},
]);
});
+ }
+ it('Changes access rights to properties of a NFT collection', async () => {
+ await testChangesAccessRightsToProperty({type: 'NFT'});
});
+ it('Changes access rights to properties of a ReFungible collection', async () => {
+ await testChangesAccessRightsToProperty({type: 'ReFungible'});
+ });
});
describe('Negative Integration Test: Access Rights to Token Properties', () => {
@@ -415,25 +485,31 @@
});
});
- it('Prevents from setting access rights to properties of a collection if not an onwer/admin', async () => {
+ async function testPreventsFromSettingAccessRightsNotAdminOrOwner(mode: CollectionMode) {
await usingApi(async api => {
- const collection = await createCollectionExpectSuccess();
-
+ const collection = await createCollectionExpectSuccess({mode: mode});
+
await expect(executeTransaction(
api,
bob,
api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: true, tokenOwner: true}}]),
)).to.be.rejectedWith(/common\.NoPermission/);
-
+
const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery'])).toJSON();
expect(propertyRights).to.be.empty;
});
+ }
+ it('Prevents from setting access rights to properties of a NFT collection if not an onwer/admin', async () => {
+ await testPreventsFromSettingAccessRightsNotAdminOrOwner({type: 'NFT'});
});
+ it('Prevents from setting access rights to properties of a ReFungible collection if not an onwer/admin', async () => {
+ await testPreventsFromSettingAccessRightsNotAdminOrOwner({type: 'ReFungible'});
+ });
- it('Prevents from adding too many possible properties', async () => {
+ async function testPreventFromAddingTooManyPossibleProperties(mode: CollectionMode) {
await usingApi(async api => {
- const collection = await createCollectionExpectSuccess();
-
+ const collection = await createCollectionExpectSuccess({mode: mode});
+
const constitution = [];
for (let i = 0; i < 65; i++) {
constitution.push({
@@ -441,51 +517,63 @@
permission: Math.random() > 0.5 ? {mutable: true, collectionAdmin: true, tokenOwner: true} : {},
});
}
-
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.setTokenPropertyPermissions(collection, constitution),
)).to.be.rejectedWith(/common\.PropertyLimitReached/);
-
+
const propertyRights = (await api.query.common.collectionPropertyPermissions(collection)).toJSON();
expect(propertyRights).to.be.empty;
- });
+ });
+ }
+ it('Prevents from adding too many possible properties (NFT)', async () => {
+ await testPreventFromAddingTooManyPossibleProperties({type: 'NFT'});
});
+ it('Prevents from adding too many possible properties (ReFungible)', async () => {
+ await testPreventFromAddingTooManyPossibleProperties({type: 'ReFungible'});
+ });
- it('Prevents access rights to be modified if constant', async () => {
+ async function testPreventAccessRightsModifiedIfConstant(mode: CollectionMode) {
await usingApi(async api => {
- const collection = await createCollectionExpectSuccess();
-
+ const collection = await createCollectionExpectSuccess({mode: mode});
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}]),
)).to.not.be.rejected;
-
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {}}]),
)).to.be.rejectedWith(/common\.NoPermission/);
-
+
const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery'])).toHuman();
expect(propertyRights).to.deep.equal([
{key: 'skullduggery', permission: {'mutable': false, 'collectionAdmin': false, 'tokenOwner': true}},
]);
- });
+ });
+ }
+ it('Prevents access rights to be modified if constant (NFT)', async () => {
+ await testPreventAccessRightsModifiedIfConstant({type: 'NFT'});
+ });
+ it('Prevents access rights to be modified if constant (ReFungible)', async () => {
+ await testPreventAccessRightsModifiedIfConstant({type: 'ReFungible'});
});
- it('Prevents adding properties with invalid names', async () => {
+ async function testPreventsAddingPropertiesWithInvalidNames(mode: CollectionMode) {
await usingApi(async api => {
- const collection = await createCollectionExpectSuccess();
-
+ const collection = await createCollectionExpectSuccess({mode: mode});
+
const invalidProperties = [
[{key: 'skullduggery', permission: {tokenOwner: true}}, {key: 'im possible', permission: {collectionAdmin: true}}],
[{key: 'G#4', permission: {tokenOwner: true}}],
[{key: 'HÆMILTON', permission: {mutable: false, collectionAdmin: true, tokenOwner: true}}],
];
-
+
for (let i = 0; i < invalidProperties.length; i++) {
await expect(executeTransaction(
api,
@@ -493,13 +581,13 @@
api.tx.unique.setTokenPropertyPermissions(collection, invalidProperties[i]),
), `on setting the new badly-named property #${i}`).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/);
}
-
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.setTokenPropertyPermissions(collection, [{key: '', permission: {}}]),
), 'on rejecting an unnamed property').to.be.rejectedWith(/common\.EmptyPropertyKey/);
-
+
const correctKey = '--0x03116e387820CA05'; // PolkadotJS would parse this as an already encoded hex-string
await expect(executeTransaction(
api,
@@ -508,30 +596,33 @@
{key: correctKey, permission: {collectionAdmin: true}},
]),
), 'on setting the correctly-but-still-badly-named property').to.not.be.rejected;
-
+
const keys = invalidProperties.flatMap(propertySet => propertySet.map(property => property.key)).concat(correctKey).concat('');
-
+
const propertyRights = (await api.rpc.unique.propertyPermissions(collection, keys)).toHuman();
expect(propertyRights).to.be.deep.equal([
{key: correctKey, permission: {mutable: false, collectionAdmin: true, tokenOwner: false}},
]);
});
+ }
+ it('Prevents adding properties with invalid names (NFT)', async () => {
+ await testPreventsAddingPropertiesWithInvalidNames({type: 'NFT'});
+ });
+ it('Prevents adding properties with invalid names (ReFungible)', async () => {
+ await testPreventsAddingPropertiesWithInvalidNames({type: 'ReFungible'});
});
});
// ---------- TOKEN PROPERTIES
describe('Integration Test: Token Properties', () => {
- let collection: number;
- let token: number;
- let nestedToken: number;
let permissions: {permission: any, signers: IKeyringPair[]}[];
before(async () => {
await usingApi(async (api, privateKeyWrapper) => {
- alice = privateKeyWrapper('//Alice');
- bob = privateKeyWrapper('//Bob');
- charlie = privateKeyWrapper('//Charlie');
+ alice = privateKeyWrapper('//Alice'); // collection owner
+ bob = privateKeyWrapper('//Bob'); // collection admin
+ charlie = privateKeyWrapper('//Charlie'); // token owner
permissions = [
{permission: {mutable: true, collectionAdmin: true}, signers: [alice, bob]},
@@ -543,36 +634,34 @@
];
});
});
-
- beforeEach(async () => {
- await usingApi(async () => {
- collection = await createCollectionExpectSuccess();
- await setCollectionPermissionsExpectSuccess(alice, collection, {nesting: {tokenOwner: true}});
-
- token = await createItemExpectSuccess(alice, collection, 'NFT');
- nestedToken = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: tokenIdToAddress(collection, token)});
-
- await addCollectionAdminExpectSuccess(alice, collection, bob.address);
- await transferExpectSuccess(collection, token, alice, charlie);
- });
- });
- it('Reads yet empty properties of a token', async () => {
+ async function testReadsYetEmptyProperties(mode: CollectionMode) {
await usingApi(async api => {
- const collection = await createCollectionExpectSuccess();
- const token = await createItemExpectSuccess(alice, collection, 'NFT');
+ const collection = await createCollectionExpectSuccess({mode: mode});
+ const token = await createItemExpectSuccess(alice, collection, mode.type);
const properties = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON();
expect(properties.map).to.be.empty;
expect(properties.consumedSpace).to.be.equal(0);
-
+
const tokenData = (await api.rpc.unique.tokenData(collection, token, ['anything'])).toJSON().properties;
expect(tokenData).to.be.empty;
});
+ }
+ it('Reads yet empty properties of a token (NFT)', async () => {
+ await testReadsYetEmptyProperties({type: 'NFT'});
});
+ it('Reads yet empty properties of a token (ReFungible)', async () => {
+ await testReadsYetEmptyProperties({type: 'ReFungible'});
+ });
- it('Assigns properties to a token according to permissions', async () => {
+ async function testAssignPropertiesAccordingToPermissions(mode: CollectionMode, pieces: number) {
await usingApi(async api => {
+ const collection = await createCollectionExpectSuccess({mode: mode});
+ const token = await createItemExpectSuccess(alice, collection, mode.type);
+ await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+ await transferExpectSuccess(collection, token, alice, charlie, pieces, mode.type);
+
const propertyKeys: string[] = [];
let i = 0;
for (const permission of permissions) {
@@ -603,10 +692,21 @@
expect(tokensData[i].value).to.be.equal('Serotonin increase');
}
});
+ }
+ it('Assigns properties to a token according to permissions (NFT)', async () => {
+ await testAssignPropertiesAccordingToPermissions({type: 'NFT'}, 1);
+ });
+ it('Assigns properties to a token according to permissions (ReFungible)', async () => {
+ await testAssignPropertiesAccordingToPermissions({type: 'ReFungible'}, 100);
});
- it('Changes properties of a token according to permissions', async () => {
+ async function testChangesPropertiesAccordingPermission(mode: CollectionMode, pieces: number) {
await usingApi(async api => {
+ const collection = await createCollectionExpectSuccess({mode: mode});
+ const token = await createItemExpectSuccess(alice, collection, mode.type);
+ await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+ await transferExpectSuccess(collection, token, alice, charlie, pieces, mode.type);
+
const propertyKeys: string[] = [];
let i = 0;
for (const permission of permissions) {
@@ -615,29 +715,29 @@
for (const signer of permission.signers) {
const key = i + '_' + signer.address;
propertyKeys.push(key);
-
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.setTokenPropertyPermissions(collection, [{key: key, permission: permission.permission}]),
), `on setting permission ${i} by ${signer.address}`).to.not.be.rejected;
-
+
await expect(executeTransaction(
api,
signer,
api.tx.unique.setTokenProperties(collection, token, [{key: key, value: 'Serotonin increase'}]),
), `on adding property ${i} by ${signer.address}`).to.not.be.rejected;
-
+
await expect(executeTransaction(
api,
signer,
api.tx.unique.setTokenProperties(collection, token, [{key: key, value: 'Serotonin stable'}]),
), `on changing property ${i} by ${signer.address}`).to.not.be.rejected;
}
-
+
i++;
}
-
+
const properties = (await api.rpc.unique.tokenProperties(collection, token, propertyKeys)).toHuman() as any[];
const tokensData = (await api.rpc.unique.tokenData(collection, token, propertyKeys)).toHuman().properties as any[];
for (let i = 0; i < properties.length; i++) {
@@ -645,32 +745,43 @@
expect(tokensData[i].value).to.be.equal('Serotonin stable');
}
});
+ }
+ it('Changes properties of a token according to permissions (NFT)', async () => {
+ await testChangesPropertiesAccordingPermission({type: 'NFT'}, 1);
});
+ it('Changes properties of a token according to permissions (ReFungible)', async () => {
+ await testChangesPropertiesAccordingPermission({type: 'ReFungible'}, 100);
+ });
- it('Deletes properties of a token according to permissions', async () => {
+ async function testDeletePropertiesAccordingPermission(mode: CollectionMode, pieces: number) {
await usingApi(async api => {
+ const collection = await createCollectionExpectSuccess({mode: mode});
+ const token = await createItemExpectSuccess(alice, collection, mode.type);
+ await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+ await transferExpectSuccess(collection, token, alice, charlie, pieces, mode.type);
+
const propertyKeys: string[] = [];
let i = 0;
-
+
for (const permission of permissions) {
if (!permission.permission.mutable) continue;
for (const signer of permission.signers) {
const key = i + '_' + signer.address;
propertyKeys.push(key);
-
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.setTokenPropertyPermissions(collection, [{key: key, permission: permission.permission}]),
), `on setting permission ${i} by ${signer.address}`).to.not.be.rejected;
-
+
await expect(executeTransaction(
api,
signer,
api.tx.unique.setTokenProperties(collection, token, [{key: key, value: 'Serotonin increase'}]),
), `on adding property ${i} by ${signer.address}`).to.not.be.rejected;
-
+
await expect(executeTransaction(
api,
signer,
@@ -680,17 +791,30 @@
i++;
}
-
+
const properties = (await api.rpc.unique.tokenProperties(collection, token, propertyKeys)).toJSON() as any[];
expect(properties).to.be.empty;
const tokensData = (await api.rpc.unique.tokenData(collection, token, propertyKeys)).toJSON().properties as any[];
expect(tokensData).to.be.empty;
expect((await api.query.nonfungible.tokenProperties(collection, token)).toJSON().consumedSpace).to.be.equal(0);
});
+ }
+ it('Deletes properties of a token according to permissions (NFT)', async () => {
+ await testDeletePropertiesAccordingPermission({type: 'NFT'}, 1);
});
+ it('Deletes properties of a token according to permissions (ReFungible)', async () => {
+ await testDeletePropertiesAccordingPermission({type: 'ReFungible'}, 100);
+ });
it('Assigns properties to a nested token according to permissions', async () => {
await usingApi(async api => {
+ const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});
+ await setCollectionPermissionsExpectSuccess(alice, collection, {nesting: {tokenOwner: true}});
+ const token = await createItemExpectSuccess(alice, collection, 'NFT');
+ const nestedToken = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: tokenIdToAddress(collection, token)});
+ await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+ await transferExpectSuccess(collection, token, alice, charlie);
+
const propertyKeys: string[] = [];
let i = 0;
for (const permission of permissions) {
@@ -725,6 +849,13 @@
it('Changes properties of a nested token according to permissions', async () => {
await usingApi(async api => {
+ const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});
+ await setCollectionPermissionsExpectSuccess(alice, collection, {nesting: {tokenOwner: true}});
+ const token = await createItemExpectSuccess(alice, collection, 'NFT');
+ const nestedToken = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: tokenIdToAddress(collection, token)});
+ await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+ await transferExpectSuccess(collection, token, alice, charlie);
+
const propertyKeys: string[] = [];
let i = 0;
for (const permission of permissions) {
@@ -767,6 +898,13 @@
it('Deletes properties of a nested token according to permissions', async () => {
await usingApi(async api => {
+ const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}});
+ await setCollectionPermissionsExpectSuccess(alice, collection, {nesting: {tokenOwner: true}});
+ const token = await createItemExpectSuccess(alice, collection, 'NFT');
+ const nestedToken = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: tokenIdToAddress(collection, token)});
+ await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+ await transferExpectSuccess(collection, token, alice, charlie);
+
const propertyKeys: string[] = [];
let i = 0;
@@ -832,11 +970,11 @@
});
});
- beforeEach(async () => {
- collection = await createCollectionExpectSuccess();
- token = await createItemExpectSuccess(alice, collection, 'NFT');
+ async function prepare(mode: CollectionMode, pieces: number) {
+ collection = await createCollectionExpectSuccess({mode: mode});
+ token = await createItemExpectSuccess(alice, collection, mode.type);
await addCollectionAdminExpectSuccess(alice, collection, bob.address);
- await transferExpectSuccess(collection, token, alice, charlie);
+ await transferExpectSuccess(collection, token, alice, charlie, pieces, mode.type);
await usingApi(async api => {
let i = 0;
@@ -848,71 +986,89 @@
alice,
api.tx.unique.setTokenPropertyPermissions(collection, [{key: `${i}`, permission: passage.permission}]),
), `on setting permission ${i} by ${signer.address}`).to.not.be.rejected;
-
+
await expect(executeTransaction(
api,
signer,
api.tx.unique.setTokenProperties(collection, token, [{key: `${i}`, value: 'Serotonin increase'}]),
), `on adding property ${i} by ${signer.address}`).to.not.be.rejected;
-
+
i++;
}
-
+
originalSpace = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON().consumedSpace as number;
- });
- });
+ });
+ }
- it('Forbids changing/deleting properties of a token if the user is outside of permissions', async () => {
+ async function testForbidsChangingDeletingPropertiesUserOutsideOfPermissions(mode: CollectionMode, pieces: number) {
+ await prepare(mode, pieces);
+
await usingApi(async api => {
let i = -1;
for (const forbiddance of constitution) {
i++;
if (!forbiddance.permission.mutable) continue;
-
+
await expect(executeTransaction(
api,
forbiddance.sinner,
api.tx.unique.setTokenProperties(collection, token, [{key: `${i}`, value: 'Serotonin down'}]),
), `on failing to change property ${i} by ${forbiddance.sinner.address}`).to.be.rejectedWith(/common\.NoPermission/);
-
+
await expect(executeTransaction(
api,
forbiddance.sinner,
api.tx.unique.deleteTokenProperties(collection, token, [`${i}`]),
), `on failing to delete property ${i} by ${forbiddance.sinner.address}`).to.be.rejectedWith(/common\.NoPermission/);
}
-
+
const properties = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON();
expect(properties.consumedSpace).to.be.equal(originalSpace);
});
+ }
+ it('Forbids changing/deleting properties of a token if the user is outside of permissions (NFT)', async () => {
+ await testForbidsChangingDeletingPropertiesUserOutsideOfPermissions({type: 'NFT'}, 1);
});
+ it('Forbids changing/deleting properties of a token if the user is outside of permissions (ReFungible)', async () => {
+ await testForbidsChangingDeletingPropertiesUserOutsideOfPermissions({type: 'ReFungible'}, 100);
+ });
- it('Forbids changing/deleting properties of a token if the property is permanent (immutable)', async () => {
+ async function testForbidsChangingDeletingPropertiesIfPropertyImmutable(mode: CollectionMode, pieces: number) {
+ await prepare(mode, pieces);
+
await usingApi(async api => {
let i = -1;
for (const permission of constitution) {
i++;
if (permission.permission.mutable) continue;
-
+
await expect(executeTransaction(
api,
permission.signers[0],
api.tx.unique.setTokenProperties(collection, token, [{key: `${i}`, value: 'Serotonin down'}]),
), `on failing to change property ${i} by ${permission.signers[0].address}`).to.be.rejectedWith(/common\.NoPermission/);
-
+
await expect(executeTransaction(
api,
permission.signers[0],
api.tx.unique.deleteTokenProperties(collection, token, [i.toString()]),
), `on failing to delete property ${i} by ${permission.signers[0].address}`).to.be.rejectedWith(/common\.NoPermission/);
}
-
+
const properties = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON();
expect(properties.consumedSpace).to.be.equal(originalSpace);
- });
+ });
+ }
+ it('Forbids changing/deleting properties of a token if the property is permanent (immutable) (NFT)', async () => {
+ await testForbidsChangingDeletingPropertiesIfPropertyImmutable({type: 'NFT'}, 1);
});
+ it('Forbids changing/deleting properties of a token if the property is permanent (immutable) (ReFungible)', async () => {
+ await testForbidsChangingDeletingPropertiesIfPropertyImmutable({type: 'ReFungible'}, 100);
+ });
+
+ async function testForbidsAddingPropertiesIfPropertyNotDeclared(mode: CollectionMode, pieces: number) {
+ await prepare(mode, pieces);
- it('Forbids adding properties to a token if the property is not declared / forbidden with the \'None\' permission', async () => {
await usingApi(async api => {
await expect(executeTransaction(
api,
@@ -925,20 +1081,28 @@
alice,
api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'now-existent', permission: {}}]),
), 'on setting a new non-permitted property').to.not.be.rejected;
-
+
await expect(executeTransaction(
api,
alice,
api.tx.unique.setTokenProperties(collection, token, [{key: 'now-existent', value: 'I exist!'}]),
), 'on failing to add a property forbidden by the \'None\' permission').to.be.rejectedWith(/common\.NoPermission/);
-
+
expect((await api.rpc.unique.tokenProperties(collection, token, ['non-existent', 'now-existent'])).toJSON()).to.be.empty;
const properties = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON();
expect(properties.consumedSpace).to.be.equal(originalSpace);
});
+ }
+ it('Forbids adding properties to a token if the property is not declared / forbidden with the \'None\' permission (NFT)', async () => {
+ await testForbidsAddingPropertiesIfPropertyNotDeclared({type: 'NFT'}, 1);
+ });
+ it('Forbids adding properties to a token if the property is not declared / forbidden with the \'None\' permission (ReFungible)', async () => {
+ await testForbidsAddingPropertiesIfPropertyNotDeclared({type: 'ReFungible'}, 100);
});
- it('Forbids adding too many properties to a token', async () => {
+ async function testForbidsAddingTooManyProperties(mode: CollectionMode, pieces: number) {
+ await prepare(mode, pieces);
+
await usingApi(async api => {
await expect(executeTransaction(
api,
@@ -948,7 +1112,7 @@
{key: 'young_years', permission: {collectionAdmin: true, tokenOwner: true}},
]),
), 'on setting a new non-permitted property').to.not.be.rejected;
-
+
// Mute the general tx parsing error
{
console.error = () => {};
@@ -958,7 +1122,7 @@
api.tx.unique.setCollectionProperties(collection, [{key: 'a_holy_book', value: 'word '.repeat(6554)}]),
)).to.be.rejected;
}
-
+
await expect(executeTransaction(
api,
alice,
@@ -967,10 +1131,107 @@
{key: 'young_years', value: 'neverending'.repeat(1490)},
]),
)).to.be.rejectedWith(/common\.NoSpaceForProperty/);
-
+
expect((await api.rpc.unique.tokenProperties(collection, token, ['a_holy_book', 'young_years'])).toJSON()).to.be.empty;
const propertiesMap = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON();
expect(propertiesMap.consumedSpace).to.be.equal(originalSpace);
});
+ }
+ it('Forbids adding too many properties to a token (NFT)', async () => {
+ await testForbidsAddingTooManyProperties({type: 'NFT'}, 1);
+ });
+ it('Forbids adding too many properties to a token (ReFungible)', async () => {
+ await testForbidsAddingTooManyProperties({type: 'ReFungible'}, 100);
+ });
+});
+
+describe('ReFungible token properties permissions tests', () => {
+ let collection: number;
+ let token: number;
+
+ before(async () => {
+ await usingApi(async (api, privateKeyWrapper) => {
+ alice = privateKeyWrapper('//Alice');
+ bob = privateKeyWrapper('//Bob');
+ charlie = privateKeyWrapper('//Charlie');
+ });
+ });
+
+ beforeEach(async () => {
+ await usingApi(async api => {
+ collection = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});
+ token = await createItemExpectSuccess(alice, collection, 'ReFungible');
+ await addCollectionAdminExpectSuccess(alice, collection, bob.address);
+
+ await expect(executeTransaction(
+ api,
+ alice,
+ api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'key', permission: {mutable:true, tokenOwner: true}}]),
+ )).to.not.be.rejected;
+ });
+ });
+
+ it('Forbids add token property with tokenOwher==true but signer have\'t all pieces', async () => {
+ await usingApi(async api => {
+ await transferExpectSuccess(collection, token, alice, charlie, 33, 'ReFungible');
+
+ await expect(executeTransaction(
+ api,
+ alice,
+ api.tx.unique.setTokenProperties(collection, token, [
+ {key: 'key', value: 'word'},
+ ]),
+ )).to.be.rejectedWith(/common\.NoPermission/);
+ });
+ });
+
+ it('Forbids mutate token property with tokenOwher==true but signer have\'t all pieces', async () => {
+ await usingApi(async api => {
+ await expect(executeTransaction(
+ api,
+ alice,
+ api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'key', permission: {mutable:true, tokenOwner: true}}]),
+ )).to.not.be.rejected;
+
+ await expect(executeTransaction(
+ api,
+ alice,
+ api.tx.unique.setTokenProperties(collection, token, [
+ {key: 'key', value: 'word'},
+ ]),
+ )).to.be.not.rejected;
+
+ await transferExpectSuccess(collection, token, alice, charlie, 33, 'ReFungible');
+
+ await expect(executeTransaction(
+ api,
+ alice,
+ api.tx.unique.setTokenProperties(collection, token, [
+ {key: 'key', value: 'bad word'},
+ ]),
+ )).to.be.rejectedWith(/common\.NoPermission/);
+ });
+ });
+
+ it('Forbids delete token property with tokenOwher==true but signer have\'t all pieces', async () => {
+ await usingApi(async api => {
+ await expect(executeTransaction(
+ api,
+ alice,
+ api.tx.unique.setTokenProperties(collection, token, [
+ {key: 'key', value: 'word'},
+ ]),
+ )).to.be.not.rejected;
+
+ await transferExpectSuccess(collection, token, alice, charlie, 33, 'ReFungible');
+
+ await expect(executeTransaction(
+ api,
+ alice,
+ api.tx.unique.deleteTokenProperties(collection, token, [
+ 'key',
+ ]),
+ )).to.be.rejectedWith(/common\.NoPermission/);
+ });
});
});
tests/src/refungible.test.tsdiffbeforeafterboth--- a/tests/src/refungible.test.ts
+++ b/tests/src/refungible.test.ts
@@ -14,7 +14,7 @@
// You should have received a copy of the GNU General Public License
// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
-import {default as usingApi} from './substrate/substrate-api';
+import {default as usingApi, executeTransaction} from './substrate/substrate-api';
import {IKeyringPair} from '@polkadot/types/types';
import {
createCollectionExpectSuccess,
@@ -30,6 +30,8 @@
transfer,
burnItem,
repartitionRFT,
+ createCollectionWithPropsExpectSuccess,
+ getDetailedCollectionInfo,
} from './util/helpers';
import chai from 'chai';
@@ -187,3 +189,26 @@
});
});
});
+
+describe('Test Refungible properties:', () => {
+ before(async () => {
+ await usingApi(async (api, privateKeyWrapper) => {
+ alice = privateKeyWrapper('//Alice');
+ bob = privateKeyWrapper('//Bob');
+ });
+ });
+
+ it('Сreate new collection with properties', async () => {
+ await usingApi(async api => {
+ const properties = [{key: 'key1', value: 'val1'}];
+ const propertyPermissions = [{key: 'key1', permission: {tokenOwner: true, mutable: false, collectionAdmin: true}}];
+ const collectionId = await createCollectionWithPropsExpectSuccess({name: 'A', description: 'B', tokenPrefix: 'C', mode: {type: 'ReFungible'},
+ properties: properties,
+ propPerm: propertyPermissions,
+ });
+ const collection = (await getDetailedCollectionInfo(api, collectionId))!;
+ expect(collection.properties.toHuman()).to.be.deep.equal(properties);
+ expect(collection.tokenPropertyPermissions.toHuman()).to.be.deep.equal(propertyPermissions);
+ });
+ });
+});
tests/src/util/helpers.tsdiffbeforeafterboth--- a/tests/src/util/helpers.ts
+++ b/tests/src/util/helpers.ts
@@ -284,7 +284,7 @@
type: 'ReFungible';
}
-type CollectionMode = Nft | Fungible | ReFungible;
+export type CollectionMode = Nft | Fungible | ReFungible;
export type Property = {
key: any,
@@ -1414,7 +1414,7 @@
tx = api.tx.unique.createItem(collectionId, to, createData as any);
}
- const events = await submitTransactionAsync(sender, tx);
+ const events = await executeTransaction(api, sender, tx);
const result = getCreateItemResult(events);
const itemCountAfter = await getLastTokenId(api, collectionId);
tests/src/xcmTransfer.test.tsdiffbeforeafterboth--- a/tests/src/xcmTransfer.test.ts
+++ b/tests/src/xcmTransfer.test.ts
@@ -31,6 +31,7 @@
const UNIQUE_CHAIN = 1000;
const KARURA_CHAIN = 2000;
const KARURA_PORT = '9946';
+const TRANSFER_AMOUNT = 2000000000000000000000000n;
describe('Integration test: Exchanging QTZ with Karura', () => {
let alice: IKeyringPair;
@@ -113,7 +114,7 @@
},
},
fun: {
- Fungible: 5000000000,
+ Fungible: TRANSFER_AMOUNT,
},
},
],
@@ -148,19 +149,17 @@
await usingApi(async (api) => {
const destination = {
- V0: {
- X3: [
- 'Parent',
- {
- Parachain: UNIQUE_CHAIN,
- },
- {
- AccountId32: {
+ V1: {
+ parents: 1,
+ interior: {
+ X2: [
+ {Parachain: UNIQUE_CHAIN},
+ {AccountId32: {
network: 'Any',
id: alice.addressRaw,
- },
- },
- ],
+ }},
+ ],
+ },
},
};
@@ -168,7 +167,7 @@
ForeignAsset: 0,
};
- const amount = 5000000000;
+ const amount = TRANSFER_AMOUNT;
const destWeight = 50000000;
const tx = api.tx.xTokens.transfer(id, amount, destination, destWeight);