difftreelog
Merge branch 'develop' into doc/architectural-changes
in: master
80 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",
@@ -5953,7 +5953,7 @@
[[package]]
name = "pallet-fungible"
-version = "0.1.0"
+version = "0.1.1"
dependencies = [
"ethereum",
"evm-coder",
@@ -6198,7 +6198,7 @@
[[package]]
name = "pallet-nonfungible"
-version = "0.1.0"
+version = "0.1.1"
dependencies = [
"ethereum",
"evm-coder",
@@ -6320,13 +6320,16 @@
[[package]]
name = "pallet-refungible"
-version = "0.1.0"
+version = "0.1.2"
dependencies = [
+ "ethereum",
+ "evm-coder",
"frame-benchmarking",
"frame-support",
"frame-system",
"pallet-common",
"pallet-evm",
+ "pallet-evm-coder-substrate",
"pallet-structure",
"parity-scale-codec 3.1.5",
"scale-info",
@@ -12374,7 +12377,7 @@
[[package]]
name = "uc-rpc"
-version = "0.1.0"
+version = "0.1.1"
dependencies = [
"anyhow",
"jsonrpsee",
@@ -12733,7 +12736,7 @@
[[package]]
name = "up-data-structs"
-version = "0.1.0"
+version = "0.1.1"
dependencies = [
"derivative",
"frame-support",
@@ -12751,7 +12754,7 @@
[[package]]
name = "up-rpc"
-version = "0.1.0"
+version = "0.1.1"
dependencies = [
"pallet-common",
"pallet-evm",
Makefilediffbeforeafterboth--- a/Makefile
+++ b/Makefile
@@ -12,6 +12,10 @@
NONFUNGIBLE_EVM_STUBS=./pallets/nonfungible/src/stubs
NONFUNGIBLE_EVM_ABI=./tests/src/eth/nonFungibleAbi.json
+REFUNGIBLE_EVM_STUBS=./pallets/refungible/src/stubs
+RENFUNGIBLE_EVM_ABI=./tests/src/eth/reFungibleAbi.json
+RENFUNGIBLE_TOKEN_EVM_ABI=./tests/src/eth/reFungibleTokenAbi.json
+
CONTRACT_HELPERS_STUBS=./pallets/evm-contract-helpers/src/stubs/
CONTRACT_HELPERS_ABI=./tests/src/eth/util/contractHelpersAbi.json
@@ -21,7 +25,7 @@
TESTS_API=./tests/src/eth/api/
.PHONY: regenerate_solidity
-regenerate_solidity: UniqueFungible.sol UniqueNFT.sol ContractHelpers.sol CollectionHelpers.sol
+regenerate_solidity: UniqueFungible.sol UniqueNFT.sol UniqueRefungibleToken.sol ContractHelpers.sol CollectionHelpers.sol
UniqueFungible.sol:
PACKAGE=pallet-fungible NAME=erc::gen_iface OUTPUT=$(TESTS_API)/$@ ./.maintain/scripts/generate_sol.sh
@@ -30,6 +34,10 @@
UniqueNFT.sol:
PACKAGE=pallet-nonfungible NAME=erc::gen_iface OUTPUT=$(TESTS_API)/$@ ./.maintain/scripts/generate_sol.sh
PACKAGE=pallet-nonfungible NAME=erc::gen_impl OUTPUT=$(NONFUNGIBLE_EVM_STUBS)/$@ ./.maintain/scripts/generate_sol.sh
+
+UniqueRefungibleToken.sol:
+ PACKAGE=pallet-refungible NAME=erc_token::gen_iface OUTPUT=$(TESTS_API)/$@ ./.maintain/scripts/generate_sol.sh
+ PACKAGE=pallet-refungible NAME=erc_token::gen_impl OUTPUT=$(REFUNGIBLE_EVM_STUBS)/$@ ./.maintain/scripts/generate_sol.sh
ContractHelpers.sol:
PACKAGE=pallet-evm-contract-helpers NAME=eth::contract_helpers_iface OUTPUT=$(TESTS_API)/$@ ./.maintain/scripts/generate_sol.sh
@@ -47,6 +55,10 @@
INPUT=$(NONFUNGIBLE_EVM_STUBS)/$< OUTPUT=$(NONFUNGIBLE_EVM_STUBS)/UniqueNFT.raw ./.maintain/scripts/compile_stub.sh
INPUT=$(NONFUNGIBLE_EVM_STUBS)/$< OUTPUT=$(NONFUNGIBLE_EVM_ABI) ./.maintain/scripts/generate_abi.sh
+UniqueRefungibleToken: UniqueRefungibleToken.sol
+ INPUT=$(REFUNGIBLE_EVM_STUBS)/$< OUTPUT=$(REFUNGIBLE_EVM_STUBS)/UniqueRefungibleToken.raw ./.maintain/scripts/compile_stub.sh
+ INPUT=$(REFUNGIBLE_EVM_STUBS)/$< OUTPUT=$(RENFUNGIBLE_TOKEN_EVM_ABI) ./.maintain/scripts/generate_abi.sh
+
ContractHelpers: ContractHelpers.sol
INPUT=$(CONTRACT_HELPERS_STUBS)/$< OUTPUT=$(CONTRACT_HELPERS_STUBS)/ContractHelpers.raw ./.maintain/scripts/compile_stub.sh
INPUT=$(CONTRACT_HELPERS_STUBS)/$< OUTPUT=$(CONTRACT_HELPERS_ABI) ./.maintain/scripts/generate_abi.sh
@@ -55,7 +67,7 @@
INPUT=$(COLLECTION_HELPER_STUBS)/$< OUTPUT=$(COLLECTION_HELPER_STUBS)/CollectionHelpers.raw ./.maintain/scripts/compile_stub.sh
INPUT=$(COLLECTION_HELPER_STUBS)/$< OUTPUT=$(COLLECTION_HELPER_ABI) ./.maintain/scripts/generate_abi.sh
-evm_stubs: UniqueFungible UniqueNFT ContractHelpers CollectionHelpers
+evm_stubs: UniqueFungible UniqueNFT UniqueRefungibleToken ContractHelpers CollectionHelpers
.PHONY: _bench
_bench:
client/rpc/CHANGELOG.mddiffbeforeafterboth--- /dev/null
+++ b/client/rpc/CHANGELOG.md
@@ -0,0 +1,11 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [0.1.1] - 2022-07-14
+
+### Added
+
+ - Implementation of RPC method `token_owners` returning 10 owners in no particular order.
+ This was an internal request to improve the web interface and support fractionalization event.
+
\ No newline at end of file
client/rpc/Cargo.tomldiffbeforeafterboth--- a/client/rpc/Cargo.toml
+++ b/client/rpc/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "uc-rpc"
-version = "0.1.0"
+version = "0.1.1"
license = "GPLv3"
edition = "2021"
client/rpc/src/lib.rsdiffbeforeafterboth--- a/client/rpc/src/lib.rs
+++ b/client/rpc/src/lib.rs
@@ -77,6 +77,15 @@
at: Option<BlockHash>,
) -> Result<Option<CrossAccountId>>;
+ /// Returns 10 tokens owners in no particular order.
+ #[method(name = "unique_tokenOwners")]
+ fn token_owners(
+ &self,
+ collection: CollectionId,
+ token: TokenId,
+ at: Option<BlockHash>,
+ ) -> Result<Vec<CrossAccountId>>;
+
/// Get the topmost token owner in the hierarchy of a possibly nested token.
#[method(name = "unique_topmostTokenOwner")]
fn topmost_token_owner(
@@ -510,6 +519,7 @@
pass_method!(next_sponsored(collection: CollectionId, account: CrossAccountId, token: TokenId) -> Option<u64>, unique_api);
pass_method!(effective_collection_limits(collection_id: CollectionId) -> Option<CollectionLimits>, unique_api);
pass_method!(total_pieces(collection_id: CollectionId, token_id: TokenId) -> Option<u128>, unique_api);
+ pass_method!(token_owners(collection: CollectionId, token: TokenId) -> Vec<CrossAccountId>, unique_api);
}
#[allow(deprecated)]
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/CHANGELOG.mddiffbeforeafterboth--- /dev/null
+++ b/pallets/common/CHANGELOG.md
@@ -0,0 +1,12 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [0.1.1] - 2022-07-14
+
+### Added
+
+ - Implementation of RPC method `token_owners` returning 10 owners in no particular order.
+ This was an internal request to improve the web interface and support fractionalization event.
+
+
\ No newline at end of file
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/>.
+//! # 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,116 +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 that has been destroyed.
- CollectionDestroyed(CollectionId),
+ CollectionDestroyed(
+ /// Globally unique identifier of collection.
+ CollectionId,
+ ),
/// New item was created.
- ///
- /// # Arguments
- ///
- /// * collection_id - ID of the collection where the item was created.
- /// * item_id - ID of the item. Unique within the collection.
- /// * recipient - Owner of the newly created item.
- /// * amount - The amount of tokens that were created (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 - Identifier of the collection to which the burned NFT belonged.
- /// * item_id - Identifier of burned NFT.
- /// * owner - Which user has destroyed their tokens.
- /// * amount - Amount of tokens that were destroyed (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.
- ///
- /// # Arguments
- ///
- /// * collection_id - ID of the collection to which the item belongs.
- /// * item_id - ID of the item transferred.
- /// * sender - Original owner of the item.
- /// * recipient - New owner of the item.
- /// * amount - Amount of tokens that were transferred (always 1 for NFT).
+ /// Item was transferred
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,
),
- /// Sponsoring allowance was approved.
- ///
- /// # Arguments
- ///
- /// * collection_id - todo:doc flesh out
- /// * 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,
),
- /// Collection property was added or edited.
- ///
- /// # Arguments
- ///
- /// * collection_id - ID of the collection, whose property was just set.
- /// * property_key - Key of the property that was just set.
- CollectionPropertySet(CollectionId, PropertyKey),
+ /// The colletion property has been added or edited.
+ CollectionPropertySet(
+ /// Id of collection to which property has been set.
+ CollectionId,
+ /// The property that was set.
+ PropertyKey,
+ ),
- /// Collection property was deleted.
- ///
- /// # Arguments
- ///
- /// * collection_id - ID of the collection, whose property was just deleted.
- /// * property_key - Key of the property that was just deleted.
- 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,
+ ),
- /// Item property was added or edited.
- ///
- /// # Arguments
- ///
- /// * collection_id - ID of the collection, whose token's property was just set.
- /// * item_id - ID of the item, whose property was just set.
- /// * property_key - Key of the property that was just set.
- TokenPropertySet(CollectionId, TokenId, PropertyKey),
+ /// The token property has been added or edited.
+ 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,
+ ),
- /// Item property was deleted.
- ///
- /// # Arguments
- ///
- /// * collection_id - ID of the collection, whose token's property was just deleted.
- /// * item_id - ID of the item, whose property was just deleted.
- /// * property_key - Key of the property that was just deleted.
- 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,
+ ),
- /// Token property permission was added or updated for a collection.
- ///
- /// # Arguments
- ///
- /// * collection_id - ID of the collection, whose permissions were just set/updated.
- /// * property_key - Key of the property of the set/updated permission.
- PropertyPermissionSet(CollectionId, PropertyKey),
+ /// The token property permission of a collection has been set.
+ PropertyPermissionSet(
+ /// ID of collection to which property permission has been set.
+ CollectionId,
+ /// The property permission that was set.
+ PropertyKey,
+ ),
}
#[pallet::error]
@@ -482,16 +571,16 @@
CollectionIsInternal,
}
- /// The number of created collections. Essentially contains the last collection ID.
+ /// Storage of the count of created collections. Essentially contains the last collection ID.
#[pallet::storage]
pub type CreatedCollectionCount<T> = StorageValue<Value = CollectionId, QueryKind = ValueQuery>;
- /// The number of destroyed collections
+ /// 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,
@@ -500,7 +589,7 @@
QueryKind = OptionQuery,
>;
- /// Collection properties
+ /// Storage of collection properties.
#[pallet::storage]
#[pallet::getter(fn collection_properties)]
pub type CollectionProperties<T> = StorageMap<
@@ -511,7 +600,7 @@
OnEmpty = up_data_structs::CollectionProperties,
>;
- /// Token permissions of a collection
+ /// Storage of token property permissions of a collection.
#[pallet::storage]
#[pallet::getter(fn property_permissions)]
pub type CollectionPropertyPermissions<T> = StorageMap<
@@ -521,7 +610,7 @@
QueryKind = ValueQuery,
>;
- /// Amount of collection admins
+ /// Storage of the amount of collection admins.
#[pallet::storage]
pub type AdminAmount<T> = StorageMap<
Hasher = Blake2_128Concat,
@@ -530,7 +619,7 @@
QueryKind = ValueQuery,
>;
- /// List of collection admins
+ /// List of collection admins.
#[pallet::storage]
pub type IsAdmin<T: Config> = StorageNMap<
Key = (
@@ -541,7 +630,7 @@
QueryKind = ValueQuery,
>;
- /// Allowlisted collection users
+ /// Allowlisted collection users.
#[pallet::storage]
pub type Allowlist<T: Config> = StorageNMap<
Key = (
@@ -552,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 = (
@@ -646,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,
@@ -654,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();
@@ -677,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() {
@@ -710,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,
@@ -785,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>,
@@ -860,7 +966,7 @@
),
);
<T as Config>::Currency::settle(
- &owner.as_sub(),
+ owner.as_sub(),
imbalance,
WithdrawReasons::TRANSFER,
ExistenceRequirement::KeepAlive,
@@ -885,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,
@@ -913,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,
@@ -931,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,
@@ -944,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,
@@ -957,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>,
@@ -970,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,
@@ -990,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>,
@@ -1003,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,
@@ -1015,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,
@@ -1045,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>,
@@ -1058,6 +1213,7 @@
Ok(())
}
+ /// Get collection property.
pub fn get_collection_property(
collection_id: CollectionId,
key: &PropertyKey,
@@ -1065,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> {
@@ -1076,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>>,
@@ -1103,6 +1261,7 @@
Ok(properties)
}
+ /// Get property permissions according to given keys.
pub fn filter_property_permissions(
collection_id: CollectionId,
keys: Option<Vec<PropertyKey>>,
@@ -1132,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,
@@ -1151,6 +1311,7 @@
Ok(())
}
+ /// Toggle `user` participation in the `collection`'s admin list.
pub fn toggle_admin(
collection: &CollectionHandle<T>,
sender: &T::CrossAccountId,
@@ -1186,6 +1347,7 @@
Ok(())
}
+ /// Merge set fields from `new_limit` to `old_limit`.
pub fn clamp_limits(
mode: CollectionMode,
old_limit: &CollectionLimits,
@@ -1231,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 {
() => {
@@ -1252,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)
@@ -1285,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,
@@ -1297,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,
@@ -1304,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,
@@ -1323,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,
@@ -1367,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,
@@ -1374,67 +1680,145 @@
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>;
+
+ /// Returns 10 tokens owners in no particular order.
+ ///
+ /// * `token` - The token for which you need to find out the owners.
+ fn token_owners(&self, token: TokenId) -> Vec<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/CHANGELOG.mddiffbeforeafterboth--- /dev/null
+++ b/pallets/fungible/CHANGELOG.md
@@ -0,0 +1,13 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [0.1.1] - 2022-07-14
+
+### Added
+
+ - Implementation of RPC method `token_owners` returning 10 owners in no particular order.
+ This was an internal request to improve the web interface and support fractionalization event.
+
+
+
\ No newline at end of file
pallets/fungible/Cargo.tomldiffbeforeafterboth--- a/pallets/fungible/Cargo.toml
+++ b/pallets/fungible/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "pallet-fungible"
-version = "0.1.0"
+version = "0.1.1"
license = "GPLv3"
edition = "2021"
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,
@@ -360,6 +362,11 @@
None
}
+ /// Returns 10 tokens owners in no particular order.
+ fn token_owners(&self, token: TokenId) -> Vec<T::CrossAccountId> {
+ <Pallet<T>>::token_owners(self.id, token).unwrap_or_default()
+ }
+
fn token_property(&self, _token_id: TokenId, _key: &PropertyKey) -> Option<PropertyValue> {
None
}
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;
@@ -33,7 +95,7 @@
use pallet_evm_coder_substrate::WithRecorder;
use sp_core::H160;
use sp_runtime::{ArithmeticError, DispatchError, DispatchResult};
-use sp_std::{collections::btree_map::BTreeMap};
+use sp_std::{collections::btree_map::BTreeMap, vec::Vec};
pub use pallet::*;
@@ -44,7 +106,6 @@
pub mod erc;
pub mod weights;
-/// todo:doc?
pub type CreateItemData<T> = (<T as pallet_evm::account::Config>::CrossAccountId, u128);
pub(crate) type SelfWeightOf<T> = <T as Config>::WeightInfo;
@@ -58,7 +119,7 @@
pub enum Error<T> {
/// Not Fungible item data used to mint in Fungible collection.
NotFungibleDataUsedToMintFungibleCollectionToken,
- /// Not default id passed as TokenId argument.
+ /// Fungible tokens hold no ID, and the default value of TokenId for Fungible collection is 0.
FungibleItemsHaveNoId,
/// Tried to set data for fungible item.
FungibleItemsDontHaveData,
@@ -95,7 +156,7 @@
QueryKind = ValueQuery,
>;
- /// todo:doc
+ /// Storage for assets delegated to a limited extent to other users.
#[pallet::storage]
pub type Allowance<T: Config> = StorageNMap<
Key = (
@@ -108,14 +169,22 @@
>;
}
+/// 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
}
@@ -136,13 +205,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,
@@ -163,10 +236,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,
@@ -211,6 +288,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,
@@ -281,6 +365,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,
@@ -382,6 +468,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,
@@ -406,6 +498,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,
@@ -445,6 +544,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,
@@ -464,6 +568,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,
@@ -482,7 +591,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,
@@ -496,4 +611,26 @@
nesting_budget,
)
}
+
+ /// Returns 10 tokens owners in no particular order
+ ///
+ /// There is no direct way to get token holders in ascending order,
+ /// since `iter_prefix` returns values in no particular order.
+ /// Therefore, getting the 10 largest holders with a large value of holders
+ /// can lead to impact memory allocation + sorting with `n * log (n)`.
+ pub fn token_owners(
+ collection: CollectionId,
+ _token: TokenId,
+ ) -> Option<Vec<T::CrossAccountId>> {
+ let res: Vec<T::CrossAccountId> = <Balance<T>>::iter_prefix((collection,))
+ .map(|(owner, _amount)| owner)
+ .take(10)
+ .collect();
+
+ if res.is_empty() {
+ None
+ } else {
+ Some(res)
+ }
+ }
}
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/CHANGELOG.mddiffbeforeafterboth--- /dev/null
+++ b/pallets/nonfungible/CHANGELOG.md
@@ -0,0 +1,11 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [0.1.1] - 2022-07-14
+
+### Added
+
+- Implementation of RPC method `token_owners`.
+ For reasons of compatibility with this pallet, returns only one owner if token exists.
+ This was an internal request to improve the web interface and support fractionalization event.
\ No newline at end of file
pallets/nonfungible/Cargo.tomldiffbeforeafterboth--- a/pallets/nonfungible/Cargo.toml
+++ b/pallets/nonfungible/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "pallet-nonfungible"
-version = "0.1.0"
+version = "0.1.1"
license = "GPLv3"
edition = "2021"
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
@@ -26,7 +26,7 @@
weights::WeightInfo as _,
};
use sp_runtime::DispatchError;
-use sp_std::vec::Vec;
+use sp_std::{vec::Vec, vec};
use crate::{
AccountBalance, Allowance, Config, CreateItemData, Error, NonfungibleHandle, Owned, Pallet,
@@ -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,
@@ -420,6 +422,11 @@
<TokenData<T>>::get((self.id, token)).map(|t| t.owner)
}
+ /// Returns token owners.
+ fn token_owners(&self, token: TokenId) -> Vec<T::CrossAccountId> {
+ self.token_owner(token).map_or_else(|| vec![], |t| vec![t])
+ }
+
fn token_property(&self, token_id: TokenId, key: &PropertyKey) -> Option<PropertyValue> {
<Pallet<T>>::token_properties((self.id, token_id))
.get(key)
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`](common::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;
@@ -56,8 +130,8 @@
pub type CreateItemData<T> = CreateNftExData<<T as pallet_evm::account::Config>::CrossAccountId>;
pub(crate) type SelfWeightOf<T> = <T as Config>::WeightInfo;
-/// Token data, stored independently from other data used to describe it.
-/// Notably contains the owner account address.
+/// Token data, stored independently from other data used to describe it
+/// for the convenience of database access. Notably contains the owner account address.
#[struct_versioning::versioned(version = 2, upper)]
#[derive(Encode, Decode, TypeInfo, MaxEncodedLen)]
pub struct ItemData<CrossAccountId> {
@@ -122,7 +196,7 @@
QueryKind = OptionQuery,
>;
- /// Key-value pairs, describing the metadata of a token.
+ /// Map of key-value pairs, describing the metadata of a token.
#[pallet::storage]
#[pallet::getter(fn token_properties)]
pub type TokenProperties<T: Config> = StorageNMap<
@@ -132,7 +206,15 @@
OnEmpty = up_data_structs::TokenProperties,
>;
- /// Scoped, auxiliary properties of a token, primarily used for on-chain operations.
+ /// Custom data of a token that is serialized to bytes,
+ /// primarily reserved for on-chain operations,
+ /// normally obscured from the external users.
+ ///
+ /// Auxiliary properties are slightly different from
+ /// usual [`TokenProperties`] due to an unlimited number
+ /// and separately stored and written-to key-value pairs.
+ ///
+ /// Currently used to store RMRK data.
#[pallet::storage]
#[pallet::getter(fn token_aux_property)]
pub type TokenAuxProperties<T: Config> = StorageNMap<
@@ -171,7 +253,7 @@
QueryKind = ValueQuery,
>;
- /// Amount of tokens owned in a collection.
+ /// Amount of tokens owned by an account in a collection.
#[pallet::storage]
pub type AccountBalance<T: Config> = StorageNMap<
Key = (
@@ -182,7 +264,7 @@
QueryKind = ValueQuery,
>;
- /// todo:doc
+ /// Allowance set by a token owner for another user to perform one of certain transactions on a token.
#[pallet::storage]
pub type Allowance<T: Config> = StorageNMap<
Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
@@ -284,13 +366,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,
@@ -305,6 +395,7 @@
Ok(())
}
+ /// Batch operation to set multiple properties with the same scope.
pub fn set_scoped_token_properties(
collection_id: CollectionId,
token_id: TokenId,
@@ -319,6 +410,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,
@@ -329,6 +423,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,
@@ -338,6 +433,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,
@@ -346,6 +444,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))
}
@@ -353,6 +452,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>,
@@ -360,6 +464,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,
@@ -384,6 +493,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,
@@ -453,6 +571,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>,
@@ -492,6 +616,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>,
@@ -585,6 +717,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,
@@ -603,6 +740,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,
@@ -622,6 +764,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,
@@ -641,6 +788,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,
@@ -657,6 +809,7 @@
)
}
+ /// Add or edit properties for the collection
pub fn set_collection_properties(
collection: &NonfungibleHandle<T>,
sender: &T::CrossAccountId,
@@ -665,6 +818,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,
@@ -673,6 +827,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,
@@ -681,6 +838,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,
@@ -689,6 +849,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,
@@ -780,6 +949,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,
@@ -964,6 +1143,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,
@@ -996,6 +1178,7 @@
Ok(())
}
+ /// Checks allowance for the spender to use the token.
fn check_allowed(
collection: &NonfungibleHandle<T>,
spender: &T::CrossAccountId,
@@ -1038,6 +1221,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,
@@ -1054,6 +1243,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,
@@ -1068,6 +1263,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,
@@ -1137,7 +1334,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/CHANGELOG.mddiffbeforeafterboth--- /dev/null
+++ b/pallets/refungible/CHANGELOG.md
@@ -0,0 +1,18 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [v0.1.2] - 2022-07-14
+
+### Other changes
+
+feat(refungible-pallet): add ERC-20 EVM API for RFT token pieces ([#413](https://github.com/UniqueNetwork/unique-chain/pull/413))
+test(refungible-pallet): add tests for ERC-20 EVM API for RFT token pieces ([#413](https://github.com/UniqueNetwork/unique-chain/pull/413))
+
+## [v0.1.1] - 2022-07-14
+
+### Other changes
+
+- feat: RPC method `token_owners` returning 10 owners in no particular order.
+
+This was an internal request to improve the web interface and support fractionalization event.
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.2"
license = "GPLv3"
edition = "2021"
@@ -11,36 +11,43 @@
version = '3.1.2'
[dependencies]
-frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
-frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
-sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
-sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
-sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
-pallet-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.24" }
+evm-coder = { default-features = false, path = '../../crates/evm-coder' }
+pallet-evm-coder-substrate = { default-features = false, path = '../../pallets/evm-coder-substrate' }
pallet-common = { default-features = false, path = '../common' }
pallet-structure = { default-features = false, path = '../structure' }
+struct-versioning = { path = "../../crates/struct-versioning" }
up-data-structs = { default-features = false, path = '../../primitives/data-structs' }
+
+ethereum = { version = "0.12.0", default-features = false }
+scale-info = { version = "2.0.1", default-features = false, features = ["derive",] }
+
frame-benchmarking = { default-features = false, optional = true, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
-scale-info = { version = "2.0.1", default-features = false, features = [
- "derive",
-] }
-struct-versioning = { path = "../../crates/struct-versioning" }
+frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
+frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
+pallet-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.24" }
+sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
+sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
+sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.24" }
[features]
default = ["std"]
std = [
+ "ethereum/std",
+ "evm-coder/std",
+ 'frame-benchmarking/std',
"frame-support/std",
"frame-system/std",
+ "pallet-common/std",
+ "pallet-evm/std",
+ "pallet-evm-coder-substrate/std",
+ "pallet-structure/std",
"sp-runtime/std",
"sp-std/std",
"up-data-structs/std",
- "pallet-common/std",
- "pallet-structure/std",
- 'frame-benchmarking/std',
- "pallet-evm/std",
]
runtime-benchmarks = [
'frame-benchmarking',
'frame-support/runtime-benchmarks',
'frame-system/runtime-benchmarks',
+ 'up-data-structs/runtime-benchmarks',
]
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,
+ weights::WeightInfo as _,
};
-use pallet_common::{CommonCollectionOperations, CommonWeightInfo, RefungibleExtensions, with_weight};
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,13 @@
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)
+ }
+
+ /// Returns 10 token in no particular order.
+ fn token_owners(&self, token: TokenId) -> Vec<T::CrossAccountId> {
+ <Pallet<T>>::token_owners(self.id, token).unwrap_or_default()
}
fn token_property(&self, _token_id: TokenId, _key: &PropertyKey) -> Option<PropertyValue> {
pallets/refungible/src/erc.rsdiffbeforeafterboth--- a/pallets/refungible/src/erc.rs
+++ b/pallets/refungible/src/erc.rs
@@ -14,34 +14,35 @@
// 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 up_data_structs::TokenId;
-use pallet_common::erc::CommonEvmHandler;
-use pallet_evm::PrecompileHandle;
+extern crate alloc;
+use evm_coder::{generate_stubgen, solidity_interface, types::*};
-use crate::{Config, RefungibleHandle};
+use pallet_common::{CollectionHandle, erc::CollectionCall, erc::CommonEvmHandler};
-impl<T: Config> CommonEvmHandler for RefungibleHandle<T> {
- const CODE: &'static [u8] = include_bytes!("./stubs/UniqueRefungible.raw");
+use pallet_evm::PrecompileHandle;
+use pallet_evm_coder_substrate::call;
- fn call(
- self,
- _handle: &mut impl PrecompileHandle,
- ) -> Option<pallet_common::erc::PrecompileResult> {
- // TODO: Implement RFT variant of ERC721
- None
- }
-}
+use crate::{Config, RefungibleHandle};
-pub struct RefungibleTokenHandle<T: Config>(pub RefungibleHandle<T>, pub TokenId);
+#[solidity_interface(
+ name = "UniqueRFT",
+ is(via("CollectionHandle<T>", common_mut, Collection),)
+)]
+impl<T: Config> RefungibleHandle<T> where T::AccountId: From<[u8; 32]> {}
-impl<T: Config> CommonEvmHandler for RefungibleTokenHandle<T> {
- const CODE: &'static [u8] = include_bytes!("./stubs/UniqueRefungibleToken.raw");
+// Not a tests, but code generators
+generate_stubgen!(gen_impl, UniqueRFTCall<()>, true);
+generate_stubgen!(gen_iface, UniqueRFTCall<()>, false);
+impl<T: Config> CommonEvmHandler for RefungibleHandle<T>
+where
+ T::AccountId: From<[u8; 32]>,
+{
+ const CODE: &'static [u8] = include_bytes!("./stubs/UniqueRefungible.raw");
fn call(
self,
- _handle: &mut impl PrecompileHandle,
+ handle: &mut impl PrecompileHandle,
) -> Option<pallet_common::erc::PrecompileResult> {
- // TODO: Implement RFT variant of ERC20
- None
+ call::<T, UniqueRFTCall<T>, _, _>(handle, self)
}
}
pallets/refungible/src/erc_token.rsdiffbeforeafterboth--- /dev/null
+++ b/pallets/refungible/src/erc_token.rs
@@ -0,0 +1,257 @@
+// 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/>.
+
+//! # Refungible Pallet EVM API for token pieces
+//!
+//! Provides ERC-20 standart support implementation and EVM API for unique extensions for Refungible Pallet.
+//! Method implementations are mostly doing parameter conversion and calling Nonfungible Pallet methods.
+
+extern crate alloc;
+use core::{
+ char::{REPLACEMENT_CHARACTER, decode_utf16},
+ convert::TryInto,
+ ops::Deref,
+};
+use evm_coder::{ToLog, execution::*, generate_stubgen, solidity_interface, types::*, weight};
+use pallet_common::{
+ CommonWeightInfo,
+ erc::{CommonEvmHandler, PrecompileResult},
+};
+use pallet_evm::{account::CrossAccountId, PrecompileHandle};
+use pallet_evm_coder_substrate::{call, dispatch_to_evm, WithRecorder};
+use pallet_structure::{SelfWeightOf as StructureWeight, weights::WeightInfo as _};
+use sp_std::vec::Vec;
+use up_data_structs::TokenId;
+
+use crate::{
+ Allowance, Balance, common::CommonWeights, Config, Pallet, RefungibleHandle, SelfWeightOf,
+ weights::WeightInfo, TotalSupply,
+};
+
+pub struct RefungibleTokenHandle<T: Config>(pub RefungibleHandle<T>, pub TokenId);
+
+#[derive(ToLog)]
+pub enum ERC20Events {
+ /// @dev This event is emitted when the amount of tokens (value) is sent
+ /// from the from address to the to address. In the case of minting new
+ /// tokens, the transfer is usually from the 0 address while in the case
+ /// of burning tokens the transfer is to 0.
+ Transfer {
+ #[indexed]
+ from: address,
+ #[indexed]
+ to: address,
+ value: uint256,
+ },
+ /// @dev This event is emitted when the amount of tokens (value) is approved
+ /// by the owner to be used by the spender.
+ Approval {
+ #[indexed]
+ owner: address,
+ #[indexed]
+ spender: address,
+ value: uint256,
+ },
+}
+
+/// @title Standard ERC20 token
+///
+/// @dev Implementation of the basic standard token.
+/// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
+#[solidity_interface(name = "ERC20", events(ERC20Events))]
+impl<T: Config> RefungibleTokenHandle<T> {
+ /// @return the name of the token.
+ fn name(&self) -> Result<string> {
+ Ok(decode_utf16(self.name.iter().copied())
+ .map(|r| r.unwrap_or(REPLACEMENT_CHARACTER))
+ .collect::<string>())
+ }
+
+ /// @return the symbol of the token.
+ fn symbol(&self) -> Result<string> {
+ Ok(string::from_utf8_lossy(&self.token_prefix).into())
+ }
+
+ /// @dev Total number of tokens in existence
+ fn total_supply(&self) -> Result<uint256> {
+ self.consume_store_reads(1)?;
+ Ok(<TotalSupply<T>>::get((self.id, self.1)).into())
+ }
+
+ /// @dev Not supported
+ fn decimals(&self) -> Result<uint8> {
+ // Decimals aren't supported for refungible tokens
+ Ok(0)
+ }
+
+ /// @dev Gets the balance of the specified address.
+ /// @param owner The address to query the balance of.
+ /// @return An uint256 representing the amount owned by the passed address.
+ fn balance_of(&self, owner: address) -> Result<uint256> {
+ self.consume_store_reads(1)?;
+ let owner = T::CrossAccountId::from_eth(owner);
+ let balance = <Balance<T>>::get((self.id, self.1, owner));
+ Ok(balance.into())
+ }
+
+ /// @dev Transfer token for a specified address
+ /// @param to The address to transfer to.
+ /// @param amount The amount to be transferred.
+ #[weight(<CommonWeights<T>>::transfer())]
+ fn transfer(&mut self, caller: caller, to: address, amount: uint256) -> Result<bool> {
+ let caller = T::CrossAccountId::from_eth(caller);
+ let to = T::CrossAccountId::from_eth(to);
+ let amount = amount.try_into().map_err(|_| "amount overflow")?;
+ let budget = self
+ .recorder
+ .weight_calls_budget(<StructureWeight<T>>::find_parent());
+
+ <Pallet<T>>::transfer(self, &caller, &to, self.1, amount, &budget)
+ .map_err(|_| "transfer error")?;
+ Ok(true)
+ }
+
+ /// @dev Transfer tokens from one address to another
+ /// @param from address The address which you want to send tokens from
+ /// @param to address The address which you want to transfer to
+ /// @param amount uint256 the amount of tokens to be transferred
+ #[weight(<CommonWeights<T>>::transfer_from())]
+ fn transfer_from(
+ &mut self,
+ caller: caller,
+ from: address,
+ to: address,
+ amount: uint256,
+ ) -> Result<bool> {
+ let caller = T::CrossAccountId::from_eth(caller);
+ let from = T::CrossAccountId::from_eth(from);
+ let to = T::CrossAccountId::from_eth(to);
+ let amount = amount.try_into().map_err(|_| "amount overflow")?;
+ let budget = self
+ .recorder
+ .weight_calls_budget(<StructureWeight<T>>::find_parent());
+
+ <Pallet<T>>::transfer_from(self, &caller, &from, &to, self.1, amount, &budget)
+ .map_err(dispatch_to_evm::<T>)?;
+ Ok(true)
+ }
+
+ /// @dev Approve the passed address to spend the specified amount of tokens on behalf of `msg.sender`.
+ /// Beware that changing an allowance with this method brings the risk that someone may use both the old
+ /// and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
+ /// race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
+ /// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
+ /// @param spender The address which will spend the funds.
+ /// @param amount The amount of tokens to be spent.
+ #[weight(<SelfWeightOf<T>>::approve())]
+ fn approve(&mut self, caller: caller, spender: address, amount: uint256) -> Result<bool> {
+ let caller = T::CrossAccountId::from_eth(caller);
+ let spender = T::CrossAccountId::from_eth(spender);
+ let amount = amount.try_into().map_err(|_| "amount overflow")?;
+
+ <Pallet<T>>::set_allowance(self, &caller, &spender, self.1, amount)
+ .map_err(dispatch_to_evm::<T>)?;
+ Ok(true)
+ }
+
+ /// @dev Function to check the amount of tokens that an owner allowed to a spender.
+ /// @param owner address The address which owns the funds.
+ /// @param spender address The address which will spend the funds.
+ /// @return A uint256 specifying the amount of tokens still available for the spender.
+ fn allowance(&self, owner: address, spender: address) -> Result<uint256> {
+ self.consume_store_reads(1)?;
+ let owner = T::CrossAccountId::from_eth(owner);
+ let spender = T::CrossAccountId::from_eth(spender);
+
+ Ok(<Allowance<T>>::get((self.id, self.1, owner, spender)).into())
+ }
+}
+
+#[solidity_interface(name = "ERC20UniqueExtensions")]
+impl<T: Config> RefungibleTokenHandle<T> {
+ /// @dev Function that burns an amount of the token of a given account,
+ /// deducting from the sender's allowance for said account.
+ /// @param from The account whose tokens will be burnt.
+ /// @param amount The amount that will be burnt.
+ #[weight(<SelfWeightOf<T>>::burn_from())]
+ fn burn_from(&mut self, caller: caller, from: address, amount: uint256) -> Result<bool> {
+ let caller = T::CrossAccountId::from_eth(caller);
+ let from = T::CrossAccountId::from_eth(from);
+ let amount = amount.try_into().map_err(|_| "amount overflow")?;
+ let budget = self
+ .recorder
+ .weight_calls_budget(<StructureWeight<T>>::find_parent());
+
+ <Pallet<T>>::burn_from(self, &caller, &from, self.1, amount, &budget)
+ .map_err(dispatch_to_evm::<T>)?;
+ Ok(true)
+ }
+
+ /// @dev Function that changes total amount of the tokens.
+ /// Throws if `msg.sender` doesn't owns all of the tokens.
+ /// @param amount New total amount of the tokens.
+ #[weight(<SelfWeightOf<T>>::repartition_item())]
+ fn repartition(&mut self, caller: caller, amount: uint256) -> Result<bool> {
+ let caller = T::CrossAccountId::from_eth(caller);
+ let amount = amount.try_into().map_err(|_| "amount overflow")?;
+
+ <Pallet<T>>::repartition(self, &caller, self.1, amount).map_err(dispatch_to_evm::<T>)?;
+ Ok(true)
+ }
+}
+
+impl<T: Config> RefungibleTokenHandle<T> {
+ pub fn into_inner(self) -> RefungibleHandle<T> {
+ self.0
+ }
+ pub fn common_mut(&mut self) -> &mut RefungibleHandle<T> {
+ &mut self.0
+ }
+}
+
+impl<T: Config> WithRecorder<T> for RefungibleTokenHandle<T> {
+ fn recorder(&self) -> &pallet_evm_coder_substrate::SubstrateRecorder<T> {
+ self.0.recorder()
+ }
+ fn into_recorder(self) -> pallet_evm_coder_substrate::SubstrateRecorder<T> {
+ self.0.into_recorder()
+ }
+}
+
+impl<T: Config> Deref for RefungibleTokenHandle<T> {
+ type Target = RefungibleHandle<T>;
+
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+
+#[solidity_interface(name = "UniqueRefungibleToken", is(ERC20, ERC20UniqueExtensions,))]
+impl<T: Config> RefungibleTokenHandle<T> where T::AccountId: From<[u8; 32]> {}
+
+generate_stubgen!(gen_impl, UniqueRefungibleTokenCall<()>, true);
+generate_stubgen!(gen_iface, UniqueRefungibleTokenCall<()>, false);
+
+impl<T: Config> CommonEvmHandler for RefungibleTokenHandle<T>
+where
+ T::AccountId: From<[u8; 32]>,
+{
+ const CODE: &'static [u8] = include_bytes!("./stubs/UniqueRefungibleToken.raw");
+
+ fn call(self, handle: &mut impl PrecompileHandle) -> Option<PrecompileResult> {
+ call::<T, UniqueRefungibleTokenCall<T>, _, _>(handle, self)
+ }
+}
pallets/refungible/src/lib.rsdiffbeforeafterboth--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -14,32 +14,113 @@
// 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`](common::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 up_data_structs::{
- AccessMode, CollectionId, CustomDataLimit, MAX_REFUNGIBLE_PIECES, TokenId,
- CreateCollectionData, CreateRefungibleExData, mapping::TokenAddressMapping, budget::Budget,
+use crate::erc_token::ERC20Events;
+
+use codec::{Encode, Decode, MaxEncodedLen};
+use core::ops::Deref;
+use evm_coder::ToLog;
+use frame_support::{BoundedVec, ensure, fail, storage::with_transaction, transactional};
+use pallet_evm::{account::CrossAccountId, Pallet as PalletEvm};
+use pallet_evm_coder_substrate::WithRecorder;
+use pallet_common::{
+ CommonCollectionOperations, Error as CommonError, Event as CommonEvent, Pallet as PalletCommon,
};
-use pallet_evm::account::CrossAccountId;
-use pallet_common::{Error as CommonError, Event as CommonEvent, Pallet as PalletCommon};
use pallet_structure::Pallet as PalletStructure;
-use sp_runtime::{ArithmeticError, DispatchError, DispatchResult};
+use scale_info::TypeInfo;
+use sp_core::H160;
+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};
-use scale_info::TypeInfo;
+use up_data_structs::{
+ AccessMode, budget::Budget, CollectionId, CreateCollectionData, CreateRefungibleExData,
+ CustomDataLimit, mapping::TokenAddressMapping, MAX_REFUNGIBLE_PIECES, TokenId, Property,
+ PropertyKey, PropertyKeyPermission, PropertyPermission, PropertyScope, PropertyValue,
+ TrySetProperty,
+};
pub use pallet::*;
#[cfg(feature = "runtime-benchmarks")]
pub mod benchmarking;
pub mod common;
pub mod erc;
+pub mod erc_token;
pub mod weights;
pub(crate) type SelfWeightOf<T> = <T as Config>::WeightInfo;
-/// Token data, stored independently from other data used to describe it.
-/// Notably contains the token metadata.
+/// Token data, stored independently from other data used to describe it
+/// for the convenience of database access. Notably contains the token metadata.
#[struct_versioning::versioned(version = 2, upper)]
#[derive(Encode, Decode, Default, TypeInfo, MaxEncodedLen)]
pub struct ItemData {
@@ -108,6 +189,16 @@
/// Amount of pieces a refungible token is split into.
#[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,
@@ -138,7 +229,7 @@
QueryKind = ValueQuery,
>;
- /// Amount of pieces of a token owned by an account.
+ /// Amount of token pieces owned by account.
#[pallet::storage]
pub type Balance<T: Config> = StorageNMap<
Key = (
@@ -151,7 +242,7 @@
QueryKind = ValueQuery,
>;
- /// todo:doc
+ /// Allowance set by a token owner for another user to perform one of certain transactions on a number of pieces of a token.
#[pallet::storage]
pub type Allowance<T: Config> = StorageNMap<
Key = (
@@ -188,7 +279,11 @@
pub fn into_inner(self) -> pallet_common::CollectionHandle<T> {
self.0
}
+ pub fn common_mut(&mut self) -> &mut pallet_common::CollectionHandle<T> {
+ &mut self.0
+ }
}
+
impl<T: Config> Deref for RefungibleHandle<T> {
type Target = pallet_common::CollectionHandle<T>;
@@ -197,23 +292,75 @@
}
}
+impl<T: Config> WithRecorder<T> for RefungibleHandle<T> {
+ fn recorder(&self) -> &pallet_evm_coder_substrate::SubstrateRecorder<T> {
+ self.0.recorder()
+ }
+ fn into_recorder(self) -> pallet_evm_coder_substrate::SubstrateRecorder<T> {
+ self.0.into_recorder()
+ }
+}
+
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,
@@ -245,13 +392,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);
@@ -259,6 +410,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,
@@ -286,7 +448,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,7 +481,18 @@
<Balance<T>>::insert((collection.id, token, owner), balance);
}
<TotalSupply<T>>::insert((collection.id, token), total_supply);
- // TODO: ERC20 transfer event
+
+ <PalletEvm<T>>::deposit_log(
+ ERC20Events::Transfer {
+ from: *owner.as_eth(),
+ to: H160::default(),
+ value: amount.into(),
+ }
+ .to_log(T::EvmTokenAddressMapping::token_to_address(
+ collection.id,
+ token,
+ )),
+ );
<PalletCommon<T>>::deposit_event(CommonEvent::ItemDestroyed(
collection.id,
token,
@@ -329,6 +502,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,
@@ -422,7 +768,17 @@
}
}
- // TODO: ERC20 transfer event
+ <PalletEvm<T>>::deposit_log(
+ ERC20Events::Transfer {
+ from: *from.as_eth(),
+ to: *to.as_eth(),
+ value: amount.into(),
+ }
+ .to_log(T::EvmTokenAddressMapping::token_to_address(
+ collection.id,
+ token,
+ )),
+ );
<PalletCommon<T>>::deposit_event(CommonEvent::Transfer(
collection.id,
token,
@@ -433,6 +789,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,
@@ -517,34 +878,70 @@
// =========
+ 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),
+
+ <PalletEvm<T>>::deposit_log(
+ ERC20Events::Transfer {
+ from: H160::default(),
+ to: *user.as_eth(),
+ value: amount.into(),
+ }
+ .to_log(T::EvmTokenAddressMapping::token_to_address(
+ collection.id,
+ TokenId(token_id),
+ )),
);
-
- // TODO: ERC20 transfer event
<PalletCommon<T>>::deposit_event(CommonEvent::ItemCreated(
collection.id,
TokenId(token_id),
@@ -568,7 +965,18 @@
} else {
<Allowance<T>>::insert((collection.id, token, sender, spender), amount);
}
- // TODO: ERC20 approval event
+
+ <PalletEvm<T>>::deposit_log(
+ ERC20Events::Approval {
+ owner: *sender.as_eth(),
+ spender: *spender.as_eth(),
+ value: amount.into(),
+ }
+ .to_log(T::EvmTokenAddressMapping::token_to_address(
+ collection.id,
+ token,
+ )),
+ );
<PalletCommon<T>>::deposit_event(CommonEvent::Approved(
collection.id,
token,
@@ -578,6 +986,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,
@@ -646,6 +1057,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,
@@ -667,6 +1084,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,
@@ -687,7 +1110,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,
@@ -697,6 +1126,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,
@@ -709,19 +1145,119 @@
);
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
);
<Balance<T>>::insert((collection.id, token, owner), amount);
<TotalSupply<T>>::insert((collection.id, token), amount);
+
+ if amount > total_pieces {
+ let mint_amount = amount - total_pieces;
+ <PalletEvm<T>>::deposit_log(
+ ERC20Events::Transfer {
+ from: H160::default(),
+ to: *owner.as_eth(),
+ value: mint_amount.into(),
+ }
+ .to_log(T::EvmTokenAddressMapping::token_to_address(
+ collection.id,
+ token,
+ )),
+ );
+ <PalletCommon<T>>::deposit_event(CommonEvent::ItemCreated(
+ collection.id,
+ token,
+ owner.clone(),
+ mint_amount,
+ ));
+ } else if total_pieces > amount {
+ let burn_amount = total_pieces - amount;
+ <PalletEvm<T>>::deposit_log(
+ ERC20Events::Transfer {
+ from: *owner.as_eth(),
+ to: H160::default(),
+ value: burn_amount.into(),
+ }
+ .to_log(T::EvmTokenAddressMapping::token_to_address(
+ collection.id,
+ token,
+ )),
+ );
+ <PalletCommon<T>>::deposit_event(CommonEvent::ItemDestroyed(
+ collection.id,
+ token,
+ owner.clone(),
+ burn_amount,
+ ));
+ }
+
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)
+ }
+
+ /// Returns 10 token in no particular order.
+ ///
+ /// There is no direct way to get token holders in ascending order,
+ /// since `iter_prefix` returns values in no particular order.
+ /// Therefore, getting the 10 largest holders with a large value of holders
+ /// can lead to impact memory allocation + sorting with `n * log (n)`.
+ pub fn token_owners(
+ collection_id: CollectionId,
+ token: TokenId,
+ ) -> Option<Vec<T::CrossAccountId>> {
+ let res: Vec<T::CrossAccountId> = <Balance<T>>::iter_prefix((collection_id, token))
+ .map(|(owner, _amount)| owner)
+ .take(10)
+ .collect();
+
+ if res.is_empty() {
+ None
+ } else {
+ Some(res)
+ }
+ }
}
pallets/refungible/src/stubs/UniqueRefungibleToken.rawdiffbeforeafterbothbinary blob — no preview
pallets/refungible/src/stubs/UniqueRefungibleToken.soldiffbeforeafterboth--- /dev/null
+++ b/pallets/refungible/src/stubs/UniqueRefungibleToken.sol
@@ -0,0 +1,138 @@
+// SPDX-License-Identifier: OTHER
+// This code is automatically generated
+
+pragma solidity >=0.8.0 <0.9.0;
+
+// Common stubs holder
+contract Dummy {
+ uint8 dummy;
+ string stub_error = "this contract is implemented in native";
+}
+
+contract ERC165 is Dummy {
+ function supportsInterface(bytes4 interfaceID)
+ external
+ view
+ returns (bool)
+ {
+ require(false, stub_error);
+ interfaceID;
+ return true;
+ }
+}
+
+// Inline
+contract ERC20Events {
+ event Transfer(address indexed from, address indexed to, uint256 value);
+ event Approval(
+ address indexed owner,
+ address indexed spender,
+ uint256 value
+ );
+}
+
+// Selector: 942e8b22
+contract ERC20 is Dummy, ERC165, ERC20Events {
+ // Selector: name() 06fdde03
+ function name() public view returns (string memory) {
+ require(false, stub_error);
+ dummy;
+ return "";
+ }
+
+ // Selector: symbol() 95d89b41
+ function symbol() public view returns (string memory) {
+ require(false, stub_error);
+ dummy;
+ return "";
+ }
+
+ // Selector: totalSupply() 18160ddd
+ function totalSupply() public view returns (uint256) {
+ require(false, stub_error);
+ dummy;
+ return 0;
+ }
+
+ // Selector: decimals() 313ce567
+ function decimals() public view returns (uint8) {
+ require(false, stub_error);
+ dummy;
+ return 0;
+ }
+
+ // Selector: balanceOf(address) 70a08231
+ function balanceOf(address owner) public view returns (uint256) {
+ require(false, stub_error);
+ owner;
+ dummy;
+ return 0;
+ }
+
+ // Selector: transfer(address,uint256) a9059cbb
+ function transfer(address to, uint256 amount) public returns (bool) {
+ require(false, stub_error);
+ to;
+ amount;
+ dummy = 0;
+ return false;
+ }
+
+ // Selector: transferFrom(address,address,uint256) 23b872dd
+ function transferFrom(
+ address from,
+ address to,
+ uint256 amount
+ ) public returns (bool) {
+ require(false, stub_error);
+ from;
+ to;
+ amount;
+ dummy = 0;
+ return false;
+ }
+
+ // Selector: approve(address,uint256) 095ea7b3
+ function approve(address spender, uint256 amount) public returns (bool) {
+ require(false, stub_error);
+ spender;
+ amount;
+ dummy = 0;
+ return false;
+ }
+
+ // Selector: allowance(address,address) dd62ed3e
+ function allowance(address owner, address spender)
+ public
+ view
+ returns (uint256)
+ {
+ require(false, stub_error);
+ owner;
+ spender;
+ dummy;
+ return 0;
+ }
+}
+
+// Selector: ab8deb37
+contract ERC20UniqueExtensions is Dummy, ERC165 {
+ // Selector: burnFrom(address,uint256) 79cc6790
+ function burnFrom(address from, uint256 amount) public returns (bool) {
+ require(false, stub_error);
+ from;
+ amount;
+ dummy = 0;
+ return false;
+ }
+
+ // Selector: repartition(uint256) d2418ca7
+ function repartition(uint256 amount) public returns (bool) {
+ require(false, stub_error);
+ amount;
+ dummy = 0;
+ return false;
+ }
+}
+
+contract UniqueRefungibleToken is Dummy, ERC165, ERC20, ERC20UniqueExtensions {}
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
@@ -24,7 +24,7 @@
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
-// http://www.apache.org/licenses/LICENSE-2.0
+// <http://www.apache.org/licenses/LICENSE-2.0>
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -32,27 +32,36 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-//! # Schedulerdo_reschedule
+//! # Unique scheduler
+//! A Pallet for scheduling dispatches.
+//!
+//! - [`Config`]
+//! - [`Call`]
+//! - [`Pallet`]
+//!
+//! ## Overview
//!
//! This Pallet exposes capabilities for scheduling dispatches to occur at a
//! specified block number or at a specified period. These scheduled dispatches
-//! may be named or anonymous and may be canceled.
+//! should be named and may be canceled.
//!
-//! **NOTE:** The scheduled calls will be dispatched with the default filter
-//! for the origin: namely `frame_system::Config::BaseCallFilter` for all origin
-//! except root which will get no filter. And not the filter contained in origin
-//! use to call `fn schedule`.
+//! **NOTE:** The unique scheduler is designed for deferred transaction calls by block number.
+//! Any user can book a call of a certain transaction to a specific block number.
+//! Also possible to book a call with a certain frequency.
//!
-//! If a call is scheduled using proxy or whatever mecanism which adds filter,
-//! then those filter will not be used when dispatching the schedule call.
+//! Key differences from the original pallet:
+//! <https://crates.io/crates/pallet-scheduler>
+//! Schedule Id restricted by 16 bytes. Identificator for booked call.
+//! Priority limited by HARD DEADLINE (<= 63). Calls over maximum weight don't include to block.
+//! The maximum weight that may be scheduled per block for any dispatchables of less priority than `schedule::HARD_DEADLINE`.
+//! Maybe_periodic limit is 100 calls. Reserved for future sponsored transaction support.
+//! At 100 calls reserved amount is not so much and this is avoid potential problems with balance locks.
+//! Any account allowed to schedule any calls. Account withdraw implemented through default transaction logic.
//!
//! ## Interface
//!
//! ### Dispatchable Functions
//!
-//! * `schedule` - schedule a dispatch, which may be periodic, to occur at a specified block and
-//! with a specified priority.
-//! * `cancel` - cancel a scheduled dispatch, specified by block number and index.
//! * `schedule_named` - augments the `schedule` interface with an additional `Vec<u8>` parameter
//! that can be used for identification.
//! * `cancel_named` - the named complement to the cancel function.
@@ -258,7 +267,7 @@
/// A Scheduler-Runtime interface for finer payment handling.
pub trait DispatchCall<T: frame_system::Config + Config, SelfContainedSignedInfo> {
- /// Reserve the maximum spendings on a call.
+ /// Reserve (lock) the maximum spendings on a call, calculated from its weight and the repetition count.
fn reserve_balance(
id: ScheduledId,
sponsor: <T as frame_system::Config>::AccountId,
@@ -266,7 +275,7 @@
count: u32,
) -> Result<(), DispatchError>;
- /// Pay for call dispatch (un-reserve) from the reserved funds, returning the change.
+ /// Unreserve (unlock) a certain amount from the payer's reserved funds, returning the change.
fn pay_for_call(
id: ScheduledId,
sponsor: <T as frame_system::Config>::AccountId,
@@ -282,7 +291,7 @@
TransactionValidityError,
>;
- /// Release reserved funds.
+ /// Release unspent reserved funds in case of a schedule cancel.
fn cancel_reserve(
id: ScheduledId,
sponsor: <T as frame_system::Config>::AccountId,
@@ -441,6 +450,8 @@
// );
// }
+ // Execute transaction via chain default pipeline
+ // That means dispatch will be processed like any user's extrinsic e.g. transaction fees will be taken
let r = T::CallExecutor::dispatch_call(sender, call.clone());
let mut actual_call_weight: Weight = item_weight;
@@ -485,8 +496,8 @@
Agenda::<T>::append(wake, Some(s));
}
}
+ // Total weight should be 0, because the transaction is already paid for
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
@@ -563,8 +563,14 @@
#[cfg_attr(feature = "serde1", serde(with = "bounded::vec_serde"))]
#[derivative(Debug(format_with = "bounded::vec_debug"))]
pub const_data: BoundedVec<u8, CustomDataLimit>,
+
/// Number of pieces the RFT is split into
pub pieces: u128,
+
+ /// Key-value pairs used to describe the token as metadata
+ #[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)]
@@ -601,6 +607,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,
}
/// Explicit item creation data with meta parameters, namely the owner.
primitives/rpc/CHANGELOG.mddiffbeforeafterboth--- /dev/null
+++ b/primitives/rpc/CHANGELOG.md
@@ -0,0 +1,10 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [0.1.1] - 2022-07-14
+
+### Added
+
+ - Implementation of RPC method `token_owners` returning 10 owners in no particular order.
+ This was an internal request to improve the web interface and support fractionalization event.
\ No newline at end of file
primitives/rpc/Cargo.tomldiffbeforeafterboth--- a/primitives/rpc/Cargo.toml
+++ b/primitives/rpc/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "up-rpc"
-version = "0.1.0"
+version = "0.1.1"
license = "GPLv3"
edition = "2021"
primitives/rpc/src/lib.rsdiffbeforeafterboth--- a/primitives/rpc/src/lib.rs
+++ b/primitives/rpc/src/lib.rs
@@ -81,5 +81,6 @@
fn next_sponsored(collection: CollectionId, account: CrossAccountId, token: TokenId) -> Result<Option<u64>>;
fn effective_collection_limits(collection_id: CollectionId) -> Result<Option<CollectionLimits>>;
fn total_pieces(collection_id: CollectionId, token_id: TokenId) -> Result<Option<u128>>;
+ fn token_owners(collection: CollectionId, token: TokenId) -> Result<Vec<CrossAccountId>>;
}
}
runtime/common/CHANGELOG.mddiffbeforeafterboth--- /dev/null
+++ b/runtime/common/CHANGELOG.md
@@ -0,0 +1,13 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [0.9.25] - 2022-07-14
+
+### Added
+
+ - Implementation of RPC method `token_owners` returning 10 owners in no particular order.
+ This was an internal request to improve the web interface and support fractionalization event.
+
+
+
\ No newline at end of file
runtime/common/src/dispatch.rsdiffbeforeafterboth--- a/runtime/common/src/dispatch.rs
+++ b/runtime/common/src/dispatch.rs
@@ -25,7 +25,9 @@
pub use pallet_common::dispatch::CollectionDispatch;
use pallet_fungible::{Pallet as PalletFungible, FungibleHandle};
use pallet_nonfungible::{Pallet as PalletNonfungible, NonfungibleHandle};
-use pallet_refungible::{Pallet as PalletRefungible, RefungibleHandle, erc::RefungibleTokenHandle};
+use pallet_refungible::{
+ Pallet as PalletRefungible, RefungibleHandle, erc_token::RefungibleTokenHandle,
+};
use up_data_structs::{
CollectionMode, CreateCollectionData, MAX_DECIMAL_POINTS, mapping::TokenAddressMapping,
};
runtime/common/src/runtime_apis.rsdiffbeforeafterboth--- a/runtime/common/src/runtime_apis.rs
+++ b/runtime/common/src/runtime_apis.rs
@@ -40,6 +40,11 @@
fn token_owner(collection: CollectionId, token: TokenId) -> Result<Option<CrossAccountId>, DispatchError> {
dispatch_unique_runtime!(collection.token_owner(token))
}
+
+ fn token_owners(collection: CollectionId, token: TokenId) -> Result<Vec::<CrossAccountId>, DispatchError> {
+ dispatch_unique_runtime!(collection.token_owners(token))
+ }
+
fn topmost_token_owner(collection: CollectionId, token: TokenId) -> Result<Option<CrossAccountId>, DispatchError> {
let budget = up_data_structs::budget::Value::new(10);
runtime/tests/src/tests.rsdiffbeforeafterboth--- a/runtime/tests/src/tests.rs
+++ b/runtime/tests/src/tests.rs
@@ -64,6 +64,12 @@
CreateReFungibleData {
const_data: vec![1, 2, 3].try_into().unwrap(),
pieces: 1023,
+ properties: vec![Property {
+ key: b"test-prop".to_vec().try_into().unwrap(),
+ value: b"test-nft-prop".to_vec().try_into().unwrap(),
+ }]
+ .try_into()
+ .unwrap(),
}
}
tests/CHANGELOG.mddiffbeforeafterboth--- /dev/null
+++ b/tests/CHANGELOG.md
@@ -0,0 +1,11 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## 2022-07-14
+
+### Added
+ - Integrintegration tests of RPC method `token_owners`.
+ - Integrintegration tests of Fungible Pallet.
+
+
\ No newline at end of file
tests/package.jsondiffbeforeafterboth--- a/tests/package.json
+++ b/tests/package.json
@@ -80,6 +80,8 @@
"testLimits": "mocha --timeout 9999999 -r ts-node/register ./**/limits.test.ts",
"testEthCreateCollection": "mocha --timeout 9999999 -r ts-node/register ./**/eth/createCollection.test.ts",
"testRFT": "mocha --timeout 9999999 -r ts-node/register ./**/refungible.test.ts",
+ "testFT": "mocha --timeout 9999999 -r ts-node/register ./**/fungible.test.ts",
+ "testRPC": "mocha --timeout 9999999 -r ts-node/register ./**/rpc.test.ts",
"polkadot-types-fetch-metadata": "curl -H 'Content-Type: application/json' -d '{\"id\":\"1\", \"jsonrpc\":\"2.0\", \"method\": \"state_getMetadata\", \"params\":[]}' http://localhost:9933 > src/interfaces/metadata.json",
"polkadot-types-from-defs": "ts-node ./node_modules/.bin/polkadot-types-from-defs --endpoint src/interfaces/metadata.json --input src/interfaces/ --package .",
"polkadot-types-from-chain": "ts-node ./node_modules/.bin/polkadot-types-from-chain --endpoint src/interfaces/metadata.json --output src/interfaces/ --package .",
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/api/UniqueRefungibleToken.soldiffbeforeafterboth--- /dev/null
+++ b/tests/src/eth/api/UniqueRefungibleToken.sol
@@ -0,0 +1,76 @@
+// SPDX-License-Identifier: OTHER
+// This code is automatically generated
+
+pragma solidity >=0.8.0 <0.9.0;
+
+// Common stubs holder
+interface Dummy {
+
+}
+
+interface ERC165 is Dummy {
+ function supportsInterface(bytes4 interfaceID) external view returns (bool);
+}
+
+// Inline
+interface ERC20Events {
+ event Transfer(address indexed from, address indexed to, uint256 value);
+ event Approval(
+ address indexed owner,
+ address indexed spender,
+ uint256 value
+ );
+}
+
+// Selector: 942e8b22
+interface ERC20 is Dummy, ERC165, ERC20Events {
+ // Selector: name() 06fdde03
+ function name() external view returns (string memory);
+
+ // Selector: symbol() 95d89b41
+ function symbol() external view returns (string memory);
+
+ // Selector: totalSupply() 18160ddd
+ function totalSupply() external view returns (uint256);
+
+ // Selector: decimals() 313ce567
+ function decimals() external view returns (uint8);
+
+ // Selector: balanceOf(address) 70a08231
+ function balanceOf(address owner) external view returns (uint256);
+
+ // Selector: transfer(address,uint256) a9059cbb
+ function transfer(address to, uint256 amount) external returns (bool);
+
+ // Selector: transferFrom(address,address,uint256) 23b872dd
+ function transferFrom(
+ address from,
+ address to,
+ uint256 amount
+ ) external returns (bool);
+
+ // Selector: approve(address,uint256) 095ea7b3
+ function approve(address spender, uint256 amount) external returns (bool);
+
+ // Selector: allowance(address,address) dd62ed3e
+ function allowance(address owner, address spender)
+ external
+ view
+ returns (uint256);
+}
+
+// Selector: ab8deb37
+interface ERC20UniqueExtensions is Dummy, ERC165 {
+ // Selector: burnFrom(address,uint256) 79cc6790
+ function burnFrom(address from, uint256 amount) external returns (bool);
+
+ // Selector: repartition(uint256) d2418ca7
+ function repartition(uint256 amount) external returns (bool);
+}
+
+interface UniqueRefungibleToken is
+ Dummy,
+ ERC165,
+ ERC20,
+ ERC20UniqueExtensions
+{}
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/eth/reFungibleToken.test.tsdiffbeforeafterboth--- /dev/null
+++ b/tests/src/eth/reFungibleToken.test.ts
@@ -0,0 +1,458 @@
+// 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/>.
+
+import {approve, createCollection, createRefungibleToken, transfer, transferFrom, UNIQUE} from '../util/helpers';
+import {createEthAccount, createEthAccountWithBalance, GAS_ARGS, itWeb3, normalizeEvents, recordEthFee, recordEvents, subToEth, tokenIdToAddress, transferBalanceToEth} from './util/helpers';
+import reFungibleTokenAbi from './reFungibleTokenAbi.json';
+
+import chai from 'chai';
+import chaiAsPromised from 'chai-as-promised';
+chai.use(chaiAsPromised);
+const expect = chai.expect;
+
+describe('Refungible token: Information getting', () => {
+ itWeb3('totalSupply', async ({api, web3, privateKeyWrapper}) => {
+ const alice = privateKeyWrapper('//Alice');
+
+ const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+ const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: caller})).itemId;
+
+ const address = tokenIdToAddress(collectionId, tokenId);
+ const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: caller, ...GAS_ARGS});
+ const totalSupply = await contract.methods.totalSupply().call();
+
+ expect(totalSupply).to.equal('200');
+ });
+
+ itWeb3('balanceOf', async ({api, web3, privateKeyWrapper}) => {
+ const alice = privateKeyWrapper('//Alice');
+
+ const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+ const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: caller})).itemId;
+
+ const address = tokenIdToAddress(collectionId, tokenId);
+ const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: caller, ...GAS_ARGS});
+ const balance = await contract.methods.balanceOf(caller).call();
+
+ expect(balance).to.equal('200');
+ });
+
+ itWeb3('decimals', async ({api, web3, privateKeyWrapper}) => {
+ const alice = privateKeyWrapper('//Alice');
+
+ const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+ const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: caller})).itemId;
+
+ const address = tokenIdToAddress(collectionId, tokenId);
+ const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: caller, ...GAS_ARGS});
+ const decimals = await contract.methods.decimals().call();
+
+ expect(decimals).to.equal('0');
+ });
+});
+
+describe('Refungible: Plain calls', () => {
+ itWeb3('Can perform approve()', async ({web3, api, privateKeyWrapper}) => {
+ const alice = privateKeyWrapper('//Alice');
+
+ const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+ const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;
+
+ const address = tokenIdToAddress(collectionId, tokenId);
+
+ const spender = createEthAccount(web3);
+
+ const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+ {
+ const result = await contract.methods.approve(spender, 100).send({from: owner});
+ const events = normalizeEvents(result.events);
+
+ expect(events).to.be.deep.equal([
+ {
+ address,
+ event: 'Approval',
+ args: {
+ owner,
+ spender,
+ value: '100',
+ },
+ },
+ ]);
+ }
+
+ {
+ const allowance = await contract.methods.allowance(owner, spender).call();
+ expect(+allowance).to.equal(100);
+ }
+ });
+
+ itWeb3('Can perform transferFrom()', async ({web3, api, privateKeyWrapper}) => {
+ const alice = privateKeyWrapper('//Alice');
+
+ const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+ const owner = createEthAccount(web3);
+ await transferBalanceToEth(api, alice, owner);
+
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;
+
+ const spender = createEthAccount(web3);
+ await transferBalanceToEth(api, alice, spender);
+
+ const receiver = createEthAccount(web3);
+
+ const address = tokenIdToAddress(collectionId, tokenId);
+ const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+ await contract.methods.approve(spender, 100).send();
+
+ {
+ const result = await contract.methods.transferFrom(owner, receiver, 49).send({from: spender});
+ const events = normalizeEvents(result.events);
+ expect(events).to.be.deep.equal([
+ {
+ address,
+ event: 'Transfer',
+ args: {
+ from: owner,
+ to: receiver,
+ value: '49',
+ },
+ },
+ {
+ address,
+ event: 'Approval',
+ args: {
+ owner,
+ spender,
+ value: '51',
+ },
+ },
+ ]);
+ }
+
+ {
+ const balance = await contract.methods.balanceOf(receiver).call();
+ expect(+balance).to.equal(49);
+ }
+
+ {
+ const balance = await contract.methods.balanceOf(owner).call();
+ expect(+balance).to.equal(151);
+ }
+ });
+
+ itWeb3('Can perform transfer()', async ({web3, api, privateKeyWrapper}) => {
+ const alice = privateKeyWrapper('//Alice');
+
+ const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+ const owner = createEthAccount(web3);
+ await transferBalanceToEth(api, alice, owner);
+
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;
+
+ const receiver = createEthAccount(web3);
+ await transferBalanceToEth(api, alice, receiver);
+
+ const address = tokenIdToAddress(collectionId, tokenId);
+ const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+ {
+ const result = await contract.methods.transfer(receiver, 50).send({from: owner});
+ const events = normalizeEvents(result.events);
+ expect(events).to.be.deep.equal([
+ {
+ address,
+ event: 'Transfer',
+ args: {
+ from: owner,
+ to: receiver,
+ value: '50',
+ },
+ },
+ ]);
+ }
+
+ {
+ const balance = await contract.methods.balanceOf(owner).call();
+ expect(+balance).to.equal(150);
+ }
+
+ {
+ const balance = await contract.methods.balanceOf(receiver).call();
+ expect(+balance).to.equal(50);
+ }
+ });
+
+ itWeb3('Can perform repartition()', async ({web3, api, privateKeyWrapper}) => {
+ const alice = privateKeyWrapper('//Alice');
+
+ const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+ const owner = createEthAccount(web3);
+ await transferBalanceToEth(api, alice, owner);
+
+ const receiver = createEthAccount(web3);
+ await transferBalanceToEth(api, alice, receiver);
+
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n, {Ethereum: owner})).itemId;
+
+ const address = tokenIdToAddress(collectionId, tokenId);
+ const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+ await contract.methods.repartition(200).send({from: owner});
+ expect(+await contract.methods.balanceOf(owner).call()).to.be.equal(200);
+ await contract.methods.transfer(receiver, 110).send({from: owner});
+ expect(+await contract.methods.balanceOf(owner).call()).to.be.equal(90);
+ expect(+await contract.methods.balanceOf(receiver).call()).to.be.equal(110);
+
+ await expect(contract.methods.repartition(80).send({from: owner})).to.eventually.be.rejected;
+
+ await contract.methods.transfer(receiver, 90).send({from: owner});
+ expect(+await contract.methods.balanceOf(owner).call()).to.be.equal(0);
+ expect(+await contract.methods.balanceOf(receiver).call()).to.be.equal(200);
+
+ await contract.methods.repartition(150).send({from: receiver});
+ await expect(contract.methods.transfer(owner, 160).send({from: receiver})).to.eventually.be.rejected;
+ expect(+await contract.methods.balanceOf(receiver).call()).to.be.equal(150);
+ });
+
+ itWeb3('Can repartition with increased amount', async ({web3, api, privateKeyWrapper}) => {
+ const alice = privateKeyWrapper('//Alice');
+
+ const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+ const owner = createEthAccount(web3);
+ await transferBalanceToEth(api, alice, owner);
+
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n, {Ethereum: owner})).itemId;
+
+ const address = tokenIdToAddress(collectionId, tokenId);
+ const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+ const result = await contract.methods.repartition(200).send();
+ const events = normalizeEvents(result.events);
+
+ expect(events).to.deep.equal([
+ {
+ address,
+ event: 'Transfer',
+ args: {
+ from: '0x0000000000000000000000000000000000000000',
+ to: owner,
+ value: '100',
+ },
+ },
+ ]);
+ });
+
+ itWeb3('Can repartition with decreased amount', async ({web3, api, privateKeyWrapper}) => {
+ const alice = privateKeyWrapper('//Alice');
+
+ const collectionId = (await createCollection(api, alice, {name: 'token name', mode: {type: 'ReFungible'}})).collectionId;
+
+ const owner = createEthAccount(web3);
+ await transferBalanceToEth(api, alice, owner);
+
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n, {Ethereum: owner})).itemId;
+
+ const address = tokenIdToAddress(collectionId, tokenId);
+ const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+ const result = await contract.methods.repartition(50).send();
+ const events = normalizeEvents(result.events);
+ expect(events).to.deep.equal([
+ {
+ address,
+ event: 'Transfer',
+ args: {
+ from: owner,
+ to: '0x0000000000000000000000000000000000000000',
+ value: '50',
+ },
+ },
+ ]);
+ });
+});
+
+describe('Refungible: Fees', () => {
+ itWeb3('approve() call fee is less than 0.2UNQ', async ({web3, api, privateKeyWrapper}) => {
+ const alice = privateKeyWrapper('//Alice');
+
+ const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+
+ const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+ const spender = createEthAccount(web3);
+
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;
+
+ const address = tokenIdToAddress(collectionId, tokenId);
+ const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+ const cost = await recordEthFee(api, owner, () => contract.methods.approve(spender, 100).send({from: owner}));
+ expect(cost < BigInt(0.2 * Number(UNIQUE)));
+ });
+
+ itWeb3('transferFrom() call fee is less than 0.2UNQ', async ({web3, api, privateKeyWrapper}) => {
+ const alice = privateKeyWrapper('//Alice');
+
+ const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+
+ const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+ const spender = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;
+
+ const address = tokenIdToAddress(collectionId, tokenId);
+ const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+ await contract.methods.approve(spender, 100).send({from: owner});
+
+ const cost = await recordEthFee(api, spender, () => contract.methods.transferFrom(owner, spender, 100).send({from: spender}));
+ expect(cost < BigInt(0.2 * Number(UNIQUE)));
+ });
+
+ itWeb3('transfer() call fee is less than 0.2UNQ', async ({web3, api, privateKeyWrapper}) => {
+ const alice = privateKeyWrapper('//Alice');
+
+ const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+
+ const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+ const receiver = createEthAccount(web3);
+
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n, {Ethereum: owner})).itemId;
+
+ const address = tokenIdToAddress(collectionId, tokenId);
+ const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: owner, ...GAS_ARGS});
+
+ const cost = await recordEthFee(api, owner, () => contract.methods.transfer(receiver, 100).send({from: owner}));
+ expect(cost < BigInt(0.2 * Number(UNIQUE)));
+ });
+});
+
+describe('Refungible: Substrate calls', () => {
+ itWeb3('Events emitted for approve()', async ({web3, api, privateKeyWrapper}) => {
+ const alice = privateKeyWrapper('//Alice');
+
+ const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+
+ const receiver = createEthAccount(web3);
+
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n)).itemId;
+
+ const address = tokenIdToAddress(collectionId, tokenId);
+ const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address);
+
+ const events = await recordEvents(contract, async () => {
+ expect(await approve(api, collectionId, tokenId, alice, {Ethereum: receiver}, 100n)).to.be.true;
+ });
+
+ expect(events).to.be.deep.equal([
+ {
+ address,
+ event: 'Approval',
+ args: {
+ owner: subToEth(alice.address),
+ spender: receiver,
+ value: '100',
+ },
+ },
+ ]);
+ });
+
+ itWeb3('Events emitted for transferFrom()', async ({web3, api, privateKeyWrapper}) => {
+ const alice = privateKeyWrapper('//Alice');
+
+ const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+ const bob = privateKeyWrapper('//Bob');
+
+ const receiver = createEthAccount(web3);
+
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n)).itemId;
+ expect(await approve(api, collectionId, tokenId, alice, bob.address, 100n)).to.be.true;
+
+ const address = tokenIdToAddress(collectionId, tokenId);
+ const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address);
+
+ const events = await recordEvents(contract, async () => {
+ expect(await transferFrom(api, collectionId, tokenId, bob, alice, {Ethereum: receiver}, 51n)).to.be.true;
+ });
+
+ expect(events).to.be.deep.equal([
+ {
+ address,
+ event: 'Transfer',
+ args: {
+ from: subToEth(alice.address),
+ to: receiver,
+ value: '51',
+ },
+ },
+ {
+ address,
+ event: 'Approval',
+ args: {
+ owner: subToEth(alice.address),
+ spender: subToEth(bob.address),
+ value: '49',
+ },
+ },
+ ]);
+ });
+
+ itWeb3('Events emitted for transfer()', async ({web3, api, privateKeyWrapper}) => {
+ const alice = privateKeyWrapper('//Alice');
+
+ const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+
+ const receiver = createEthAccount(web3);
+
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 200n)).itemId;
+
+ const address = tokenIdToAddress(collectionId, tokenId);
+ const contract = new web3.eth.Contract(reFungibleTokenAbi as any, address);
+
+ const events = await recordEvents(contract, async () => {
+ expect(await transfer(api, collectionId, tokenId, alice, {Ethereum: receiver}, 51n)).to.be.true;
+ });
+
+ expect(events).to.be.deep.equal([
+ {
+ address,
+ event: 'Transfer',
+ args: {
+ from: subToEth(alice.address),
+ to: receiver,
+ value: '51',
+ },
+ },
+ ]);
+ });
+});
tests/src/eth/reFungibleTokenAbi.jsondiffbeforeafterboth--- /dev/null
+++ b/tests/src/eth/reFungibleTokenAbi.json
@@ -0,0 +1,158 @@
+[
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ { "internalType": "address", "name": "owner", "type": "address" },
+ { "internalType": "address", "name": "spender", "type": "address" }
+ ],
+ "name": "allowance",
+ "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ { "internalType": "address", "name": "spender", "type": "address" },
+ { "internalType": "uint256", "name": "amount", "type": "uint256" }
+ ],
+ "name": "approve",
+ "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ { "internalType": "address", "name": "owner", "type": "address" }
+ ],
+ "name": "balanceOf",
+ "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ { "internalType": "address", "name": "from", "type": "address" },
+ { "internalType": "uint256", "name": "amount", "type": "uint256" }
+ ],
+ "name": "burnFrom",
+ "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ { "internalType": "uint256", "name": "amount", "type": "uint256" }
+ ],
+ "name": "repartition",
+ "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" }
+ ],
+ "name": "supportsInterface",
+ "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ { "internalType": "address", "name": "to", "type": "address" },
+ { "internalType": "uint256", "name": "amount", "type": "uint256" }
+ ],
+ "name": "transfer",
+ "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ { "internalType": "address", "name": "from", "type": "address" },
+ { "internalType": "address", "name": "to", "type": "address" },
+ { "internalType": "uint256", "name": "amount", "type": "uint256" }
+ ],
+ "name": "transferFrom",
+ "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+]
tests/src/fungible.test.tsdiffbeforeafterboth--- /dev/null
+++ b/tests/src/fungible.test.ts
@@ -0,0 +1,184 @@
+// 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/>.
+
+import {default as usingApi} from './substrate/substrate-api';
+import {IKeyringPair} from '@polkadot/types/types';
+import {
+ getBalance,
+ createMultipleItemsExpectSuccess,
+ isTokenExists,
+ getLastTokenId,
+ getAllowance,
+ approve,
+ transferFrom,
+ createCollection,
+ transfer,
+ burnItem,
+ normalizeAccountId,
+ CrossAccountId,
+ createFungibleItemExpectSuccess,
+ U128_MAX,
+ burnFromExpectSuccess,
+} from './util/helpers';
+
+import chai from 'chai';
+import chaiAsPromised from 'chai-as-promised';
+chai.use(chaiAsPromised);
+const expect = chai.expect;
+
+let alice: IKeyringPair;
+let bob: IKeyringPair;
+
+describe('integration test: Fungible functionality:', () => {
+ before(async () => {
+ await usingApi(async (api, privateKeyWrapper) => {
+ alice = privateKeyWrapper('//Alice');
+ bob = privateKeyWrapper('//Bob');
+ });
+ });
+
+ it('Create fungible collection and token', async () => {
+ await usingApi(async api => {
+ const createCollectionResult = await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}});
+ expect(createCollectionResult.success).to.be.true;
+ const collectionId = createCollectionResult.collectionId;
+ const defaultTokenId = await getLastTokenId(api, collectionId);
+ const aliceTokenId = await createFungibleItemExpectSuccess(alice, collectionId, {Value: U128_MAX}, alice.address);
+ const aliceBalance = await getBalance(api, collectionId, alice, aliceTokenId);
+ const itemCountAfter = await getLastTokenId(api, collectionId);
+
+ // What to expect
+ // tslint:disable-next-line:no-unused-expression
+ expect(itemCountAfter).to.be.equal(defaultTokenId);
+ expect(aliceBalance).to.be.equal(U128_MAX);
+ });
+ });
+
+ it('RPC method tokenOnewrs for fungible collection and token', async () => {
+ await usingApi(async (api, privateKeyWrapper) => {
+ const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'};
+ const facelessCrowd = Array.from(Array(7).keys()).map(i => normalizeAccountId(privateKeyWrapper(i.toString())));
+
+ const createCollectionResult = await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}});
+ const collectionId = createCollectionResult.collectionId;
+ const aliceTokenId = await createFungibleItemExpectSuccess(alice, collectionId, {Value: U128_MAX}, alice.address);
+
+ await transfer(api, collectionId, aliceTokenId, alice, bob, 1000n);
+ await transfer(api, collectionId, aliceTokenId, alice, ethAcc, 900n);
+
+ for (let i = 0; i < 7; i++) {
+ await transfer(api, collectionId, aliceTokenId, alice, facelessCrowd[i], 1);
+ }
+
+ const owners = await api.rpc.unique.tokenOwners(collectionId, aliceTokenId);
+ const ids = (owners.toJSON() as CrossAccountId[]).map(s => normalizeAccountId(s));
+ const aliceID = normalizeAccountId(alice);
+ const bobId = normalizeAccountId(bob);
+
+ // What to expect
+ // tslint:disable-next-line:no-unused-expression
+ expect(ids).to.deep.include.members([aliceID, ethAcc, bobId, ...facelessCrowd]);
+ expect(owners.length == 10).to.be.true;
+
+ const eleven = privateKeyWrapper('11');
+ expect(await transfer(api, collectionId, aliceTokenId, alice, eleven, 10n)).to.be.true;
+ expect((await api.rpc.unique.tokenOwners(collectionId, aliceTokenId)).length).to.be.equal(10);
+ });
+ });
+
+ it('Transfer token', async () => {
+ await usingApi(async api => {
+ const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'};
+ const collectionId = (await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}})).collectionId;
+ const tokenId = await createFungibleItemExpectSuccess(alice, collectionId, {Value: 500n}, alice.address);
+
+ expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(500n);
+ expect(await transfer(api, collectionId, tokenId, alice, bob, 60n)).to.be.true;
+ expect(await transfer(api, collectionId, tokenId, alice, ethAcc, 140n)).to.be.true;
+
+ expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(300n);
+ expect(await getBalance(api, collectionId, bob, tokenId)).to.be.equal(60n);
+ expect(await getBalance(api, collectionId, ethAcc, tokenId)).to.be.equal(140n);
+ await expect(transfer(api, collectionId, tokenId, alice, bob, 350n)).to.eventually.be.rejected;
+ });
+ });
+
+ it('Tokens multiple creation', async () => {
+ await usingApi(async api => {
+ const collectionId = (await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}})).collectionId;
+
+ const args = [
+ {Fungible: {Value: 500n}},
+ {Fungible: {Value: 400n}},
+ {Fungible: {Value: 300n}},
+ ];
+
+ await createMultipleItemsExpectSuccess(alice, collectionId, args);
+ expect(await getBalance(api, collectionId, alice, 0)).to.be.equal(1200n);
+ });
+ });
+
+ it('Burn some tokens ', async () => {
+ await usingApi(async api => {
+ const collectionId = (await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}})).collectionId;
+ const tokenId = (await createFungibleItemExpectSuccess(alice, collectionId, {Value: 500n}, alice.address));
+ expect(await isTokenExists(api, collectionId, tokenId)).to.be.true;
+ expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(500n);
+ expect(await burnItem(api, alice, collectionId, tokenId, 499n)).to.be.true;
+ expect(await isTokenExists(api, collectionId, tokenId)).to.be.true;
+ expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(1n);
+ });
+ });
+
+ it('Burn all tokens ', async () => {
+ await usingApi(async api => {
+ const collectionId = (await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}})).collectionId;
+ const tokenId = (await createFungibleItemExpectSuccess(alice, collectionId, {Value: 500n}, alice.address));
+ expect(await isTokenExists(api, collectionId, tokenId)).to.be.true;
+ expect(await burnItem(api, alice, collectionId, tokenId, 500n)).to.be.true;
+ expect(await isTokenExists(api, collectionId, tokenId)).to.be.true;
+
+ expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(0n);
+ expect((await api.rpc.unique.totalPieces(collectionId, tokenId)).value.toBigInt()).to.be.equal(0n);
+ });
+ });
+
+ it('Set allowance for token', async () => {
+ await usingApi(async api => {
+ const collectionId = (await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}})).collectionId;
+ const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'};
+
+ const tokenId = (await createFungibleItemExpectSuccess(alice, collectionId, {Value: 100n}, alice.address));
+ expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(100n);
+
+ expect(await approve(api, collectionId, tokenId, alice, bob, 60n)).to.be.true;
+ expect(await getAllowance(api, collectionId, alice, bob, tokenId)).to.be.equal(60n);
+ expect(await getBalance(api, collectionId, bob, tokenId)).to.be.equal(0n);
+
+ expect(await transferFrom(api, collectionId, tokenId, bob, alice, bob, 20n)).to.be.true;
+ expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(80n);
+ expect(await getBalance(api, collectionId, bob, tokenId)).to.be.equal(20n);
+ expect(await getAllowance(api, collectionId, alice, bob, tokenId)).to.be.equal(40n);
+
+ await burnFromExpectSuccess(bob, alice, collectionId, tokenId, 10n);
+
+ expect(await getBalance(api, collectionId, alice, tokenId)).to.be.equal(70n);
+ expect(await getAllowance(api, collectionId, alice, bob, tokenId)).to.be.equal(30n);
+ expect(await transferFrom(api, collectionId, tokenId, bob, alice, ethAcc, 10n)).to.be.true;
+ expect(await getBalance(api, collectionId, ethAcc, tokenId)).to.be.equal(10n);
+ });
+ });
+});
tests/src/interfaces/augment-api-consts.tsdiffbeforeafterboth--- a/tests/src/interfaces/augment-api-consts.ts
+++ b/tests/src/interfaces/augment-api-consts.ts
@@ -29,7 +29,13 @@
[key: string]: Codec;
};
common: {
+ /**
+ * Maximum admins per collection.
+ **/
collectionAdminsLimit: u32 & AugmentedConst<ApiType>;
+ /**
+ * Set price to create a collection.
+ **/
collectionCreationPrice: u128 & AugmentedConst<ApiType>;
/**
* Generic const
tests/src/interfaces/augment-api-errors.tsdiffbeforeafterboth--- a/tests/src/interfaces/augment-api-errors.ts
+++ b/tests/src/interfaces/augment-api-errors.ts
@@ -285,7 +285,7 @@
**/
FungibleItemsDontHaveData: AugmentedError<ApiType>;
/**
- * Not default id passed as TokenId argument.
+ * Fungible tokens hold no ID, and the default value of TokenId for Fungible collection is 0.
**/
FungibleItemsHaveNoId: AugmentedError<ApiType>;
/**
@@ -596,7 +596,7 @@
};
unique: {
/**
- * Decimal_points parameter must be lower than MAX_DECIMAL_POINTS constant, currently it is 30.
+ * Decimal_points parameter must be lower than [`up_data_structs::MAX_DECIMAL_POINTS`].
**/
CollectionDecimalPointLimitExceeded: AugmentedError<ApiType>;
/**
@@ -608,7 +608,7 @@
**/
EmptyArgument: AugmentedError<ApiType>;
/**
- * Repertition is only supported by refungible collection
+ * Repertition is only supported by refungible collection.
**/
RepartitionCalledOnNonRefungibleCollection: AugmentedError<ApiType>;
/**
tests/src/interfaces/augment-api-events.tsdiffbeforeafterboth--- a/tests/src/interfaces/augment-api-events.ts
+++ b/tests/src/interfaces/augment-api-events.ts
@@ -59,114 +59,47 @@
};
common: {
/**
- * Sponsoring allowance was approved.
- *
- * # Arguments
- *
- * * collection_id - todo:doc flesh out
- * * item_id
- * * sender
- * * spender
- * * amount
+ * Amount pieces of token owned by `sender` was approved for `spender`.
**/
Approved: AugmentedEvent<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
/**
* New collection was created
- *
- * # Arguments
- *
- * * collection_id - Globally unique identifier of newly created collection.
- * * mode - [CollectionMode] converted into u8.
- * * account_id - Collection owner.
**/
CollectionCreated: AugmentedEvent<ApiType, [u32, u8, AccountId32]>;
/**
* New collection was destroyed
- *
- * # Arguments
- *
- * * collection_id - Globally unique identifier of collection that has been destroyed.
**/
CollectionDestroyed: AugmentedEvent<ApiType, [u32]>;
/**
- * Collection property was deleted.
- *
- * # Arguments
- *
- * * collection_id - ID of the collection, whose property was just deleted.
- * * property_key - Key of the property that was just deleted.
+ * The property has been deleted.
**/
CollectionPropertyDeleted: AugmentedEvent<ApiType, [u32, Bytes]>;
/**
- * Collection property was added or edited.
- *
- * # Arguments
- *
- * * collection_id - ID of the collection, whose property was just set.
- * * property_key - Key of the property that was just set.
+ * The colletion property has been added or edited.
**/
CollectionPropertySet: AugmentedEvent<ApiType, [u32, Bytes]>;
/**
* New item was created.
- *
- * # Arguments
- *
- * * collection_id - ID of the collection where the item was created.
- * * item_id - ID of the item. Unique within the collection.
- * * recipient - Owner of the newly created item.
- * * amount - The amount of tokens that were created (always 1 for NFT).
**/
ItemCreated: AugmentedEvent<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
/**
* Collection item was burned.
- *
- * # Arguments
- *
- * * collection_id - Identifier of the collection to which the burned NFT belonged.
- * * item_id - Identifier of burned NFT.
- * * owner - Which user has destroyed their tokens.
- * * amount - Amount of tokens that were destroyed (always 1 for NFT).
**/
ItemDestroyed: AugmentedEvent<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
/**
- * Token property permission was added or updated for a collection.
- *
- * # Arguments
- *
- * * collection_id - ID of the collection, whose permissions were just set/updated.
- * * property_key - Key of the property of the set/updated permission.
+ * The token property permission of a collection has been set.
**/
PropertyPermissionSet: AugmentedEvent<ApiType, [u32, Bytes]>;
/**
- * Item property was deleted.
- *
- * # Arguments
- *
- * * collection_id - ID of the collection, whose token's property was just deleted.
- * * item_id - ID of the item, whose property was just deleted.
- * * property_key - Key of the property that was just deleted.
+ * The token property has been deleted.
**/
TokenPropertyDeleted: AugmentedEvent<ApiType, [u32, u32, Bytes]>;
/**
- * Item property was added or edited.
- *
- * # Arguments
- *
- * * collection_id - ID of the collection, whose token's property was just set.
- * * item_id - ID of the item, whose property was just set.
- * * property_key - Key of the property that was just set.
+ * The token property has been added or edited.
**/
TokenPropertySet: AugmentedEvent<ApiType, [u32, u32, Bytes]>;
/**
- * Item was transferred.
- *
- * # Arguments
- *
- * * collection_id - ID of the collection to which the item belongs.
- * * item_id - ID of the item transferred.
- * * sender - Original owner of the item.
- * * recipient - New owner of the item.
- * * amount - Amount of tokens that were transferred (always 1 for NFT).
+ * Item was transferred
**/
Transfer: AugmentedEvent<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
/**
@@ -569,94 +502,77 @@
* Address was added to the allow list
*
* # Arguments
- *
- * * collection_id: Globally unique collection identifier.
- *
- * * user: Address.
+ * * collection_id: ID of the affected collection.
+ * * user: Address of the added account.
**/
AllowListAddressAdded: AugmentedEvent<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
/**
* Address was removed from the allow list
*
* # Arguments
- *
- * * collection_id: Globally unique collection identifier.
- *
- * * user: Address.
+ * * collection_id: ID of the affected collection.
+ * * user: Address of the removed account.
**/
AllowListAddressRemoved: AugmentedEvent<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
/**
* Collection admin was added
*
* # Arguments
- *
- * * collection_id: Globally unique collection identifier.
- *
- * * admin: Admin address.
+ * * collection_id: ID of the affected collection.
+ * * admin: Admin address.
**/
CollectionAdminAdded: AugmentedEvent<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
/**
* Collection admin was removed
*
* # Arguments
- *
- * * collection_id: Globally unique collection identifier.
- *
- * * admin: Admin address.
+ * * collection_id: ID of the affected collection.
+ * * admin: Removed admin address.
**/
CollectionAdminRemoved: AugmentedEvent<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
/**
* Collection limits were set
*
* # Arguments
- *
- * * collection_id: Globally unique collection identifier.
+ * * collection_id: ID of the affected collection.
**/
CollectionLimitSet: AugmentedEvent<ApiType, [u32]>;
/**
* Collection owned was changed
*
* # Arguments
- *
- * * collection_id: Globally unique collection identifier.
- *
- * * owner: New owner address.
+ * * collection_id: ID of the affected collection.
+ * * owner: New owner address.
**/
CollectionOwnedChanged: AugmentedEvent<ApiType, [u32, AccountId32]>;
/**
* Collection permissions were set
*
* # Arguments
- *
- * * collection_id: Globally unique collection identifier.
+ * * collection_id: ID of the affected collection.
**/
CollectionPermissionSet: AugmentedEvent<ApiType, [u32]>;
/**
* Collection sponsor was removed
*
* # Arguments
- *
- * * collection_id: Globally unique collection identifier.
+ * * collection_id: ID of the affected collection.
**/
CollectionSponsorRemoved: AugmentedEvent<ApiType, [u32]>;
/**
* Collection sponsor was set
*
* # Arguments
- *
- * * collection_id: Globally unique collection identifier.
- *
- * * owner: New sponsor address.
+ * * collection_id: ID of the affected collection.
+ * * owner: New sponsor address.
**/
CollectionSponsorSet: AugmentedEvent<ApiType, [u32, AccountId32]>;
/**
* New sponsor was confirm
*
* # Arguments
- *
- * * collection_id: Globally unique collection identifier.
- *
- * * sponsor: New sponsor address.
+ * * collection_id: ID of the affected collection.
+ * * sponsor: New sponsor address.
**/
SponsorshipConfirmed: AugmentedEvent<ApiType, [u32, AccountId32]>;
/**
tests/src/interfaces/augment-api-query.tsdiffbeforeafterboth--- a/tests/src/interfaces/augment-api-query.ts
+++ b/tests/src/interfaces/augment-api-query.ts
@@ -70,39 +70,39 @@
};
common: {
/**
- * Amount of collection admins
+ * Storage of the amount of collection admins.
**/
adminAmount: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<u32>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
/**
- * Allowlisted collection users
+ * Allowlisted collection users.
**/
allowlist: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<bool>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
/**
- * Collection info
+ * Storage of collection info.
**/
collectionById: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<Option<UpDataStructsCollection>>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
/**
- * Collection properties
+ * Storage of collection properties.
**/
collectionProperties: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<UpDataStructsProperties>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
/**
- * Token permissions of a collection
+ * Storage of token property permissions of a collection.
**/
collectionPropertyPermissions: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<BTreeMap<Bytes, UpDataStructsPropertyPermission>>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
/**
- * The number of created collections. Essentially contains the last collection ID.
+ * Storage of the count of created collections. Essentially contains the last collection ID.
**/
createdCollectionCount: AugmentedQuery<ApiType, () => Observable<u32>, []> & QueryableStorageEntry<ApiType, []>;
/**
- * The number of destroyed collections
+ * Storage of the count of deleted collections.
**/
destroyedCollectionCount: AugmentedQuery<ApiType, () => Observable<u32>, []> & QueryableStorageEntry<ApiType, []>;
/**
- * Not used by code, exists only to provide some types to metadata
+ * Not used by code, exists only to provide some types to metadata.
**/
dummyStorageValue: AugmentedQuery<ApiType, () => Observable<Option<ITuple<[UpDataStructsCollectionStats, u32, u32, UpDataStructsTokenChild, PhantomTypeUpDataStructs]>>>, []> & QueryableStorageEntry<ApiType, []>;
/**
- * List of collection admins
+ * List of collection admins.
**/
isAdmin: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<bool>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
/**
@@ -200,7 +200,7 @@
};
fungible: {
/**
- * todo:doc
+ * Storage for assets delegated to a limited extent to other users.
**/
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]>;
/**
@@ -244,11 +244,11 @@
};
nonfungible: {
/**
- * Amount of tokens owned in a collection.
+ * Amount of tokens owned by an account in a collection.
**/
accountBalance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u32>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
/**
- * todo:doc
+ * Allowance set by a token owner for another user to perform one of certain transactions on a token.
**/
allowance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<Option<PalletEvmAccountBasicCrossAccountIdRepr>>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
/**
@@ -256,7 +256,15 @@
**/
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]>;
/**
- * Scoped, auxiliary properties of a token, primarily used for on-chain operations.
+ * Custom data of a token that is serialized to bytes,
+ * primarily reserved for on-chain operations,
+ * normally obscured from the external users.
+ *
+ * Auxiliary properties are slightly different from
+ * usual [`TokenProperties`] due to an unlimited number
+ * and separately stored and written-to key-value pairs.
+ *
+ * Currently used to store RMRK data.
**/
tokenAuxProperties: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array, arg3: UpDataStructsPropertyScope | 'None' | 'Rmrk' | number | Uint8Array, arg4: Bytes | string | Uint8Array) => Observable<Option<Bytes>>, [u32, u32, UpDataStructsPropertyScope, Bytes]> & QueryableStorageEntry<ApiType, [u32, u32, UpDataStructsPropertyScope, Bytes]>;
/**
@@ -268,7 +276,7 @@
**/
tokenData: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<Option<PalletNonfungibleItemData>>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
/**
- * Key-value pairs, describing the metadata of a token.
+ * Map of key-value pairs, describing the metadata of a token.
**/
tokenProperties: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<UpDataStructsProperties>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
/**
@@ -447,11 +455,11 @@
**/
accountBalance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u32>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
/**
- * todo:doc
+ * Allowance set by a token owner for another user to perform one of certain transactions on a number of pieces of 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 pieces of a token owned by an account.
+ * 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]>;
/**
@@ -463,6 +471,10 @@
**/
tokenData: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<PalletRefungibleItemData>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
/**
+ * Amount of pieces a refungible token is split into.
+ **/
+ tokenProperties: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<UpDataStructsProperties>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
+ /**
* Amount of tokens burnt in a collection.
**/
tokensBurnt: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<u32>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
@@ -471,7 +483,7 @@
**/
tokensMinted: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<u32>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
/**
- * Amount of pieces a refungible token is split into.
+ * 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]>;
/**
tests/src/interfaces/augment-api-rpc.tsdiffbeforeafterboth--- a/tests/src/interfaces/augment-api-rpc.ts
+++ b/tests/src/interfaces/augment-api-rpc.ts
@@ -673,6 +673,10 @@
**/
collectionTokens: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<u32>>>;
/**
+ * Get token constant metadata
+ **/
+ constMetadata: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Bytes>>;
+ /**
* Get effective collection limits
**/
effectiveCollectionLimits: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<UpDataStructsCollectionLimits>>>;
@@ -705,6 +709,10 @@
**/
tokenOwner: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<PalletEvmAccountBasicCrossAccountIdRepr>>>;
/**
+ * Returns 10 tokens owners in no particular order
+ **/
+ tokenOwners: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletEvmAccountBasicCrossAccountIdRepr>>>;
+ /**
* Get token properties, optionally limited to the provided keys
**/
tokenProperties: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, propertyKeys?: Vec<Text> | (Text | string)[], at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsProperty>>>;
@@ -720,6 +728,10 @@
* Get the amount of distinctive tokens present in a collection
**/
totalSupply: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u32>>;
+ /**
+ * Get token variable metadata
+ **/
+ variableMetadata: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Bytes>>;
};
web3: {
/**
tests/src/interfaces/augment-api-tx.tsdiffbeforeafterboth--- a/tests/src/interfaces/augment-api-tx.ts
+++ b/tests/src/interfaces/augment-api-tx.ts
@@ -730,18 +730,22 @@
};
unique: {
/**
- * Adds an admin of the collection.
- * NFT Collection can be controlled by multiple admin addresses (some which can also be servers, for example). Admins can issue and burn NFTs, as well as add and remove other admins, but cannot change NFT or Collection ownership.
+ * Add an admin to a collection.
+ *
+ * NFT Collection can be controlled by multiple admin addresses
+ * (some which can also be servers, for example). Admins can issue
+ * and burn NFTs, as well as add and remove other admins,
+ * but cannot change NFT or Collection ownership.
*
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
+ * * Collection owner
+ * * Collection admin
*
* # Arguments
*
- * * collection_id - ID of the Collection to add admin for.
- * * new_admin - Address of new admin to add.
+ * * `collection_id`: ID of the Collection to add an admin for.
+ * * `new_admin`: Address of new admin to add.
**/
addCollectionAdmin: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newAdmin: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
/**
@@ -749,61 +753,76 @@
*
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
+ * * Collection owner
+ * * Collection admin
*
* # Arguments
*
- * * collection_id.
- * * address.
+ * * `collection_id`: ID of the modified collection.
+ * * `address`: ID of the address to be added to the allowlist.
**/
addToAllowList: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, address: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
/**
- * Set, change, or remove approved address to transfer the ownership of the NFT.
+ * Allow a non-permissioned address to transfer or burn an item.
*
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
- * * Current NFT owner
+ * * Collection owner
+ * * Collection admin
+ * * Current item owner
*
* # Arguments
*
- * * approved - Address that is approved to transfer this NFT or zero (if needed to remove approval).
- * * collection_id.
- * * item_id - ID of the item.
+ * * `spender`: Account to be approved to make specific transactions on non-owned tokens.
+ * * `collection_id`: ID of the collection the item belongs to.
+ * * `item_id`: ID of the item transactions on which are now approved.
+ * * `amount`: Number of pieces of the item approved for a transaction (maximum of 1 for NFTs).
+ * Set to 0 to revoke the approval.
**/
approve: AugmentedSubmittable<(spender: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, amount: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletEvmAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
/**
- * Destroy a concrete instance of NFT on behalf of the owner.
- * See also: [`approve`]
+ * Destroy a token on behalf of the owner as a non-owner account.
+ *
+ * See also: [`approve`][`Pallet::approve`].
+ *
+ * After this method executes, one approval is removed from the total so that
+ * the approved address will not be able to transfer this item again from this owner.
*
* # Permissions
*
- * * Collection Owner.
- * * Collection Admin.
- * * Current NFT Owner.
+ * * Collection owner
+ * * Collection admin
+ * * Current token owner
+ * * Address approved by current item owner
*
* # Arguments
*
- * * collection_id - ID of the collection.
- * * item_id - ID of NFT to burn.
- * * from - The owner of the item from whom it is taken away.
+ * * `from`: The owner of the burning item.
+ * * `collection_id`: ID of the collection to which the item belongs.
+ * * `item_id`: ID of item to burn.
+ * * `value`: Number of pieces to burn.
+ * * Non-Fungible Mode: An NFT is indivisible, there is always 1 corresponding to an ID.
+ * * Fungible Mode: The desired number of pieces to burn.
+ * * Re-Fungible Mode: The desired number of pieces to burn.
**/
burnFrom: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, from: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, u32, u128]>;
/**
- * Destroy a concrete instance of NFT.
+ * Destroy an item.
*
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
- * * Current NFT Owner
+ * * Collection owner
+ * * Collection admin
+ * * Current item owner
*
* # Arguments
*
- * * collection_id - ID of the collection.
- * * item_id - ID of NFT to burn.
+ * * `collection_id`: ID of the collection to which the item belongs.
+ * * `item_id`: ID of item to burn.
+ * * `value`: Number of pieces of the item to destroy.
+ * * Non-Fungible Mode: An NFT is indivisible, there is always 1 corresponding to an ID.
+ * * Fungible Mode: The desired number of pieces to burn.
+ * * Re-Fungible Mode: The desired number of pieces to burn.
**/
burnItem: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, u128]>;
/**
@@ -811,108 +830,126 @@
*
* # Permissions
*
- * * Collection Owner
+ * * Collection owner
*
* # Arguments
*
- * * collection_id.
- * * new_owner.
+ * * `collection_id`: ID of the modified collection.
+ * * `new_owner`: ID of the account that will become the owner.
**/
changeCollectionOwner: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newOwner: AccountId32 | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, AccountId32]>;
/**
- * Confirm own sponsorship of a collection.
+ * Confirm own sponsorship of a collection, becoming the sponsor.
*
+ * An invitation must be pending, see [`set_collection_sponsor`][`Pallet::set_collection_sponsor`].
+ * Sponsor can pay the fees of a transaction instead of the sender,
+ * but only within specified limits.
+ *
* # Permissions
*
* * Sponsor-to-be
*
* # Arguments
*
- * * collection_id.
+ * * `collection_id`: ID of the collection with the pending sponsor.
**/
confirmSponsorship: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;
/**
- * This method creates a Collection of NFTs. Each Token may have multiple properties encoded as an array of bytes of certain length. The initial owner of the collection is set to the address that signed the transaction and can be changed later.
+ * Create a collection of tokens.
+ *
+ * Each Token may have multiple properties encoded as an array of bytes
+ * of certain length. The initial owner of the collection is set
+ * to the address that signed the transaction and can be changed later.
*
+ * Prefer the more advanced [`create_collection_ex`][`Pallet::create_collection_ex`] instead.
+ *
* # Permissions
*
- * * Anyone.
+ * * Anyone - becomes the owner of the new collection.
*
* # Arguments
*
- * * collection_name: UTF-16 string with collection name (limit 64 characters), will be stored as zero-terminated.
- * * collection_description - UTF-16 string with collection description (limit 256 characters), will be stored as zero-terminated.
- * * token_prefix - UTF-8 string with token prefix.
- * * mode - [CollectionMode] collection type and type dependent data.
+ * * `collection_name`: Wide-character string with collection name
+ * (limit [`MAX_COLLECTION_NAME_LENGTH`]).
+ * * `collection_description`: Wide-character string with collection description
+ * (limit [`MAX_COLLECTION_DESCRIPTION_LENGTH`]).
+ * * `token_prefix`: Byte string containing the token prefix to mark a collection
+ * to which a token belongs (limit [`MAX_TOKEN_PREFIX_LENGTH`]).
+ * * `mode`: Type of items stored in the collection and type dependent data.
**/
createCollection: AugmentedSubmittable<(collectionName: Vec<u16> | (u16 | AnyNumber | Uint8Array)[], collectionDescription: Vec<u16> | (u16 | AnyNumber | Uint8Array)[], tokenPrefix: Bytes | string | Uint8Array, mode: UpDataStructsCollectionMode | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Vec<u16>, Vec<u16>, Bytes, UpDataStructsCollectionMode]>;
/**
* Create a collection with explicit parameters.
- * Prefer it to the deprecated [`created_collection`] method.
*
+ * Prefer it to the deprecated [`create_collection`][`Pallet::create_collection`] method.
+ *
* # Permissions
*
- * * Anyone.
+ * * Anyone - becomes the owner of the new collection.
*
* # Arguments
*
- * * data: explicit create-collection data.
+ * * `data`: Explicit data of a collection used for its creation.
**/
createCollectionEx: AugmentedSubmittable<(data: UpDataStructsCreateCollectionData | { mode?: any; access?: any; name?: any; description?: any; tokenPrefix?: any; pendingSponsor?: any; limits?: any; permissions?: any; tokenPropertyPermissions?: any; properties?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [UpDataStructsCreateCollectionData]>;
/**
- * Create a concrete instance of NFT Collection created with CreateCollection method.
+ * Mint an item within a collection.
+ *
+ * A collection must exist first, see [`create_collection_ex`][`Pallet::create_collection_ex`].
*
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
+ * * Collection owner
+ * * Collection admin
* * Anyone if
* * Allow List is enabled, and
* * Address is added to allow list, and
- * * MintPermission is enabled (see SetMintPermission method)
+ * * MintPermission is enabled (see [`set_collection_permissions`][`Pallet::set_collection_permissions`])
*
* # Arguments
*
- * * collection_id - ID of the collection.
- * * owner - Address, initial owner of the NFT.
- * * data - Token data to store on chain.
+ * * `collection_id`: ID of the collection to which an item would belong.
+ * * `owner`: Address of the initial owner of the item.
+ * * `data`: Token data describing the item to store on chain.
**/
createItem: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, owner: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, data: UpDataStructsCreateItemData | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, UpDataStructsCreateItemData]>;
/**
- * Create multiple items in a collection created with CreateCollection method.
+ * Create multiple items within a collection.
+ *
+ * A collection must exist first, see [`create_collection_ex`][`Pallet::create_collection_ex`].
*
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
+ * * Collection owner
+ * * Collection admin
* * Anyone if
* * Allow List is enabled, and
- * * Address is added to allow list, and
- * * MintPermission is enabled (see SetMintPermission method)
+ * * Address is added to the allow list, and
+ * * MintPermission is enabled (see [`set_collection_permissions`][`Pallet::set_collection_permissions`])
*
* # Arguments
*
- * * collection_id - ID of the collection.
- * * owner - Address, initial owner of the NFT.
- * * items_data - Array items properties. Each property is an array of bytes itself, see [`create_item`].
+ * * `collection_id`: ID of the collection to which the tokens would belong.
+ * * `owner`: Address of the initial owner of the tokens.
+ * * `items_data`: Vector of data describing each item to be created.
**/
createMultipleItems: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, owner: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, itemsData: Vec<UpDataStructsCreateItemData> | (UpDataStructsCreateItemData | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, Vec<UpDataStructsCreateItemData>]>;
/**
- * Create multiple items inside a collection with explicitly specified initial parameters.
+ * Create multiple items within a collection with explicitly specified initial parameters.
*
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
+ * * Collection owner
+ * * Collection admin
* * Anyone if
* * Allow List is enabled, and
* * Address is added to allow list, and
- * * MintPermission is enabled (see SetMintPermission method)
+ * * MintPermission is enabled (see [`set_collection_permissions`][`Pallet::set_collection_permissions`])
*
* # Arguments
*
- * * collection_id - ID of the collection.
- * * data - Explicit item creation data.
+ * * `collection_id`: ID of the collection to which the tokens would belong.
+ * * `data`: Explicit item creation data.
**/
createMultipleItemsEx: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, data: UpDataStructsCreateItemExData | { NFT: any } | { Fungible: any } | { RefungibleMultipleItems: any } | { RefungibleMultipleOwners: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsCreateItemExData]>;
/**
@@ -925,63 +962,68 @@
*
* # Arguments
*
- * * collection_id.
- * * property_keys - Vector of keys of the properties to be deleted.
+ * * `collection_id`: ID of the modified collection.
+ * * `property_keys`: Vector of keys of the properties to be deleted.
+ * Keys support Latin letters, `-`, `_`, and `.` as symbols.
**/
deleteCollectionProperties: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, propertyKeys: Vec<Bytes> | (Bytes | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, Vec<Bytes>]>;
/**
- * Delete specified token properties.
+ * Delete specified token properties. Currently properties only work with NFTs.
*
* # Permissions
*
* * Depends on collection's token property permissions and specified property mutability:
- * * Collection Owner
- * * Collection Admin
- * * Token Owner
+ * * Collection owner
+ * * Collection admin
+ * * Token owner
*
* # Arguments
*
- * * collection_id.
- * * token_id.
- * * property_keys - Vector of keys of the properties to be deleted.
+ * * `collection_id`: ID of the collection to which the token belongs.
+ * * `token_id`: ID of the modified token.
+ * * `property_keys`: Vector of keys of the properties to be deleted.
+ * Keys support Latin letters, `-`, `_`, and `.` as symbols.
**/
deleteTokenProperties: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, propertyKeys: Vec<Bytes> | (Bytes | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, u32, Vec<Bytes>]>;
/**
- * Destroy the collection if no tokens exist within.
+ * Destroy a collection if no tokens exist within.
*
* # Permissions
*
- * * Collection Owner
+ * * Collection owner
*
* # Arguments
*
- * * collection_id - collection to destroy.
+ * * `collection_id`: Collection to destroy.
**/
destroyCollection: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;
/**
- * Remove admin address of the Collection. An admin address can remove itself. List of admins may become empty, in which case only Collection Owner will be able to add an Admin.
+ * Remove admin of a collection.
+ *
+ * An admin address can remove itself. List of admins may become empty,
+ * in which case only Collection Owner will be able to add an Admin.
*
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
+ * * Collection owner
+ * * Collection admin
*
* # Arguments
*
- * * collection_id - ID of the Collection to remove admin for.
- * * account_id - Address of admin to remove.
+ * * `collection_id`: ID of the collection to remove the admin for.
+ * * `account_id`: Address of the admin to remove.
**/
removeCollectionAdmin: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, accountId: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
/**
- * Switch back to pay-per-own-transaction model.
+ * Remove a collection's a sponsor, making everyone pay for their own transactions.
*
* # Permissions
*
- * * Collection Owner
+ * * Collection owner
*
* # Arguments
*
- * * collection_id.
+ * * `collection_id`: ID of the collection with the sponsor to remove.
**/
removeCollectionSponsor: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;
/**
@@ -989,27 +1031,27 @@
*
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
+ * * Collection owner
+ * * Collection admin
*
* # Arguments
*
- * * collection_id.
- * * address.
+ * * `collection_id`: ID of the modified collection.
+ * * `address`: ID of the address to be removed from the allowlist.
**/
removeFromAllowList: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, address: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
/**
- * Re-partition a refungible token, while owning all of its parts.
+ * Re-partition a refungible token, while owning all of its parts/pieces.
*
* # Permissions
*
- * * Token Owner (must own every part)
+ * * Token owner (must own every part)
*
* # Arguments
*
- * * collection_id.
- * * token_id - ID of the RFT.
- * * amount - New number of parts into which the token shall be partitioned.
+ * * `collection_id`: ID of the collection the RFT belongs to.
+ * * `token_id`: ID of the RFT.
+ * * `amount`: New number of parts/pieces into which the token shall be partitioned.
**/
repartition: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, amount: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, u128]>;
/**
@@ -1017,13 +1059,14 @@
*
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
+ * * Collection owner
+ * * Collection admin
*
* # Arguments
*
- * * collection_id.
- * * new_limit - New limits of the collection. They will overwrite the current ones.
+ * * `collection_id`: ID of the modified collection.
+ * * `new_limit`: New limits of the collection. Fields that are not set (None)
+ * will not overwrite the old ones.
**/
setCollectionLimits: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newLimit: UpDataStructsCollectionLimits | { accountTokenOwnershipLimit?: any; sponsoredDataSize?: any; sponsoredDataRateLimit?: any; tokenLimit?: any; sponsorTransferTimeout?: any; sponsorApproveTimeout?: any; ownerCanTransfer?: any; ownerCanDestroy?: any; transfersEnabled?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsCollectionLimits]>;
/**
@@ -1031,13 +1074,14 @@
*
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
+ * * Collection owner
+ * * Collection admin
*
* # Arguments
*
- * * collection_id.
- * * new_permission - New permissions of the collection. They will overwrite the current ones.
+ * * `collection_id`: ID of the modified collection.
+ * * `new_permission`: New permissions of the collection. Fields that are not set (None)
+ * will not overwrite the old ones.
**/
setCollectionPermissions: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newPermission: UpDataStructsCollectionPermissions | { access?: any; mintMode?: any; nesting?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsCollectionPermissions]>;
/**
@@ -1045,71 +1089,82 @@
*
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
+ * * Collection owner
+ * * Collection admin
*
* # Arguments
*
- * * collection_id.
- * * properties - Vector of key-value pairs stored as the collection's metadata. Keys support Latin letters, `-`, `_`, and `.` as symbols.
+ * * `collection_id`: ID of the modified collection.
+ * * `properties`: Vector of key-value pairs stored as the collection's metadata.
+ * Keys support Latin letters, `-`, `_`, and `.` as symbols.
**/
setCollectionProperties: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, properties: Vec<UpDataStructsProperty> | (UpDataStructsProperty | { key?: any; value?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, Vec<UpDataStructsProperty>]>;
/**
- * Set (invite) a new collection sponsor. If successful, confirmation from the sponsor-to-be will be pending.
+ * Set (invite) a new collection sponsor.
+ *
+ * If successful, confirmation from the sponsor-to-be will be pending.
*
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
+ * * Collection owner
+ * * Collection admin
*
* # Arguments
*
- * * collection_id.
- * * new_sponsor.
+ * * `collection_id`: ID of the modified collection.
+ * * `new_sponsor`: ID of the account of the sponsor-to-be.
**/
setCollectionSponsor: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newSponsor: AccountId32 | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, AccountId32]>;
/**
* Add or change token properties according to collection's permissions.
+ * Currently properties only work with NFTs.
*
* # Permissions
*
* * Depends on collection's token property permissions and specified property mutability:
- * * Collection Owner
- * * Collection Admin
- * * Token Owner
+ * * Collection owner
+ * * Collection admin
+ * * Token owner
+ *
+ * See [`set_token_property_permissions`][`Pallet::set_token_property_permissions`].
*
* # Arguments
*
- * * collection_id.
- * * token_id.
- * * properties - Vector of key-value pairs stored as the token's metadata. Keys support Latin letters, `-`, `_`, and `.` as symbols.
+ * * `collection_id: ID of the collection to which the token belongs.
+ * * `token_id`: ID of the modified token.
+ * * `properties`: Vector of key-value pairs stored as the token's metadata.
+ * Keys support Latin letters, `-`, `_`, and `.` as symbols.
**/
setTokenProperties: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, properties: Vec<UpDataStructsProperty> | (UpDataStructsProperty | { key?: any; value?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, u32, Vec<UpDataStructsProperty>]>;
/**
* Add or change token property permissions of a collection.
*
+ * Without a permission for a particular key, a property with that key
+ * cannot be created in a token.
+ *
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
+ * * Collection owner
+ * * Collection admin
*
* # Arguments
*
- * * collection_id.
- * * property_permissions - Vector of permissions for property keys. Keys support Latin letters, `-`, `_`, and `.` as symbols.
+ * * `collection_id`: ID of the modified collection.
+ * * `property_permissions`: Vector of permissions for property keys.
+ * Keys support Latin letters, `-`, `_`, and `.` as symbols.
**/
setTokenPropertyPermissions: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, propertyPermissions: Vec<UpDataStructsPropertyKeyPermission> | (UpDataStructsPropertyKeyPermission | { key?: any; permission?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, Vec<UpDataStructsPropertyKeyPermission>]>;
/**
- * Set transfers_enabled value for particular collection.
+ * Completely allow or disallow transfers for a particular collection.
*
* # Permissions
*
- * * Collection Owner
+ * * Collection owner
*
* # Arguments
*
- * * collection_id - ID of the collection.
- * * value - New flag value.
+ * * `collection_id`: ID of the collection.
+ * * `value`: New value of the flag, are transfers allowed?
**/
setTransfersEnabledFlag: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, value: bool | boolean | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, bool]>;
/**
@@ -1117,44 +1172,50 @@
*
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
- * * Current NFT owner
+ * * Collection owner
+ * * Collection admin
+ * * Current token owner
*
* # Arguments
*
- * * recipient - Address of token recipient.
- *
- * * collection_id.
- *
- * * item_id - ID of the item
+ * * `recipient`: Address of token recipient.
+ * * `collection_id`: ID of the collection the item belongs to.
+ * * `item_id`: ID of the item.
* * Non-Fungible Mode: Required.
* * Fungible Mode: Ignored.
* * Re-Fungible Mode: Required.
*
- * * value - Amount to transfer.
- * * Non-Fungible Mode: Ignored
- * * Fungible Mode: Must specify transferred amount
- * * Re-Fungible Mode: Must specify transferred portion (between 0 and 1)
+ * * `value`: Amount to transfer.
+ * * Non-Fungible Mode: An NFT is indivisible, there is always 1 corresponding to an ID.
+ * * Fungible Mode: The desired number of pieces to transfer.
+ * * Re-Fungible Mode: The desired number of pieces to transfer.
**/
transfer: AugmentedSubmittable<(recipient: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletEvmAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
/**
- * Change ownership of a NFT on behalf of the owner. See Approve method for additional information. After this method executes, the approval is removed so that the approved address will not be able to transfer this NFT again from this owner.
+ * Change ownership of an item on behalf of the owner as a non-owner account.
+ *
+ * See the [`approve`][`Pallet::approve`] method for additional information.
+ *
+ * After this method executes, one approval is removed from the total so that
+ * the approved address will not be able to transfer this item again from this owner.
*
* # Permissions
*
- * * Collection Owner
- * * Collection Admin
- * * Current NFT owner
- * * Address approved by current NFT owner
+ * * Collection owner
+ * * Collection admin
+ * * Current item owner
+ * * Address approved by current item owner
*
* # Arguments
*
- * * from - Address that currently owns the token.
- * * recipient - Address of the new token-owner-to-be.
- * * collection_id.
- * * item_id - ID of the item to be transferred.
- * * value - Amount to transfer.
+ * * `from`: Address that currently owns the token.
+ * * `recipient`: Address of the new token-owner-to-be.
+ * * `collection_id`: ID of the collection the item.
+ * * `item_id`: ID of the item to be transferred.
+ * * `value`: Amount to transfer.
+ * * Non-Fungible Mode: An NFT is indivisible, there is always 1 corresponding to an ID.
+ * * Fungible Mode: The desired number of pieces to transfer.
+ * * Re-Fungible Mode: The desired number of pieces to transfer.
**/
transferFrom: AugmentedSubmittable<(from: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, recipient: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
/**
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 newAdmin: 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 newPermission: UpDataStructsCollectionPermissions;1501 } & Struct;1502 readonly isRepartition: boolean;1503 readonly asRepartition: {1504 readonly collectionId: u32;1505 readonly tokenId: 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 module1// 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 newAdmin: 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 newPermission: UpDataStructsCollectionPermissions;1501 } & Struct;1502 readonly isRepartition: boolean;1503 readonly asRepartition: {1504 readonly collectionId: u32;1505 readonly tokenId: 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 readonly properties: Vec<UpDataStructsProperty>;1633 }16341635 /** @name UpDataStructsCreateItemExData (193) */1636 export interface UpDataStructsCreateItemExData extends Enum {1637 readonly isNft: boolean;1638 readonly asNft: Vec<UpDataStructsCreateNftExData>;1639 readonly isFungible: boolean;1640 readonly asFungible: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;1641 readonly isRefungibleMultipleItems: boolean;1642 readonly asRefungibleMultipleItems: Vec<UpDataStructsCreateRefungibleExData>;1643 readonly isRefungibleMultipleOwners: boolean;1644 readonly asRefungibleMultipleOwners: UpDataStructsCreateRefungibleExData;1645 readonly type: 'Nft' | 'Fungible' | 'RefungibleMultipleItems' | 'RefungibleMultipleOwners';1646 }16471648 /** @name UpDataStructsCreateNftExData (195) */1649 export interface UpDataStructsCreateNftExData extends Struct {1650 readonly properties: Vec<UpDataStructsProperty>;1651 readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1652 }16531654 /** @name UpDataStructsCreateRefungibleExData (202) */1655 export interface UpDataStructsCreateRefungibleExData extends Struct {1656 readonly constData: Bytes;1657 readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;1658 readonly properties: Vec<UpDataStructsProperty>;1659 }16601661 /** @name PalletUniqueSchedulerCall (204) */1662 export interface PalletUniqueSchedulerCall extends Enum {1663 readonly isScheduleNamed: boolean;1664 readonly asScheduleNamed: {1665 readonly id: U8aFixed;1666 readonly when: u32;1667 readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1668 readonly priority: u8;1669 readonly call: FrameSupportScheduleMaybeHashed;1670 } & Struct;1671 readonly isCancelNamed: boolean;1672 readonly asCancelNamed: {1673 readonly id: U8aFixed;1674 } & Struct;1675 readonly isScheduleNamedAfter: boolean;1676 readonly asScheduleNamedAfter: {1677 readonly id: U8aFixed;1678 readonly after: u32;1679 readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1680 readonly priority: u8;1681 readonly call: FrameSupportScheduleMaybeHashed;1682 } & Struct;1683 readonly type: 'ScheduleNamed' | 'CancelNamed' | 'ScheduleNamedAfter';1684 }16851686 /** @name FrameSupportScheduleMaybeHashed (206) */1687 export interface FrameSupportScheduleMaybeHashed extends Enum {1688 readonly isValue: boolean;1689 readonly asValue: Call;1690 readonly isHash: boolean;1691 readonly asHash: H256;1692 readonly type: 'Value' | 'Hash';1693 }16941695 /** @name PalletTemplateTransactionPaymentCall (207) */1696 export type PalletTemplateTransactionPaymentCall = Null;16971698 /** @name PalletStructureCall (208) */1699 export type PalletStructureCall = Null;17001701 /** @name PalletRmrkCoreCall (209) */1702 export interface PalletRmrkCoreCall extends Enum {1703 readonly isCreateCollection: boolean;1704 readonly asCreateCollection: {1705 readonly metadata: Bytes;1706 readonly max: Option<u32>;1707 readonly symbol: Bytes;1708 } & Struct;1709 readonly isDestroyCollection: boolean;1710 readonly asDestroyCollection: {1711 readonly collectionId: u32;1712 } & Struct;1713 readonly isChangeCollectionIssuer: boolean;1714 readonly asChangeCollectionIssuer: {1715 readonly collectionId: u32;1716 readonly newIssuer: MultiAddress;1717 } & Struct;1718 readonly isLockCollection: boolean;1719 readonly asLockCollection: {1720 readonly collectionId: u32;1721 } & Struct;1722 readonly isMintNft: boolean;1723 readonly asMintNft: {1724 readonly owner: Option<AccountId32>;1725 readonly collectionId: u32;1726 readonly recipient: Option<AccountId32>;1727 readonly royaltyAmount: Option<Permill>;1728 readonly metadata: Bytes;1729 readonly transferable: bool;1730 readonly resources: Option<Vec<RmrkTraitsResourceResourceTypes>>;1731 } & Struct;1732 readonly isBurnNft: boolean;1733 readonly asBurnNft: {1734 readonly collectionId: u32;1735 readonly nftId: u32;1736 readonly maxBurns: u32;1737 } & Struct;1738 readonly isSend: boolean;1739 readonly asSend: {1740 readonly rmrkCollectionId: u32;1741 readonly rmrkNftId: u32;1742 readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1743 } & Struct;1744 readonly isAcceptNft: boolean;1745 readonly asAcceptNft: {1746 readonly rmrkCollectionId: u32;1747 readonly rmrkNftId: u32;1748 readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1749 } & Struct;1750 readonly isRejectNft: boolean;1751 readonly asRejectNft: {1752 readonly rmrkCollectionId: u32;1753 readonly rmrkNftId: u32;1754 } & Struct;1755 readonly isAcceptResource: boolean;1756 readonly asAcceptResource: {1757 readonly rmrkCollectionId: u32;1758 readonly rmrkNftId: u32;1759 readonly resourceId: u32;1760 } & Struct;1761 readonly isAcceptResourceRemoval: boolean;1762 readonly asAcceptResourceRemoval: {1763 readonly rmrkCollectionId: u32;1764 readonly rmrkNftId: u32;1765 readonly resourceId: u32;1766 } & Struct;1767 readonly isSetProperty: boolean;1768 readonly asSetProperty: {1769 readonly rmrkCollectionId: Compact<u32>;1770 readonly maybeNftId: Option<u32>;1771 readonly key: Bytes;1772 readonly value: Bytes;1773 } & Struct;1774 readonly isSetPriority: boolean;1775 readonly asSetPriority: {1776 readonly rmrkCollectionId: u32;1777 readonly rmrkNftId: u32;1778 readonly priorities: Vec<u32>;1779 } & Struct;1780 readonly isAddBasicResource: boolean;1781 readonly asAddBasicResource: {1782 readonly rmrkCollectionId: u32;1783 readonly nftId: u32;1784 readonly resource: RmrkTraitsResourceBasicResource;1785 } & Struct;1786 readonly isAddComposableResource: boolean;1787 readonly asAddComposableResource: {1788 readonly rmrkCollectionId: u32;1789 readonly nftId: u32;1790 readonly resource: RmrkTraitsResourceComposableResource;1791 } & Struct;1792 readonly isAddSlotResource: boolean;1793 readonly asAddSlotResource: {1794 readonly rmrkCollectionId: u32;1795 readonly nftId: u32;1796 readonly resource: RmrkTraitsResourceSlotResource;1797 } & Struct;1798 readonly isRemoveResource: boolean;1799 readonly asRemoveResource: {1800 readonly rmrkCollectionId: u32;1801 readonly nftId: u32;1802 readonly resourceId: u32;1803 } & Struct;1804 readonly type: 'CreateCollection' | 'DestroyCollection' | 'ChangeCollectionIssuer' | 'LockCollection' | 'MintNft' | 'BurnNft' | 'Send' | 'AcceptNft' | 'RejectNft' | 'AcceptResource' | 'AcceptResourceRemoval' | 'SetProperty' | 'SetPriority' | 'AddBasicResource' | 'AddComposableResource' | 'AddSlotResource' | 'RemoveResource';1805 }18061807 /** @name RmrkTraitsResourceResourceTypes (215) */1808 export interface RmrkTraitsResourceResourceTypes extends Enum {1809 readonly isBasic: boolean;1810 readonly asBasic: RmrkTraitsResourceBasicResource;1811 readonly isComposable: boolean;1812 readonly asComposable: RmrkTraitsResourceComposableResource;1813 readonly isSlot: boolean;1814 readonly asSlot: RmrkTraitsResourceSlotResource;1815 readonly type: 'Basic' | 'Composable' | 'Slot';1816 }18171818 /** @name RmrkTraitsResourceBasicResource (217) */1819 export interface RmrkTraitsResourceBasicResource extends Struct {1820 readonly src: Option<Bytes>;1821 readonly metadata: Option<Bytes>;1822 readonly license: Option<Bytes>;1823 readonly thumb: Option<Bytes>;1824 }18251826 /** @name RmrkTraitsResourceComposableResource (219) */1827 export interface RmrkTraitsResourceComposableResource extends Struct {1828 readonly parts: Vec<u32>;1829 readonly base: u32;1830 readonly src: Option<Bytes>;1831 readonly metadata: Option<Bytes>;1832 readonly license: Option<Bytes>;1833 readonly thumb: Option<Bytes>;1834 }18351836 /** @name RmrkTraitsResourceSlotResource (220) */1837 export interface RmrkTraitsResourceSlotResource extends Struct {1838 readonly base: u32;1839 readonly src: Option<Bytes>;1840 readonly metadata: Option<Bytes>;1841 readonly slot: u32;1842 readonly license: Option<Bytes>;1843 readonly thumb: Option<Bytes>;1844 }18451846 /** @name RmrkTraitsNftAccountIdOrCollectionNftTuple (222) */1847 export interface RmrkTraitsNftAccountIdOrCollectionNftTuple extends Enum {1848 readonly isAccountId: boolean;1849 readonly asAccountId: AccountId32;1850 readonly isCollectionAndNftTuple: boolean;1851 readonly asCollectionAndNftTuple: ITuple<[u32, u32]>;1852 readonly type: 'AccountId' | 'CollectionAndNftTuple';1853 }18541855 /** @name PalletRmrkEquipCall (226) */1856 export interface PalletRmrkEquipCall extends Enum {1857 readonly isCreateBase: boolean;1858 readonly asCreateBase: {1859 readonly baseType: Bytes;1860 readonly symbol: Bytes;1861 readonly parts: Vec<RmrkTraitsPartPartType>;1862 } & Struct;1863 readonly isThemeAdd: boolean;1864 readonly asThemeAdd: {1865 readonly baseId: u32;1866 readonly theme: RmrkTraitsTheme;1867 } & Struct;1868 readonly isEquippable: boolean;1869 readonly asEquippable: {1870 readonly baseId: u32;1871 readonly slotId: u32;1872 readonly equippables: RmrkTraitsPartEquippableList;1873 } & Struct;1874 readonly type: 'CreateBase' | 'ThemeAdd' | 'Equippable';1875 }18761877 /** @name RmrkTraitsPartPartType (229) */1878 export interface RmrkTraitsPartPartType extends Enum {1879 readonly isFixedPart: boolean;1880 readonly asFixedPart: RmrkTraitsPartFixedPart;1881 readonly isSlotPart: boolean;1882 readonly asSlotPart: RmrkTraitsPartSlotPart;1883 readonly type: 'FixedPart' | 'SlotPart';1884 }18851886 /** @name RmrkTraitsPartFixedPart (231) */1887 export interface RmrkTraitsPartFixedPart extends Struct {1888 readonly id: u32;1889 readonly z: u32;1890 readonly src: Bytes;1891 }18921893 /** @name RmrkTraitsPartSlotPart (232) */1894 export interface RmrkTraitsPartSlotPart extends Struct {1895 readonly id: u32;1896 readonly equippable: RmrkTraitsPartEquippableList;1897 readonly src: Bytes;1898 readonly z: u32;1899 }19001901 /** @name RmrkTraitsPartEquippableList (233) */1902 export interface RmrkTraitsPartEquippableList extends Enum {1903 readonly isAll: boolean;1904 readonly isEmpty: boolean;1905 readonly isCustom: boolean;1906 readonly asCustom: Vec<u32>;1907 readonly type: 'All' | 'Empty' | 'Custom';1908 }19091910 /** @name RmrkTraitsTheme (235) */1911 export interface RmrkTraitsTheme extends Struct {1912 readonly name: Bytes;1913 readonly properties: Vec<RmrkTraitsThemeThemeProperty>;1914 readonly inherit: bool;1915 }19161917 /** @name RmrkTraitsThemeThemeProperty (237) */1918 export interface RmrkTraitsThemeThemeProperty extends Struct {1919 readonly key: Bytes;1920 readonly value: Bytes;1921 }19221923 /** @name PalletEvmCall (239) */1924 export interface PalletEvmCall extends Enum {1925 readonly isWithdraw: boolean;1926 readonly asWithdraw: {1927 readonly address: H160;1928 readonly value: u128;1929 } & Struct;1930 readonly isCall: boolean;1931 readonly asCall: {1932 readonly source: H160;1933 readonly target: H160;1934 readonly input: Bytes;1935 readonly value: U256;1936 readonly gasLimit: u64;1937 readonly maxFeePerGas: U256;1938 readonly maxPriorityFeePerGas: Option<U256>;1939 readonly nonce: Option<U256>;1940 readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1941 } & Struct;1942 readonly isCreate: boolean;1943 readonly asCreate: {1944 readonly source: H160;1945 readonly init: Bytes;1946 readonly value: U256;1947 readonly gasLimit: u64;1948 readonly maxFeePerGas: U256;1949 readonly maxPriorityFeePerGas: Option<U256>;1950 readonly nonce: Option<U256>;1951 readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1952 } & Struct;1953 readonly isCreate2: boolean;1954 readonly asCreate2: {1955 readonly source: H160;1956 readonly init: Bytes;1957 readonly salt: H256;1958 readonly value: U256;1959 readonly gasLimit: u64;1960 readonly maxFeePerGas: U256;1961 readonly maxPriorityFeePerGas: Option<U256>;1962 readonly nonce: Option<U256>;1963 readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1964 } & Struct;1965 readonly type: 'Withdraw' | 'Call' | 'Create' | 'Create2';1966 }19671968 /** @name PalletEthereumCall (245) */1969 export interface PalletEthereumCall extends Enum {1970 readonly isTransact: boolean;1971 readonly asTransact: {1972 readonly transaction: EthereumTransactionTransactionV2;1973 } & Struct;1974 readonly type: 'Transact';1975 }19761977 /** @name EthereumTransactionTransactionV2 (246) */1978 export interface EthereumTransactionTransactionV2 extends Enum {1979 readonly isLegacy: boolean;1980 readonly asLegacy: EthereumTransactionLegacyTransaction;1981 readonly isEip2930: boolean;1982 readonly asEip2930: EthereumTransactionEip2930Transaction;1983 readonly isEip1559: boolean;1984 readonly asEip1559: EthereumTransactionEip1559Transaction;1985 readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';1986 }19871988 /** @name EthereumTransactionLegacyTransaction (247) */1989 export interface EthereumTransactionLegacyTransaction extends Struct {1990 readonly nonce: U256;1991 readonly gasPrice: U256;1992 readonly gasLimit: U256;1993 readonly action: EthereumTransactionTransactionAction;1994 readonly value: U256;1995 readonly input: Bytes;1996 readonly signature: EthereumTransactionTransactionSignature;1997 }19981999 /** @name EthereumTransactionTransactionAction (248) */2000 export interface EthereumTransactionTransactionAction extends Enum {2001 readonly isCall: boolean;2002 readonly asCall: H160;2003 readonly isCreate: boolean;2004 readonly type: 'Call' | 'Create';2005 }20062007 /** @name EthereumTransactionTransactionSignature (249) */2008 export interface EthereumTransactionTransactionSignature extends Struct {2009 readonly v: u64;2010 readonly r: H256;2011 readonly s: H256;2012 }20132014 /** @name EthereumTransactionEip2930Transaction (251) */2015 export interface EthereumTransactionEip2930Transaction extends Struct {2016 readonly chainId: u64;2017 readonly nonce: U256;2018 readonly gasPrice: U256;2019 readonly gasLimit: U256;2020 readonly action: EthereumTransactionTransactionAction;2021 readonly value: U256;2022 readonly input: Bytes;2023 readonly accessList: Vec<EthereumTransactionAccessListItem>;2024 readonly oddYParity: bool;2025 readonly r: H256;2026 readonly s: H256;2027 }20282029 /** @name EthereumTransactionAccessListItem (253) */2030 export interface EthereumTransactionAccessListItem extends Struct {2031 readonly address: H160;2032 readonly storageKeys: Vec<H256>;2033 }20342035 /** @name EthereumTransactionEip1559Transaction (254) */2036 export interface EthereumTransactionEip1559Transaction extends Struct {2037 readonly chainId: u64;2038 readonly nonce: U256;2039 readonly maxPriorityFeePerGas: U256;2040 readonly maxFeePerGas: U256;2041 readonly gasLimit: U256;2042 readonly action: EthereumTransactionTransactionAction;2043 readonly value: U256;2044 readonly input: Bytes;2045 readonly accessList: Vec<EthereumTransactionAccessListItem>;2046 readonly oddYParity: bool;2047 readonly r: H256;2048 readonly s: H256;2049 }20502051 /** @name PalletEvmMigrationCall (255) */2052 export interface PalletEvmMigrationCall extends Enum {2053 readonly isBegin: boolean;2054 readonly asBegin: {2055 readonly address: H160;2056 } & Struct;2057 readonly isSetData: boolean;2058 readonly asSetData: {2059 readonly address: H160;2060 readonly data: Vec<ITuple<[H256, H256]>>;2061 } & Struct;2062 readonly isFinish: boolean;2063 readonly asFinish: {2064 readonly address: H160;2065 readonly code: Bytes;2066 } & Struct;2067 readonly type: 'Begin' | 'SetData' | 'Finish';2068 }20692070 /** @name PalletSudoEvent (258) */2071 export interface PalletSudoEvent extends Enum {2072 readonly isSudid: boolean;2073 readonly asSudid: {2074 readonly sudoResult: Result<Null, SpRuntimeDispatchError>;2075 } & Struct;2076 readonly isKeyChanged: boolean;2077 readonly asKeyChanged: {2078 readonly oldSudoer: Option<AccountId32>;2079 } & Struct;2080 readonly isSudoAsDone: boolean;2081 readonly asSudoAsDone: {2082 readonly sudoResult: Result<Null, SpRuntimeDispatchError>;2083 } & Struct;2084 readonly type: 'Sudid' | 'KeyChanged' | 'SudoAsDone';2085 }20862087 /** @name SpRuntimeDispatchError (260) */2088 export interface SpRuntimeDispatchError extends Enum {2089 readonly isOther: boolean;2090 readonly isCannotLookup: boolean;2091 readonly isBadOrigin: boolean;2092 readonly isModule: boolean;2093 readonly asModule: SpRuntimeModuleError;2094 readonly isConsumerRemaining: boolean;2095 readonly isNoProviders: boolean;2096 readonly isTooManyConsumers: boolean;2097 readonly isToken: boolean;2098 readonly asToken: SpRuntimeTokenError;2099 readonly isArithmetic: boolean;2100 readonly asArithmetic: SpRuntimeArithmeticError;2101 readonly isTransactional: boolean;2102 readonly asTransactional: SpRuntimeTransactionalError;2103 readonly type: 'Other' | 'CannotLookup' | 'BadOrigin' | 'Module' | 'ConsumerRemaining' | 'NoProviders' | 'TooManyConsumers' | 'Token' | 'Arithmetic' | 'Transactional';2104 }21052106 /** @name SpRuntimeModuleError (261) */2107 export interface SpRuntimeModuleError extends Struct {2108 readonly index: u8;2109 readonly error: U8aFixed;2110 }21112112 /** @name SpRuntimeTokenError (262) */2113 export interface SpRuntimeTokenError extends Enum {2114 readonly isNoFunds: boolean;2115 readonly isWouldDie: boolean;2116 readonly isBelowMinimum: boolean;2117 readonly isCannotCreate: boolean;2118 readonly isUnknownAsset: boolean;2119 readonly isFrozen: boolean;2120 readonly isUnsupported: boolean;2121 readonly type: 'NoFunds' | 'WouldDie' | 'BelowMinimum' | 'CannotCreate' | 'UnknownAsset' | 'Frozen' | 'Unsupported';2122 }21232124 /** @name SpRuntimeArithmeticError (263) */2125 export interface SpRuntimeArithmeticError extends Enum {2126 readonly isUnderflow: boolean;2127 readonly isOverflow: boolean;2128 readonly isDivisionByZero: boolean;2129 readonly type: 'Underflow' | 'Overflow' | 'DivisionByZero';2130 }21312132 /** @name SpRuntimeTransactionalError (264) */2133 export interface SpRuntimeTransactionalError extends Enum {2134 readonly isLimitReached: boolean;2135 readonly isNoLayer: boolean;2136 readonly type: 'LimitReached' | 'NoLayer';2137 }21382139 /** @name PalletSudoError (265) */2140 export interface PalletSudoError extends Enum {2141 readonly isRequireSudo: boolean;2142 readonly type: 'RequireSudo';2143 }21442145 /** @name FrameSystemAccountInfo (266) */2146 export interface FrameSystemAccountInfo extends Struct {2147 readonly nonce: u32;2148 readonly consumers: u32;2149 readonly providers: u32;2150 readonly sufficients: u32;2151 readonly data: PalletBalancesAccountData;2152 }21532154 /** @name FrameSupportWeightsPerDispatchClassU64 (267) */2155 export interface FrameSupportWeightsPerDispatchClassU64 extends Struct {2156 readonly normal: u64;2157 readonly operational: u64;2158 readonly mandatory: u64;2159 }21602161 /** @name SpRuntimeDigest (268) */2162 export interface SpRuntimeDigest extends Struct {2163 readonly logs: Vec<SpRuntimeDigestDigestItem>;2164 }21652166 /** @name SpRuntimeDigestDigestItem (270) */2167 export interface SpRuntimeDigestDigestItem extends Enum {2168 readonly isOther: boolean;2169 readonly asOther: Bytes;2170 readonly isConsensus: boolean;2171 readonly asConsensus: ITuple<[U8aFixed, Bytes]>;2172 readonly isSeal: boolean;2173 readonly asSeal: ITuple<[U8aFixed, Bytes]>;2174 readonly isPreRuntime: boolean;2175 readonly asPreRuntime: ITuple<[U8aFixed, Bytes]>;2176 readonly isRuntimeEnvironmentUpdated: boolean;2177 readonly type: 'Other' | 'Consensus' | 'Seal' | 'PreRuntime' | 'RuntimeEnvironmentUpdated';2178 }21792180 /** @name FrameSystemEventRecord (272) */2181 export interface FrameSystemEventRecord extends Struct {2182 readonly phase: FrameSystemPhase;2183 readonly event: Event;2184 readonly topics: Vec<H256>;2185 }21862187 /** @name FrameSystemEvent (274) */2188 export interface FrameSystemEvent extends Enum {2189 readonly isExtrinsicSuccess: boolean;2190 readonly asExtrinsicSuccess: {2191 readonly dispatchInfo: FrameSupportWeightsDispatchInfo;2192 } & Struct;2193 readonly isExtrinsicFailed: boolean;2194 readonly asExtrinsicFailed: {2195 readonly dispatchError: SpRuntimeDispatchError;2196 readonly dispatchInfo: FrameSupportWeightsDispatchInfo;2197 } & Struct;2198 readonly isCodeUpdated: boolean;2199 readonly isNewAccount: boolean;2200 readonly asNewAccount: {2201 readonly account: AccountId32;2202 } & Struct;2203 readonly isKilledAccount: boolean;2204 readonly asKilledAccount: {2205 readonly account: AccountId32;2206 } & Struct;2207 readonly isRemarked: boolean;2208 readonly asRemarked: {2209 readonly sender: AccountId32;2210 readonly hash_: H256;2211 } & Struct;2212 readonly type: 'ExtrinsicSuccess' | 'ExtrinsicFailed' | 'CodeUpdated' | 'NewAccount' | 'KilledAccount' | 'Remarked';2213 }22142215 /** @name FrameSupportWeightsDispatchInfo (275) */2216 export interface FrameSupportWeightsDispatchInfo extends Struct {2217 readonly weight: u64;2218 readonly class: FrameSupportWeightsDispatchClass;2219 readonly paysFee: FrameSupportWeightsPays;2220 }22212222 /** @name FrameSupportWeightsDispatchClass (276) */2223 export interface FrameSupportWeightsDispatchClass extends Enum {2224 readonly isNormal: boolean;2225 readonly isOperational: boolean;2226 readonly isMandatory: boolean;2227 readonly type: 'Normal' | 'Operational' | 'Mandatory';2228 }22292230 /** @name FrameSupportWeightsPays (277) */2231 export interface FrameSupportWeightsPays extends Enum {2232 readonly isYes: boolean;2233 readonly isNo: boolean;2234 readonly type: 'Yes' | 'No';2235 }22362237 /** @name OrmlVestingModuleEvent (278) */2238 export interface OrmlVestingModuleEvent extends Enum {2239 readonly isVestingScheduleAdded: boolean;2240 readonly asVestingScheduleAdded: {2241 readonly from: AccountId32;2242 readonly to: AccountId32;2243 readonly vestingSchedule: OrmlVestingVestingSchedule;2244 } & Struct;2245 readonly isClaimed: boolean;2246 readonly asClaimed: {2247 readonly who: AccountId32;2248 readonly amount: u128;2249 } & Struct;2250 readonly isVestingSchedulesUpdated: boolean;2251 readonly asVestingSchedulesUpdated: {2252 readonly who: AccountId32;2253 } & Struct;2254 readonly type: 'VestingScheduleAdded' | 'Claimed' | 'VestingSchedulesUpdated';2255 }22562257 /** @name CumulusPalletXcmpQueueEvent (279) */2258 export interface CumulusPalletXcmpQueueEvent extends Enum {2259 readonly isSuccess: boolean;2260 readonly asSuccess: Option<H256>;2261 readonly isFail: boolean;2262 readonly asFail: ITuple<[Option<H256>, XcmV2TraitsError]>;2263 readonly isBadVersion: boolean;2264 readonly asBadVersion: Option<H256>;2265 readonly isBadFormat: boolean;2266 readonly asBadFormat: Option<H256>;2267 readonly isUpwardMessageSent: boolean;2268 readonly asUpwardMessageSent: Option<H256>;2269 readonly isXcmpMessageSent: boolean;2270 readonly asXcmpMessageSent: Option<H256>;2271 readonly isOverweightEnqueued: boolean;2272 readonly asOverweightEnqueued: ITuple<[u32, u32, u64, u64]>;2273 readonly isOverweightServiced: boolean;2274 readonly asOverweightServiced: ITuple<[u64, u64]>;2275 readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced';2276 }22772278 /** @name PalletXcmEvent (280) */2279 export interface PalletXcmEvent extends Enum {2280 readonly isAttempted: boolean;2281 readonly asAttempted: XcmV2TraitsOutcome;2282 readonly isSent: boolean;2283 readonly asSent: ITuple<[XcmV1MultiLocation, XcmV1MultiLocation, XcmV2Xcm]>;2284 readonly isUnexpectedResponse: boolean;2285 readonly asUnexpectedResponse: ITuple<[XcmV1MultiLocation, u64]>;2286 readonly isResponseReady: boolean;2287 readonly asResponseReady: ITuple<[u64, XcmV2Response]>;2288 readonly isNotified: boolean;2289 readonly asNotified: ITuple<[u64, u8, u8]>;2290 readonly isNotifyOverweight: boolean;2291 readonly asNotifyOverweight: ITuple<[u64, u8, u8, u64, u64]>;2292 readonly isNotifyDispatchError: boolean;2293 readonly asNotifyDispatchError: ITuple<[u64, u8, u8]>;2294 readonly isNotifyDecodeFailed: boolean;2295 readonly asNotifyDecodeFailed: ITuple<[u64, u8, u8]>;2296 readonly isInvalidResponder: boolean;2297 readonly asInvalidResponder: ITuple<[XcmV1MultiLocation, u64, Option<XcmV1MultiLocation>]>;2298 readonly isInvalidResponderVersion: boolean;2299 readonly asInvalidResponderVersion: ITuple<[XcmV1MultiLocation, u64]>;2300 readonly isResponseTaken: boolean;2301 readonly asResponseTaken: u64;2302 readonly isAssetsTrapped: boolean;2303 readonly asAssetsTrapped: ITuple<[H256, XcmV1MultiLocation, XcmVersionedMultiAssets]>;2304 readonly isVersionChangeNotified: boolean;2305 readonly asVersionChangeNotified: ITuple<[XcmV1MultiLocation, u32]>;2306 readonly isSupportedVersionChanged: boolean;2307 readonly asSupportedVersionChanged: ITuple<[XcmV1MultiLocation, u32]>;2308 readonly isNotifyTargetSendFail: boolean;2309 readonly asNotifyTargetSendFail: ITuple<[XcmV1MultiLocation, u64, XcmV2TraitsError]>;2310 readonly isNotifyTargetMigrationFail: boolean;2311 readonly asNotifyTargetMigrationFail: ITuple<[XcmVersionedMultiLocation, u64]>;2312 readonly type: 'Attempted' | 'Sent' | 'UnexpectedResponse' | 'ResponseReady' | 'Notified' | 'NotifyOverweight' | 'NotifyDispatchError' | 'NotifyDecodeFailed' | 'InvalidResponder' | 'InvalidResponderVersion' | 'ResponseTaken' | 'AssetsTrapped' | 'VersionChangeNotified' | 'SupportedVersionChanged' | 'NotifyTargetSendFail' | 'NotifyTargetMigrationFail';2313 }23142315 /** @name XcmV2TraitsOutcome (281) */2316 export interface XcmV2TraitsOutcome extends Enum {2317 readonly isComplete: boolean;2318 readonly asComplete: u64;2319 readonly isIncomplete: boolean;2320 readonly asIncomplete: ITuple<[u64, XcmV2TraitsError]>;2321 readonly isError: boolean;2322 readonly asError: XcmV2TraitsError;2323 readonly type: 'Complete' | 'Incomplete' | 'Error';2324 }23252326 /** @name CumulusPalletXcmEvent (283) */2327 export interface CumulusPalletXcmEvent extends Enum {2328 readonly isInvalidFormat: boolean;2329 readonly asInvalidFormat: U8aFixed;2330 readonly isUnsupportedVersion: boolean;2331 readonly asUnsupportedVersion: U8aFixed;2332 readonly isExecutedDownward: boolean;2333 readonly asExecutedDownward: ITuple<[U8aFixed, XcmV2TraitsOutcome]>;2334 readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward';2335 }23362337 /** @name CumulusPalletDmpQueueEvent (284) */2338 export interface CumulusPalletDmpQueueEvent extends Enum {2339 readonly isInvalidFormat: boolean;2340 readonly asInvalidFormat: {2341 readonly messageId: U8aFixed;2342 } & Struct;2343 readonly isUnsupportedVersion: boolean;2344 readonly asUnsupportedVersion: {2345 readonly messageId: U8aFixed;2346 } & Struct;2347 readonly isExecutedDownward: boolean;2348 readonly asExecutedDownward: {2349 readonly messageId: U8aFixed;2350 readonly outcome: XcmV2TraitsOutcome;2351 } & Struct;2352 readonly isWeightExhausted: boolean;2353 readonly asWeightExhausted: {2354 readonly messageId: U8aFixed;2355 readonly remainingWeight: u64;2356 readonly requiredWeight: u64;2357 } & Struct;2358 readonly isOverweightEnqueued: boolean;2359 readonly asOverweightEnqueued: {2360 readonly messageId: U8aFixed;2361 readonly overweightIndex: u64;2362 readonly requiredWeight: u64;2363 } & Struct;2364 readonly isOverweightServiced: boolean;2365 readonly asOverweightServiced: {2366 readonly overweightIndex: u64;2367 readonly weightUsed: u64;2368 } & Struct;2369 readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced';2370 }23712372 /** @name PalletUniqueRawEvent (285) */2373 export interface PalletUniqueRawEvent extends Enum {2374 readonly isCollectionSponsorRemoved: boolean;2375 readonly asCollectionSponsorRemoved: u32;2376 readonly isCollectionAdminAdded: boolean;2377 readonly asCollectionAdminAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2378 readonly isCollectionOwnedChanged: boolean;2379 readonly asCollectionOwnedChanged: ITuple<[u32, AccountId32]>;2380 readonly isCollectionSponsorSet: boolean;2381 readonly asCollectionSponsorSet: ITuple<[u32, AccountId32]>;2382 readonly isSponsorshipConfirmed: boolean;2383 readonly asSponsorshipConfirmed: ITuple<[u32, AccountId32]>;2384 readonly isCollectionAdminRemoved: boolean;2385 readonly asCollectionAdminRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2386 readonly isAllowListAddressRemoved: boolean;2387 readonly asAllowListAddressRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2388 readonly isAllowListAddressAdded: boolean;2389 readonly asAllowListAddressAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;2390 readonly isCollectionLimitSet: boolean;2391 readonly asCollectionLimitSet: u32;2392 readonly isCollectionPermissionSet: boolean;2393 readonly asCollectionPermissionSet: u32;2394 readonly type: 'CollectionSponsorRemoved' | 'CollectionAdminAdded' | 'CollectionOwnedChanged' | 'CollectionSponsorSet' | 'SponsorshipConfirmed' | 'CollectionAdminRemoved' | 'AllowListAddressRemoved' | 'AllowListAddressAdded' | 'CollectionLimitSet' | 'CollectionPermissionSet';2395 }23962397 /** @name PalletUniqueSchedulerEvent (286) */2398 export interface PalletUniqueSchedulerEvent extends Enum {2399 readonly isScheduled: boolean;2400 readonly asScheduled: {2401 readonly when: u32;2402 readonly index: u32;2403 } & Struct;2404 readonly isCanceled: boolean;2405 readonly asCanceled: {2406 readonly when: u32;2407 readonly index: u32;2408 } & Struct;2409 readonly isDispatched: boolean;2410 readonly asDispatched: {2411 readonly task: ITuple<[u32, u32]>;2412 readonly id: Option<U8aFixed>;2413 readonly result: Result<Null, SpRuntimeDispatchError>;2414 } & Struct;2415 readonly isCallLookupFailed: boolean;2416 readonly asCallLookupFailed: {2417 readonly task: ITuple<[u32, u32]>;2418 readonly id: Option<U8aFixed>;2419 readonly error: FrameSupportScheduleLookupError;2420 } & Struct;2421 readonly type: 'Scheduled' | 'Canceled' | 'Dispatched' | 'CallLookupFailed';2422 }24232424 /** @name FrameSupportScheduleLookupError (288) */2425 export interface FrameSupportScheduleLookupError extends Enum {2426 readonly isUnknown: boolean;2427 readonly isBadFormat: boolean;2428 readonly type: 'Unknown' | 'BadFormat';2429 }24302431 /** @name PalletCommonEvent (289) */2432 export interface PalletCommonEvent extends Enum {2433 readonly isCollectionCreated: boolean;2434 readonly asCollectionCreated: ITuple<[u32, u8, AccountId32]>;2435 readonly isCollectionDestroyed: boolean;2436 readonly asCollectionDestroyed: u32;2437 readonly isItemCreated: boolean;2438 readonly asItemCreated: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2439 readonly isItemDestroyed: boolean;2440 readonly asItemDestroyed: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2441 readonly isTransfer: boolean;2442 readonly asTransfer: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2443 readonly isApproved: boolean;2444 readonly asApproved: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;2445 readonly isCollectionPropertySet: boolean;2446 readonly asCollectionPropertySet: ITuple<[u32, Bytes]>;2447 readonly isCollectionPropertyDeleted: boolean;2448 readonly asCollectionPropertyDeleted: ITuple<[u32, Bytes]>;2449 readonly isTokenPropertySet: boolean;2450 readonly asTokenPropertySet: ITuple<[u32, u32, Bytes]>;2451 readonly isTokenPropertyDeleted: boolean;2452 readonly asTokenPropertyDeleted: ITuple<[u32, u32, Bytes]>;2453 readonly isPropertyPermissionSet: boolean;2454 readonly asPropertyPermissionSet: ITuple<[u32, Bytes]>;2455 readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'ItemCreated' | 'ItemDestroyed' | 'Transfer' | 'Approved' | 'CollectionPropertySet' | 'CollectionPropertyDeleted' | 'TokenPropertySet' | 'TokenPropertyDeleted' | 'PropertyPermissionSet';2456 }24572458 /** @name PalletStructureEvent (290) */2459 export interface PalletStructureEvent extends Enum {2460 readonly isExecuted: boolean;2461 readonly asExecuted: Result<Null, SpRuntimeDispatchError>;2462 readonly type: 'Executed';2463 }24642465 /** @name PalletRmrkCoreEvent (291) */2466 export interface PalletRmrkCoreEvent extends Enum {2467 readonly isCollectionCreated: boolean;2468 readonly asCollectionCreated: {2469 readonly issuer: AccountId32;2470 readonly collectionId: u32;2471 } & Struct;2472 readonly isCollectionDestroyed: boolean;2473 readonly asCollectionDestroyed: {2474 readonly issuer: AccountId32;2475 readonly collectionId: u32;2476 } & Struct;2477 readonly isIssuerChanged: boolean;2478 readonly asIssuerChanged: {2479 readonly oldIssuer: AccountId32;2480 readonly newIssuer: AccountId32;2481 readonly collectionId: u32;2482 } & Struct;2483 readonly isCollectionLocked: boolean;2484 readonly asCollectionLocked: {2485 readonly issuer: AccountId32;2486 readonly collectionId: u32;2487 } & Struct;2488 readonly isNftMinted: boolean;2489 readonly asNftMinted: {2490 readonly owner: AccountId32;2491 readonly collectionId: u32;2492 readonly nftId: u32;2493 } & Struct;2494 readonly isNftBurned: boolean;2495 readonly asNftBurned: {2496 readonly owner: AccountId32;2497 readonly nftId: u32;2498 } & Struct;2499 readonly isNftSent: boolean;2500 readonly asNftSent: {2501 readonly sender: AccountId32;2502 readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;2503 readonly collectionId: u32;2504 readonly nftId: u32;2505 readonly approvalRequired: bool;2506 } & Struct;2507 readonly isNftAccepted: boolean;2508 readonly asNftAccepted: {2509 readonly sender: AccountId32;2510 readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;2511 readonly collectionId: u32;2512 readonly nftId: u32;2513 } & Struct;2514 readonly isNftRejected: boolean;2515 readonly asNftRejected: {2516 readonly sender: AccountId32;2517 readonly collectionId: u32;2518 readonly nftId: u32;2519 } & Struct;2520 readonly isPropertySet: boolean;2521 readonly asPropertySet: {2522 readonly collectionId: u32;2523 readonly maybeNftId: Option<u32>;2524 readonly key: Bytes;2525 readonly value: Bytes;2526 } & Struct;2527 readonly isResourceAdded: boolean;2528 readonly asResourceAdded: {2529 readonly nftId: u32;2530 readonly resourceId: u32;2531 } & Struct;2532 readonly isResourceRemoval: boolean;2533 readonly asResourceRemoval: {2534 readonly nftId: u32;2535 readonly resourceId: u32;2536 } & Struct;2537 readonly isResourceAccepted: boolean;2538 readonly asResourceAccepted: {2539 readonly nftId: u32;2540 readonly resourceId: u32;2541 } & Struct;2542 readonly isResourceRemovalAccepted: boolean;2543 readonly asResourceRemovalAccepted: {2544 readonly nftId: u32;2545 readonly resourceId: u32;2546 } & Struct;2547 readonly isPrioritySet: boolean;2548 readonly asPrioritySet: {2549 readonly collectionId: u32;2550 readonly nftId: u32;2551 } & Struct;2552 readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'IssuerChanged' | 'CollectionLocked' | 'NftMinted' | 'NftBurned' | 'NftSent' | 'NftAccepted' | 'NftRejected' | 'PropertySet' | 'ResourceAdded' | 'ResourceRemoval' | 'ResourceAccepted' | 'ResourceRemovalAccepted' | 'PrioritySet';2553 }25542555 /** @name PalletRmrkEquipEvent (292) */2556 export interface PalletRmrkEquipEvent extends Enum {2557 readonly isBaseCreated: boolean;2558 readonly asBaseCreated: {2559 readonly issuer: AccountId32;2560 readonly baseId: u32;2561 } & Struct;2562 readonly isEquippablesUpdated: boolean;2563 readonly asEquippablesUpdated: {2564 readonly baseId: u32;2565 readonly slotId: u32;2566 } & Struct;2567 readonly type: 'BaseCreated' | 'EquippablesUpdated';2568 }25692570 /** @name PalletEvmEvent (293) */2571 export interface PalletEvmEvent extends Enum {2572 readonly isLog: boolean;2573 readonly asLog: EthereumLog;2574 readonly isCreated: boolean;2575 readonly asCreated: H160;2576 readonly isCreatedFailed: boolean;2577 readonly asCreatedFailed: H160;2578 readonly isExecuted: boolean;2579 readonly asExecuted: H160;2580 readonly isExecutedFailed: boolean;2581 readonly asExecutedFailed: H160;2582 readonly isBalanceDeposit: boolean;2583 readonly asBalanceDeposit: ITuple<[AccountId32, H160, U256]>;2584 readonly isBalanceWithdraw: boolean;2585 readonly asBalanceWithdraw: ITuple<[AccountId32, H160, U256]>;2586 readonly type: 'Log' | 'Created' | 'CreatedFailed' | 'Executed' | 'ExecutedFailed' | 'BalanceDeposit' | 'BalanceWithdraw';2587 }25882589 /** @name EthereumLog (294) */2590 export interface EthereumLog extends Struct {2591 readonly address: H160;2592 readonly topics: Vec<H256>;2593 readonly data: Bytes;2594 }25952596 /** @name PalletEthereumEvent (295) */2597 export interface PalletEthereumEvent extends Enum {2598 readonly isExecuted: boolean;2599 readonly asExecuted: ITuple<[H160, H160, H256, EvmCoreErrorExitReason]>;2600 readonly type: 'Executed';2601 }26022603 /** @name EvmCoreErrorExitReason (296) */2604 export interface EvmCoreErrorExitReason extends Enum {2605 readonly isSucceed: boolean;2606 readonly asSucceed: EvmCoreErrorExitSucceed;2607 readonly isError: boolean;2608 readonly asError: EvmCoreErrorExitError;2609 readonly isRevert: boolean;2610 readonly asRevert: EvmCoreErrorExitRevert;2611 readonly isFatal: boolean;2612 readonly asFatal: EvmCoreErrorExitFatal;2613 readonly type: 'Succeed' | 'Error' | 'Revert' | 'Fatal';2614 }26152616 /** @name EvmCoreErrorExitSucceed (297) */2617 export interface EvmCoreErrorExitSucceed extends Enum {2618 readonly isStopped: boolean;2619 readonly isReturned: boolean;2620 readonly isSuicided: boolean;2621 readonly type: 'Stopped' | 'Returned' | 'Suicided';2622 }26232624 /** @name EvmCoreErrorExitError (298) */2625 export interface EvmCoreErrorExitError extends Enum {2626 readonly isStackUnderflow: boolean;2627 readonly isStackOverflow: boolean;2628 readonly isInvalidJump: boolean;2629 readonly isInvalidRange: boolean;2630 readonly isDesignatedInvalid: boolean;2631 readonly isCallTooDeep: boolean;2632 readonly isCreateCollision: boolean;2633 readonly isCreateContractLimit: boolean;2634 readonly isOutOfOffset: boolean;2635 readonly isOutOfGas: boolean;2636 readonly isOutOfFund: boolean;2637 readonly isPcUnderflow: boolean;2638 readonly isCreateEmpty: boolean;2639 readonly isOther: boolean;2640 readonly asOther: Text;2641 readonly isInvalidCode: boolean;2642 readonly type: 'StackUnderflow' | 'StackOverflow' | 'InvalidJump' | 'InvalidRange' | 'DesignatedInvalid' | 'CallTooDeep' | 'CreateCollision' | 'CreateContractLimit' | 'OutOfOffset' | 'OutOfGas' | 'OutOfFund' | 'PcUnderflow' | 'CreateEmpty' | 'Other' | 'InvalidCode';2643 }26442645 /** @name EvmCoreErrorExitRevert (301) */2646 export interface EvmCoreErrorExitRevert extends Enum {2647 readonly isReverted: boolean;2648 readonly type: 'Reverted';2649 }26502651 /** @name EvmCoreErrorExitFatal (302) */2652 export interface EvmCoreErrorExitFatal extends Enum {2653 readonly isNotSupported: boolean;2654 readonly isUnhandledInterrupt: boolean;2655 readonly isCallErrorAsFatal: boolean;2656 readonly asCallErrorAsFatal: EvmCoreErrorExitError;2657 readonly isOther: boolean;2658 readonly asOther: Text;2659 readonly type: 'NotSupported' | 'UnhandledInterrupt' | 'CallErrorAsFatal' | 'Other';2660 }26612662 /** @name FrameSystemPhase (303) */2663 export interface FrameSystemPhase extends Enum {2664 readonly isApplyExtrinsic: boolean;2665 readonly asApplyExtrinsic: u32;2666 readonly isFinalization: boolean;2667 readonly isInitialization: boolean;2668 readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization';2669 }26702671 /** @name FrameSystemLastRuntimeUpgradeInfo (305) */2672 export interface FrameSystemLastRuntimeUpgradeInfo extends Struct {2673 readonly specVersion: Compact<u32>;2674 readonly specName: Text;2675 }26762677 /** @name FrameSystemLimitsBlockWeights (306) */2678 export interface FrameSystemLimitsBlockWeights extends Struct {2679 readonly baseBlock: u64;2680 readonly maxBlock: u64;2681 readonly perClass: FrameSupportWeightsPerDispatchClassWeightsPerClass;2682 }26832684 /** @name FrameSupportWeightsPerDispatchClassWeightsPerClass (307) */2685 export interface FrameSupportWeightsPerDispatchClassWeightsPerClass extends Struct {2686 readonly normal: FrameSystemLimitsWeightsPerClass;2687 readonly operational: FrameSystemLimitsWeightsPerClass;2688 readonly mandatory: FrameSystemLimitsWeightsPerClass;2689 }26902691 /** @name FrameSystemLimitsWeightsPerClass (308) */2692 export interface FrameSystemLimitsWeightsPerClass extends Struct {2693 readonly baseExtrinsic: u64;2694 readonly maxExtrinsic: Option<u64>;2695 readonly maxTotal: Option<u64>;2696 readonly reserved: Option<u64>;2697 }26982699 /** @name FrameSystemLimitsBlockLength (310) */2700 export interface FrameSystemLimitsBlockLength extends Struct {2701 readonly max: FrameSupportWeightsPerDispatchClassU32;2702 }27032704 /** @name FrameSupportWeightsPerDispatchClassU32 (311) */2705 export interface FrameSupportWeightsPerDispatchClassU32 extends Struct {2706 readonly normal: u32;2707 readonly operational: u32;2708 readonly mandatory: u32;2709 }27102711 /** @name FrameSupportWeightsRuntimeDbWeight (312) */2712 export interface FrameSupportWeightsRuntimeDbWeight extends Struct {2713 readonly read: u64;2714 readonly write: u64;2715 }27162717 /** @name SpVersionRuntimeVersion (313) */2718 export interface SpVersionRuntimeVersion extends Struct {2719 readonly specName: Text;2720 readonly implName: Text;2721 readonly authoringVersion: u32;2722 readonly specVersion: u32;2723 readonly implVersion: u32;2724 readonly apis: Vec<ITuple<[U8aFixed, u32]>>;2725 readonly transactionVersion: u32;2726 readonly stateVersion: u8;2727 }27282729 /** @name FrameSystemError (317) */2730 export interface FrameSystemError extends Enum {2731 readonly isInvalidSpecName: boolean;2732 readonly isSpecVersionNeedsToIncrease: boolean;2733 readonly isFailedToExtractRuntimeVersion: boolean;2734 readonly isNonDefaultComposite: boolean;2735 readonly isNonZeroRefCount: boolean;2736 readonly isCallFiltered: boolean;2737 readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered';2738 }27392740 /** @name OrmlVestingModuleError (319) */2741 export interface OrmlVestingModuleError extends Enum {2742 readonly isZeroVestingPeriod: boolean;2743 readonly isZeroVestingPeriodCount: boolean;2744 readonly isInsufficientBalanceToLock: boolean;2745 readonly isTooManyVestingSchedules: boolean;2746 readonly isAmountLow: boolean;2747 readonly isMaxVestingSchedulesExceeded: boolean;2748 readonly type: 'ZeroVestingPeriod' | 'ZeroVestingPeriodCount' | 'InsufficientBalanceToLock' | 'TooManyVestingSchedules' | 'AmountLow' | 'MaxVestingSchedulesExceeded';2749 }27502751 /** @name CumulusPalletXcmpQueueInboundChannelDetails (321) */2752 export interface CumulusPalletXcmpQueueInboundChannelDetails extends Struct {2753 readonly sender: u32;2754 readonly state: CumulusPalletXcmpQueueInboundState;2755 readonly messageMetadata: Vec<ITuple<[u32, PolkadotParachainPrimitivesXcmpMessageFormat]>>;2756 }27572758 /** @name CumulusPalletXcmpQueueInboundState (322) */2759 export interface CumulusPalletXcmpQueueInboundState extends Enum {2760 readonly isOk: boolean;2761 readonly isSuspended: boolean;2762 readonly type: 'Ok' | 'Suspended';2763 }27642765 /** @name PolkadotParachainPrimitivesXcmpMessageFormat (325) */2766 export interface PolkadotParachainPrimitivesXcmpMessageFormat extends Enum {2767 readonly isConcatenatedVersionedXcm: boolean;2768 readonly isConcatenatedEncodedBlob: boolean;2769 readonly isSignals: boolean;2770 readonly type: 'ConcatenatedVersionedXcm' | 'ConcatenatedEncodedBlob' | 'Signals';2771 }27722773 /** @name CumulusPalletXcmpQueueOutboundChannelDetails (328) */2774 export interface CumulusPalletXcmpQueueOutboundChannelDetails extends Struct {2775 readonly recipient: u32;2776 readonly state: CumulusPalletXcmpQueueOutboundState;2777 readonly signalsExist: bool;2778 readonly firstIndex: u16;2779 readonly lastIndex: u16;2780 }27812782 /** @name CumulusPalletXcmpQueueOutboundState (329) */2783 export interface CumulusPalletXcmpQueueOutboundState extends Enum {2784 readonly isOk: boolean;2785 readonly isSuspended: boolean;2786 readonly type: 'Ok' | 'Suspended';2787 }27882789 /** @name CumulusPalletXcmpQueueQueueConfigData (331) */2790 export interface CumulusPalletXcmpQueueQueueConfigData extends Struct {2791 readonly suspendThreshold: u32;2792 readonly dropThreshold: u32;2793 readonly resumeThreshold: u32;2794 readonly thresholdWeight: u64;2795 readonly weightRestrictDecay: u64;2796 readonly xcmpMaxIndividualWeight: u64;2797 }27982799 /** @name CumulusPalletXcmpQueueError (333) */2800 export interface CumulusPalletXcmpQueueError extends Enum {2801 readonly isFailedToSend: boolean;2802 readonly isBadXcmOrigin: boolean;2803 readonly isBadXcm: boolean;2804 readonly isBadOverweightIndex: boolean;2805 readonly isWeightOverLimit: boolean;2806 readonly type: 'FailedToSend' | 'BadXcmOrigin' | 'BadXcm' | 'BadOverweightIndex' | 'WeightOverLimit';2807 }28082809 /** @name PalletXcmError (334) */2810 export interface PalletXcmError extends Enum {2811 readonly isUnreachable: boolean;2812 readonly isSendFailure: boolean;2813 readonly isFiltered: boolean;2814 readonly isUnweighableMessage: boolean;2815 readonly isDestinationNotInvertible: boolean;2816 readonly isEmpty: boolean;2817 readonly isCannotReanchor: boolean;2818 readonly isTooManyAssets: boolean;2819 readonly isInvalidOrigin: boolean;2820 readonly isBadVersion: boolean;2821 readonly isBadLocation: boolean;2822 readonly isNoSubscription: boolean;2823 readonly isAlreadySubscribed: boolean;2824 readonly type: 'Unreachable' | 'SendFailure' | 'Filtered' | 'UnweighableMessage' | 'DestinationNotInvertible' | 'Empty' | 'CannotReanchor' | 'TooManyAssets' | 'InvalidOrigin' | 'BadVersion' | 'BadLocation' | 'NoSubscription' | 'AlreadySubscribed';2825 }28262827 /** @name CumulusPalletXcmError (335) */2828 export type CumulusPalletXcmError = Null;28292830 /** @name CumulusPalletDmpQueueConfigData (336) */2831 export interface CumulusPalletDmpQueueConfigData extends Struct {2832 readonly maxIndividual: u64;2833 }28342835 /** @name CumulusPalletDmpQueuePageIndexData (337) */2836 export interface CumulusPalletDmpQueuePageIndexData extends Struct {2837 readonly beginUsed: u32;2838 readonly endUsed: u32;2839 readonly overweightCount: u64;2840 }28412842 /** @name CumulusPalletDmpQueueError (340) */2843 export interface CumulusPalletDmpQueueError extends Enum {2844 readonly isUnknown: boolean;2845 readonly isOverLimit: boolean;2846 readonly type: 'Unknown' | 'OverLimit';2847 }28482849 /** @name PalletUniqueError (344) */2850 export interface PalletUniqueError extends Enum {2851 readonly isCollectionDecimalPointLimitExceeded: boolean;2852 readonly isConfirmUnsetSponsorFail: boolean;2853 readonly isEmptyArgument: boolean;2854 readonly isRepartitionCalledOnNonRefungibleCollection: boolean;2855 readonly type: 'CollectionDecimalPointLimitExceeded' | 'ConfirmUnsetSponsorFail' | 'EmptyArgument' | 'RepartitionCalledOnNonRefungibleCollection';2856 }28572858 /** @name PalletUniqueSchedulerScheduledV3 (347) */2859 export interface PalletUniqueSchedulerScheduledV3 extends Struct {2860 readonly maybeId: Option<U8aFixed>;2861 readonly priority: u8;2862 readonly call: FrameSupportScheduleMaybeHashed;2863 readonly maybePeriodic: Option<ITuple<[u32, u32]>>;2864 readonly origin: OpalRuntimeOriginCaller;2865 }28662867 /** @name OpalRuntimeOriginCaller (348) */2868 export interface OpalRuntimeOriginCaller extends Enum {2869 readonly isVoid: boolean;2870 readonly isSystem: boolean;2871 readonly asSystem: FrameSupportDispatchRawOrigin;2872 readonly isPolkadotXcm: boolean;2873 readonly asPolkadotXcm: PalletXcmOrigin;2874 readonly isCumulusXcm: boolean;2875 readonly asCumulusXcm: CumulusPalletXcmOrigin;2876 readonly isEthereum: boolean;2877 readonly asEthereum: PalletEthereumRawOrigin;2878 readonly type: 'Void' | 'System' | 'PolkadotXcm' | 'CumulusXcm' | 'Ethereum';2879 }28802881 /** @name FrameSupportDispatchRawOrigin (349) */2882 export interface FrameSupportDispatchRawOrigin extends Enum {2883 readonly isRoot: boolean;2884 readonly isSigned: boolean;2885 readonly asSigned: AccountId32;2886 readonly isNone: boolean;2887 readonly type: 'Root' | 'Signed' | 'None';2888 }28892890 /** @name PalletXcmOrigin (350) */2891 export interface PalletXcmOrigin extends Enum {2892 readonly isXcm: boolean;2893 readonly asXcm: XcmV1MultiLocation;2894 readonly isResponse: boolean;2895 readonly asResponse: XcmV1MultiLocation;2896 readonly type: 'Xcm' | 'Response';2897 }28982899 /** @name CumulusPalletXcmOrigin (351) */2900 export interface CumulusPalletXcmOrigin extends Enum {2901 readonly isRelay: boolean;2902 readonly isSiblingParachain: boolean;2903 readonly asSiblingParachain: u32;2904 readonly type: 'Relay' | 'SiblingParachain';2905 }29062907 /** @name PalletEthereumRawOrigin (352) */2908 export interface PalletEthereumRawOrigin extends Enum {2909 readonly isEthereumTransaction: boolean;2910 readonly asEthereumTransaction: H160;2911 readonly type: 'EthereumTransaction';2912 }29132914 /** @name SpCoreVoid (353) */2915 export type SpCoreVoid = Null;29162917 /** @name PalletUniqueSchedulerError (354) */2918 export interface PalletUniqueSchedulerError extends Enum {2919 readonly isFailedToSchedule: boolean;2920 readonly isNotFound: boolean;2921 readonly isTargetBlockNumberInPast: boolean;2922 readonly isRescheduleNoChange: boolean;2923 readonly type: 'FailedToSchedule' | 'NotFound' | 'TargetBlockNumberInPast' | 'RescheduleNoChange';2924 }29252926 /** @name UpDataStructsCollection (355) */2927 export interface UpDataStructsCollection extends Struct {2928 readonly owner: AccountId32;2929 readonly mode: UpDataStructsCollectionMode;2930 readonly name: Vec<u16>;2931 readonly description: Vec<u16>;2932 readonly tokenPrefix: Bytes;2933 readonly sponsorship: UpDataStructsSponsorshipState;2934 readonly limits: UpDataStructsCollectionLimits;2935 readonly permissions: UpDataStructsCollectionPermissions;2936 readonly externalCollection: bool;2937 }29382939 /** @name UpDataStructsSponsorshipState (356) */2940 export interface UpDataStructsSponsorshipState extends Enum {2941 readonly isDisabled: boolean;2942 readonly isUnconfirmed: boolean;2943 readonly asUnconfirmed: AccountId32;2944 readonly isConfirmed: boolean;2945 readonly asConfirmed: AccountId32;2946 readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';2947 }29482949 /** @name UpDataStructsProperties (357) */2950 export interface UpDataStructsProperties extends Struct {2951 readonly map: UpDataStructsPropertiesMapBoundedVec;2952 readonly consumedSpace: u32;2953 readonly spaceLimit: u32;2954 }29552956 /** @name UpDataStructsPropertiesMapBoundedVec (358) */2957 export interface UpDataStructsPropertiesMapBoundedVec extends BTreeMap<Bytes, Bytes> {}29582959 /** @name UpDataStructsPropertiesMapPropertyPermission (363) */2960 export interface UpDataStructsPropertiesMapPropertyPermission extends BTreeMap<Bytes, UpDataStructsPropertyPermission> {}29612962 /** @name UpDataStructsCollectionStats (370) */2963 export interface UpDataStructsCollectionStats extends Struct {2964 readonly created: u32;2965 readonly destroyed: u32;2966 readonly alive: u32;2967 }29682969 /** @name UpDataStructsTokenChild (371) */2970 export interface UpDataStructsTokenChild extends Struct {2971 readonly token: u32;2972 readonly collection: u32;2973 }29742975 /** @name PhantomTypeUpDataStructs (372) */2976 export interface PhantomTypeUpDataStructs extends Vec<ITuple<[UpDataStructsTokenData, UpDataStructsRpcCollection, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftNftInfo, RmrkTraitsResourceResourceInfo, RmrkTraitsPropertyPropertyInfo, RmrkTraitsBaseBaseInfo, RmrkTraitsPartPartType, RmrkTraitsTheme, RmrkTraitsNftNftChild]>> {}29772978 /** @name UpDataStructsTokenData (374) */2979 export interface UpDataStructsTokenData extends Struct {2980 readonly properties: Vec<UpDataStructsProperty>;2981 readonly owner: Option<PalletEvmAccountBasicCrossAccountIdRepr>;2982 readonly pieces: u128;2983 }29842985 /** @name UpDataStructsRpcCollection (376) */2986 export interface UpDataStructsRpcCollection extends Struct {2987 readonly owner: AccountId32;2988 readonly mode: UpDataStructsCollectionMode;2989 readonly name: Vec<u16>;2990 readonly description: Vec<u16>;2991 readonly tokenPrefix: Bytes;2992 readonly sponsorship: UpDataStructsSponsorshipState;2993 readonly limits: UpDataStructsCollectionLimits;2994 readonly permissions: UpDataStructsCollectionPermissions;2995 readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2996 readonly properties: Vec<UpDataStructsProperty>;2997 readonly readOnly: bool;2998 }29993000 /** @name RmrkTraitsCollectionCollectionInfo (377) */3001 export interface RmrkTraitsCollectionCollectionInfo extends Struct {3002 readonly issuer: AccountId32;3003 readonly metadata: Bytes;3004 readonly max: Option<u32>;3005 readonly symbol: Bytes;3006 readonly nftsCount: u32;3007 }30083009 /** @name RmrkTraitsNftNftInfo (378) */3010 export interface RmrkTraitsNftNftInfo extends Struct {3011 readonly owner: RmrkTraitsNftAccountIdOrCollectionNftTuple;3012 readonly royalty: Option<RmrkTraitsNftRoyaltyInfo>;3013 readonly metadata: Bytes;3014 readonly equipped: bool;3015 readonly pending: bool;3016 }30173018 /** @name RmrkTraitsNftRoyaltyInfo (380) */3019 export interface RmrkTraitsNftRoyaltyInfo extends Struct {3020 readonly recipient: AccountId32;3021 readonly amount: Permill;3022 }30233024 /** @name RmrkTraitsResourceResourceInfo (381) */3025 export interface RmrkTraitsResourceResourceInfo extends Struct {3026 readonly id: u32;3027 readonly resource: RmrkTraitsResourceResourceTypes;3028 readonly pending: bool;3029 readonly pendingRemoval: bool;3030 }30313032 /** @name RmrkTraitsPropertyPropertyInfo (382) */3033 export interface RmrkTraitsPropertyPropertyInfo extends Struct {3034 readonly key: Bytes;3035 readonly value: Bytes;3036 }30373038 /** @name RmrkTraitsBaseBaseInfo (383) */3039 export interface RmrkTraitsBaseBaseInfo extends Struct {3040 readonly issuer: AccountId32;3041 readonly baseType: Bytes;3042 readonly symbol: Bytes;3043 }30443045 /** @name RmrkTraitsNftNftChild (384) */3046 export interface RmrkTraitsNftNftChild extends Struct {3047 readonly collectionId: u32;3048 readonly nftId: u32;3049 }30503051 /** @name PalletCommonError (386) */3052 export interface PalletCommonError extends Enum {3053 readonly isCollectionNotFound: boolean;3054 readonly isMustBeTokenOwner: boolean;3055 readonly isNoPermission: boolean;3056 readonly isCantDestroyNotEmptyCollection: boolean;3057 readonly isPublicMintingNotAllowed: boolean;3058 readonly isAddressNotInAllowlist: boolean;3059 readonly isCollectionNameLimitExceeded: boolean;3060 readonly isCollectionDescriptionLimitExceeded: boolean;3061 readonly isCollectionTokenPrefixLimitExceeded: boolean;3062 readonly isTotalCollectionsLimitExceeded: boolean;3063 readonly isCollectionAdminCountExceeded: boolean;3064 readonly isCollectionLimitBoundsExceeded: boolean;3065 readonly isOwnerPermissionsCantBeReverted: boolean;3066 readonly isTransferNotAllowed: boolean;3067 readonly isAccountTokenLimitExceeded: boolean;3068 readonly isCollectionTokenLimitExceeded: boolean;3069 readonly isMetadataFlagFrozen: boolean;3070 readonly isTokenNotFound: boolean;3071 readonly isTokenValueTooLow: boolean;3072 readonly isApprovedValueTooLow: boolean;3073 readonly isCantApproveMoreThanOwned: boolean;3074 readonly isAddressIsZero: boolean;3075 readonly isUnsupportedOperation: boolean;3076 readonly isNotSufficientFounds: boolean;3077 readonly isUserIsNotAllowedToNest: boolean;3078 readonly isSourceCollectionIsNotAllowedToNest: boolean;3079 readonly isCollectionFieldSizeExceeded: boolean;3080 readonly isNoSpaceForProperty: boolean;3081 readonly isPropertyLimitReached: boolean;3082 readonly isPropertyKeyIsTooLong: boolean;3083 readonly isInvalidCharacterInPropertyKey: boolean;3084 readonly isEmptyPropertyKey: boolean;3085 readonly isCollectionIsExternal: boolean;3086 readonly isCollectionIsInternal: boolean;3087 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';3088 }30893090 /** @name PalletFungibleError (388) */3091 export interface PalletFungibleError extends Enum {3092 readonly isNotFungibleDataUsedToMintFungibleCollectionToken: boolean;3093 readonly isFungibleItemsHaveNoId: boolean;3094 readonly isFungibleItemsDontHaveData: boolean;3095 readonly isFungibleDisallowsNesting: boolean;3096 readonly isSettingPropertiesNotAllowed: boolean;3097 readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';3098 }30993100 /** @name PalletRefungibleItemData (389) */3101 export interface PalletRefungibleItemData extends Struct {3102 readonly constData: Bytes;3103 }31043105 /** @name PalletRefungibleError (393) */3106 export interface PalletRefungibleError extends Enum {3107 readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;3108 readonly isWrongRefungiblePieces: boolean;3109 readonly isRepartitionWhileNotOwningAllPieces: boolean;3110 readonly isRefungibleDisallowsNesting: boolean;3111 readonly isSettingPropertiesNotAllowed: boolean;3112 readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';3113 }31143115 /** @name PalletNonfungibleItemData (394) */3116 export interface PalletNonfungibleItemData extends Struct {3117 readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;3118 }31193120 /** @name UpDataStructsPropertyScope (396) */3121 export interface UpDataStructsPropertyScope extends Enum {3122 readonly isNone: boolean;3123 readonly isRmrk: boolean;3124 readonly type: 'None' | 'Rmrk';3125 }31263127 /** @name PalletNonfungibleError (398) */3128 export interface PalletNonfungibleError extends Enum {3129 readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean;3130 readonly isNonfungibleItemsHaveNoAmount: boolean;3131 readonly isCantBurnNftWithChildren: boolean;3132 readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren';3133 }31343135 /** @name PalletStructureError (399) */3136 export interface PalletStructureError extends Enum {3137 readonly isOuroborosDetected: boolean;3138 readonly isDepthLimit: boolean;3139 readonly isBreadthLimit: boolean;3140 readonly isTokenNotFound: boolean;3141 readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound';3142 }31433144 /** @name PalletRmrkCoreError (400) */3145 export interface PalletRmrkCoreError extends Enum {3146 readonly isCorruptedCollectionType: boolean;3147 readonly isNftTypeEncodeError: boolean;3148 readonly isRmrkPropertyKeyIsTooLong: boolean;3149 readonly isRmrkPropertyValueIsTooLong: boolean;3150 readonly isRmrkPropertyIsNotFound: boolean;3151 readonly isUnableToDecodeRmrkData: boolean;3152 readonly isCollectionNotEmpty: boolean;3153 readonly isNoAvailableCollectionId: boolean;3154 readonly isNoAvailableNftId: boolean;3155 readonly isCollectionUnknown: boolean;3156 readonly isNoPermission: boolean;3157 readonly isNonTransferable: boolean;3158 readonly isCollectionFullOrLocked: boolean;3159 readonly isResourceDoesntExist: boolean;3160 readonly isCannotSendToDescendentOrSelf: boolean;3161 readonly isCannotAcceptNonOwnedNft: boolean;3162 readonly isCannotRejectNonOwnedNft: boolean;3163 readonly isCannotRejectNonPendingNft: boolean;3164 readonly isResourceNotPending: boolean;3165 readonly isNoAvailableResourceId: boolean;3166 readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId';3167 }31683169 /** @name PalletRmrkEquipError (402) */3170 export interface PalletRmrkEquipError extends Enum {3171 readonly isPermissionError: boolean;3172 readonly isNoAvailableBaseId: boolean;3173 readonly isNoAvailablePartId: boolean;3174 readonly isBaseDoesntExist: boolean;3175 readonly isNeedsDefaultThemeFirst: boolean;3176 readonly isPartDoesntExist: boolean;3177 readonly isNoEquippableOnFixedPart: boolean;3178 readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart';3179 }31803181 /** @name PalletEvmError (405) */3182 export interface PalletEvmError extends Enum {3183 readonly isBalanceLow: boolean;3184 readonly isFeeOverflow: boolean;3185 readonly isPaymentOverflow: boolean;3186 readonly isWithdrawFailed: boolean;3187 readonly isGasPriceTooLow: boolean;3188 readonly isInvalidNonce: boolean;3189 readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce';3190 }31913192 /** @name FpRpcTransactionStatus (408) */3193 export interface FpRpcTransactionStatus extends Struct {3194 readonly transactionHash: H256;3195 readonly transactionIndex: u32;3196 readonly from: H160;3197 readonly to: Option<H160>;3198 readonly contractAddress: Option<H160>;3199 readonly logs: Vec<EthereumLog>;3200 readonly logsBloom: EthbloomBloom;3201 }32023203 /** @name EthbloomBloom (410) */3204 export interface EthbloomBloom extends U8aFixed {}32053206 /** @name EthereumReceiptReceiptV3 (412) */3207 export interface EthereumReceiptReceiptV3 extends Enum {3208 readonly isLegacy: boolean;3209 readonly asLegacy: EthereumReceiptEip658ReceiptData;3210 readonly isEip2930: boolean;3211 readonly asEip2930: EthereumReceiptEip658ReceiptData;3212 readonly isEip1559: boolean;3213 readonly asEip1559: EthereumReceiptEip658ReceiptData;3214 readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';3215 }32163217 /** @name EthereumReceiptEip658ReceiptData (413) */3218 export interface EthereumReceiptEip658ReceiptData extends Struct {3219 readonly statusCode: u8;3220 readonly usedGas: U256;3221 readonly logsBloom: EthbloomBloom;3222 readonly logs: Vec<EthereumLog>;3223 }32243225 /** @name EthereumBlock (414) */3226 export interface EthereumBlock extends Struct {3227 readonly header: EthereumHeader;3228 readonly transactions: Vec<EthereumTransactionTransactionV2>;3229 readonly ommers: Vec<EthereumHeader>;3230 }32313232 /** @name EthereumHeader (415) */3233 export interface EthereumHeader extends Struct {3234 readonly parentHash: H256;3235 readonly ommersHash: H256;3236 readonly beneficiary: H160;3237 readonly stateRoot: H256;3238 readonly transactionsRoot: H256;3239 readonly receiptsRoot: H256;3240 readonly logsBloom: EthbloomBloom;3241 readonly difficulty: U256;3242 readonly number: U256;3243 readonly gasLimit: U256;3244 readonly gasUsed: U256;3245 readonly timestamp: u64;3246 readonly extraData: Bytes;3247 readonly mixHash: H256;3248 readonly nonce: EthereumTypesHashH64;3249 }32503251 /** @name EthereumTypesHashH64 (416) */3252 export interface EthereumTypesHashH64 extends U8aFixed {}32533254 /** @name PalletEthereumError (421) */3255 export interface PalletEthereumError extends Enum {3256 readonly isInvalidSignature: boolean;3257 readonly isPreLogExists: boolean;3258 readonly type: 'InvalidSignature' | 'PreLogExists';3259 }32603261 /** @name PalletEvmCoderSubstrateError (422) */3262 export interface PalletEvmCoderSubstrateError extends Enum {3263 readonly isOutOfGas: boolean;3264 readonly isOutOfFund: boolean;3265 readonly type: 'OutOfGas' | 'OutOfFund';3266 }32673268 /** @name PalletEvmContractHelpersSponsoringModeT (423) */3269 export interface PalletEvmContractHelpersSponsoringModeT extends Enum {3270 readonly isDisabled: boolean;3271 readonly isAllowlisted: boolean;3272 readonly isGenerous: boolean;3273 readonly type: 'Disabled' | 'Allowlisted' | 'Generous';3274 }32753276 /** @name PalletEvmContractHelpersError (425) */3277 export interface PalletEvmContractHelpersError extends Enum {3278 readonly isNoPermission: boolean;3279 readonly type: 'NoPermission';3280 }32813282 /** @name PalletEvmMigrationError (426) */3283 export interface PalletEvmMigrationError extends Enum {3284 readonly isAccountNotEmpty: boolean;3285 readonly isAccountIsNotMigrating: boolean;3286 readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating';3287 }32883289 /** @name SpRuntimeMultiSignature (428) */3290 export interface SpRuntimeMultiSignature extends Enum {3291 readonly isEd25519: boolean;3292 readonly asEd25519: SpCoreEd25519Signature;3293 readonly isSr25519: boolean;3294 readonly asSr25519: SpCoreSr25519Signature;3295 readonly isEcdsa: boolean;3296 readonly asEcdsa: SpCoreEcdsaSignature;3297 readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa';3298 }32993300 /** @name SpCoreEd25519Signature (429) */3301 export interface SpCoreEd25519Signature extends U8aFixed {}33023303 /** @name SpCoreSr25519Signature (431) */3304 export interface SpCoreSr25519Signature extends U8aFixed {}33053306 /** @name SpCoreEcdsaSignature (432) */3307 export interface SpCoreEcdsaSignature extends U8aFixed {}33083309 /** @name FrameSystemExtensionsCheckSpecVersion (435) */3310 export type FrameSystemExtensionsCheckSpecVersion = Null;33113312 /** @name FrameSystemExtensionsCheckGenesis (436) */3313 export type FrameSystemExtensionsCheckGenesis = Null;33143315 /** @name FrameSystemExtensionsCheckNonce (439) */3316 export interface FrameSystemExtensionsCheckNonce extends Compact<u32> {}33173318 /** @name FrameSystemExtensionsCheckWeight (440) */3319 export type FrameSystemExtensionsCheckWeight = Null;33203321 /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (441) */3322 export interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact<u128> {}33233324 /** @name OpalRuntimeRuntime (442) */3325 export type OpalRuntimeRuntime = Null;33263327 /** @name PalletEthereumFakeTransactionFinalizer (443) */3328 export type PalletEthereumFakeTransactionFinalizer = Null;33293330} // declare moduletests/src/interfaces/unique/definitions.tsdiffbeforeafterboth--- a/tests/src/interfaces/unique/definitions.ts
+++ b/tests/src/interfaces/unique/definitions.ts
@@ -63,6 +63,11 @@
[collectionParam, tokenParam],
`Option<${CROSS_ACCOUNT_ID_TYPE}>`,
),
+ tokenOwners: fun(
+ 'Returns 10 tokens owners in no particular order',
+ [collectionParam, tokenParam],
+ `Vec<${CROSS_ACCOUNT_ID_TYPE}>`
+ ),
tokenChildren: fun(
'Get tokens nested directly into the token',
[collectionParam, tokenParam],
@@ -85,6 +90,17 @@
'Vec<UpDataStructsPropertyKeyPermission>',
),
+ constMetadata: fun(
+ 'Get token constant metadata',
+ [collectionParam, tokenParam],
+ 'Vec<u8>',
+ ),
+ variableMetadata: fun(
+ 'Get token variable metadata',
+ [collectionParam, tokenParam],
+ 'Vec<u8>',
+ ),
+
tokenData: fun(
'Get token data, including properties, optionally limited to the provided keys, and total pieces for an RFT',
[collectionParam, tokenParam, propertyKeysParam],
@@ -128,7 +144,11 @@
'bool',
),
- lastTokenId: fun('Get the last token ID created in a collection', [collectionParam], 'u32'),
+ lastTokenId: fun(
+ 'Get the last token ID created in a collection',
+ [collectionParam],
+ 'u32',
+ ),
collectionById: fun(
'Get a collection by the specified ID',
[collectionParam],
tests/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, submitTransactionAsync} from './substrate/substrate-api';
import {IKeyringPair} from '@polkadot/types/types';
import {
createCollectionExpectSuccess,
@@ -30,6 +30,12 @@
transfer,
burnItem,
repartitionRFT,
+ createCollectionWithPropsExpectSuccess,
+ getDetailedCollectionInfo,
+ normalizeAccountId,
+ CrossAccountId,
+ getCreateItemsResult,
+ getDestroyItemsResult,
} from './util/helpers';
import chai from 'chai';
@@ -51,14 +57,14 @@
it('Create refungible collection and token', async () => {
await usingApi(async api => {
const createCollectionResult = await createCollection(api, alice, {mode: {type: 'ReFungible'}});
- expect(createCollectionResult.success).to.be.true;
+ expect(createCollectionResult.success).to.be.true;
const collectionId = createCollectionResult.collectionId;
-
+
const itemCountBefore = await getLastTokenId(api, collectionId);
const result = await createRefungibleToken(api, alice, collectionId, 100n);
-
+
const itemCountAfter = await getLastTokenId(api, collectionId);
-
+
// What to expect
// tslint:disable-next-line:no-unused-expression
expect(result.success).to.be.true;
@@ -67,7 +73,43 @@
expect(itemCountAfter.toString()).to.be.equal(result.itemId.toString());
});
});
-
+
+ it('RPC method tokenOnewrs for refungible collection and token', async () => {
+ await usingApi(async (api, privateKeyWrapper) => {
+ const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'};
+ const facelessCrowd = Array.from(Array(7).keys()).map(i => normalizeAccountId(privateKeyWrapper(i.toString())));
+
+ const createCollectionResult = await createCollection(api, alice, {mode: {type: 'ReFungible'}});
+ const collectionId = createCollectionResult.collectionId;
+
+ const result = await createRefungibleToken(api, alice, collectionId, 10_000n);
+ const aliceTokenId = result.itemId;
+
+
+ await transfer(api, collectionId, aliceTokenId, alice, bob, 1000n);
+ await transfer(api, collectionId, aliceTokenId, alice, ethAcc, 900n);
+
+ for (let i = 0; i < 7; i++) {
+ await transfer(api, collectionId, aliceTokenId, alice, facelessCrowd[i], 50*(i+1));
+ }
+
+ const owners = await api.rpc.unique.tokenOwners(collectionId, aliceTokenId);
+ const ids = (owners.toJSON() as CrossAccountId[]).map(s => normalizeAccountId(s));
+
+ const aliceID = normalizeAccountId(alice);
+ const bobId = normalizeAccountId(bob);
+
+ // What to expect
+ // tslint:disable-next-line:no-unused-expression
+ expect(ids).to.deep.include.members([aliceID, ethAcc, bobId, ...facelessCrowd]);
+ expect(owners.length).to.be.equal(10);
+
+ const eleven = privateKeyWrapper('11');
+ expect(await transfer(api, collectionId, aliceTokenId, alice, eleven, 10n)).to.be.true;
+ expect((await api.rpc.unique.tokenOwners(collectionId, aliceTokenId)).length).to.be.equal(10);
+ });
+ });
+
it('Transfer token pieces', async () => {
await usingApi(async api => {
const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
@@ -186,4 +228,67 @@
await expect(transfer(api, collectionId, tokenId, bob, alice, 160n)).to.eventually.be.rejected;
});
});
+
+ it('Repartition with increased amount', async () => {
+ await usingApi(async api => {
+ const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n)).itemId;
+
+ const tx = api.tx.unique.repartition(collectionId, tokenId, 200n);
+ const events = await submitTransactionAsync(alice, tx);
+ const substrateEvents = getCreateItemsResult(events);
+ expect(substrateEvents).to.include.deep.members([
+ {
+ success: true,
+ collectionId,
+ itemId: tokenId,
+ recipient: {Substrate: alice.address},
+ amount: 100,
+ },
+ ]);
+ });
+ });
+
+ it('Repartition with decreased amount', async () => {
+ await usingApi(async api => {
+ const collectionId = (await createCollection(api, alice, {mode: {type: 'ReFungible'}})).collectionId;
+ const tokenId = (await createRefungibleToken(api, alice, collectionId, 100n)).itemId;
+
+ const tx = api.tx.unique.repartition(collectionId, tokenId, 50n);
+ const events = await submitTransactionAsync(alice, tx);
+ const substrateEvents = getDestroyItemsResult(events);
+ expect(substrateEvents).to.include.deep.members([
+ {
+ success: true,
+ collectionId,
+ itemId: tokenId,
+ owner: {Substrate: alice.address},
+ amount: 50,
+ },
+ ]);
+ });
+ });
+});
+
+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/rpc.test.tsdiffbeforeafterboth--- a/tests/src/rpc.test.ts
+++ b/tests/src/rpc.test.ts
@@ -1,12 +1,57 @@
+import {IKeyringPair} from '@polkadot/types/types';
import {expect} from 'chai';
import usingApi from './substrate/substrate-api';
-import {createCollectionExpectSuccess, getTokenOwner} from './util/helpers';
+import {createCollection, createCollectionExpectSuccess, createFungibleItemExpectSuccess, CrossAccountId, getTokenOwner, normalizeAccountId, transfer, U128_MAX} from './util/helpers';
+
+let alice: IKeyringPair;
+let bob: IKeyringPair;
-describe('getTokenOwner', () => {
+
+describe('integration test: RPC methods', () => {
+ before(async () => {
+ await usingApi(async (api, privateKeyWrapper) => {
+ alice = privateKeyWrapper('//Alice');
+ bob = privateKeyWrapper('//Bob');
+ });
+ });
+
+
it('returns None for fungible collection', async () => {
await usingApi(async api => {
const collection = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
await expect(getTokenOwner(api, collection, 0)).to.be.rejectedWith(/^owner == null$/);
});
});
+
+ it('RPC method tokenOwners for fungible collection and token', async () => {
+ await usingApi(async (api, privateKeyWrapper) => {
+ const ethAcc = {Ethereum: '0x67fb3503a61b284dc83fa96dceec4192db47dc7c'};
+ const facelessCrowd = Array.from(Array(7).keys()).map(i => normalizeAccountId(privateKeyWrapper(i.toString())));
+
+ const createCollectionResult = await createCollection(api, alice, {mode: {type: 'Fungible', decimalPoints: 0}});
+ const collectionId = createCollectionResult.collectionId;
+ const aliceTokenId = await createFungibleItemExpectSuccess(alice, collectionId, {Value: U128_MAX}, alice.address);
+
+ await transfer(api, collectionId, aliceTokenId, alice, bob, 1000n);
+ await transfer(api, collectionId, aliceTokenId, alice, ethAcc, 900n);
+
+ for (let i = 0; i < 7; i++) {
+ await transfer(api, collectionId, aliceTokenId, alice, facelessCrowd[i], 1);
+ }
+
+ const owners = await api.rpc.unique.tokenOwners(collectionId, aliceTokenId);
+ const ids = (owners.toJSON() as CrossAccountId[]).map(s => normalizeAccountId(s));
+ const aliceID = normalizeAccountId(alice);
+ const bobId = normalizeAccountId(bob);
+
+ // What to expect
+ // tslint:disable-next-line:no-unused-expression
+ expect(ids).to.deep.include.members([aliceID, ethAcc, bobId, ...facelessCrowd]);
+ expect(owners.length == 10).to.be.true;
+
+ const eleven = privateKeyWrapper('11');
+ expect(await transfer(api, collectionId, aliceTokenId, alice, eleven, 10n)).to.be.true;
+ expect((await api.rpc.unique.tokenOwners(collectionId, aliceTokenId)).length).to.be.equal(10);
+ });
+ });
});
\ No newline at end of file
tests/src/util/helpers.tsdiffbeforeafterboth--- a/tests/src/util/helpers.ts
+++ b/tests/src/util/helpers.ts
@@ -103,6 +103,15 @@
collectionId: number;
itemId: number;
recipient?: CrossAccountId;
+ amount?: number;
+}
+
+interface DestroyItemResult {
+ success: boolean;
+ collectionId: number;
+ itemId: number;
+ owner: CrossAccountId;
+ amount: number;
}
interface TransferResult {
@@ -220,12 +229,14 @@
const collectionId = parseInt(data[0].toString(), 10);
const itemId = parseInt(data[1].toString(), 10);
const recipient = normalizeAccountId(data[2].toJSON() as any);
+ const amount = parseInt(data[3].toString(), 10);
const itemRes: CreateItemResult = {
success: true,
collectionId,
itemId,
recipient,
+ amount,
};
results.push(itemRes);
@@ -255,6 +266,31 @@
return result;
}
+export function getDestroyItemsResult(events: EventRecord[]): DestroyItemResult[] {
+ const results: DestroyItemResult[] = [];
+
+ const genericResult = getGenericResult<DestroyItemResult[]>(events, 'common', 'ItemDestroyed', (data) => {
+ const collectionId = parseInt(data[0].toString(), 10);
+ const itemId = parseInt(data[1].toString(), 10);
+ const owner = normalizeAccountId(data[2].toJSON() as any);
+ const amount = parseInt(data[3].toString(), 10);
+
+ const itemRes: DestroyItemResult = {
+ success: true,
+ collectionId,
+ itemId,
+ owner,
+ amount,
+ };
+
+ results.push(itemRes);
+ return results;
+ });
+
+ if (!genericResult.success) return [];
+ return results;
+}
+
export function getTransferResult(api: ApiPromise, events: EventRecord[]): TransferResult {
for (const {event} of events) {
if (api.events.common.Transfer.is(event)) {
@@ -284,7 +320,7 @@
type: 'ReFungible';
}
-type CollectionMode = Nft | Fungible | ReFungible;
+export type CollectionMode = Nft | Fungible | ReFungible;
export type Property = {
key: any,
@@ -1414,7 +1450,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);