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.tsdiffbeforeafterboth1// Auto-generated via `yarn polkadot-types-from-defs`, do not edit2/* eslint-disable */34import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';5import type { ITuple } from '@polkadot/types-codec/types';6import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime';7import type { Event } from '@polkadot/types/interfaces/system';89/** @name CumulusPalletDmpQueueCall */10export interface CumulusPalletDmpQueueCall extends Enum {11 readonly isServiceOverweight: boolean;12 readonly asServiceOverweight: {13 readonly index: u64;14 readonly weightLimit: u64;15 } & Struct;16 readonly type: 'ServiceOverweight';17}1819/** @name CumulusPalletDmpQueueConfigData */20export interface CumulusPalletDmpQueueConfigData extends Struct {21 readonly maxIndividual: u64;22}2324/** @name CumulusPalletDmpQueueError */25export interface CumulusPalletDmpQueueError extends Enum {26 readonly isUnknown: boolean;27 readonly isOverLimit: boolean;28 readonly type: 'Unknown' | 'OverLimit';29}3031/** @name CumulusPalletDmpQueueEvent */32export interface CumulusPalletDmpQueueEvent extends Enum {33 readonly isInvalidFormat: boolean;34 readonly asInvalidFormat: {35 readonly messageId: U8aFixed;36 } & Struct;37 readonly isUnsupportedVersion: boolean;38 readonly asUnsupportedVersion: {39 readonly messageId: U8aFixed;40 } & Struct;41 readonly isExecutedDownward: boolean;42 readonly asExecutedDownward: {43 readonly messageId: U8aFixed;44 readonly outcome: XcmV2TraitsOutcome;45 } & Struct;46 readonly isWeightExhausted: boolean;47 readonly asWeightExhausted: {48 readonly messageId: U8aFixed;49 readonly remainingWeight: u64;50 readonly requiredWeight: u64;51 } & Struct;52 readonly isOverweightEnqueued: boolean;53 readonly asOverweightEnqueued: {54 readonly messageId: U8aFixed;55 readonly overweightIndex: u64;56 readonly requiredWeight: u64;57 } & Struct;58 readonly isOverweightServiced: boolean;59 readonly asOverweightServiced: {60 readonly overweightIndex: u64;61 readonly weightUsed: u64;62 } & Struct;63 readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced';64}6566/** @name CumulusPalletDmpQueuePageIndexData */67export interface CumulusPalletDmpQueuePageIndexData extends Struct {68 readonly beginUsed: u32;69 readonly endUsed: u32;70 readonly overweightCount: u64;71}7273/** @name CumulusPalletParachainSystemCall */74export interface CumulusPalletParachainSystemCall extends Enum {75 readonly isSetValidationData: boolean;76 readonly asSetValidationData: {77 readonly data: CumulusPrimitivesParachainInherentParachainInherentData;78 } & Struct;79 readonly isSudoSendUpwardMessage: boolean;80 readonly asSudoSendUpwardMessage: {81 readonly message: Bytes;82 } & Struct;83 readonly isAuthorizeUpgrade: boolean;84 readonly asAuthorizeUpgrade: {85 readonly codeHash: H256;86 } & Struct;87 readonly isEnactAuthorizedUpgrade: boolean;88 readonly asEnactAuthorizedUpgrade: {89 readonly code: Bytes;90 } & Struct;91 readonly type: 'SetValidationData' | 'SudoSendUpwardMessage' | 'AuthorizeUpgrade' | 'EnactAuthorizedUpgrade';92}9394/** @name CumulusPalletParachainSystemError */95export interface CumulusPalletParachainSystemError extends Enum {96 readonly isOverlappingUpgrades: boolean;97 readonly isProhibitedByPolkadot: boolean;98 readonly isTooBig: boolean;99 readonly isValidationDataNotAvailable: boolean;100 readonly isHostConfigurationNotAvailable: boolean;101 readonly isNotScheduled: boolean;102 readonly isNothingAuthorized: boolean;103 readonly isUnauthorized: boolean;104 readonly type: 'OverlappingUpgrades' | 'ProhibitedByPolkadot' | 'TooBig' | 'ValidationDataNotAvailable' | 'HostConfigurationNotAvailable' | 'NotScheduled' | 'NothingAuthorized' | 'Unauthorized';105}106107/** @name CumulusPalletParachainSystemEvent */108export 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 CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot */132export interface CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot extends Struct {133 readonly dmqMqcHead: H256;134 readonly relayDispatchQueueSize: ITuple<[u32, u32]>;135 readonly ingressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;136 readonly egressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;137}138139/** @name CumulusPalletXcmCall */140export interface CumulusPalletXcmCall extends Null {}141142/** @name CumulusPalletXcmError */143export interface CumulusPalletXcmError extends Null {}144145/** @name CumulusPalletXcmEvent */146export interface CumulusPalletXcmEvent extends Enum {147 readonly isInvalidFormat: boolean;148 readonly asInvalidFormat: U8aFixed;149 readonly isUnsupportedVersion: boolean;150 readonly asUnsupportedVersion: U8aFixed;151 readonly isExecutedDownward: boolean;152 readonly asExecutedDownward: ITuple<[U8aFixed, XcmV2TraitsOutcome]>;153 readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward';154}155156/** @name CumulusPalletXcmOrigin */157export interface CumulusPalletXcmOrigin extends Enum {158 readonly isRelay: boolean;159 readonly isSiblingParachain: boolean;160 readonly asSiblingParachain: u32;161 readonly type: 'Relay' | 'SiblingParachain';162}163164/** @name CumulusPalletXcmpQueueCall */165export interface CumulusPalletXcmpQueueCall extends Enum {166 readonly isServiceOverweight: boolean;167 readonly asServiceOverweight: {168 readonly index: u64;169 readonly weightLimit: u64;170 } & Struct;171 readonly isSuspendXcmExecution: boolean;172 readonly isResumeXcmExecution: boolean;173 readonly isUpdateSuspendThreshold: boolean;174 readonly asUpdateSuspendThreshold: {175 readonly new_: u32;176 } & Struct;177 readonly isUpdateDropThreshold: boolean;178 readonly asUpdateDropThreshold: {179 readonly new_: u32;180 } & Struct;181 readonly isUpdateResumeThreshold: boolean;182 readonly asUpdateResumeThreshold: {183 readonly new_: u32;184 } & Struct;185 readonly isUpdateThresholdWeight: boolean;186 readonly asUpdateThresholdWeight: {187 readonly new_: u64;188 } & Struct;189 readonly isUpdateWeightRestrictDecay: boolean;190 readonly asUpdateWeightRestrictDecay: {191 readonly new_: u64;192 } & Struct;193 readonly isUpdateXcmpMaxIndividualWeight: boolean;194 readonly asUpdateXcmpMaxIndividualWeight: {195 readonly new_: u64;196 } & Struct;197 readonly type: 'ServiceOverweight' | 'SuspendXcmExecution' | 'ResumeXcmExecution' | 'UpdateSuspendThreshold' | 'UpdateDropThreshold' | 'UpdateResumeThreshold' | 'UpdateThresholdWeight' | 'UpdateWeightRestrictDecay' | 'UpdateXcmpMaxIndividualWeight';198}199200/** @name CumulusPalletXcmpQueueError */201export interface CumulusPalletXcmpQueueError extends Enum {202 readonly isFailedToSend: boolean;203 readonly isBadXcmOrigin: boolean;204 readonly isBadXcm: boolean;205 readonly isBadOverweightIndex: boolean;206 readonly isWeightOverLimit: boolean;207 readonly type: 'FailedToSend' | 'BadXcmOrigin' | 'BadXcm' | 'BadOverweightIndex' | 'WeightOverLimit';208}209210/** @name CumulusPalletXcmpQueueEvent */211export interface CumulusPalletXcmpQueueEvent extends Enum {212 readonly isSuccess: boolean;213 readonly asSuccess: Option<H256>;214 readonly isFail: boolean;215 readonly asFail: ITuple<[Option<H256>, XcmV2TraitsError]>;216 readonly isBadVersion: boolean;217 readonly asBadVersion: Option<H256>;218 readonly isBadFormat: boolean;219 readonly asBadFormat: Option<H256>;220 readonly isUpwardMessageSent: boolean;221 readonly asUpwardMessageSent: Option<H256>;222 readonly isXcmpMessageSent: boolean;223 readonly asXcmpMessageSent: Option<H256>;224 readonly isOverweightEnqueued: boolean;225 readonly asOverweightEnqueued: ITuple<[u32, u32, u64, u64]>;226 readonly isOverweightServiced: boolean;227 readonly asOverweightServiced: ITuple<[u64, u64]>;228 readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced';229}230231/** @name CumulusPalletXcmpQueueInboundChannelDetails */232export interface CumulusPalletXcmpQueueInboundChannelDetails extends Struct {233 readonly sender: u32;234 readonly state: CumulusPalletXcmpQueueInboundState;235 readonly messageMetadata: Vec<ITuple<[u32, PolkadotParachainPrimitivesXcmpMessageFormat]>>;236}237238/** @name CumulusPalletXcmpQueueInboundState */239export interface CumulusPalletXcmpQueueInboundState extends Enum {240 readonly isOk: boolean;241 readonly isSuspended: boolean;242 readonly type: 'Ok' | 'Suspended';243}244245/** @name CumulusPalletXcmpQueueOutboundChannelDetails */246export interface CumulusPalletXcmpQueueOutboundChannelDetails extends Struct {247 readonly recipient: u32;248 readonly state: CumulusPalletXcmpQueueOutboundState;249 readonly signalsExist: bool;250 readonly firstIndex: u16;251 readonly lastIndex: u16;252}253254/** @name CumulusPalletXcmpQueueOutboundState */255export interface CumulusPalletXcmpQueueOutboundState extends Enum {256 readonly isOk: boolean;257 readonly isSuspended: boolean;258 readonly type: 'Ok' | 'Suspended';259}260261/** @name CumulusPalletXcmpQueueQueueConfigData */262export interface CumulusPalletXcmpQueueQueueConfigData extends Struct {263 readonly suspendThreshold: u32;264 readonly dropThreshold: u32;265 readonly resumeThreshold: u32;266 readonly thresholdWeight: u64;267 readonly weightRestrictDecay: u64;268 readonly xcmpMaxIndividualWeight: u64;269}270271/** @name CumulusPrimitivesParachainInherentParachainInherentData */272export interface CumulusPrimitivesParachainInherentParachainInherentData extends Struct {273 readonly validationData: PolkadotPrimitivesV2PersistedValidationData;274 readonly relayChainState: SpTrieStorageProof;275 readonly downwardMessages: Vec<PolkadotCorePrimitivesInboundDownwardMessage>;276 readonly horizontalMessages: BTreeMap<u32, Vec<PolkadotCorePrimitivesInboundHrmpMessage>>;277}278279/** @name EthbloomBloom */280export interface EthbloomBloom extends U8aFixed {}281282/** @name EthereumBlock */283export interface EthereumBlock extends Struct {284 readonly header: EthereumHeader;285 readonly transactions: Vec<EthereumTransactionTransactionV2>;286 readonly ommers: Vec<EthereumHeader>;287}288289/** @name EthereumHeader */290export interface EthereumHeader extends Struct {291 readonly parentHash: H256;292 readonly ommersHash: H256;293 readonly beneficiary: H160;294 readonly stateRoot: H256;295 readonly transactionsRoot: H256;296 readonly receiptsRoot: H256;297 readonly logsBloom: EthbloomBloom;298 readonly difficulty: U256;299 readonly number: U256;300 readonly gasLimit: U256;301 readonly gasUsed: U256;302 readonly timestamp: u64;303 readonly extraData: Bytes;304 readonly mixHash: H256;305 readonly nonce: EthereumTypesHashH64;306}307308/** @name EthereumLog */309export interface EthereumLog extends Struct {310 readonly address: H160;311 readonly topics: Vec<H256>;312 readonly data: Bytes;313}314315/** @name EthereumReceiptEip658ReceiptData */316export interface EthereumReceiptEip658ReceiptData extends Struct {317 readonly statusCode: u8;318 readonly usedGas: U256;319 readonly logsBloom: EthbloomBloom;320 readonly logs: Vec<EthereumLog>;321}322323/** @name EthereumReceiptReceiptV3 */324export interface EthereumReceiptReceiptV3 extends Enum {325 readonly isLegacy: boolean;326 readonly asLegacy: EthereumReceiptEip658ReceiptData;327 readonly isEip2930: boolean;328 readonly asEip2930: EthereumReceiptEip658ReceiptData;329 readonly isEip1559: boolean;330 readonly asEip1559: EthereumReceiptEip658ReceiptData;331 readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';332}333334/** @name EthereumTransactionAccessListItem */335export interface EthereumTransactionAccessListItem extends Struct {336 readonly address: H160;337 readonly storageKeys: Vec<H256>;338}339340/** @name EthereumTransactionEip1559Transaction */341export interface EthereumTransactionEip1559Transaction extends Struct {342 readonly chainId: u64;343 readonly nonce: U256;344 readonly maxPriorityFeePerGas: U256;345 readonly maxFeePerGas: U256;346 readonly gasLimit: U256;347 readonly action: EthereumTransactionTransactionAction;348 readonly value: U256;349 readonly input: Bytes;350 readonly accessList: Vec<EthereumTransactionAccessListItem>;351 readonly oddYParity: bool;352 readonly r: H256;353 readonly s: H256;354}355356/** @name EthereumTransactionEip2930Transaction */357export interface EthereumTransactionEip2930Transaction extends Struct {358 readonly chainId: u64;359 readonly nonce: U256;360 readonly gasPrice: U256;361 readonly gasLimit: U256;362 readonly action: EthereumTransactionTransactionAction;363 readonly value: U256;364 readonly input: Bytes;365 readonly accessList: Vec<EthereumTransactionAccessListItem>;366 readonly oddYParity: bool;367 readonly r: H256;368 readonly s: H256;369}370371/** @name EthereumTransactionLegacyTransaction */372export interface EthereumTransactionLegacyTransaction extends Struct {373 readonly nonce: U256;374 readonly gasPrice: U256;375 readonly gasLimit: U256;376 readonly action: EthereumTransactionTransactionAction;377 readonly value: U256;378 readonly input: Bytes;379 readonly signature: EthereumTransactionTransactionSignature;380}381382/** @name EthereumTransactionTransactionAction */383export interface EthereumTransactionTransactionAction extends Enum {384 readonly isCall: boolean;385 readonly asCall: H160;386 readonly isCreate: boolean;387 readonly type: 'Call' | 'Create';388}389390/** @name EthereumTransactionTransactionSignature */391export interface EthereumTransactionTransactionSignature extends Struct {392 readonly v: u64;393 readonly r: H256;394 readonly s: H256;395}396397/** @name EthereumTransactionTransactionV2 */398export interface EthereumTransactionTransactionV2 extends Enum {399 readonly isLegacy: boolean;400 readonly asLegacy: EthereumTransactionLegacyTransaction;401 readonly isEip2930: boolean;402 readonly asEip2930: EthereumTransactionEip2930Transaction;403 readonly isEip1559: boolean;404 readonly asEip1559: EthereumTransactionEip1559Transaction;405 readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';406}407408/** @name EthereumTypesHashH64 */409export interface EthereumTypesHashH64 extends U8aFixed {}410411/** @name EvmCoreErrorExitError */412export interface EvmCoreErrorExitError extends Enum {413 readonly isStackUnderflow: boolean;414 readonly isStackOverflow: boolean;415 readonly isInvalidJump: boolean;416 readonly isInvalidRange: boolean;417 readonly isDesignatedInvalid: boolean;418 readonly isCallTooDeep: boolean;419 readonly isCreateCollision: boolean;420 readonly isCreateContractLimit: boolean;421 readonly isOutOfOffset: boolean;422 readonly isOutOfGas: boolean;423 readonly isOutOfFund: boolean;424 readonly isPcUnderflow: boolean;425 readonly isCreateEmpty: boolean;426 readonly isOther: boolean;427 readonly asOther: Text;428 readonly isInvalidCode: boolean;429 readonly type: 'StackUnderflow' | 'StackOverflow' | 'InvalidJump' | 'InvalidRange' | 'DesignatedInvalid' | 'CallTooDeep' | 'CreateCollision' | 'CreateContractLimit' | 'OutOfOffset' | 'OutOfGas' | 'OutOfFund' | 'PcUnderflow' | 'CreateEmpty' | 'Other' | 'InvalidCode';430}431432/** @name EvmCoreErrorExitFatal */433export interface EvmCoreErrorExitFatal extends Enum {434 readonly isNotSupported: boolean;435 readonly isUnhandledInterrupt: boolean;436 readonly isCallErrorAsFatal: boolean;437 readonly asCallErrorAsFatal: EvmCoreErrorExitError;438 readonly isOther: boolean;439 readonly asOther: Text;440 readonly type: 'NotSupported' | 'UnhandledInterrupt' | 'CallErrorAsFatal' | 'Other';441}442443/** @name EvmCoreErrorExitReason */444export interface EvmCoreErrorExitReason extends Enum {445 readonly isSucceed: boolean;446 readonly asSucceed: EvmCoreErrorExitSucceed;447 readonly isError: boolean;448 readonly asError: EvmCoreErrorExitError;449 readonly isRevert: boolean;450 readonly asRevert: EvmCoreErrorExitRevert;451 readonly isFatal: boolean;452 readonly asFatal: EvmCoreErrorExitFatal;453 readonly type: 'Succeed' | 'Error' | 'Revert' | 'Fatal';454}455456/** @name EvmCoreErrorExitRevert */457export interface EvmCoreErrorExitRevert extends Enum {458 readonly isReverted: boolean;459 readonly type: 'Reverted';460}461462/** @name EvmCoreErrorExitSucceed */463export interface EvmCoreErrorExitSucceed extends Enum {464 readonly isStopped: boolean;465 readonly isReturned: boolean;466 readonly isSuicided: boolean;467 readonly type: 'Stopped' | 'Returned' | 'Suicided';468}469470/** @name FpRpcTransactionStatus */471export interface FpRpcTransactionStatus extends Struct {472 readonly transactionHash: H256;473 readonly transactionIndex: u32;474 readonly from: H160;475 readonly to: Option<H160>;476 readonly contractAddress: Option<H160>;477 readonly logs: Vec<EthereumLog>;478 readonly logsBloom: EthbloomBloom;479}480481/** @name FrameSupportDispatchRawOrigin */482export interface FrameSupportDispatchRawOrigin extends Enum {483 readonly isRoot: boolean;484 readonly isSigned: boolean;485 readonly asSigned: AccountId32;486 readonly isNone: boolean;487 readonly type: 'Root' | 'Signed' | 'None';488}489490/** @name FrameSupportPalletId */491export interface FrameSupportPalletId extends U8aFixed {}492493/** @name FrameSupportScheduleLookupError */494export interface FrameSupportScheduleLookupError extends Enum {495 readonly isUnknown: boolean;496 readonly isBadFormat: boolean;497 readonly type: 'Unknown' | 'BadFormat';498}499500/** @name FrameSupportScheduleMaybeHashed */501export interface FrameSupportScheduleMaybeHashed extends Enum {502 readonly isValue: boolean;503 readonly asValue: Call;504 readonly isHash: boolean;505 readonly asHash: H256;506 readonly type: 'Value' | 'Hash';507}508509/** @name FrameSupportTokensMiscBalanceStatus */510export interface FrameSupportTokensMiscBalanceStatus extends Enum {511 readonly isFree: boolean;512 readonly isReserved: boolean;513 readonly type: 'Free' | 'Reserved';514}515516/** @name FrameSupportWeightsDispatchClass */517export interface FrameSupportWeightsDispatchClass extends Enum {518 readonly isNormal: boolean;519 readonly isOperational: boolean;520 readonly isMandatory: boolean;521 readonly type: 'Normal' | 'Operational' | 'Mandatory';522}523524/** @name FrameSupportWeightsDispatchInfo */525export interface FrameSupportWeightsDispatchInfo extends Struct {526 readonly weight: u64;527 readonly class: FrameSupportWeightsDispatchClass;528 readonly paysFee: FrameSupportWeightsPays;529}530531/** @name FrameSupportWeightsPays */532export interface FrameSupportWeightsPays extends Enum {533 readonly isYes: boolean;534 readonly isNo: boolean;535 readonly type: 'Yes' | 'No';536}537538/** @name FrameSupportWeightsPerDispatchClassU32 */539export interface FrameSupportWeightsPerDispatchClassU32 extends Struct {540 readonly normal: u32;541 readonly operational: u32;542 readonly mandatory: u32;543}544545/** @name FrameSupportWeightsPerDispatchClassU64 */546export interface FrameSupportWeightsPerDispatchClassU64 extends Struct {547 readonly normal: u64;548 readonly operational: u64;549 readonly mandatory: u64;550}551552/** @name FrameSupportWeightsPerDispatchClassWeightsPerClass */553export interface FrameSupportWeightsPerDispatchClassWeightsPerClass extends Struct {554 readonly normal: FrameSystemLimitsWeightsPerClass;555 readonly operational: FrameSystemLimitsWeightsPerClass;556 readonly mandatory: FrameSystemLimitsWeightsPerClass;557}558559/** @name FrameSupportWeightsRuntimeDbWeight */560export interface FrameSupportWeightsRuntimeDbWeight extends Struct {561 readonly read: u64;562 readonly write: u64;563}564565/** @name FrameSystemAccountInfo */566export interface FrameSystemAccountInfo extends Struct {567 readonly nonce: u32;568 readonly consumers: u32;569 readonly providers: u32;570 readonly sufficients: u32;571 readonly data: PalletBalancesAccountData;572}573574/** @name FrameSystemCall */575export interface FrameSystemCall extends Enum {576 readonly isFillBlock: boolean;577 readonly asFillBlock: {578 readonly ratio: Perbill;579 } & Struct;580 readonly isRemark: boolean;581 readonly asRemark: {582 readonly remark: Bytes;583 } & Struct;584 readonly isSetHeapPages: boolean;585 readonly asSetHeapPages: {586 readonly pages: u64;587 } & Struct;588 readonly isSetCode: boolean;589 readonly asSetCode: {590 readonly code: Bytes;591 } & Struct;592 readonly isSetCodeWithoutChecks: boolean;593 readonly asSetCodeWithoutChecks: {594 readonly code: Bytes;595 } & Struct;596 readonly isSetStorage: boolean;597 readonly asSetStorage: {598 readonly items: Vec<ITuple<[Bytes, Bytes]>>;599 } & Struct;600 readonly isKillStorage: boolean;601 readonly asKillStorage: {602 readonly keys_: Vec<Bytes>;603 } & Struct;604 readonly isKillPrefix: boolean;605 readonly asKillPrefix: {606 readonly prefix: Bytes;607 readonly subkeys: u32;608 } & Struct;609 readonly isRemarkWithEvent: boolean;610 readonly asRemarkWithEvent: {611 readonly remark: Bytes;612 } & Struct;613 readonly type: 'FillBlock' | 'Remark' | 'SetHeapPages' | 'SetCode' | 'SetCodeWithoutChecks' | 'SetStorage' | 'KillStorage' | 'KillPrefix' | 'RemarkWithEvent';614}615616/** @name FrameSystemError */617export interface FrameSystemError extends Enum {618 readonly isInvalidSpecName: boolean;619 readonly isSpecVersionNeedsToIncrease: boolean;620 readonly isFailedToExtractRuntimeVersion: boolean;621 readonly isNonDefaultComposite: boolean;622 readonly isNonZeroRefCount: boolean;623 readonly isCallFiltered: boolean;624 readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered';625}626627/** @name FrameSystemEvent */628export interface FrameSystemEvent extends Enum {629 readonly isExtrinsicSuccess: boolean;630 readonly asExtrinsicSuccess: {631 readonly dispatchInfo: FrameSupportWeightsDispatchInfo;632 } & Struct;633 readonly isExtrinsicFailed: boolean;634 readonly asExtrinsicFailed: {635 readonly dispatchError: SpRuntimeDispatchError;636 readonly dispatchInfo: FrameSupportWeightsDispatchInfo;637 } & Struct;638 readonly isCodeUpdated: boolean;639 readonly isNewAccount: boolean;640 readonly asNewAccount: {641 readonly account: AccountId32;642 } & Struct;643 readonly isKilledAccount: boolean;644 readonly asKilledAccount: {645 readonly account: AccountId32;646 } & Struct;647 readonly isRemarked: boolean;648 readonly asRemarked: {649 readonly sender: AccountId32;650 readonly hash_: H256;651 } & Struct;652 readonly type: 'ExtrinsicSuccess' | 'ExtrinsicFailed' | 'CodeUpdated' | 'NewAccount' | 'KilledAccount' | 'Remarked';653}654655/** @name FrameSystemEventRecord */656export interface FrameSystemEventRecord extends Struct {657 readonly phase: FrameSystemPhase;658 readonly event: Event;659 readonly topics: Vec<H256>;660}661662/** @name FrameSystemExtensionsCheckGenesis */663export interface FrameSystemExtensionsCheckGenesis extends Null {}664665/** @name FrameSystemExtensionsCheckNonce */666export interface FrameSystemExtensionsCheckNonce extends Compact<u32> {}667668/** @name FrameSystemExtensionsCheckSpecVersion */669export interface FrameSystemExtensionsCheckSpecVersion extends Null {}670671/** @name FrameSystemExtensionsCheckWeight */672export interface FrameSystemExtensionsCheckWeight extends Null {}673674/** @name FrameSystemLastRuntimeUpgradeInfo */675export interface FrameSystemLastRuntimeUpgradeInfo extends Struct {676 readonly specVersion: Compact<u32>;677 readonly specName: Text;678}679680/** @name FrameSystemLimitsBlockLength */681export interface FrameSystemLimitsBlockLength extends Struct {682 readonly max: FrameSupportWeightsPerDispatchClassU32;683}684685/** @name FrameSystemLimitsBlockWeights */686export interface FrameSystemLimitsBlockWeights extends Struct {687 readonly baseBlock: u64;688 readonly maxBlock: u64;689 readonly perClass: FrameSupportWeightsPerDispatchClassWeightsPerClass;690}691692/** @name FrameSystemLimitsWeightsPerClass */693export interface FrameSystemLimitsWeightsPerClass extends Struct {694 readonly baseExtrinsic: u64;695 readonly maxExtrinsic: Option<u64>;696 readonly maxTotal: Option<u64>;697 readonly reserved: Option<u64>;698}699700/** @name FrameSystemPhase */701export interface FrameSystemPhase extends Enum {702 readonly isApplyExtrinsic: boolean;703 readonly asApplyExtrinsic: u32;704 readonly isFinalization: boolean;705 readonly isInitialization: boolean;706 readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization';707}708709/** @name OpalRuntimeOriginCaller */710export interface OpalRuntimeOriginCaller extends Enum {711 readonly isVoid: boolean;712 readonly asVoid: SpCoreVoid;713 readonly isSystem: boolean;714 readonly asSystem: FrameSupportDispatchRawOrigin;715 readonly isPolkadotXcm: boolean;716 readonly asPolkadotXcm: PalletXcmOrigin;717 readonly isCumulusXcm: boolean;718 readonly asCumulusXcm: CumulusPalletXcmOrigin;719 readonly isEthereum: boolean;720 readonly asEthereum: PalletEthereumRawOrigin;721 readonly type: 'Void' | 'System' | 'PolkadotXcm' | 'CumulusXcm' | 'Ethereum';722}723724/** @name OpalRuntimeRuntime */725export interface OpalRuntimeRuntime extends Null {}726727/** @name OrmlVestingModuleCall */728export interface OrmlVestingModuleCall extends Enum {729 readonly isClaim: boolean;730 readonly isVestedTransfer: boolean;731 readonly asVestedTransfer: {732 readonly dest: MultiAddress;733 readonly schedule: OrmlVestingVestingSchedule;734 } & Struct;735 readonly isUpdateVestingSchedules: boolean;736 readonly asUpdateVestingSchedules: {737 readonly who: MultiAddress;738 readonly vestingSchedules: Vec<OrmlVestingVestingSchedule>;739 } & Struct;740 readonly isClaimFor: boolean;741 readonly asClaimFor: {742 readonly dest: MultiAddress;743 } & Struct;744 readonly type: 'Claim' | 'VestedTransfer' | 'UpdateVestingSchedules' | 'ClaimFor';745}746747/** @name OrmlVestingModuleError */748export interface OrmlVestingModuleError extends Enum {749 readonly isZeroVestingPeriod: boolean;750 readonly isZeroVestingPeriodCount: boolean;751 readonly isInsufficientBalanceToLock: boolean;752 readonly isTooManyVestingSchedules: boolean;753 readonly isAmountLow: boolean;754 readonly isMaxVestingSchedulesExceeded: boolean;755 readonly type: 'ZeroVestingPeriod' | 'ZeroVestingPeriodCount' | 'InsufficientBalanceToLock' | 'TooManyVestingSchedules' | 'AmountLow' | 'MaxVestingSchedulesExceeded';756}757758/** @name OrmlVestingModuleEvent */759export interface OrmlVestingModuleEvent extends Enum {760 readonly isVestingScheduleAdded: boolean;761 readonly asVestingScheduleAdded: {762 readonly from: AccountId32;763 readonly to: AccountId32;764 readonly vestingSchedule: OrmlVestingVestingSchedule;765 } & Struct;766 readonly isClaimed: boolean;767 readonly asClaimed: {768 readonly who: AccountId32;769 readonly amount: u128;770 } & Struct;771 readonly isVestingSchedulesUpdated: boolean;772 readonly asVestingSchedulesUpdated: {773 readonly who: AccountId32;774 } & Struct;775 readonly type: 'VestingScheduleAdded' | 'Claimed' | 'VestingSchedulesUpdated';776}777778/** @name OrmlVestingVestingSchedule */779export interface OrmlVestingVestingSchedule extends Struct {780 readonly start: u32;781 readonly period: u32;782 readonly periodCount: u32;783 readonly perPeriod: Compact<u128>;784}785786/** @name PalletBalancesAccountData */787export interface PalletBalancesAccountData extends Struct {788 readonly free: u128;789 readonly reserved: u128;790 readonly miscFrozen: u128;791 readonly feeFrozen: u128;792}793794/** @name PalletBalancesBalanceLock */795export interface PalletBalancesBalanceLock extends Struct {796 readonly id: U8aFixed;797 readonly amount: u128;798 readonly reasons: PalletBalancesReasons;799}800801/** @name PalletBalancesCall */802export interface PalletBalancesCall extends Enum {803 readonly isTransfer: boolean;804 readonly asTransfer: {805 readonly dest: MultiAddress;806 readonly value: Compact<u128>;807 } & Struct;808 readonly isSetBalance: boolean;809 readonly asSetBalance: {810 readonly who: MultiAddress;811 readonly newFree: Compact<u128>;812 readonly newReserved: Compact<u128>;813 } & Struct;814 readonly isForceTransfer: boolean;815 readonly asForceTransfer: {816 readonly source: MultiAddress;817 readonly dest: MultiAddress;818 readonly value: Compact<u128>;819 } & Struct;820 readonly isTransferKeepAlive: boolean;821 readonly asTransferKeepAlive: {822 readonly dest: MultiAddress;823 readonly value: Compact<u128>;824 } & Struct;825 readonly isTransferAll: boolean;826 readonly asTransferAll: {827 readonly dest: MultiAddress;828 readonly keepAlive: bool;829 } & Struct;830 readonly isForceUnreserve: boolean;831 readonly asForceUnreserve: {832 readonly who: MultiAddress;833 readonly amount: u128;834 } & Struct;835 readonly type: 'Transfer' | 'SetBalance' | 'ForceTransfer' | 'TransferKeepAlive' | 'TransferAll' | 'ForceUnreserve';836}837838/** @name PalletBalancesError */839export interface PalletBalancesError extends Enum {840 readonly isVestingBalance: boolean;841 readonly isLiquidityRestrictions: boolean;842 readonly isInsufficientBalance: boolean;843 readonly isExistentialDeposit: boolean;844 readonly isKeepAlive: boolean;845 readonly isExistingVestingSchedule: boolean;846 readonly isDeadAccount: boolean;847 readonly isTooManyReserves: boolean;848 readonly type: 'VestingBalance' | 'LiquidityRestrictions' | 'InsufficientBalance' | 'ExistentialDeposit' | 'KeepAlive' | 'ExistingVestingSchedule' | 'DeadAccount' | 'TooManyReserves';849}850851/** @name PalletBalancesEvent */852export interface PalletBalancesEvent extends Enum {853 readonly isEndowed: boolean;854 readonly asEndowed: {855 readonly account: AccountId32;856 readonly freeBalance: u128;857 } & Struct;858 readonly isDustLost: boolean;859 readonly asDustLost: {860 readonly account: AccountId32;861 readonly amount: u128;862 } & Struct;863 readonly isTransfer: boolean;864 readonly asTransfer: {865 readonly from: AccountId32;866 readonly to: AccountId32;867 readonly amount: u128;868 } & Struct;869 readonly isBalanceSet: boolean;870 readonly asBalanceSet: {871 readonly who: AccountId32;872 readonly free: u128;873 readonly reserved: u128;874 } & Struct;875 readonly isReserved: boolean;876 readonly asReserved: {877 readonly who: AccountId32;878 readonly amount: u128;879 } & Struct;880 readonly isUnreserved: boolean;881 readonly asUnreserved: {882 readonly who: AccountId32;883 readonly amount: u128;884 } & Struct;885 readonly isReserveRepatriated: boolean;886 readonly asReserveRepatriated: {887 readonly from: AccountId32;888 readonly to: AccountId32;889 readonly amount: u128;890 readonly destinationStatus: FrameSupportTokensMiscBalanceStatus;891 } & Struct;892 readonly isDeposit: boolean;893 readonly asDeposit: {894 readonly who: AccountId32;895 readonly amount: u128;896 } & Struct;897 readonly isWithdraw: boolean;898 readonly asWithdraw: {899 readonly who: AccountId32;900 readonly amount: u128;901 } & Struct;902 readonly isSlashed: boolean;903 readonly asSlashed: {904 readonly who: AccountId32;905 readonly amount: u128;906 } & Struct;907 readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'BalanceSet' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'Deposit' | 'Withdraw' | 'Slashed';908}909910/** @name PalletBalancesReasons */911export interface PalletBalancesReasons extends Enum {912 readonly isFee: boolean;913 readonly isMisc: boolean;914 readonly isAll: boolean;915 readonly type: 'Fee' | 'Misc' | 'All';916}917918/** @name PalletBalancesReleases */919export interface PalletBalancesReleases extends Enum {920 readonly isV100: boolean;921 readonly isV200: boolean;922 readonly type: 'V100' | 'V200';923}924925/** @name PalletBalancesReserveData */926export interface PalletBalancesReserveData extends Struct {927 readonly id: U8aFixed;928 readonly amount: u128;929}930931/** @name PalletCommonError */932export interface PalletCommonError extends Enum {933 readonly isCollectionNotFound: boolean;934 readonly isMustBeTokenOwner: boolean;935 readonly isNoPermission: boolean;936 readonly isCantDestroyNotEmptyCollection: boolean;937 readonly isPublicMintingNotAllowed: boolean;938 readonly isAddressNotInAllowlist: boolean;939 readonly isCollectionNameLimitExceeded: boolean;940 readonly isCollectionDescriptionLimitExceeded: boolean;941 readonly isCollectionTokenPrefixLimitExceeded: boolean;942 readonly isTotalCollectionsLimitExceeded: boolean;943 readonly isCollectionAdminCountExceeded: boolean;944 readonly isCollectionLimitBoundsExceeded: boolean;945 readonly isOwnerPermissionsCantBeReverted: boolean;946 readonly isTransferNotAllowed: boolean;947 readonly isAccountTokenLimitExceeded: boolean;948 readonly isCollectionTokenLimitExceeded: boolean;949 readonly isMetadataFlagFrozen: boolean;950 readonly isTokenNotFound: boolean;951 readonly isTokenValueTooLow: boolean;952 readonly isApprovedValueTooLow: boolean;953 readonly isCantApproveMoreThanOwned: boolean;954 readonly isAddressIsZero: boolean;955 readonly isUnsupportedOperation: boolean;956 readonly isNotSufficientFounds: boolean;957 readonly isUserIsNotAllowedToNest: boolean;958 readonly isSourceCollectionIsNotAllowedToNest: boolean;959 readonly isCollectionFieldSizeExceeded: boolean;960 readonly isNoSpaceForProperty: boolean;961 readonly isPropertyLimitReached: boolean;962 readonly isPropertyKeyIsTooLong: boolean;963 readonly isInvalidCharacterInPropertyKey: boolean;964 readonly isEmptyPropertyKey: boolean;965 readonly isCollectionIsExternal: boolean;966 readonly isCollectionIsInternal: boolean;967 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';968}969970/** @name PalletCommonEvent */971export interface PalletCommonEvent extends Enum {972 readonly isCollectionCreated: boolean;973 readonly asCollectionCreated: ITuple<[u32, u8, AccountId32]>;974 readonly isCollectionDestroyed: boolean;975 readonly asCollectionDestroyed: u32;976 readonly isItemCreated: boolean;977 readonly asItemCreated: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;978 readonly isItemDestroyed: boolean;979 readonly asItemDestroyed: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;980 readonly isTransfer: boolean;981 readonly asTransfer: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;982 readonly isApproved: boolean;983 readonly asApproved: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;984 readonly isCollectionPropertySet: boolean;985 readonly asCollectionPropertySet: ITuple<[u32, Bytes]>;986 readonly isCollectionPropertyDeleted: boolean;987 readonly asCollectionPropertyDeleted: ITuple<[u32, Bytes]>;988 readonly isTokenPropertySet: boolean;989 readonly asTokenPropertySet: ITuple<[u32, u32, Bytes]>;990 readonly isTokenPropertyDeleted: boolean;991 readonly asTokenPropertyDeleted: ITuple<[u32, u32, Bytes]>;992 readonly isPropertyPermissionSet: boolean;993 readonly asPropertyPermissionSet: ITuple<[u32, Bytes]>;994 readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'ItemCreated' | 'ItemDestroyed' | 'Transfer' | 'Approved' | 'CollectionPropertySet' | 'CollectionPropertyDeleted' | 'TokenPropertySet' | 'TokenPropertyDeleted' | 'PropertyPermissionSet';995}996997/** @name PalletEthereumCall */998export interface PalletEthereumCall extends Enum {999 readonly isTransact: boolean;1000 readonly asTransact: {1001 readonly transaction: EthereumTransactionTransactionV2;1002 } & Struct;1003 readonly type: 'Transact';1004}10051006/** @name PalletEthereumError */1007export interface PalletEthereumError extends Enum {1008 readonly isInvalidSignature: boolean;1009 readonly isPreLogExists: boolean;1010 readonly type: 'InvalidSignature' | 'PreLogExists';1011}10121013/** @name PalletEthereumEvent */1014export interface PalletEthereumEvent extends Enum {1015 readonly isExecuted: boolean;1016 readonly asExecuted: ITuple<[H160, H160, H256, EvmCoreErrorExitReason]>;1017 readonly type: 'Executed';1018}10191020/** @name PalletEthereumFakeTransactionFinalizer */1021export interface PalletEthereumFakeTransactionFinalizer extends Null {}10221023/** @name PalletEthereumRawOrigin */1024export interface PalletEthereumRawOrigin extends Enum {1025 readonly isEthereumTransaction: boolean;1026 readonly asEthereumTransaction: H160;1027 readonly type: 'EthereumTransaction';1028}10291030/** @name PalletEvmAccountBasicCrossAccountIdRepr */1031export interface PalletEvmAccountBasicCrossAccountIdRepr extends Enum {1032 readonly isSubstrate: boolean;1033 readonly asSubstrate: AccountId32;1034 readonly isEthereum: boolean;1035 readonly asEthereum: H160;1036 readonly type: 'Substrate' | 'Ethereum';1037}10381039/** @name PalletEvmCall */1040export interface PalletEvmCall extends Enum {1041 readonly isWithdraw: boolean;1042 readonly asWithdraw: {1043 readonly address: H160;1044 readonly value: u128;1045 } & Struct;1046 readonly isCall: boolean;1047 readonly asCall: {1048 readonly source: H160;1049 readonly target: H160;1050 readonly input: Bytes;1051 readonly value: U256;1052 readonly gasLimit: u64;1053 readonly maxFeePerGas: U256;1054 readonly maxPriorityFeePerGas: Option<U256>;1055 readonly nonce: Option<U256>;1056 readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1057 } & Struct;1058 readonly isCreate: boolean;1059 readonly asCreate: {1060 readonly source: H160;1061 readonly init: Bytes;1062 readonly value: U256;1063 readonly gasLimit: u64;1064 readonly maxFeePerGas: U256;1065 readonly maxPriorityFeePerGas: Option<U256>;1066 readonly nonce: Option<U256>;1067 readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1068 } & Struct;1069 readonly isCreate2: boolean;1070 readonly asCreate2: {1071 readonly source: H160;1072 readonly init: Bytes;1073 readonly salt: H256;1074 readonly value: U256;1075 readonly gasLimit: u64;1076 readonly maxFeePerGas: U256;1077 readonly maxPriorityFeePerGas: Option<U256>;1078 readonly nonce: Option<U256>;1079 readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1080 } & Struct;1081 readonly type: 'Withdraw' | 'Call' | 'Create' | 'Create2';1082}10831084/** @name PalletEvmCoderSubstrateError */1085export interface PalletEvmCoderSubstrateError extends Enum {1086 readonly isOutOfGas: boolean;1087 readonly isOutOfFund: boolean;1088 readonly type: 'OutOfGas' | 'OutOfFund';1089}10901091/** @name PalletEvmContractHelpersError */1092export interface PalletEvmContractHelpersError extends Enum {1093 readonly isNoPermission: boolean;1094 readonly type: 'NoPermission';1095}10961097/** @name PalletEvmContractHelpersSponsoringModeT */1098export interface PalletEvmContractHelpersSponsoringModeT extends Enum {1099 readonly isDisabled: boolean;1100 readonly isAllowlisted: boolean;1101 readonly isGenerous: boolean;1102 readonly type: 'Disabled' | 'Allowlisted' | 'Generous';1103}11041105/** @name PalletEvmError */1106export interface PalletEvmError extends Enum {1107 readonly isBalanceLow: boolean;1108 readonly isFeeOverflow: boolean;1109 readonly isPaymentOverflow: boolean;1110 readonly isWithdrawFailed: boolean;1111 readonly isGasPriceTooLow: boolean;1112 readonly isInvalidNonce: boolean;1113 readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce';1114}11151116/** @name PalletEvmEvent */1117export interface PalletEvmEvent extends Enum {1118 readonly isLog: boolean;1119 readonly asLog: EthereumLog;1120 readonly isCreated: boolean;1121 readonly asCreated: H160;1122 readonly isCreatedFailed: boolean;1123 readonly asCreatedFailed: H160;1124 readonly isExecuted: boolean;1125 readonly asExecuted: H160;1126 readonly isExecutedFailed: boolean;1127 readonly asExecutedFailed: H160;1128 readonly isBalanceDeposit: boolean;1129 readonly asBalanceDeposit: ITuple<[AccountId32, H160, U256]>;1130 readonly isBalanceWithdraw: boolean;1131 readonly asBalanceWithdraw: ITuple<[AccountId32, H160, U256]>;1132 readonly type: 'Log' | 'Created' | 'CreatedFailed' | 'Executed' | 'ExecutedFailed' | 'BalanceDeposit' | 'BalanceWithdraw';1133}11341135/** @name PalletEvmMigrationCall */1136export interface PalletEvmMigrationCall extends Enum {1137 readonly isBegin: boolean;1138 readonly asBegin: {1139 readonly address: H160;1140 } & Struct;1141 readonly isSetData: boolean;1142 readonly asSetData: {1143 readonly address: H160;1144 readonly data: Vec<ITuple<[H256, H256]>>;1145 } & Struct;1146 readonly isFinish: boolean;1147 readonly asFinish: {1148 readonly address: H160;1149 readonly code: Bytes;1150 } & Struct;1151 readonly type: 'Begin' | 'SetData' | 'Finish';1152}11531154/** @name PalletEvmMigrationError */1155export interface PalletEvmMigrationError extends Enum {1156 readonly isAccountNotEmpty: boolean;1157 readonly isAccountIsNotMigrating: boolean;1158 readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating';1159}11601161/** @name PalletFungibleError */1162export interface PalletFungibleError extends Enum {1163 readonly isNotFungibleDataUsedToMintFungibleCollectionToken: boolean;1164 readonly isFungibleItemsHaveNoId: boolean;1165 readonly isFungibleItemsDontHaveData: boolean;1166 readonly isFungibleDisallowsNesting: boolean;1167 readonly isSettingPropertiesNotAllowed: boolean;1168 readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';1169}11701171/** @name PalletInflationCall */1172export interface PalletInflationCall extends Enum {1173 readonly isStartInflation: boolean;1174 readonly asStartInflation: {1175 readonly inflationStartRelayBlock: u32;1176 } & Struct;1177 readonly type: 'StartInflation';1178}11791180/** @name PalletNonfungibleError */1181export interface PalletNonfungibleError extends Enum {1182 readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean;1183 readonly isNonfungibleItemsHaveNoAmount: boolean;1184 readonly isCantBurnNftWithChildren: boolean;1185 readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren';1186}11871188/** @name PalletNonfungibleItemData */1189export interface PalletNonfungibleItemData extends Struct {1190 readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1191}11921193/** @name PalletRefungibleError */1194export interface PalletRefungibleError extends Enum {1195 readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;1196 readonly isWrongRefungiblePieces: boolean;1197 readonly isRepartitionWhileNotOwningAllPieces: boolean;1198 readonly isRefungibleDisallowsNesting: boolean;1199 readonly isSettingPropertiesNotAllowed: boolean;1200 readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';1201}12021203/** @name PalletRefungibleItemData */1204export interface PalletRefungibleItemData extends Struct {1205 readonly constData: Bytes;1206}12071208/** @name PalletRmrkCoreCall */1209export interface PalletRmrkCoreCall extends Enum {1210 readonly isCreateCollection: boolean;1211 readonly asCreateCollection: {1212 readonly metadata: Bytes;1213 readonly max: Option<u32>;1214 readonly symbol: Bytes;1215 } & Struct;1216 readonly isDestroyCollection: boolean;1217 readonly asDestroyCollection: {1218 readonly collectionId: u32;1219 } & Struct;1220 readonly isChangeCollectionIssuer: boolean;1221 readonly asChangeCollectionIssuer: {1222 readonly collectionId: u32;1223 readonly newIssuer: MultiAddress;1224 } & Struct;1225 readonly isLockCollection: boolean;1226 readonly asLockCollection: {1227 readonly collectionId: u32;1228 } & Struct;1229 readonly isMintNft: boolean;1230 readonly asMintNft: {1231 readonly owner: Option<AccountId32>;1232 readonly collectionId: u32;1233 readonly recipient: Option<AccountId32>;1234 readonly royaltyAmount: Option<Permill>;1235 readonly metadata: Bytes;1236 readonly transferable: bool;1237 readonly resources: Option<Vec<RmrkTraitsResourceResourceTypes>>;1238 } & Struct;1239 readonly isBurnNft: boolean;1240 readonly asBurnNft: {1241 readonly collectionId: u32;1242 readonly nftId: u32;1243 readonly maxBurns: u32;1244 } & Struct;1245 readonly isSend: boolean;1246 readonly asSend: {1247 readonly rmrkCollectionId: u32;1248 readonly rmrkNftId: u32;1249 readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1250 } & Struct;1251 readonly isAcceptNft: boolean;1252 readonly asAcceptNft: {1253 readonly rmrkCollectionId: u32;1254 readonly rmrkNftId: u32;1255 readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1256 } & Struct;1257 readonly isRejectNft: boolean;1258 readonly asRejectNft: {1259 readonly rmrkCollectionId: u32;1260 readonly rmrkNftId: u32;1261 } & Struct;1262 readonly isAcceptResource: boolean;1263 readonly asAcceptResource: {1264 readonly rmrkCollectionId: u32;1265 readonly rmrkNftId: u32;1266 readonly resourceId: u32;1267 } & Struct;1268 readonly isAcceptResourceRemoval: boolean;1269 readonly asAcceptResourceRemoval: {1270 readonly rmrkCollectionId: u32;1271 readonly rmrkNftId: u32;1272 readonly resourceId: u32;1273 } & Struct;1274 readonly isSetProperty: boolean;1275 readonly asSetProperty: {1276 readonly rmrkCollectionId: Compact<u32>;1277 readonly maybeNftId: Option<u32>;1278 readonly key: Bytes;1279 readonly value: Bytes;1280 } & Struct;1281 readonly isSetPriority: boolean;1282 readonly asSetPriority: {1283 readonly rmrkCollectionId: u32;1284 readonly rmrkNftId: u32;1285 readonly priorities: Vec<u32>;1286 } & Struct;1287 readonly isAddBasicResource: boolean;1288 readonly asAddBasicResource: {1289 readonly rmrkCollectionId: u32;1290 readonly nftId: u32;1291 readonly resource: RmrkTraitsResourceBasicResource;1292 } & Struct;1293 readonly isAddComposableResource: boolean;1294 readonly asAddComposableResource: {1295 readonly rmrkCollectionId: u32;1296 readonly nftId: u32;1297 readonly resource: RmrkTraitsResourceComposableResource;1298 } & Struct;1299 readonly isAddSlotResource: boolean;1300 readonly asAddSlotResource: {1301 readonly rmrkCollectionId: u32;1302 readonly nftId: u32;1303 readonly resource: RmrkTraitsResourceSlotResource;1304 } & Struct;1305 readonly isRemoveResource: boolean;1306 readonly asRemoveResource: {1307 readonly rmrkCollectionId: u32;1308 readonly nftId: u32;1309 readonly resourceId: u32;1310 } & Struct;1311 readonly type: 'CreateCollection' | 'DestroyCollection' | 'ChangeCollectionIssuer' | 'LockCollection' | 'MintNft' | 'BurnNft' | 'Send' | 'AcceptNft' | 'RejectNft' | 'AcceptResource' | 'AcceptResourceRemoval' | 'SetProperty' | 'SetPriority' | 'AddBasicResource' | 'AddComposableResource' | 'AddSlotResource' | 'RemoveResource';1312}13131314/** @name PalletRmrkCoreError */1315export interface PalletRmrkCoreError extends Enum {1316 readonly isCorruptedCollectionType: boolean;1317 readonly isNftTypeEncodeError: boolean;1318 readonly isRmrkPropertyKeyIsTooLong: boolean;1319 readonly isRmrkPropertyValueIsTooLong: boolean;1320 readonly isRmrkPropertyIsNotFound: boolean;1321 readonly isUnableToDecodeRmrkData: boolean;1322 readonly isCollectionNotEmpty: boolean;1323 readonly isNoAvailableCollectionId: boolean;1324 readonly isNoAvailableNftId: boolean;1325 readonly isCollectionUnknown: boolean;1326 readonly isNoPermission: boolean;1327 readonly isNonTransferable: boolean;1328 readonly isCollectionFullOrLocked: boolean;1329 readonly isResourceDoesntExist: boolean;1330 readonly isCannotSendToDescendentOrSelf: boolean;1331 readonly isCannotAcceptNonOwnedNft: boolean;1332 readonly isCannotRejectNonOwnedNft: boolean;1333 readonly isCannotRejectNonPendingNft: boolean;1334 readonly isResourceNotPending: boolean;1335 readonly isNoAvailableResourceId: boolean;1336 readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId';1337}13381339/** @name PalletRmrkCoreEvent */1340export interface PalletRmrkCoreEvent extends Enum {1341 readonly isCollectionCreated: boolean;1342 readonly asCollectionCreated: {1343 readonly issuer: AccountId32;1344 readonly collectionId: u32;1345 } & Struct;1346 readonly isCollectionDestroyed: boolean;1347 readonly asCollectionDestroyed: {1348 readonly issuer: AccountId32;1349 readonly collectionId: u32;1350 } & Struct;1351 readonly isIssuerChanged: boolean;1352 readonly asIssuerChanged: {1353 readonly oldIssuer: AccountId32;1354 readonly newIssuer: AccountId32;1355 readonly collectionId: u32;1356 } & Struct;1357 readonly isCollectionLocked: boolean;1358 readonly asCollectionLocked: {1359 readonly issuer: AccountId32;1360 readonly collectionId: u32;1361 } & Struct;1362 readonly isNftMinted: boolean;1363 readonly asNftMinted: {1364 readonly owner: AccountId32;1365 readonly collectionId: u32;1366 readonly nftId: u32;1367 } & Struct;1368 readonly isNftBurned: boolean;1369 readonly asNftBurned: {1370 readonly owner: AccountId32;1371 readonly nftId: u32;1372 } & Struct;1373 readonly isNftSent: boolean;1374 readonly asNftSent: {1375 readonly sender: AccountId32;1376 readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;1377 readonly collectionId: u32;1378 readonly nftId: u32;1379 readonly approvalRequired: bool;1380 } & Struct;1381 readonly isNftAccepted: boolean;1382 readonly asNftAccepted: {1383 readonly sender: AccountId32;1384 readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;1385 readonly collectionId: u32;1386 readonly nftId: u32;1387 } & Struct;1388 readonly isNftRejected: boolean;1389 readonly asNftRejected: {1390 readonly sender: AccountId32;1391 readonly collectionId: u32;1392 readonly nftId: u32;1393 } & Struct;1394 readonly isPropertySet: boolean;1395 readonly asPropertySet: {1396 readonly collectionId: u32;1397 readonly maybeNftId: Option<u32>;1398 readonly key: Bytes;1399 readonly value: Bytes;1400 } & Struct;1401 readonly isResourceAdded: boolean;1402 readonly asResourceAdded: {1403 readonly nftId: u32;1404 readonly resourceId: u32;1405 } & Struct;1406 readonly isResourceRemoval: boolean;1407 readonly asResourceRemoval: {1408 readonly nftId: u32;1409 readonly resourceId: u32;1410 } & Struct;1411 readonly isResourceAccepted: boolean;1412 readonly asResourceAccepted: {1413 readonly nftId: u32;1414 readonly resourceId: u32;1415 } & Struct;1416 readonly isResourceRemovalAccepted: boolean;1417 readonly asResourceRemovalAccepted: {1418 readonly nftId: u32;1419 readonly resourceId: u32;1420 } & Struct;1421 readonly isPrioritySet: boolean;1422 readonly asPrioritySet: {1423 readonly collectionId: u32;1424 readonly nftId: u32;1425 } & Struct;1426 readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'IssuerChanged' | 'CollectionLocked' | 'NftMinted' | 'NftBurned' | 'NftSent' | 'NftAccepted' | 'NftRejected' | 'PropertySet' | 'ResourceAdded' | 'ResourceRemoval' | 'ResourceAccepted' | 'ResourceRemovalAccepted' | 'PrioritySet';1427}14281429/** @name PalletRmrkEquipCall */1430export interface PalletRmrkEquipCall extends Enum {1431 readonly isCreateBase: boolean;1432 readonly asCreateBase: {1433 readonly baseType: Bytes;1434 readonly symbol: Bytes;1435 readonly parts: Vec<RmrkTraitsPartPartType>;1436 } & Struct;1437 readonly isThemeAdd: boolean;1438 readonly asThemeAdd: {1439 readonly baseId: u32;1440 readonly theme: RmrkTraitsTheme;1441 } & Struct;1442 readonly isEquippable: boolean;1443 readonly asEquippable: {1444 readonly baseId: u32;1445 readonly slotId: u32;1446 readonly equippables: RmrkTraitsPartEquippableList;1447 } & Struct;1448 readonly type: 'CreateBase' | 'ThemeAdd' | 'Equippable';1449}14501451/** @name PalletRmrkEquipError */1452export interface PalletRmrkEquipError extends Enum {1453 readonly isPermissionError: boolean;1454 readonly isNoAvailableBaseId: boolean;1455 readonly isNoAvailablePartId: boolean;1456 readonly isBaseDoesntExist: boolean;1457 readonly isNeedsDefaultThemeFirst: boolean;1458 readonly isPartDoesntExist: boolean;1459 readonly isNoEquippableOnFixedPart: boolean;1460 readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart';1461}14621463/** @name PalletRmrkEquipEvent */1464export interface PalletRmrkEquipEvent extends Enum {1465 readonly isBaseCreated: boolean;1466 readonly asBaseCreated: {1467 readonly issuer: AccountId32;1468 readonly baseId: u32;1469 } & Struct;1470 readonly isEquippablesUpdated: boolean;1471 readonly asEquippablesUpdated: {1472 readonly baseId: u32;1473 readonly slotId: u32;1474 } & Struct;1475 readonly type: 'BaseCreated' | 'EquippablesUpdated';1476}14771478/** @name PalletStructureCall */1479export interface PalletStructureCall extends Null {}14801481/** @name PalletStructureError */1482export interface PalletStructureError extends Enum {1483 readonly isOuroborosDetected: boolean;1484 readonly isDepthLimit: boolean;1485 readonly isBreadthLimit: boolean;1486 readonly isTokenNotFound: boolean;1487 readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound';1488}14891490/** @name PalletStructureEvent */1491export interface PalletStructureEvent extends Enum {1492 readonly isExecuted: boolean;1493 readonly asExecuted: Result<Null, SpRuntimeDispatchError>;1494 readonly type: 'Executed';1495}14961497/** @name PalletSudoCall */1498export interface PalletSudoCall extends Enum {1499 readonly isSudo: boolean;1500 readonly asSudo: {1501 readonly call: Call;1502 } & Struct;1503 readonly isSudoUncheckedWeight: boolean;1504 readonly asSudoUncheckedWeight: {1505 readonly call: Call;1506 readonly weight: u64;1507 } & Struct;1508 readonly isSetKey: boolean;1509 readonly asSetKey: {1510 readonly new_: MultiAddress;1511 } & Struct;1512 readonly isSudoAs: boolean;1513 readonly asSudoAs: {1514 readonly who: MultiAddress;1515 readonly call: Call;1516 } & Struct;1517 readonly type: 'Sudo' | 'SudoUncheckedWeight' | 'SetKey' | 'SudoAs';1518}15191520/** @name PalletSudoError */1521export interface PalletSudoError extends Enum {1522 readonly isRequireSudo: boolean;1523 readonly type: 'RequireSudo';1524}15251526/** @name PalletSudoEvent */1527export interface PalletSudoEvent extends Enum {1528 readonly isSudid: boolean;1529 readonly asSudid: {1530 readonly sudoResult: Result<Null, SpRuntimeDispatchError>;1531 } & Struct;1532 readonly isKeyChanged: boolean;1533 readonly asKeyChanged: {1534 readonly oldSudoer: Option<AccountId32>;1535 } & Struct;1536 readonly isSudoAsDone: boolean;1537 readonly asSudoAsDone: {1538 readonly sudoResult: Result<Null, SpRuntimeDispatchError>;1539 } & Struct;1540 readonly type: 'Sudid' | 'KeyChanged' | 'SudoAsDone';1541}15421543/** @name PalletTemplateTransactionPaymentCall */1544export interface PalletTemplateTransactionPaymentCall extends Null {}15451546/** @name PalletTemplateTransactionPaymentChargeTransactionPayment */1547export interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact<u128> {}15481549/** @name PalletTimestampCall */1550export interface PalletTimestampCall extends Enum {1551 readonly isSet: boolean;1552 readonly asSet: {1553 readonly now: Compact<u64>;1554 } & Struct;1555 readonly type: 'Set';1556}15571558/** @name PalletTransactionPaymentReleases */1559export interface PalletTransactionPaymentReleases extends Enum {1560 readonly isV1Ancient: boolean;1561 readonly isV2: boolean;1562 readonly type: 'V1Ancient' | 'V2';1563}15641565/** @name PalletTreasuryCall */1566export interface PalletTreasuryCall extends Enum {1567 readonly isProposeSpend: boolean;1568 readonly asProposeSpend: {1569 readonly value: Compact<u128>;1570 readonly beneficiary: MultiAddress;1571 } & Struct;1572 readonly isRejectProposal: boolean;1573 readonly asRejectProposal: {1574 readonly proposalId: Compact<u32>;1575 } & Struct;1576 readonly isApproveProposal: boolean;1577 readonly asApproveProposal: {1578 readonly proposalId: Compact<u32>;1579 } & Struct;1580 readonly isRemoveApproval: boolean;1581 readonly asRemoveApproval: {1582 readonly proposalId: Compact<u32>;1583 } & Struct;1584 readonly type: 'ProposeSpend' | 'RejectProposal' | 'ApproveProposal' | 'RemoveApproval';1585}15861587/** @name PalletTreasuryError */1588export interface PalletTreasuryError extends Enum {1589 readonly isInsufficientProposersBalance: boolean;1590 readonly isInvalidIndex: boolean;1591 readonly isTooManyApprovals: boolean;1592 readonly isProposalNotApproved: boolean;1593 readonly type: 'InsufficientProposersBalance' | 'InvalidIndex' | 'TooManyApprovals' | 'ProposalNotApproved';1594}15951596/** @name PalletTreasuryEvent */1597export interface PalletTreasuryEvent extends Enum {1598 readonly isProposed: boolean;1599 readonly asProposed: {1600 readonly proposalIndex: u32;1601 } & Struct;1602 readonly isSpending: boolean;1603 readonly asSpending: {1604 readonly budgetRemaining: u128;1605 } & Struct;1606 readonly isAwarded: boolean;1607 readonly asAwarded: {1608 readonly proposalIndex: u32;1609 readonly award: u128;1610 readonly account: AccountId32;1611 } & Struct;1612 readonly isRejected: boolean;1613 readonly asRejected: {1614 readonly proposalIndex: u32;1615 readonly slashed: u128;1616 } & Struct;1617 readonly isBurnt: boolean;1618 readonly asBurnt: {1619 readonly burntFunds: u128;1620 } & Struct;1621 readonly isRollover: boolean;1622 readonly asRollover: {1623 readonly rolloverBalance: u128;1624 } & Struct;1625 readonly isDeposit: boolean;1626 readonly asDeposit: {1627 readonly value: u128;1628 } & Struct;1629 readonly type: 'Proposed' | 'Spending' | 'Awarded' | 'Rejected' | 'Burnt' | 'Rollover' | 'Deposit';1630}16311632/** @name PalletTreasuryProposal */1633export interface PalletTreasuryProposal extends Struct {1634 readonly proposer: AccountId32;1635 readonly value: u128;1636 readonly beneficiary: AccountId32;1637 readonly bond: u128;1638}16391640/** @name PalletUniqueCall */1641export interface PalletUniqueCall extends Enum {1642 readonly isCreateCollection: boolean;1643 readonly asCreateCollection: {1644 readonly collectionName: Vec<u16>;1645 readonly collectionDescription: Vec<u16>;1646 readonly tokenPrefix: Bytes;1647 readonly mode: UpDataStructsCollectionMode;1648 } & Struct;1649 readonly isCreateCollectionEx: boolean;1650 readonly asCreateCollectionEx: {1651 readonly data: UpDataStructsCreateCollectionData;1652 } & Struct;1653 readonly isDestroyCollection: boolean;1654 readonly asDestroyCollection: {1655 readonly collectionId: u32;1656 } & Struct;1657 readonly isAddToAllowList: boolean;1658 readonly asAddToAllowList: {1659 readonly collectionId: u32;1660 readonly address: PalletEvmAccountBasicCrossAccountIdRepr;1661 } & Struct;1662 readonly isRemoveFromAllowList: boolean;1663 readonly asRemoveFromAllowList: {1664 readonly collectionId: u32;1665 readonly address: PalletEvmAccountBasicCrossAccountIdRepr;1666 } & Struct;1667 readonly isChangeCollectionOwner: boolean;1668 readonly asChangeCollectionOwner: {1669 readonly collectionId: u32;1670 readonly newOwner: AccountId32;1671 } & Struct;1672 readonly isAddCollectionAdmin: boolean;1673 readonly asAddCollectionAdmin: {1674 readonly collectionId: u32;1675 readonly newAdmin: PalletEvmAccountBasicCrossAccountIdRepr;1676 } & Struct;1677 readonly isRemoveCollectionAdmin: boolean;1678 readonly asRemoveCollectionAdmin: {1679 readonly collectionId: u32;1680 readonly accountId: PalletEvmAccountBasicCrossAccountIdRepr;1681 } & Struct;1682 readonly isSetCollectionSponsor: boolean;1683 readonly asSetCollectionSponsor: {1684 readonly collectionId: u32;1685 readonly newSponsor: AccountId32;1686 } & Struct;1687 readonly isConfirmSponsorship: boolean;1688 readonly asConfirmSponsorship: {1689 readonly collectionId: u32;1690 } & Struct;1691 readonly isRemoveCollectionSponsor: boolean;1692 readonly asRemoveCollectionSponsor: {1693 readonly collectionId: u32;1694 } & Struct;1695 readonly isCreateItem: boolean;1696 readonly asCreateItem: {1697 readonly collectionId: u32;1698 readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1699 readonly data: UpDataStructsCreateItemData;1700 } & Struct;1701 readonly isCreateMultipleItems: boolean;1702 readonly asCreateMultipleItems: {1703 readonly collectionId: u32;1704 readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1705 readonly itemsData: Vec<UpDataStructsCreateItemData>;1706 } & Struct;1707 readonly isSetCollectionProperties: boolean;1708 readonly asSetCollectionProperties: {1709 readonly collectionId: u32;1710 readonly properties: Vec<UpDataStructsProperty>;1711 } & Struct;1712 readonly isDeleteCollectionProperties: boolean;1713 readonly asDeleteCollectionProperties: {1714 readonly collectionId: u32;1715 readonly propertyKeys: Vec<Bytes>;1716 } & Struct;1717 readonly isSetTokenProperties: boolean;1718 readonly asSetTokenProperties: {1719 readonly collectionId: u32;1720 readonly tokenId: u32;1721 readonly properties: Vec<UpDataStructsProperty>;1722 } & Struct;1723 readonly isDeleteTokenProperties: boolean;1724 readonly asDeleteTokenProperties: {1725 readonly collectionId: u32;1726 readonly tokenId: u32;1727 readonly propertyKeys: Vec<Bytes>;1728 } & Struct;1729 readonly isSetTokenPropertyPermissions: boolean;1730 readonly asSetTokenPropertyPermissions: {1731 readonly collectionId: u32;1732 readonly propertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;1733 } & Struct;1734 readonly isCreateMultipleItemsEx: boolean;1735 readonly asCreateMultipleItemsEx: {1736 readonly collectionId: u32;1737 readonly data: UpDataStructsCreateItemExData;1738 } & Struct;1739 readonly isSetTransfersEnabledFlag: boolean;1740 readonly asSetTransfersEnabledFlag: {1741 readonly collectionId: u32;1742 readonly value: bool;1743 } & Struct;1744 readonly isBurnItem: boolean;1745 readonly asBurnItem: {1746 readonly collectionId: u32;1747 readonly itemId: u32;1748 readonly value: u128;1749 } & Struct;1750 readonly isBurnFrom: boolean;1751 readonly asBurnFrom: {1752 readonly collectionId: u32;1753 readonly from: PalletEvmAccountBasicCrossAccountIdRepr;1754 readonly itemId: u32;1755 readonly value: u128;1756 } & Struct;1757 readonly isTransfer: boolean;1758 readonly asTransfer: {1759 readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;1760 readonly collectionId: u32;1761 readonly itemId: u32;1762 readonly value: u128;1763 } & Struct;1764 readonly isApprove: boolean;1765 readonly asApprove: {1766 readonly spender: PalletEvmAccountBasicCrossAccountIdRepr;1767 readonly collectionId: u32;1768 readonly itemId: u32;1769 readonly amount: u128;1770 } & Struct;1771 readonly isTransferFrom: boolean;1772 readonly asTransferFrom: {1773 readonly from: PalletEvmAccountBasicCrossAccountIdRepr;1774 readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;1775 readonly collectionId: u32;1776 readonly itemId: u32;1777 readonly value: u128;1778 } & Struct;1779 readonly isSetCollectionLimits: boolean;1780 readonly asSetCollectionLimits: {1781 readonly collectionId: u32;1782 readonly newLimit: UpDataStructsCollectionLimits;1783 } & Struct;1784 readonly isSetCollectionPermissions: boolean;1785 readonly asSetCollectionPermissions: {1786 readonly collectionId: u32;1787 readonly newPermission: UpDataStructsCollectionPermissions;1788 } & Struct;1789 readonly isRepartition: boolean;1790 readonly asRepartition: {1791 readonly collectionId: u32;1792 readonly tokenId: u32;1793 readonly amount: u128;1794 } & Struct;1795 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';1796}17971798/** @name PalletUniqueError */1799export interface PalletUniqueError extends Enum {1800 readonly isCollectionDecimalPointLimitExceeded: boolean;1801 readonly isConfirmUnsetSponsorFail: boolean;1802 readonly isEmptyArgument: boolean;1803 readonly isRepartitionCalledOnNonRefungibleCollection: boolean;1804 readonly type: 'CollectionDecimalPointLimitExceeded' | 'ConfirmUnsetSponsorFail' | 'EmptyArgument' | 'RepartitionCalledOnNonRefungibleCollection';1805}18061807/** @name PalletUniqueRawEvent */1808export interface PalletUniqueRawEvent extends Enum {1809 readonly isCollectionSponsorRemoved: boolean;1810 readonly asCollectionSponsorRemoved: u32;1811 readonly isCollectionAdminAdded: boolean;1812 readonly asCollectionAdminAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1813 readonly isCollectionOwnedChanged: boolean;1814 readonly asCollectionOwnedChanged: ITuple<[u32, AccountId32]>;1815 readonly isCollectionSponsorSet: boolean;1816 readonly asCollectionSponsorSet: ITuple<[u32, AccountId32]>;1817 readonly isSponsorshipConfirmed: boolean;1818 readonly asSponsorshipConfirmed: ITuple<[u32, AccountId32]>;1819 readonly isCollectionAdminRemoved: boolean;1820 readonly asCollectionAdminRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1821 readonly isAllowListAddressRemoved: boolean;1822 readonly asAllowListAddressRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1823 readonly isAllowListAddressAdded: boolean;1824 readonly asAllowListAddressAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1825 readonly isCollectionLimitSet: boolean;1826 readonly asCollectionLimitSet: u32;1827 readonly isCollectionPermissionSet: boolean;1828 readonly asCollectionPermissionSet: u32;1829 readonly type: 'CollectionSponsorRemoved' | 'CollectionAdminAdded' | 'CollectionOwnedChanged' | 'CollectionSponsorSet' | 'SponsorshipConfirmed' | 'CollectionAdminRemoved' | 'AllowListAddressRemoved' | 'AllowListAddressAdded' | 'CollectionLimitSet' | 'CollectionPermissionSet';1830}18311832/** @name PalletUniqueSchedulerCall */1833export interface PalletUniqueSchedulerCall extends Enum {1834 readonly isScheduleNamed: boolean;1835 readonly asScheduleNamed: {1836 readonly id: U8aFixed;1837 readonly when: u32;1838 readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1839 readonly priority: u8;1840 readonly call: FrameSupportScheduleMaybeHashed;1841 } & Struct;1842 readonly isCancelNamed: boolean;1843 readonly asCancelNamed: {1844 readonly id: U8aFixed;1845 } & Struct;1846 readonly isScheduleNamedAfter: boolean;1847 readonly asScheduleNamedAfter: {1848 readonly id: U8aFixed;1849 readonly after: u32;1850 readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1851 readonly priority: u8;1852 readonly call: FrameSupportScheduleMaybeHashed;1853 } & Struct;1854 readonly type: 'ScheduleNamed' | 'CancelNamed' | 'ScheduleNamedAfter';1855}18561857/** @name PalletUniqueSchedulerError */1858export interface PalletUniqueSchedulerError extends Enum {1859 readonly isFailedToSchedule: boolean;1860 readonly isNotFound: boolean;1861 readonly isTargetBlockNumberInPast: boolean;1862 readonly isRescheduleNoChange: boolean;1863 readonly type: 'FailedToSchedule' | 'NotFound' | 'TargetBlockNumberInPast' | 'RescheduleNoChange';1864}18651866/** @name PalletUniqueSchedulerEvent */1867export interface PalletUniqueSchedulerEvent extends Enum {1868 readonly isScheduled: boolean;1869 readonly asScheduled: {1870 readonly when: u32;1871 readonly index: u32;1872 } & Struct;1873 readonly isCanceled: boolean;1874 readonly asCanceled: {1875 readonly when: u32;1876 readonly index: u32;1877 } & Struct;1878 readonly isDispatched: boolean;1879 readonly asDispatched: {1880 readonly task: ITuple<[u32, u32]>;1881 readonly id: Option<U8aFixed>;1882 readonly result: Result<Null, SpRuntimeDispatchError>;1883 } & Struct;1884 readonly isCallLookupFailed: boolean;1885 readonly asCallLookupFailed: {1886 readonly task: ITuple<[u32, u32]>;1887 readonly id: Option<U8aFixed>;1888 readonly error: FrameSupportScheduleLookupError;1889 } & Struct;1890 readonly type: 'Scheduled' | 'Canceled' | 'Dispatched' | 'CallLookupFailed';1891}18921893/** @name PalletUniqueSchedulerScheduledV3 */1894export interface PalletUniqueSchedulerScheduledV3 extends Struct {1895 readonly maybeId: Option<U8aFixed>;1896 readonly priority: u8;1897 readonly call: FrameSupportScheduleMaybeHashed;1898 readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1899 readonly origin: OpalRuntimeOriginCaller;1900}19011902/** @name PalletXcmCall */1903export interface PalletXcmCall extends Enum {1904 readonly isSend: boolean;1905 readonly asSend: {1906 readonly dest: XcmVersionedMultiLocation;1907 readonly message: XcmVersionedXcm;1908 } & Struct;1909 readonly isTeleportAssets: boolean;1910 readonly asTeleportAssets: {1911 readonly dest: XcmVersionedMultiLocation;1912 readonly beneficiary: XcmVersionedMultiLocation;1913 readonly assets: XcmVersionedMultiAssets;1914 readonly feeAssetItem: u32;1915 } & Struct;1916 readonly isReserveTransferAssets: boolean;1917 readonly asReserveTransferAssets: {1918 readonly dest: XcmVersionedMultiLocation;1919 readonly beneficiary: XcmVersionedMultiLocation;1920 readonly assets: XcmVersionedMultiAssets;1921 readonly feeAssetItem: u32;1922 } & Struct;1923 readonly isExecute: boolean;1924 readonly asExecute: {1925 readonly message: XcmVersionedXcm;1926 readonly maxWeight: u64;1927 } & Struct;1928 readonly isForceXcmVersion: boolean;1929 readonly asForceXcmVersion: {1930 readonly location: XcmV1MultiLocation;1931 readonly xcmVersion: u32;1932 } & Struct;1933 readonly isForceDefaultXcmVersion: boolean;1934 readonly asForceDefaultXcmVersion: {1935 readonly maybeXcmVersion: Option<u32>;1936 } & Struct;1937 readonly isForceSubscribeVersionNotify: boolean;1938 readonly asForceSubscribeVersionNotify: {1939 readonly location: XcmVersionedMultiLocation;1940 } & Struct;1941 readonly isForceUnsubscribeVersionNotify: boolean;1942 readonly asForceUnsubscribeVersionNotify: {1943 readonly location: XcmVersionedMultiLocation;1944 } & Struct;1945 readonly isLimitedReserveTransferAssets: boolean;1946 readonly asLimitedReserveTransferAssets: {1947 readonly dest: XcmVersionedMultiLocation;1948 readonly beneficiary: XcmVersionedMultiLocation;1949 readonly assets: XcmVersionedMultiAssets;1950 readonly feeAssetItem: u32;1951 readonly weightLimit: XcmV2WeightLimit;1952 } & Struct;1953 readonly isLimitedTeleportAssets: boolean;1954 readonly asLimitedTeleportAssets: {1955 readonly dest: XcmVersionedMultiLocation;1956 readonly beneficiary: XcmVersionedMultiLocation;1957 readonly assets: XcmVersionedMultiAssets;1958 readonly feeAssetItem: u32;1959 readonly weightLimit: XcmV2WeightLimit;1960 } & Struct;1961 readonly type: 'Send' | 'TeleportAssets' | 'ReserveTransferAssets' | 'Execute' | 'ForceXcmVersion' | 'ForceDefaultXcmVersion' | 'ForceSubscribeVersionNotify' | 'ForceUnsubscribeVersionNotify' | 'LimitedReserveTransferAssets' | 'LimitedTeleportAssets';1962}19631964/** @name PalletXcmError */1965export interface PalletXcmError extends Enum {1966 readonly isUnreachable: boolean;1967 readonly isSendFailure: boolean;1968 readonly isFiltered: boolean;1969 readonly isUnweighableMessage: boolean;1970 readonly isDestinationNotInvertible: boolean;1971 readonly isEmpty: boolean;1972 readonly isCannotReanchor: boolean;1973 readonly isTooManyAssets: boolean;1974 readonly isInvalidOrigin: boolean;1975 readonly isBadVersion: boolean;1976 readonly isBadLocation: boolean;1977 readonly isNoSubscription: boolean;1978 readonly isAlreadySubscribed: boolean;1979 readonly type: 'Unreachable' | 'SendFailure' | 'Filtered' | 'UnweighableMessage' | 'DestinationNotInvertible' | 'Empty' | 'CannotReanchor' | 'TooManyAssets' | 'InvalidOrigin' | 'BadVersion' | 'BadLocation' | 'NoSubscription' | 'AlreadySubscribed';1980}19811982/** @name PalletXcmEvent */1983export interface PalletXcmEvent extends Enum {1984 readonly isAttempted: boolean;1985 readonly asAttempted: XcmV2TraitsOutcome;1986 readonly isSent: boolean;1987 readonly asSent: ITuple<[XcmV1MultiLocation, XcmV1MultiLocation, XcmV2Xcm]>;1988 readonly isUnexpectedResponse: boolean;1989 readonly asUnexpectedResponse: ITuple<[XcmV1MultiLocation, u64]>;1990 readonly isResponseReady: boolean;1991 readonly asResponseReady: ITuple<[u64, XcmV2Response]>;1992 readonly isNotified: boolean;1993 readonly asNotified: ITuple<[u64, u8, u8]>;1994 readonly isNotifyOverweight: boolean;1995 readonly asNotifyOverweight: ITuple<[u64, u8, u8, u64, u64]>;1996 readonly isNotifyDispatchError: boolean;1997 readonly asNotifyDispatchError: ITuple<[u64, u8, u8]>;1998 readonly isNotifyDecodeFailed: boolean;1999 readonly asNotifyDecodeFailed: ITuple<[u64, u8, u8]>;2000 readonly isInvalidResponder: boolean;2001 readonly asInvalidResponder: ITuple<[XcmV1MultiLocation, u64, Option<XcmV1MultiLocation>]>;2002 readonly isInvalidResponderVersion: boolean;2003 readonly asInvalidResponderVersion: ITuple<[XcmV1MultiLocation, u64]>;2004 readonly isResponseTaken: boolean;2005 readonly asResponseTaken: u64;2006 readonly isAssetsTrapped: boolean;2007 readonly asAssetsTrapped: ITuple<[H256, XcmV1MultiLocation, XcmVersionedMultiAssets]>;2008 readonly isVersionChangeNotified: boolean;2009 readonly asVersionChangeNotified: ITuple<[XcmV1MultiLocation, u32]>;2010 readonly isSupportedVersionChanged: boolean;2011 readonly asSupportedVersionChanged: ITuple<[XcmV1MultiLocation, u32]>;2012 readonly isNotifyTargetSendFail: boolean;2013 readonly asNotifyTargetSendFail: ITuple<[XcmV1MultiLocation, u64, XcmV2TraitsError]>;2014 readonly isNotifyTargetMigrationFail: boolean;2015 readonly asNotifyTargetMigrationFail: ITuple<[XcmVersionedMultiLocation, u64]>;2016 readonly type: 'Attempted' | 'Sent' | 'UnexpectedResponse' | 'ResponseReady' | 'Notified' | 'NotifyOverweight' | 'NotifyDispatchError' | 'NotifyDecodeFailed' | 'InvalidResponder' | 'InvalidResponderVersion' | 'ResponseTaken' | 'AssetsTrapped' | 'VersionChangeNotified' | 'SupportedVersionChanged' | 'NotifyTargetSendFail' | 'NotifyTargetMigrationFail';2017}20182019/** @name PalletXcmOrigin */2020export interface PalletXcmOrigin extends Enum {2021 readonly isXcm: boolean;2022 readonly asXcm: XcmV1MultiLocation;2023 readonly isResponse: boolean;2024 readonly asResponse: XcmV1MultiLocation;2025 readonly type: 'Xcm' | 'Response';2026}20272028/** @name PhantomTypeUpDataStructs */2029export interface PhantomTypeUpDataStructs extends Vec<ITuple<[UpDataStructsTokenData, UpDataStructsRpcCollection, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftNftInfo, RmrkTraitsResourceResourceInfo, RmrkTraitsPropertyPropertyInfo, RmrkTraitsBaseBaseInfo, RmrkTraitsPartPartType, RmrkTraitsTheme, RmrkTraitsNftNftChild]>> {}20302031/** @name PolkadotCorePrimitivesInboundDownwardMessage */2032export interface PolkadotCorePrimitivesInboundDownwardMessage extends Struct {2033 readonly sentAt: u32;2034 readonly msg: Bytes;2035}20362037/** @name PolkadotCorePrimitivesInboundHrmpMessage */2038export interface PolkadotCorePrimitivesInboundHrmpMessage extends Struct {2039 readonly sentAt: u32;2040 readonly data: Bytes;2041}20422043/** @name PolkadotCorePrimitivesOutboundHrmpMessage */2044export interface PolkadotCorePrimitivesOutboundHrmpMessage extends Struct {2045 readonly recipient: u32;2046 readonly data: Bytes;2047}20482049/** @name PolkadotParachainPrimitivesXcmpMessageFormat */2050export interface PolkadotParachainPrimitivesXcmpMessageFormat extends Enum {2051 readonly isConcatenatedVersionedXcm: boolean;2052 readonly isConcatenatedEncodedBlob: boolean;2053 readonly isSignals: boolean;2054 readonly type: 'ConcatenatedVersionedXcm' | 'ConcatenatedEncodedBlob' | 'Signals';2055}20562057/** @name PolkadotPrimitivesV2AbridgedHostConfiguration */2058export interface PolkadotPrimitivesV2AbridgedHostConfiguration extends Struct {2059 readonly maxCodeSize: u32;2060 readonly maxHeadDataSize: u32;2061 readonly maxUpwardQueueCount: u32;2062 readonly maxUpwardQueueSize: u32;2063 readonly maxUpwardMessageSize: u32;2064 readonly maxUpwardMessageNumPerCandidate: u32;2065 readonly hrmpMaxMessageNumPerCandidate: u32;2066 readonly validationUpgradeCooldown: u32;2067 readonly validationUpgradeDelay: u32;2068}20692070/** @name PolkadotPrimitivesV2AbridgedHrmpChannel */2071export interface PolkadotPrimitivesV2AbridgedHrmpChannel extends Struct {2072 readonly maxCapacity: u32;2073 readonly maxTotalSize: u32;2074 readonly maxMessageSize: u32;2075 readonly msgCount: u32;2076 readonly totalSize: u32;2077 readonly mqcHead: Option<H256>;2078}20792080/** @name PolkadotPrimitivesV2PersistedValidationData */2081export interface PolkadotPrimitivesV2PersistedValidationData extends Struct {2082 readonly parentHead: Bytes;2083 readonly relayParentNumber: u32;2084 readonly relayParentStorageRoot: H256;2085 readonly maxPovSize: u32;2086}20872088/** @name PolkadotPrimitivesV2UpgradeRestriction */2089export interface PolkadotPrimitivesV2UpgradeRestriction extends Enum {2090 readonly isPresent: boolean;2091 readonly type: 'Present';2092}20932094/** @name RmrkTraitsBaseBaseInfo */2095export interface RmrkTraitsBaseBaseInfo extends Struct {2096 readonly issuer: AccountId32;2097 readonly baseType: Bytes;2098 readonly symbol: Bytes;2099}21002101/** @name RmrkTraitsCollectionCollectionInfo */2102export interface RmrkTraitsCollectionCollectionInfo extends Struct {2103 readonly issuer: AccountId32;2104 readonly metadata: Bytes;2105 readonly max: Option<u32>;2106 readonly symbol: Bytes;2107 readonly nftsCount: u32;2108}21092110/** @name RmrkTraitsNftAccountIdOrCollectionNftTuple */2111export interface RmrkTraitsNftAccountIdOrCollectionNftTuple extends Enum {2112 readonly isAccountId: boolean;2113 readonly asAccountId: AccountId32;2114 readonly isCollectionAndNftTuple: boolean;2115 readonly asCollectionAndNftTuple: ITuple<[u32, u32]>;2116 readonly type: 'AccountId' | 'CollectionAndNftTuple';2117}21182119/** @name RmrkTraitsNftNftChild */2120export interface RmrkTraitsNftNftChild extends Struct {2121 readonly collectionId: u32;2122 readonly nftId: u32;2123}21242125/** @name RmrkTraitsNftNftInfo */2126export interface RmrkTraitsNftNftInfo extends Struct {2127 readonly owner: RmrkTraitsNftAccountIdOrCollectionNftTuple;2128 readonly royalty: Option<RmrkTraitsNftRoyaltyInfo>;2129 readonly metadata: Bytes;2130 readonly equipped: bool;2131 readonly pending: bool;2132}21332134/** @name RmrkTraitsNftRoyaltyInfo */2135export interface RmrkTraitsNftRoyaltyInfo extends Struct {2136 readonly recipient: AccountId32;2137 readonly amount: Permill;2138}21392140/** @name RmrkTraitsPartEquippableList */2141export interface RmrkTraitsPartEquippableList extends Enum {2142 readonly isAll: boolean;2143 readonly isEmpty: boolean;2144 readonly isCustom: boolean;2145 readonly asCustom: Vec<u32>;2146 readonly type: 'All' | 'Empty' | 'Custom';2147}21482149/** @name RmrkTraitsPartFixedPart */2150export interface RmrkTraitsPartFixedPart extends Struct {2151 readonly id: u32;2152 readonly z: u32;2153 readonly src: Bytes;2154}21552156/** @name RmrkTraitsPartPartType */2157export interface RmrkTraitsPartPartType extends Enum {2158 readonly isFixedPart: boolean;2159 readonly asFixedPart: RmrkTraitsPartFixedPart;2160 readonly isSlotPart: boolean;2161 readonly asSlotPart: RmrkTraitsPartSlotPart;2162 readonly type: 'FixedPart' | 'SlotPart';2163}21642165/** @name RmrkTraitsPartSlotPart */2166export interface RmrkTraitsPartSlotPart extends Struct {2167 readonly id: u32;2168 readonly equippable: RmrkTraitsPartEquippableList;2169 readonly src: Bytes;2170 readonly z: u32;2171}21722173/** @name RmrkTraitsPropertyPropertyInfo */2174export interface RmrkTraitsPropertyPropertyInfo extends Struct {2175 readonly key: Bytes;2176 readonly value: Bytes;2177}21782179/** @name RmrkTraitsResourceBasicResource */2180export interface RmrkTraitsResourceBasicResource extends Struct {2181 readonly src: Option<Bytes>;2182 readonly metadata: Option<Bytes>;2183 readonly license: Option<Bytes>;2184 readonly thumb: Option<Bytes>;2185}21862187/** @name RmrkTraitsResourceComposableResource */2188export interface RmrkTraitsResourceComposableResource extends Struct {2189 readonly parts: Vec<u32>;2190 readonly base: u32;2191 readonly src: Option<Bytes>;2192 readonly metadata: Option<Bytes>;2193 readonly license: Option<Bytes>;2194 readonly thumb: Option<Bytes>;2195}21962197/** @name RmrkTraitsResourceResourceInfo */2198export interface RmrkTraitsResourceResourceInfo extends Struct {2199 readonly id: u32;2200 readonly resource: RmrkTraitsResourceResourceTypes;2201 readonly pending: bool;2202 readonly pendingRemoval: bool;2203}22042205/** @name RmrkTraitsResourceResourceTypes */2206export interface RmrkTraitsResourceResourceTypes extends Enum {2207 readonly isBasic: boolean;2208 readonly asBasic: RmrkTraitsResourceBasicResource;2209 readonly isComposable: boolean;2210 readonly asComposable: RmrkTraitsResourceComposableResource;2211 readonly isSlot: boolean;2212 readonly asSlot: RmrkTraitsResourceSlotResource;2213 readonly type: 'Basic' | 'Composable' | 'Slot';2214}22152216/** @name RmrkTraitsResourceSlotResource */2217export interface RmrkTraitsResourceSlotResource extends Struct {2218 readonly base: u32;2219 readonly src: Option<Bytes>;2220 readonly metadata: Option<Bytes>;2221 readonly slot: u32;2222 readonly license: Option<Bytes>;2223 readonly thumb: Option<Bytes>;2224}22252226/** @name RmrkTraitsTheme */2227export interface RmrkTraitsTheme extends Struct {2228 readonly name: Bytes;2229 readonly properties: Vec<RmrkTraitsThemeThemeProperty>;2230 readonly inherit: bool;2231}22322233/** @name RmrkTraitsThemeThemeProperty */2234export interface RmrkTraitsThemeThemeProperty extends Struct {2235 readonly key: Bytes;2236 readonly value: Bytes;2237}22382239/** @name SpCoreEcdsaSignature */2240export interface SpCoreEcdsaSignature extends U8aFixed {}22412242/** @name SpCoreEd25519Signature */2243export interface SpCoreEd25519Signature extends U8aFixed {}22442245/** @name SpCoreSr25519Signature */2246export interface SpCoreSr25519Signature extends U8aFixed {}22472248/** @name SpCoreVoid */2249export interface SpCoreVoid extends Null {}22502251/** @name SpRuntimeArithmeticError */2252export interface SpRuntimeArithmeticError extends Enum {2253 readonly isUnderflow: boolean;2254 readonly isOverflow: boolean;2255 readonly isDivisionByZero: boolean;2256 readonly type: 'Underflow' | 'Overflow' | 'DivisionByZero';2257}22582259/** @name SpRuntimeDigest */2260export interface SpRuntimeDigest extends Struct {2261 readonly logs: Vec<SpRuntimeDigestDigestItem>;2262}22632264/** @name SpRuntimeDigestDigestItem */2265export interface SpRuntimeDigestDigestItem extends Enum {2266 readonly isOther: boolean;2267 readonly asOther: Bytes;2268 readonly isConsensus: boolean;2269 readonly asConsensus: ITuple<[U8aFixed, Bytes]>;2270 readonly isSeal: boolean;2271 readonly asSeal: ITuple<[U8aFixed, Bytes]>;2272 readonly isPreRuntime: boolean;2273 readonly asPreRuntime: ITuple<[U8aFixed, Bytes]>;2274 readonly isRuntimeEnvironmentUpdated: boolean;2275 readonly type: 'Other' | 'Consensus' | 'Seal' | 'PreRuntime' | 'RuntimeEnvironmentUpdated';2276}22772278/** @name SpRuntimeDispatchError */2279export interface SpRuntimeDispatchError extends Enum {2280 readonly isOther: boolean;2281 readonly isCannotLookup: boolean;2282 readonly isBadOrigin: boolean;2283 readonly isModule: boolean;2284 readonly asModule: SpRuntimeModuleError;2285 readonly isConsumerRemaining: boolean;2286 readonly isNoProviders: boolean;2287 readonly isTooManyConsumers: boolean;2288 readonly isToken: boolean;2289 readonly asToken: SpRuntimeTokenError;2290 readonly isArithmetic: boolean;2291 readonly asArithmetic: SpRuntimeArithmeticError;2292 readonly isTransactional: boolean;2293 readonly asTransactional: SpRuntimeTransactionalError;2294 readonly type: 'Other' | 'CannotLookup' | 'BadOrigin' | 'Module' | 'ConsumerRemaining' | 'NoProviders' | 'TooManyConsumers' | 'Token' | 'Arithmetic' | 'Transactional';2295}22962297/** @name SpRuntimeModuleError */2298export interface SpRuntimeModuleError extends Struct {2299 readonly index: u8;2300 readonly error: U8aFixed;2301}23022303/** @name SpRuntimeMultiSignature */2304export interface SpRuntimeMultiSignature extends Enum {2305 readonly isEd25519: boolean;2306 readonly asEd25519: SpCoreEd25519Signature;2307 readonly isSr25519: boolean;2308 readonly asSr25519: SpCoreSr25519Signature;2309 readonly isEcdsa: boolean;2310 readonly asEcdsa: SpCoreEcdsaSignature;2311 readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa';2312}23132314/** @name SpRuntimeTokenError */2315export interface SpRuntimeTokenError extends Enum {2316 readonly isNoFunds: boolean;2317 readonly isWouldDie: boolean;2318 readonly isBelowMinimum: boolean;2319 readonly isCannotCreate: boolean;2320 readonly isUnknownAsset: boolean;2321 readonly isFrozen: boolean;2322 readonly isUnsupported: boolean;2323 readonly type: 'NoFunds' | 'WouldDie' | 'BelowMinimum' | 'CannotCreate' | 'UnknownAsset' | 'Frozen' | 'Unsupported';2324}23252326/** @name SpRuntimeTransactionalError */2327export interface SpRuntimeTransactionalError extends Enum {2328 readonly isLimitReached: boolean;2329 readonly isNoLayer: boolean;2330 readonly type: 'LimitReached' | 'NoLayer';2331}23322333/** @name SpTrieStorageProof */2334export interface SpTrieStorageProof extends Struct {2335 readonly trieNodes: BTreeSet<Bytes>;2336}23372338/** @name SpVersionRuntimeVersion */2339export interface SpVersionRuntimeVersion extends Struct {2340 readonly specName: Text;2341 readonly implName: Text;2342 readonly authoringVersion: u32;2343 readonly specVersion: u32;2344 readonly implVersion: u32;2345 readonly apis: Vec<ITuple<[U8aFixed, u32]>>;2346 readonly transactionVersion: u32;2347 readonly stateVersion: u8;2348}23492350/** @name UpDataStructsAccessMode */2351export interface UpDataStructsAccessMode extends Enum {2352 readonly isNormal: boolean;2353 readonly isAllowList: boolean;2354 readonly type: 'Normal' | 'AllowList';2355}23562357/** @name UpDataStructsCollection */2358export interface UpDataStructsCollection extends Struct {2359 readonly owner: AccountId32;2360 readonly mode: UpDataStructsCollectionMode;2361 readonly name: Vec<u16>;2362 readonly description: Vec<u16>;2363 readonly tokenPrefix: Bytes;2364 readonly sponsorship: UpDataStructsSponsorshipState;2365 readonly limits: UpDataStructsCollectionLimits;2366 readonly permissions: UpDataStructsCollectionPermissions;2367 readonly externalCollection: bool;2368}23692370/** @name UpDataStructsCollectionLimits */2371export interface UpDataStructsCollectionLimits extends Struct {2372 readonly accountTokenOwnershipLimit: Option<u32>;2373 readonly sponsoredDataSize: Option<u32>;2374 readonly sponsoredDataRateLimit: Option<UpDataStructsSponsoringRateLimit>;2375 readonly tokenLimit: Option<u32>;2376 readonly sponsorTransferTimeout: Option<u32>;2377 readonly sponsorApproveTimeout: Option<u32>;2378 readonly ownerCanTransfer: Option<bool>;2379 readonly ownerCanDestroy: Option<bool>;2380 readonly transfersEnabled: Option<bool>;2381}23822383/** @name UpDataStructsCollectionMode */2384export interface UpDataStructsCollectionMode extends Enum {2385 readonly isNft: boolean;2386 readonly isFungible: boolean;2387 readonly asFungible: u8;2388 readonly isReFungible: boolean;2389 readonly type: 'Nft' | 'Fungible' | 'ReFungible';2390}23912392/** @name UpDataStructsCollectionPermissions */2393export interface UpDataStructsCollectionPermissions extends Struct {2394 readonly access: Option<UpDataStructsAccessMode>;2395 readonly mintMode: Option<bool>;2396 readonly nesting: Option<UpDataStructsNestingPermissions>;2397}23982399/** @name UpDataStructsCollectionStats */2400export interface UpDataStructsCollectionStats extends Struct {2401 readonly created: u32;2402 readonly destroyed: u32;2403 readonly alive: u32;2404}24052406/** @name UpDataStructsCreateCollectionData */2407export interface UpDataStructsCreateCollectionData extends Struct {2408 readonly mode: UpDataStructsCollectionMode;2409 readonly access: Option<UpDataStructsAccessMode>;2410 readonly name: Vec<u16>;2411 readonly description: Vec<u16>;2412 readonly tokenPrefix: Bytes;2413 readonly pendingSponsor: Option<AccountId32>;2414 readonly limits: Option<UpDataStructsCollectionLimits>;2415 readonly permissions: Option<UpDataStructsCollectionPermissions>;2416 readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2417 readonly properties: Vec<UpDataStructsProperty>;2418}24192420/** @name UpDataStructsCreateFungibleData */2421export interface UpDataStructsCreateFungibleData extends Struct {2422 readonly value: u128;2423}24242425/** @name UpDataStructsCreateItemData */2426export interface UpDataStructsCreateItemData extends Enum {2427 readonly isNft: boolean;2428 readonly asNft: UpDataStructsCreateNftData;2429 readonly isFungible: boolean;2430 readonly asFungible: UpDataStructsCreateFungibleData;2431 readonly isReFungible: boolean;2432 readonly asReFungible: UpDataStructsCreateReFungibleData;2433 readonly type: 'Nft' | 'Fungible' | 'ReFungible';2434}24352436/** @name UpDataStructsCreateItemExData */2437export interface UpDataStructsCreateItemExData extends Enum {2438 readonly isNft: boolean;2439 readonly asNft: Vec<UpDataStructsCreateNftExData>;2440 readonly isFungible: boolean;2441 readonly asFungible: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr,u128>;2442 readonly isRefungibleMultipleItems: boolean;2443 readonly asRefungibleMultipleItems: Vec<UpDataStructsCreateRefungibleExData>;2444 readonly isRefungibleMultipleOwners: boolean;2445 readonly asRefungibleMultipleOwners: UpDataStructsCreateRefungibleExData;2446 readonly type: 'Nft' | 'Fungible' | 'RefungibleMultipleItems' | 'RefungibleMultipleOwners';2447}24482449/** @name UpDataStructsCreateNftData */2450export interface UpDataStructsCreateNftData extends Struct {2451 readonly properties: Vec<UpDataStructsProperty>;2452}24532454/** @name UpDataStructsCreateNftExData */2455export interface UpDataStructsCreateNftExData extends Struct {2456 readonly properties: Vec<UpDataStructsProperty>;2457 readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;2458}24592460/** @name UpDataStructsCreateReFungibleData */2461export interface UpDataStructsCreateReFungibleData extends Struct {2462 readonly constData: Bytes;2463 readonly pieces: u128;2464}24652466/** @name UpDataStructsCreateRefungibleExData */2467export interface UpDataStructsCreateRefungibleExData extends Struct {2468 readonly constData: Bytes;2469 readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;2470}24712472/** @name UpDataStructsNestingPermissions */2473export interface UpDataStructsNestingPermissions extends Struct {2474 readonly tokenOwner: bool;2475 readonly collectionAdmin: bool;2476 readonly restricted: Option<UpDataStructsOwnerRestrictedSet>;2477}24782479/** @name UpDataStructsOwnerRestrictedSet */2480export interface UpDataStructsOwnerRestrictedSet extends BTreeSet<u32> {}24812482/** @name UpDataStructsProperties */2483export interface UpDataStructsProperties extends Struct {2484 readonly map: UpDataStructsPropertiesMapBoundedVec;2485 readonly consumedSpace: u32;2486 readonly spaceLimit: u32;2487}24882489/** @name UpDataStructsPropertiesMapBoundedVec */2490export interface UpDataStructsPropertiesMapBoundedVec extends BTreeMap<Bytes, Bytes> {}24912492/** @name UpDataStructsPropertiesMapPropertyPermission */2493export interface UpDataStructsPropertiesMapPropertyPermission extends BTreeMap<Bytes, UpDataStructsPropertyPermission> {}24942495/** @name UpDataStructsProperty */2496export interface UpDataStructsProperty extends Struct {2497 readonly key: Bytes;2498 readonly value: Bytes;2499}25002501/** @name UpDataStructsPropertyKeyPermission */2502export interface UpDataStructsPropertyKeyPermission extends Struct {2503 readonly key: Bytes;2504 readonly permission: UpDataStructsPropertyPermission;2505}25062507/** @name UpDataStructsPropertyPermission */2508export interface UpDataStructsPropertyPermission extends Struct {2509 readonly mutable: bool;2510 readonly collectionAdmin: bool;2511 readonly tokenOwner: bool;2512}25132514/** @name UpDataStructsPropertyScope */2515export interface UpDataStructsPropertyScope extends Enum {2516 readonly isNone: boolean;2517 readonly isRmrk: boolean;2518 readonly type: 'None' | 'Rmrk';2519}25202521/** @name UpDataStructsRpcCollection */2522export interface UpDataStructsRpcCollection extends Struct {2523 readonly owner: AccountId32;2524 readonly mode: UpDataStructsCollectionMode;2525 readonly name: Vec<u16>;2526 readonly description: Vec<u16>;2527 readonly tokenPrefix: Bytes;2528 readonly sponsorship: UpDataStructsSponsorshipState;2529 readonly limits: UpDataStructsCollectionLimits;2530 readonly permissions: UpDataStructsCollectionPermissions;2531 readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2532 readonly properties: Vec<UpDataStructsProperty>;2533 readonly readOnly: bool;2534}25352536/** @name UpDataStructsSponsoringRateLimit */2537export interface UpDataStructsSponsoringRateLimit extends Enum {2538 readonly isSponsoringDisabled: boolean;2539 readonly isBlocks: boolean;2540 readonly asBlocks: u32;2541 readonly type: 'SponsoringDisabled' | 'Blocks';2542}25432544/** @name UpDataStructsSponsorshipState */2545export interface UpDataStructsSponsorshipState extends Enum {2546 readonly isDisabled: boolean;2547 readonly isUnconfirmed: boolean;2548 readonly asUnconfirmed: AccountId32;2549 readonly isConfirmed: boolean;2550 readonly asConfirmed: AccountId32;2551 readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';2552}25532554/** @name UpDataStructsTokenChild */2555export interface UpDataStructsTokenChild extends Struct {2556 readonly token: u32;2557 readonly collection: u32;2558}25592560/** @name UpDataStructsTokenData */2561export interface UpDataStructsTokenData extends Struct {2562 readonly properties: Vec<UpDataStructsProperty>;2563 readonly owner: Option<PalletEvmAccountBasicCrossAccountIdRepr>;2564 readonly pieces: u128;2565}25662567/** @name XcmDoubleEncoded */2568export interface XcmDoubleEncoded extends Struct {2569 readonly encoded: Bytes;2570}25712572/** @name XcmV0Junction */2573export interface XcmV0Junction extends Enum {2574 readonly isParent: boolean;2575 readonly isParachain: boolean;2576 readonly asParachain: Compact<u32>;2577 readonly isAccountId32: boolean;2578 readonly asAccountId32: {2579 readonly network: XcmV0JunctionNetworkId;2580 readonly id: U8aFixed;2581 } & Struct;2582 readonly isAccountIndex64: boolean;2583 readonly asAccountIndex64: {2584 readonly network: XcmV0JunctionNetworkId;2585 readonly index: Compact<u64>;2586 } & Struct;2587 readonly isAccountKey20: boolean;2588 readonly asAccountKey20: {2589 readonly network: XcmV0JunctionNetworkId;2590 readonly key: U8aFixed;2591 } & Struct;2592 readonly isPalletInstance: boolean;2593 readonly asPalletInstance: u8;2594 readonly isGeneralIndex: boolean;2595 readonly asGeneralIndex: Compact<u128>;2596 readonly isGeneralKey: boolean;2597 readonly asGeneralKey: Bytes;2598 readonly isOnlyChild: boolean;2599 readonly isPlurality: boolean;2600 readonly asPlurality: {2601 readonly id: XcmV0JunctionBodyId;2602 readonly part: XcmV0JunctionBodyPart;2603 } & Struct;2604 readonly type: 'Parent' | 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';2605}26062607/** @name XcmV0JunctionBodyId */2608export interface XcmV0JunctionBodyId extends Enum {2609 readonly isUnit: boolean;2610 readonly isNamed: boolean;2611 readonly asNamed: Bytes;2612 readonly isIndex: boolean;2613 readonly asIndex: Compact<u32>;2614 readonly isExecutive: boolean;2615 readonly isTechnical: boolean;2616 readonly isLegislative: boolean;2617 readonly isJudicial: boolean;2618 readonly type: 'Unit' | 'Named' | 'Index' | 'Executive' | 'Technical' | 'Legislative' | 'Judicial';2619}26202621/** @name XcmV0JunctionBodyPart */2622export interface XcmV0JunctionBodyPart extends Enum {2623 readonly isVoice: boolean;2624 readonly isMembers: boolean;2625 readonly asMembers: {2626 readonly count: Compact<u32>;2627 } & Struct;2628 readonly isFraction: boolean;2629 readonly asFraction: {2630 readonly nom: Compact<u32>;2631 readonly denom: Compact<u32>;2632 } & Struct;2633 readonly isAtLeastProportion: boolean;2634 readonly asAtLeastProportion: {2635 readonly nom: Compact<u32>;2636 readonly denom: Compact<u32>;2637 } & Struct;2638 readonly isMoreThanProportion: boolean;2639 readonly asMoreThanProportion: {2640 readonly nom: Compact<u32>;2641 readonly denom: Compact<u32>;2642 } & Struct;2643 readonly type: 'Voice' | 'Members' | 'Fraction' | 'AtLeastProportion' | 'MoreThanProportion';2644}26452646/** @name XcmV0JunctionNetworkId */2647export interface XcmV0JunctionNetworkId extends Enum {2648 readonly isAny: boolean;2649 readonly isNamed: boolean;2650 readonly asNamed: Bytes;2651 readonly isPolkadot: boolean;2652 readonly isKusama: boolean;2653 readonly type: 'Any' | 'Named' | 'Polkadot' | 'Kusama';2654}26552656/** @name XcmV0MultiAsset */2657export interface XcmV0MultiAsset extends Enum {2658 readonly isNone: boolean;2659 readonly isAll: boolean;2660 readonly isAllFungible: boolean;2661 readonly isAllNonFungible: boolean;2662 readonly isAllAbstractFungible: boolean;2663 readonly asAllAbstractFungible: {2664 readonly id: Bytes;2665 } & Struct;2666 readonly isAllAbstractNonFungible: boolean;2667 readonly asAllAbstractNonFungible: {2668 readonly class: Bytes;2669 } & Struct;2670 readonly isAllConcreteFungible: boolean;2671 readonly asAllConcreteFungible: {2672 readonly id: XcmV0MultiLocation;2673 } & Struct;2674 readonly isAllConcreteNonFungible: boolean;2675 readonly asAllConcreteNonFungible: {2676 readonly class: XcmV0MultiLocation;2677 } & Struct;2678 readonly isAbstractFungible: boolean;2679 readonly asAbstractFungible: {2680 readonly id: Bytes;2681 readonly amount: Compact<u128>;2682 } & Struct;2683 readonly isAbstractNonFungible: boolean;2684 readonly asAbstractNonFungible: {2685 readonly class: Bytes;2686 readonly instance: XcmV1MultiassetAssetInstance;2687 } & Struct;2688 readonly isConcreteFungible: boolean;2689 readonly asConcreteFungible: {2690 readonly id: XcmV0MultiLocation;2691 readonly amount: Compact<u128>;2692 } & Struct;2693 readonly isConcreteNonFungible: boolean;2694 readonly asConcreteNonFungible: {2695 readonly class: XcmV0MultiLocation;2696 readonly instance: XcmV1MultiassetAssetInstance;2697 } & Struct;2698 readonly type: 'None' | 'All' | 'AllFungible' | 'AllNonFungible' | 'AllAbstractFungible' | 'AllAbstractNonFungible' | 'AllConcreteFungible' | 'AllConcreteNonFungible' | 'AbstractFungible' | 'AbstractNonFungible' | 'ConcreteFungible' | 'ConcreteNonFungible';2699}27002701/** @name XcmV0MultiLocation */2702export interface XcmV0MultiLocation extends Enum {2703 readonly isNull: boolean;2704 readonly isX1: boolean;2705 readonly asX1: XcmV0Junction;2706 readonly isX2: boolean;2707 readonly asX2: ITuple<[XcmV0Junction, XcmV0Junction]>;2708 readonly isX3: boolean;2709 readonly asX3: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2710 readonly isX4: boolean;2711 readonly asX4: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2712 readonly isX5: boolean;2713 readonly asX5: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2714 readonly isX6: boolean;2715 readonly asX6: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2716 readonly isX7: boolean;2717 readonly asX7: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2718 readonly isX8: boolean;2719 readonly asX8: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2720 readonly type: 'Null' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';2721}27222723/** @name XcmV0Order */2724export interface XcmV0Order extends Enum {2725 readonly isNull: boolean;2726 readonly isDepositAsset: boolean;2727 readonly asDepositAsset: {2728 readonly assets: Vec<XcmV0MultiAsset>;2729 readonly dest: XcmV0MultiLocation;2730 } & Struct;2731 readonly isDepositReserveAsset: boolean;2732 readonly asDepositReserveAsset: {2733 readonly assets: Vec<XcmV0MultiAsset>;2734 readonly dest: XcmV0MultiLocation;2735 readonly effects: Vec<XcmV0Order>;2736 } & Struct;2737 readonly isExchangeAsset: boolean;2738 readonly asExchangeAsset: {2739 readonly give: Vec<XcmV0MultiAsset>;2740 readonly receive: Vec<XcmV0MultiAsset>;2741 } & Struct;2742 readonly isInitiateReserveWithdraw: boolean;2743 readonly asInitiateReserveWithdraw: {2744 readonly assets: Vec<XcmV0MultiAsset>;2745 readonly reserve: XcmV0MultiLocation;2746 readonly effects: Vec<XcmV0Order>;2747 } & Struct;2748 readonly isInitiateTeleport: boolean;2749 readonly asInitiateTeleport: {2750 readonly assets: Vec<XcmV0MultiAsset>;2751 readonly dest: XcmV0MultiLocation;2752 readonly effects: Vec<XcmV0Order>;2753 } & Struct;2754 readonly isQueryHolding: boolean;2755 readonly asQueryHolding: {2756 readonly queryId: Compact<u64>;2757 readonly dest: XcmV0MultiLocation;2758 readonly assets: Vec<XcmV0MultiAsset>;2759 } & Struct;2760 readonly isBuyExecution: boolean;2761 readonly asBuyExecution: {2762 readonly fees: XcmV0MultiAsset;2763 readonly weight: u64;2764 readonly debt: u64;2765 readonly haltOnError: bool;2766 readonly xcm: Vec<XcmV0Xcm>;2767 } & Struct;2768 readonly type: 'Null' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';2769}27702771/** @name XcmV0OriginKind */2772export interface XcmV0OriginKind extends Enum {2773 readonly isNative: boolean;2774 readonly isSovereignAccount: boolean;2775 readonly isSuperuser: boolean;2776 readonly isXcm: boolean;2777 readonly type: 'Native' | 'SovereignAccount' | 'Superuser' | 'Xcm';2778}27792780/** @name XcmV0Response */2781export interface XcmV0Response extends Enum {2782 readonly isAssets: boolean;2783 readonly asAssets: Vec<XcmV0MultiAsset>;2784 readonly type: 'Assets';2785}27862787/** @name XcmV0Xcm */2788export interface XcmV0Xcm extends Enum {2789 readonly isWithdrawAsset: boolean;2790 readonly asWithdrawAsset: {2791 readonly assets: Vec<XcmV0MultiAsset>;2792 readonly effects: Vec<XcmV0Order>;2793 } & Struct;2794 readonly isReserveAssetDeposit: boolean;2795 readonly asReserveAssetDeposit: {2796 readonly assets: Vec<XcmV0MultiAsset>;2797 readonly effects: Vec<XcmV0Order>;2798 } & Struct;2799 readonly isTeleportAsset: boolean;2800 readonly asTeleportAsset: {2801 readonly assets: Vec<XcmV0MultiAsset>;2802 readonly effects: Vec<XcmV0Order>;2803 } & Struct;2804 readonly isQueryResponse: boolean;2805 readonly asQueryResponse: {2806 readonly queryId: Compact<u64>;2807 readonly response: XcmV0Response;2808 } & Struct;2809 readonly isTransferAsset: boolean;2810 readonly asTransferAsset: {2811 readonly assets: Vec<XcmV0MultiAsset>;2812 readonly dest: XcmV0MultiLocation;2813 } & Struct;2814 readonly isTransferReserveAsset: boolean;2815 readonly asTransferReserveAsset: {2816 readonly assets: Vec<XcmV0MultiAsset>;2817 readonly dest: XcmV0MultiLocation;2818 readonly effects: Vec<XcmV0Order>;2819 } & Struct;2820 readonly isTransact: boolean;2821 readonly asTransact: {2822 readonly originType: XcmV0OriginKind;2823 readonly requireWeightAtMost: u64;2824 readonly call: XcmDoubleEncoded;2825 } & Struct;2826 readonly isHrmpNewChannelOpenRequest: boolean;2827 readonly asHrmpNewChannelOpenRequest: {2828 readonly sender: Compact<u32>;2829 readonly maxMessageSize: Compact<u32>;2830 readonly maxCapacity: Compact<u32>;2831 } & Struct;2832 readonly isHrmpChannelAccepted: boolean;2833 readonly asHrmpChannelAccepted: {2834 readonly recipient: Compact<u32>;2835 } & Struct;2836 readonly isHrmpChannelClosing: boolean;2837 readonly asHrmpChannelClosing: {2838 readonly initiator: Compact<u32>;2839 readonly sender: Compact<u32>;2840 readonly recipient: Compact<u32>;2841 } & Struct;2842 readonly isRelayedFrom: boolean;2843 readonly asRelayedFrom: {2844 readonly who: XcmV0MultiLocation;2845 readonly message: XcmV0Xcm;2846 } & Struct;2847 readonly type: 'WithdrawAsset' | 'ReserveAssetDeposit' | 'TeleportAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom';2848}28492850/** @name XcmV1Junction */2851export interface XcmV1Junction extends Enum {2852 readonly isParachain: boolean;2853 readonly asParachain: Compact<u32>;2854 readonly isAccountId32: boolean;2855 readonly asAccountId32: {2856 readonly network: XcmV0JunctionNetworkId;2857 readonly id: U8aFixed;2858 } & Struct;2859 readonly isAccountIndex64: boolean;2860 readonly asAccountIndex64: {2861 readonly network: XcmV0JunctionNetworkId;2862 readonly index: Compact<u64>;2863 } & Struct;2864 readonly isAccountKey20: boolean;2865 readonly asAccountKey20: {2866 readonly network: XcmV0JunctionNetworkId;2867 readonly key: U8aFixed;2868 } & Struct;2869 readonly isPalletInstance: boolean;2870 readonly asPalletInstance: u8;2871 readonly isGeneralIndex: boolean;2872 readonly asGeneralIndex: Compact<u128>;2873 readonly isGeneralKey: boolean;2874 readonly asGeneralKey: Bytes;2875 readonly isOnlyChild: boolean;2876 readonly isPlurality: boolean;2877 readonly asPlurality: {2878 readonly id: XcmV0JunctionBodyId;2879 readonly part: XcmV0JunctionBodyPart;2880 } & Struct;2881 readonly type: 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';2882}28832884/** @name XcmV1MultiAsset */2885export interface XcmV1MultiAsset extends Struct {2886 readonly id: XcmV1MultiassetAssetId;2887 readonly fun: XcmV1MultiassetFungibility;2888}28892890/** @name XcmV1MultiassetAssetId */2891export interface XcmV1MultiassetAssetId extends Enum {2892 readonly isConcrete: boolean;2893 readonly asConcrete: XcmV1MultiLocation;2894 readonly isAbstract: boolean;2895 readonly asAbstract: Bytes;2896 readonly type: 'Concrete' | 'Abstract';2897}28982899/** @name XcmV1MultiassetAssetInstance */2900export interface XcmV1MultiassetAssetInstance extends Enum {2901 readonly isUndefined: boolean;2902 readonly isIndex: boolean;2903 readonly asIndex: Compact<u128>;2904 readonly isArray4: boolean;2905 readonly asArray4: U8aFixed;2906 readonly isArray8: boolean;2907 readonly asArray8: U8aFixed;2908 readonly isArray16: boolean;2909 readonly asArray16: U8aFixed;2910 readonly isArray32: boolean;2911 readonly asArray32: U8aFixed;2912 readonly isBlob: boolean;2913 readonly asBlob: Bytes;2914 readonly type: 'Undefined' | 'Index' | 'Array4' | 'Array8' | 'Array16' | 'Array32' | 'Blob';2915}29162917/** @name XcmV1MultiassetFungibility */2918export interface XcmV1MultiassetFungibility extends Enum {2919 readonly isFungible: boolean;2920 readonly asFungible: Compact<u128>;2921 readonly isNonFungible: boolean;2922 readonly asNonFungible: XcmV1MultiassetAssetInstance;2923 readonly type: 'Fungible' | 'NonFungible';2924}29252926/** @name XcmV1MultiassetMultiAssetFilter */2927export interface XcmV1MultiassetMultiAssetFilter extends Enum {2928 readonly isDefinite: boolean;2929 readonly asDefinite: XcmV1MultiassetMultiAssets;2930 readonly isWild: boolean;2931 readonly asWild: XcmV1MultiassetWildMultiAsset;2932 readonly type: 'Definite' | 'Wild';2933}29342935/** @name XcmV1MultiassetMultiAssets */2936export interface XcmV1MultiassetMultiAssets extends Vec<XcmV1MultiAsset> {}29372938/** @name XcmV1MultiassetWildFungibility */2939export interface XcmV1MultiassetWildFungibility extends Enum {2940 readonly isFungible: boolean;2941 readonly isNonFungible: boolean;2942 readonly type: 'Fungible' | 'NonFungible';2943}29442945/** @name XcmV1MultiassetWildMultiAsset */2946export interface XcmV1MultiassetWildMultiAsset extends Enum {2947 readonly isAll: boolean;2948 readonly isAllOf: boolean;2949 readonly asAllOf: {2950 readonly id: XcmV1MultiassetAssetId;2951 readonly fun: XcmV1MultiassetWildFungibility;2952 } & Struct;2953 readonly type: 'All' | 'AllOf';2954}29552956/** @name XcmV1MultiLocation */2957export interface XcmV1MultiLocation extends Struct {2958 readonly parents: u8;2959 readonly interior: XcmV1MultilocationJunctions;2960}29612962/** @name XcmV1MultilocationJunctions */2963export interface XcmV1MultilocationJunctions extends Enum {2964 readonly isHere: boolean;2965 readonly isX1: boolean;2966 readonly asX1: XcmV1Junction;2967 readonly isX2: boolean;2968 readonly asX2: ITuple<[XcmV1Junction, XcmV1Junction]>;2969 readonly isX3: boolean;2970 readonly asX3: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2971 readonly isX4: boolean;2972 readonly asX4: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2973 readonly isX5: boolean;2974 readonly asX5: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2975 readonly isX6: boolean;2976 readonly asX6: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2977 readonly isX7: boolean;2978 readonly asX7: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2979 readonly isX8: boolean;2980 readonly asX8: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2981 readonly type: 'Here' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';2982}29832984/** @name XcmV1Order */2985export interface XcmV1Order extends Enum {2986 readonly isNoop: boolean;2987 readonly isDepositAsset: boolean;2988 readonly asDepositAsset: {2989 readonly assets: XcmV1MultiassetMultiAssetFilter;2990 readonly maxAssets: u32;2991 readonly beneficiary: XcmV1MultiLocation;2992 } & Struct;2993 readonly isDepositReserveAsset: boolean;2994 readonly asDepositReserveAsset: {2995 readonly assets: XcmV1MultiassetMultiAssetFilter;2996 readonly maxAssets: u32;2997 readonly dest: XcmV1MultiLocation;2998 readonly effects: Vec<XcmV1Order>;2999 } & Struct;3000 readonly isExchangeAsset: boolean;3001 readonly asExchangeAsset: {3002 readonly give: XcmV1MultiassetMultiAssetFilter;3003 readonly receive: XcmV1MultiassetMultiAssets;3004 } & Struct;3005 readonly isInitiateReserveWithdraw: boolean;3006 readonly asInitiateReserveWithdraw: {3007 readonly assets: XcmV1MultiassetMultiAssetFilter;3008 readonly reserve: XcmV1MultiLocation;3009 readonly effects: Vec<XcmV1Order>;3010 } & Struct;3011 readonly isInitiateTeleport: boolean;3012 readonly asInitiateTeleport: {3013 readonly assets: XcmV1MultiassetMultiAssetFilter;3014 readonly dest: XcmV1MultiLocation;3015 readonly effects: Vec<XcmV1Order>;3016 } & Struct;3017 readonly isQueryHolding: boolean;3018 readonly asQueryHolding: {3019 readonly queryId: Compact<u64>;3020 readonly dest: XcmV1MultiLocation;3021 readonly assets: XcmV1MultiassetMultiAssetFilter;3022 } & Struct;3023 readonly isBuyExecution: boolean;3024 readonly asBuyExecution: {3025 readonly fees: XcmV1MultiAsset;3026 readonly weight: u64;3027 readonly debt: u64;3028 readonly haltOnError: bool;3029 readonly instructions: Vec<XcmV1Xcm>;3030 } & Struct;3031 readonly type: 'Noop' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';3032}30333034/** @name XcmV1Response */3035export interface XcmV1Response extends Enum {3036 readonly isAssets: boolean;3037 readonly asAssets: XcmV1MultiassetMultiAssets;3038 readonly isVersion: boolean;3039 readonly asVersion: u32;3040 readonly type: 'Assets' | 'Version';3041}30423043/** @name XcmV1Xcm */3044export interface XcmV1Xcm extends Enum {3045 readonly isWithdrawAsset: boolean;3046 readonly asWithdrawAsset: {3047 readonly assets: XcmV1MultiassetMultiAssets;3048 readonly effects: Vec<XcmV1Order>;3049 } & Struct;3050 readonly isReserveAssetDeposited: boolean;3051 readonly asReserveAssetDeposited: {3052 readonly assets: XcmV1MultiassetMultiAssets;3053 readonly effects: Vec<XcmV1Order>;3054 } & Struct;3055 readonly isReceiveTeleportedAsset: boolean;3056 readonly asReceiveTeleportedAsset: {3057 readonly assets: XcmV1MultiassetMultiAssets;3058 readonly effects: Vec<XcmV1Order>;3059 } & Struct;3060 readonly isQueryResponse: boolean;3061 readonly asQueryResponse: {3062 readonly queryId: Compact<u64>;3063 readonly response: XcmV1Response;3064 } & Struct;3065 readonly isTransferAsset: boolean;3066 readonly asTransferAsset: {3067 readonly assets: XcmV1MultiassetMultiAssets;3068 readonly beneficiary: XcmV1MultiLocation;3069 } & Struct;3070 readonly isTransferReserveAsset: boolean;3071 readonly asTransferReserveAsset: {3072 readonly assets: XcmV1MultiassetMultiAssets;3073 readonly dest: XcmV1MultiLocation;3074 readonly effects: Vec<XcmV1Order>;3075 } & Struct;3076 readonly isTransact: boolean;3077 readonly asTransact: {3078 readonly originType: XcmV0OriginKind;3079 readonly requireWeightAtMost: u64;3080 readonly call: XcmDoubleEncoded;3081 } & Struct;3082 readonly isHrmpNewChannelOpenRequest: boolean;3083 readonly asHrmpNewChannelOpenRequest: {3084 readonly sender: Compact<u32>;3085 readonly maxMessageSize: Compact<u32>;3086 readonly maxCapacity: Compact<u32>;3087 } & Struct;3088 readonly isHrmpChannelAccepted: boolean;3089 readonly asHrmpChannelAccepted: {3090 readonly recipient: Compact<u32>;3091 } & Struct;3092 readonly isHrmpChannelClosing: boolean;3093 readonly asHrmpChannelClosing: {3094 readonly initiator: Compact<u32>;3095 readonly sender: Compact<u32>;3096 readonly recipient: Compact<u32>;3097 } & Struct;3098 readonly isRelayedFrom: boolean;3099 readonly asRelayedFrom: {3100 readonly who: XcmV1MultilocationJunctions;3101 readonly message: XcmV1Xcm;3102 } & Struct;3103 readonly isSubscribeVersion: boolean;3104 readonly asSubscribeVersion: {3105 readonly queryId: Compact<u64>;3106 readonly maxResponseWeight: Compact<u64>;3107 } & Struct;3108 readonly isUnsubscribeVersion: boolean;3109 readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom' | 'SubscribeVersion' | 'UnsubscribeVersion';3110}31113112/** @name XcmV2Instruction */3113export interface XcmV2Instruction extends Enum {3114 readonly isWithdrawAsset: boolean;3115 readonly asWithdrawAsset: XcmV1MultiassetMultiAssets;3116 readonly isReserveAssetDeposited: boolean;3117 readonly asReserveAssetDeposited: XcmV1MultiassetMultiAssets;3118 readonly isReceiveTeleportedAsset: boolean;3119 readonly asReceiveTeleportedAsset: XcmV1MultiassetMultiAssets;3120 readonly isQueryResponse: boolean;3121 readonly asQueryResponse: {3122 readonly queryId: Compact<u64>;3123 readonly response: XcmV2Response;3124 readonly maxWeight: Compact<u64>;3125 } & Struct;3126 readonly isTransferAsset: boolean;3127 readonly asTransferAsset: {3128 readonly assets: XcmV1MultiassetMultiAssets;3129 readonly beneficiary: XcmV1MultiLocation;3130 } & Struct;3131 readonly isTransferReserveAsset: boolean;3132 readonly asTransferReserveAsset: {3133 readonly assets: XcmV1MultiassetMultiAssets;3134 readonly dest: XcmV1MultiLocation;3135 readonly xcm: XcmV2Xcm;3136 } & Struct;3137 readonly isTransact: boolean;3138 readonly asTransact: {3139 readonly originType: XcmV0OriginKind;3140 readonly requireWeightAtMost: Compact<u64>;3141 readonly call: XcmDoubleEncoded;3142 } & Struct;3143 readonly isHrmpNewChannelOpenRequest: boolean;3144 readonly asHrmpNewChannelOpenRequest: {3145 readonly sender: Compact<u32>;3146 readonly maxMessageSize: Compact<u32>;3147 readonly maxCapacity: Compact<u32>;3148 } & Struct;3149 readonly isHrmpChannelAccepted: boolean;3150 readonly asHrmpChannelAccepted: {3151 readonly recipient: Compact<u32>;3152 } & Struct;3153 readonly isHrmpChannelClosing: boolean;3154 readonly asHrmpChannelClosing: {3155 readonly initiator: Compact<u32>;3156 readonly sender: Compact<u32>;3157 readonly recipient: Compact<u32>;3158 } & Struct;3159 readonly isClearOrigin: boolean;3160 readonly isDescendOrigin: boolean;3161 readonly asDescendOrigin: XcmV1MultilocationJunctions;3162 readonly isReportError: boolean;3163 readonly asReportError: {3164 readonly queryId: Compact<u64>;3165 readonly dest: XcmV1MultiLocation;3166 readonly maxResponseWeight: Compact<u64>;3167 } & Struct;3168 readonly isDepositAsset: boolean;3169 readonly asDepositAsset: {3170 readonly assets: XcmV1MultiassetMultiAssetFilter;3171 readonly maxAssets: Compact<u32>;3172 readonly beneficiary: XcmV1MultiLocation;3173 } & Struct;3174 readonly isDepositReserveAsset: boolean;3175 readonly asDepositReserveAsset: {3176 readonly assets: XcmV1MultiassetMultiAssetFilter;3177 readonly maxAssets: Compact<u32>;3178 readonly dest: XcmV1MultiLocation;3179 readonly xcm: XcmV2Xcm;3180 } & Struct;3181 readonly isExchangeAsset: boolean;3182 readonly asExchangeAsset: {3183 readonly give: XcmV1MultiassetMultiAssetFilter;3184 readonly receive: XcmV1MultiassetMultiAssets;3185 } & Struct;3186 readonly isInitiateReserveWithdraw: boolean;3187 readonly asInitiateReserveWithdraw: {3188 readonly assets: XcmV1MultiassetMultiAssetFilter;3189 readonly reserve: XcmV1MultiLocation;3190 readonly xcm: XcmV2Xcm;3191 } & Struct;3192 readonly isInitiateTeleport: boolean;3193 readonly asInitiateTeleport: {3194 readonly assets: XcmV1MultiassetMultiAssetFilter;3195 readonly dest: XcmV1MultiLocation;3196 readonly xcm: XcmV2Xcm;3197 } & Struct;3198 readonly isQueryHolding: boolean;3199 readonly asQueryHolding: {3200 readonly queryId: Compact<u64>;3201 readonly dest: XcmV1MultiLocation;3202 readonly assets: XcmV1MultiassetMultiAssetFilter;3203 readonly maxResponseWeight: Compact<u64>;3204 } & Struct;3205 readonly isBuyExecution: boolean;3206 readonly asBuyExecution: {3207 readonly fees: XcmV1MultiAsset;3208 readonly weightLimit: XcmV2WeightLimit;3209 } & Struct;3210 readonly isRefundSurplus: boolean;3211 readonly isSetErrorHandler: boolean;3212 readonly asSetErrorHandler: XcmV2Xcm;3213 readonly isSetAppendix: boolean;3214 readonly asSetAppendix: XcmV2Xcm;3215 readonly isClearError: boolean;3216 readonly isClaimAsset: boolean;3217 readonly asClaimAsset: {3218 readonly assets: XcmV1MultiassetMultiAssets;3219 readonly ticket: XcmV1MultiLocation;3220 } & Struct;3221 readonly isTrap: boolean;3222 readonly asTrap: Compact<u64>;3223 readonly isSubscribeVersion: boolean;3224 readonly asSubscribeVersion: {3225 readonly queryId: Compact<u64>;3226 readonly maxResponseWeight: Compact<u64>;3227 } & Struct;3228 readonly isUnsubscribeVersion: boolean;3229 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';3230}32313232/** @name XcmV2Response */3233export interface XcmV2Response extends Enum {3234 readonly isNull: boolean;3235 readonly isAssets: boolean;3236 readonly asAssets: XcmV1MultiassetMultiAssets;3237 readonly isExecutionResult: boolean;3238 readonly asExecutionResult: Option<ITuple<[u32, XcmV2TraitsError]>>;3239 readonly isVersion: boolean;3240 readonly asVersion: u32;3241 readonly type: 'Null' | 'Assets' | 'ExecutionResult' | 'Version';3242}32433244/** @name XcmV2TraitsError */3245export interface XcmV2TraitsError extends Enum {3246 readonly isOverflow: boolean;3247 readonly isUnimplemented: boolean;3248 readonly isUntrustedReserveLocation: boolean;3249 readonly isUntrustedTeleportLocation: boolean;3250 readonly isMultiLocationFull: boolean;3251 readonly isMultiLocationNotInvertible: boolean;3252 readonly isBadOrigin: boolean;3253 readonly isInvalidLocation: boolean;3254 readonly isAssetNotFound: boolean;3255 readonly isFailedToTransactAsset: boolean;3256 readonly isNotWithdrawable: boolean;3257 readonly isLocationCannotHold: boolean;3258 readonly isExceedsMaxMessageSize: boolean;3259 readonly isDestinationUnsupported: boolean;3260 readonly isTransport: boolean;3261 readonly isUnroutable: boolean;3262 readonly isUnknownClaim: boolean;3263 readonly isFailedToDecode: boolean;3264 readonly isMaxWeightInvalid: boolean;3265 readonly isNotHoldingFees: boolean;3266 readonly isTooExpensive: boolean;3267 readonly isTrap: boolean;3268 readonly asTrap: u64;3269 readonly isUnhandledXcmVersion: boolean;3270 readonly isWeightLimitReached: boolean;3271 readonly asWeightLimitReached: u64;3272 readonly isBarrier: boolean;3273 readonly isWeightNotComputable: boolean;3274 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';3275}32763277/** @name XcmV2TraitsOutcome */3278export interface XcmV2TraitsOutcome extends Enum {3279 readonly isComplete: boolean;3280 readonly asComplete: u64;3281 readonly isIncomplete: boolean;3282 readonly asIncomplete: ITuple<[u64, XcmV2TraitsError]>;3283 readonly isError: boolean;3284 readonly asError: XcmV2TraitsError;3285 readonly type: 'Complete' | 'Incomplete' | 'Error';3286}32873288/** @name XcmV2WeightLimit */3289export interface XcmV2WeightLimit extends Enum {3290 readonly isUnlimited: boolean;3291 readonly isLimited: boolean;3292 readonly asLimited: Compact<u64>;3293 readonly type: 'Unlimited' | 'Limited';3294}32953296/** @name XcmV2Xcm */3297export interface XcmV2Xcm extends Vec<XcmV2Instruction> {}32983299/** @name XcmVersionedMultiAssets */3300export interface XcmVersionedMultiAssets extends Enum {3301 readonly isV0: boolean;3302 readonly asV0: Vec<XcmV0MultiAsset>;3303 readonly isV1: boolean;3304 readonly asV1: XcmV1MultiassetMultiAssets;3305 readonly type: 'V0' | 'V1';3306}33073308/** @name XcmVersionedMultiLocation */3309export interface XcmVersionedMultiLocation extends Enum {3310 readonly isV0: boolean;3311 readonly asV0: XcmV0MultiLocation;3312 readonly isV1: boolean;3313 readonly asV1: XcmV1MultiLocation;3314 readonly type: 'V0' | 'V1';3315}33163317/** @name XcmVersionedXcm */3318export interface XcmVersionedXcm extends Enum {3319 readonly isV0: boolean;3320 readonly asV0: XcmV0Xcm;3321 readonly isV1: boolean;3322 readonly asV1: XcmV1Xcm;3323 readonly isV2: boolean;3324 readonly asV2: XcmV2Xcm;3325 readonly type: 'V0' | 'V1' | 'V2';3326}33273328export type PHANTOM_DEFAULT = 'default';1// Auto-generated via `yarn polkadot-types-from-defs`, do not edit2/* eslint-disable */34import type { BTreeMap, BTreeSet, Bytes, Compact, Enum, Null, Option, Result, Struct, Text, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';5import type { ITuple } from '@polkadot/types-codec/types';6import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime';7import type { Event } from '@polkadot/types/interfaces/system';89/** @name CumulusPalletDmpQueueCall */10export interface CumulusPalletDmpQueueCall extends Enum {11 readonly isServiceOverweight: boolean;12 readonly asServiceOverweight: {13 readonly index: u64;14 readonly weightLimit: u64;15 } & Struct;16 readonly type: 'ServiceOverweight';17}1819/** @name CumulusPalletDmpQueueConfigData */20export interface CumulusPalletDmpQueueConfigData extends Struct {21 readonly maxIndividual: u64;22}2324/** @name CumulusPalletDmpQueueError */25export interface CumulusPalletDmpQueueError extends Enum {26 readonly isUnknown: boolean;27 readonly isOverLimit: boolean;28 readonly type: 'Unknown' | 'OverLimit';29}3031/** @name CumulusPalletDmpQueueEvent */32export interface CumulusPalletDmpQueueEvent extends Enum {33 readonly isInvalidFormat: boolean;34 readonly asInvalidFormat: {35 readonly messageId: U8aFixed;36 } & Struct;37 readonly isUnsupportedVersion: boolean;38 readonly asUnsupportedVersion: {39 readonly messageId: U8aFixed;40 } & Struct;41 readonly isExecutedDownward: boolean;42 readonly asExecutedDownward: {43 readonly messageId: U8aFixed;44 readonly outcome: XcmV2TraitsOutcome;45 } & Struct;46 readonly isWeightExhausted: boolean;47 readonly asWeightExhausted: {48 readonly messageId: U8aFixed;49 readonly remainingWeight: u64;50 readonly requiredWeight: u64;51 } & Struct;52 readonly isOverweightEnqueued: boolean;53 readonly asOverweightEnqueued: {54 readonly messageId: U8aFixed;55 readonly overweightIndex: u64;56 readonly requiredWeight: u64;57 } & Struct;58 readonly isOverweightServiced: boolean;59 readonly asOverweightServiced: {60 readonly overweightIndex: u64;61 readonly weightUsed: u64;62 } & Struct;63 readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced';64}6566/** @name CumulusPalletDmpQueuePageIndexData */67export interface CumulusPalletDmpQueuePageIndexData extends Struct {68 readonly beginUsed: u32;69 readonly endUsed: u32;70 readonly overweightCount: u64;71}7273/** @name CumulusPalletParachainSystemCall */74export interface CumulusPalletParachainSystemCall extends Enum {75 readonly isSetValidationData: boolean;76 readonly asSetValidationData: {77 readonly data: CumulusPrimitivesParachainInherentParachainInherentData;78 } & Struct;79 readonly isSudoSendUpwardMessage: boolean;80 readonly asSudoSendUpwardMessage: {81 readonly message: Bytes;82 } & Struct;83 readonly isAuthorizeUpgrade: boolean;84 readonly asAuthorizeUpgrade: {85 readonly codeHash: H256;86 } & Struct;87 readonly isEnactAuthorizedUpgrade: boolean;88 readonly asEnactAuthorizedUpgrade: {89 readonly code: Bytes;90 } & Struct;91 readonly type: 'SetValidationData' | 'SudoSendUpwardMessage' | 'AuthorizeUpgrade' | 'EnactAuthorizedUpgrade';92}9394/** @name CumulusPalletParachainSystemError */95export interface CumulusPalletParachainSystemError extends Enum {96 readonly isOverlappingUpgrades: boolean;97 readonly isProhibitedByPolkadot: boolean;98 readonly isTooBig: boolean;99 readonly isValidationDataNotAvailable: boolean;100 readonly isHostConfigurationNotAvailable: boolean;101 readonly isNotScheduled: boolean;102 readonly isNothingAuthorized: boolean;103 readonly isUnauthorized: boolean;104 readonly type: 'OverlappingUpgrades' | 'ProhibitedByPolkadot' | 'TooBig' | 'ValidationDataNotAvailable' | 'HostConfigurationNotAvailable' | 'NotScheduled' | 'NothingAuthorized' | 'Unauthorized';105}106107/** @name CumulusPalletParachainSystemEvent */108export 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 CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot */132export interface CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot extends Struct {133 readonly dmqMqcHead: H256;134 readonly relayDispatchQueueSize: ITuple<[u32, u32]>;135 readonly ingressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;136 readonly egressChannels: Vec<ITuple<[u32, PolkadotPrimitivesV2AbridgedHrmpChannel]>>;137}138139/** @name CumulusPalletXcmCall */140export interface CumulusPalletXcmCall extends Null {}141142/** @name CumulusPalletXcmError */143export interface CumulusPalletXcmError extends Null {}144145/** @name CumulusPalletXcmEvent */146export interface CumulusPalletXcmEvent extends Enum {147 readonly isInvalidFormat: boolean;148 readonly asInvalidFormat: U8aFixed;149 readonly isUnsupportedVersion: boolean;150 readonly asUnsupportedVersion: U8aFixed;151 readonly isExecutedDownward: boolean;152 readonly asExecutedDownward: ITuple<[U8aFixed, XcmV2TraitsOutcome]>;153 readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward';154}155156/** @name CumulusPalletXcmOrigin */157export interface CumulusPalletXcmOrigin extends Enum {158 readonly isRelay: boolean;159 readonly isSiblingParachain: boolean;160 readonly asSiblingParachain: u32;161 readonly type: 'Relay' | 'SiblingParachain';162}163164/** @name CumulusPalletXcmpQueueCall */165export interface CumulusPalletXcmpQueueCall extends Enum {166 readonly isServiceOverweight: boolean;167 readonly asServiceOverweight: {168 readonly index: u64;169 readonly weightLimit: u64;170 } & Struct;171 readonly isSuspendXcmExecution: boolean;172 readonly isResumeXcmExecution: boolean;173 readonly isUpdateSuspendThreshold: boolean;174 readonly asUpdateSuspendThreshold: {175 readonly new_: u32;176 } & Struct;177 readonly isUpdateDropThreshold: boolean;178 readonly asUpdateDropThreshold: {179 readonly new_: u32;180 } & Struct;181 readonly isUpdateResumeThreshold: boolean;182 readonly asUpdateResumeThreshold: {183 readonly new_: u32;184 } & Struct;185 readonly isUpdateThresholdWeight: boolean;186 readonly asUpdateThresholdWeight: {187 readonly new_: u64;188 } & Struct;189 readonly isUpdateWeightRestrictDecay: boolean;190 readonly asUpdateWeightRestrictDecay: {191 readonly new_: u64;192 } & Struct;193 readonly isUpdateXcmpMaxIndividualWeight: boolean;194 readonly asUpdateXcmpMaxIndividualWeight: {195 readonly new_: u64;196 } & Struct;197 readonly type: 'ServiceOverweight' | 'SuspendXcmExecution' | 'ResumeXcmExecution' | 'UpdateSuspendThreshold' | 'UpdateDropThreshold' | 'UpdateResumeThreshold' | 'UpdateThresholdWeight' | 'UpdateWeightRestrictDecay' | 'UpdateXcmpMaxIndividualWeight';198}199200/** @name CumulusPalletXcmpQueueError */201export interface CumulusPalletXcmpQueueError extends Enum {202 readonly isFailedToSend: boolean;203 readonly isBadXcmOrigin: boolean;204 readonly isBadXcm: boolean;205 readonly isBadOverweightIndex: boolean;206 readonly isWeightOverLimit: boolean;207 readonly type: 'FailedToSend' | 'BadXcmOrigin' | 'BadXcm' | 'BadOverweightIndex' | 'WeightOverLimit';208}209210/** @name CumulusPalletXcmpQueueEvent */211export interface CumulusPalletXcmpQueueEvent extends Enum {212 readonly isSuccess: boolean;213 readonly asSuccess: Option<H256>;214 readonly isFail: boolean;215 readonly asFail: ITuple<[Option<H256>, XcmV2TraitsError]>;216 readonly isBadVersion: boolean;217 readonly asBadVersion: Option<H256>;218 readonly isBadFormat: boolean;219 readonly asBadFormat: Option<H256>;220 readonly isUpwardMessageSent: boolean;221 readonly asUpwardMessageSent: Option<H256>;222 readonly isXcmpMessageSent: boolean;223 readonly asXcmpMessageSent: Option<H256>;224 readonly isOverweightEnqueued: boolean;225 readonly asOverweightEnqueued: ITuple<[u32, u32, u64, u64]>;226 readonly isOverweightServiced: boolean;227 readonly asOverweightServiced: ITuple<[u64, u64]>;228 readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced';229}230231/** @name CumulusPalletXcmpQueueInboundChannelDetails */232export interface CumulusPalletXcmpQueueInboundChannelDetails extends Struct {233 readonly sender: u32;234 readonly state: CumulusPalletXcmpQueueInboundState;235 readonly messageMetadata: Vec<ITuple<[u32, PolkadotParachainPrimitivesXcmpMessageFormat]>>;236}237238/** @name CumulusPalletXcmpQueueInboundState */239export interface CumulusPalletXcmpQueueInboundState extends Enum {240 readonly isOk: boolean;241 readonly isSuspended: boolean;242 readonly type: 'Ok' | 'Suspended';243}244245/** @name CumulusPalletXcmpQueueOutboundChannelDetails */246export interface CumulusPalletXcmpQueueOutboundChannelDetails extends Struct {247 readonly recipient: u32;248 readonly state: CumulusPalletXcmpQueueOutboundState;249 readonly signalsExist: bool;250 readonly firstIndex: u16;251 readonly lastIndex: u16;252}253254/** @name CumulusPalletXcmpQueueOutboundState */255export interface CumulusPalletXcmpQueueOutboundState extends Enum {256 readonly isOk: boolean;257 readonly isSuspended: boolean;258 readonly type: 'Ok' | 'Suspended';259}260261/** @name CumulusPalletXcmpQueueQueueConfigData */262export interface CumulusPalletXcmpQueueQueueConfigData extends Struct {263 readonly suspendThreshold: u32;264 readonly dropThreshold: u32;265 readonly resumeThreshold: u32;266 readonly thresholdWeight: u64;267 readonly weightRestrictDecay: u64;268 readonly xcmpMaxIndividualWeight: u64;269}270271/** @name CumulusPrimitivesParachainInherentParachainInherentData */272export interface CumulusPrimitivesParachainInherentParachainInherentData extends Struct {273 readonly validationData: PolkadotPrimitivesV2PersistedValidationData;274 readonly relayChainState: SpTrieStorageProof;275 readonly downwardMessages: Vec<PolkadotCorePrimitivesInboundDownwardMessage>;276 readonly horizontalMessages: BTreeMap<u32, Vec<PolkadotCorePrimitivesInboundHrmpMessage>>;277}278279/** @name EthbloomBloom */280export interface EthbloomBloom extends U8aFixed {}281282/** @name EthereumBlock */283export interface EthereumBlock extends Struct {284 readonly header: EthereumHeader;285 readonly transactions: Vec<EthereumTransactionTransactionV2>;286 readonly ommers: Vec<EthereumHeader>;287}288289/** @name EthereumHeader */290export interface EthereumHeader extends Struct {291 readonly parentHash: H256;292 readonly ommersHash: H256;293 readonly beneficiary: H160;294 readonly stateRoot: H256;295 readonly transactionsRoot: H256;296 readonly receiptsRoot: H256;297 readonly logsBloom: EthbloomBloom;298 readonly difficulty: U256;299 readonly number: U256;300 readonly gasLimit: U256;301 readonly gasUsed: U256;302 readonly timestamp: u64;303 readonly extraData: Bytes;304 readonly mixHash: H256;305 readonly nonce: EthereumTypesHashH64;306}307308/** @name EthereumLog */309export interface EthereumLog extends Struct {310 readonly address: H160;311 readonly topics: Vec<H256>;312 readonly data: Bytes;313}314315/** @name EthereumReceiptEip658ReceiptData */316export interface EthereumReceiptEip658ReceiptData extends Struct {317 readonly statusCode: u8;318 readonly usedGas: U256;319 readonly logsBloom: EthbloomBloom;320 readonly logs: Vec<EthereumLog>;321}322323/** @name EthereumReceiptReceiptV3 */324export interface EthereumReceiptReceiptV3 extends Enum {325 readonly isLegacy: boolean;326 readonly asLegacy: EthereumReceiptEip658ReceiptData;327 readonly isEip2930: boolean;328 readonly asEip2930: EthereumReceiptEip658ReceiptData;329 readonly isEip1559: boolean;330 readonly asEip1559: EthereumReceiptEip658ReceiptData;331 readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';332}333334/** @name EthereumTransactionAccessListItem */335export interface EthereumTransactionAccessListItem extends Struct {336 readonly address: H160;337 readonly storageKeys: Vec<H256>;338}339340/** @name EthereumTransactionEip1559Transaction */341export interface EthereumTransactionEip1559Transaction extends Struct {342 readonly chainId: u64;343 readonly nonce: U256;344 readonly maxPriorityFeePerGas: U256;345 readonly maxFeePerGas: U256;346 readonly gasLimit: U256;347 readonly action: EthereumTransactionTransactionAction;348 readonly value: U256;349 readonly input: Bytes;350 readonly accessList: Vec<EthereumTransactionAccessListItem>;351 readonly oddYParity: bool;352 readonly r: H256;353 readonly s: H256;354}355356/** @name EthereumTransactionEip2930Transaction */357export interface EthereumTransactionEip2930Transaction extends Struct {358 readonly chainId: u64;359 readonly nonce: U256;360 readonly gasPrice: U256;361 readonly gasLimit: U256;362 readonly action: EthereumTransactionTransactionAction;363 readonly value: U256;364 readonly input: Bytes;365 readonly accessList: Vec<EthereumTransactionAccessListItem>;366 readonly oddYParity: bool;367 readonly r: H256;368 readonly s: H256;369}370371/** @name EthereumTransactionLegacyTransaction */372export interface EthereumTransactionLegacyTransaction extends Struct {373 readonly nonce: U256;374 readonly gasPrice: U256;375 readonly gasLimit: U256;376 readonly action: EthereumTransactionTransactionAction;377 readonly value: U256;378 readonly input: Bytes;379 readonly signature: EthereumTransactionTransactionSignature;380}381382/** @name EthereumTransactionTransactionAction */383export interface EthereumTransactionTransactionAction extends Enum {384 readonly isCall: boolean;385 readonly asCall: H160;386 readonly isCreate: boolean;387 readonly type: 'Call' | 'Create';388}389390/** @name EthereumTransactionTransactionSignature */391export interface EthereumTransactionTransactionSignature extends Struct {392 readonly v: u64;393 readonly r: H256;394 readonly s: H256;395}396397/** @name EthereumTransactionTransactionV2 */398export interface EthereumTransactionTransactionV2 extends Enum {399 readonly isLegacy: boolean;400 readonly asLegacy: EthereumTransactionLegacyTransaction;401 readonly isEip2930: boolean;402 readonly asEip2930: EthereumTransactionEip2930Transaction;403 readonly isEip1559: boolean;404 readonly asEip1559: EthereumTransactionEip1559Transaction;405 readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';406}407408/** @name EthereumTypesHashH64 */409export interface EthereumTypesHashH64 extends U8aFixed {}410411/** @name EvmCoreErrorExitError */412export interface EvmCoreErrorExitError extends Enum {413 readonly isStackUnderflow: boolean;414 readonly isStackOverflow: boolean;415 readonly isInvalidJump: boolean;416 readonly isInvalidRange: boolean;417 readonly isDesignatedInvalid: boolean;418 readonly isCallTooDeep: boolean;419 readonly isCreateCollision: boolean;420 readonly isCreateContractLimit: boolean;421 readonly isOutOfOffset: boolean;422 readonly isOutOfGas: boolean;423 readonly isOutOfFund: boolean;424 readonly isPcUnderflow: boolean;425 readonly isCreateEmpty: boolean;426 readonly isOther: boolean;427 readonly asOther: Text;428 readonly isInvalidCode: boolean;429 readonly type: 'StackUnderflow' | 'StackOverflow' | 'InvalidJump' | 'InvalidRange' | 'DesignatedInvalid' | 'CallTooDeep' | 'CreateCollision' | 'CreateContractLimit' | 'OutOfOffset' | 'OutOfGas' | 'OutOfFund' | 'PcUnderflow' | 'CreateEmpty' | 'Other' | 'InvalidCode';430}431432/** @name EvmCoreErrorExitFatal */433export interface EvmCoreErrorExitFatal extends Enum {434 readonly isNotSupported: boolean;435 readonly isUnhandledInterrupt: boolean;436 readonly isCallErrorAsFatal: boolean;437 readonly asCallErrorAsFatal: EvmCoreErrorExitError;438 readonly isOther: boolean;439 readonly asOther: Text;440 readonly type: 'NotSupported' | 'UnhandledInterrupt' | 'CallErrorAsFatal' | 'Other';441}442443/** @name EvmCoreErrorExitReason */444export interface EvmCoreErrorExitReason extends Enum {445 readonly isSucceed: boolean;446 readonly asSucceed: EvmCoreErrorExitSucceed;447 readonly isError: boolean;448 readonly asError: EvmCoreErrorExitError;449 readonly isRevert: boolean;450 readonly asRevert: EvmCoreErrorExitRevert;451 readonly isFatal: boolean;452 readonly asFatal: EvmCoreErrorExitFatal;453 readonly type: 'Succeed' | 'Error' | 'Revert' | 'Fatal';454}455456/** @name EvmCoreErrorExitRevert */457export interface EvmCoreErrorExitRevert extends Enum {458 readonly isReverted: boolean;459 readonly type: 'Reverted';460}461462/** @name EvmCoreErrorExitSucceed */463export interface EvmCoreErrorExitSucceed extends Enum {464 readonly isStopped: boolean;465 readonly isReturned: boolean;466 readonly isSuicided: boolean;467 readonly type: 'Stopped' | 'Returned' | 'Suicided';468}469470/** @name FpRpcTransactionStatus */471export interface FpRpcTransactionStatus extends Struct {472 readonly transactionHash: H256;473 readonly transactionIndex: u32;474 readonly from: H160;475 readonly to: Option<H160>;476 readonly contractAddress: Option<H160>;477 readonly logs: Vec<EthereumLog>;478 readonly logsBloom: EthbloomBloom;479}480481/** @name FrameSupportDispatchRawOrigin */482export interface FrameSupportDispatchRawOrigin extends Enum {483 readonly isRoot: boolean;484 readonly isSigned: boolean;485 readonly asSigned: AccountId32;486 readonly isNone: boolean;487 readonly type: 'Root' | 'Signed' | 'None';488}489490/** @name FrameSupportPalletId */491export interface FrameSupportPalletId extends U8aFixed {}492493/** @name FrameSupportScheduleLookupError */494export interface FrameSupportScheduleLookupError extends Enum {495 readonly isUnknown: boolean;496 readonly isBadFormat: boolean;497 readonly type: 'Unknown' | 'BadFormat';498}499500/** @name FrameSupportScheduleMaybeHashed */501export interface FrameSupportScheduleMaybeHashed extends Enum {502 readonly isValue: boolean;503 readonly asValue: Call;504 readonly isHash: boolean;505 readonly asHash: H256;506 readonly type: 'Value' | 'Hash';507}508509/** @name FrameSupportTokensMiscBalanceStatus */510export interface FrameSupportTokensMiscBalanceStatus extends Enum {511 readonly isFree: boolean;512 readonly isReserved: boolean;513 readonly type: 'Free' | 'Reserved';514}515516/** @name FrameSupportWeightsDispatchClass */517export interface FrameSupportWeightsDispatchClass extends Enum {518 readonly isNormal: boolean;519 readonly isOperational: boolean;520 readonly isMandatory: boolean;521 readonly type: 'Normal' | 'Operational' | 'Mandatory';522}523524/** @name FrameSupportWeightsDispatchInfo */525export interface FrameSupportWeightsDispatchInfo extends Struct {526 readonly weight: u64;527 readonly class: FrameSupportWeightsDispatchClass;528 readonly paysFee: FrameSupportWeightsPays;529}530531/** @name FrameSupportWeightsPays */532export interface FrameSupportWeightsPays extends Enum {533 readonly isYes: boolean;534 readonly isNo: boolean;535 readonly type: 'Yes' | 'No';536}537538/** @name FrameSupportWeightsPerDispatchClassU32 */539export interface FrameSupportWeightsPerDispatchClassU32 extends Struct {540 readonly normal: u32;541 readonly operational: u32;542 readonly mandatory: u32;543}544545/** @name FrameSupportWeightsPerDispatchClassU64 */546export interface FrameSupportWeightsPerDispatchClassU64 extends Struct {547 readonly normal: u64;548 readonly operational: u64;549 readonly mandatory: u64;550}551552/** @name FrameSupportWeightsPerDispatchClassWeightsPerClass */553export interface FrameSupportWeightsPerDispatchClassWeightsPerClass extends Struct {554 readonly normal: FrameSystemLimitsWeightsPerClass;555 readonly operational: FrameSystemLimitsWeightsPerClass;556 readonly mandatory: FrameSystemLimitsWeightsPerClass;557}558559/** @name FrameSupportWeightsRuntimeDbWeight */560export interface FrameSupportWeightsRuntimeDbWeight extends Struct {561 readonly read: u64;562 readonly write: u64;563}564565/** @name FrameSystemAccountInfo */566export interface FrameSystemAccountInfo extends Struct {567 readonly nonce: u32;568 readonly consumers: u32;569 readonly providers: u32;570 readonly sufficients: u32;571 readonly data: PalletBalancesAccountData;572}573574/** @name FrameSystemCall */575export interface FrameSystemCall extends Enum {576 readonly isFillBlock: boolean;577 readonly asFillBlock: {578 readonly ratio: Perbill;579 } & Struct;580 readonly isRemark: boolean;581 readonly asRemark: {582 readonly remark: Bytes;583 } & Struct;584 readonly isSetHeapPages: boolean;585 readonly asSetHeapPages: {586 readonly pages: u64;587 } & Struct;588 readonly isSetCode: boolean;589 readonly asSetCode: {590 readonly code: Bytes;591 } & Struct;592 readonly isSetCodeWithoutChecks: boolean;593 readonly asSetCodeWithoutChecks: {594 readonly code: Bytes;595 } & Struct;596 readonly isSetStorage: boolean;597 readonly asSetStorage: {598 readonly items: Vec<ITuple<[Bytes, Bytes]>>;599 } & Struct;600 readonly isKillStorage: boolean;601 readonly asKillStorage: {602 readonly keys_: Vec<Bytes>;603 } & Struct;604 readonly isKillPrefix: boolean;605 readonly asKillPrefix: {606 readonly prefix: Bytes;607 readonly subkeys: u32;608 } & Struct;609 readonly isRemarkWithEvent: boolean;610 readonly asRemarkWithEvent: {611 readonly remark: Bytes;612 } & Struct;613 readonly type: 'FillBlock' | 'Remark' | 'SetHeapPages' | 'SetCode' | 'SetCodeWithoutChecks' | 'SetStorage' | 'KillStorage' | 'KillPrefix' | 'RemarkWithEvent';614}615616/** @name FrameSystemError */617export interface FrameSystemError extends Enum {618 readonly isInvalidSpecName: boolean;619 readonly isSpecVersionNeedsToIncrease: boolean;620 readonly isFailedToExtractRuntimeVersion: boolean;621 readonly isNonDefaultComposite: boolean;622 readonly isNonZeroRefCount: boolean;623 readonly isCallFiltered: boolean;624 readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered';625}626627/** @name FrameSystemEvent */628export interface FrameSystemEvent extends Enum {629 readonly isExtrinsicSuccess: boolean;630 readonly asExtrinsicSuccess: {631 readonly dispatchInfo: FrameSupportWeightsDispatchInfo;632 } & Struct;633 readonly isExtrinsicFailed: boolean;634 readonly asExtrinsicFailed: {635 readonly dispatchError: SpRuntimeDispatchError;636 readonly dispatchInfo: FrameSupportWeightsDispatchInfo;637 } & Struct;638 readonly isCodeUpdated: boolean;639 readonly isNewAccount: boolean;640 readonly asNewAccount: {641 readonly account: AccountId32;642 } & Struct;643 readonly isKilledAccount: boolean;644 readonly asKilledAccount: {645 readonly account: AccountId32;646 } & Struct;647 readonly isRemarked: boolean;648 readonly asRemarked: {649 readonly sender: AccountId32;650 readonly hash_: H256;651 } & Struct;652 readonly type: 'ExtrinsicSuccess' | 'ExtrinsicFailed' | 'CodeUpdated' | 'NewAccount' | 'KilledAccount' | 'Remarked';653}654655/** @name FrameSystemEventRecord */656export interface FrameSystemEventRecord extends Struct {657 readonly phase: FrameSystemPhase;658 readonly event: Event;659 readonly topics: Vec<H256>;660}661662/** @name FrameSystemExtensionsCheckGenesis */663export interface FrameSystemExtensionsCheckGenesis extends Null {}664665/** @name FrameSystemExtensionsCheckNonce */666export interface FrameSystemExtensionsCheckNonce extends Compact<u32> {}667668/** @name FrameSystemExtensionsCheckSpecVersion */669export interface FrameSystemExtensionsCheckSpecVersion extends Null {}670671/** @name FrameSystemExtensionsCheckWeight */672export interface FrameSystemExtensionsCheckWeight extends Null {}673674/** @name FrameSystemLastRuntimeUpgradeInfo */675export interface FrameSystemLastRuntimeUpgradeInfo extends Struct {676 readonly specVersion: Compact<u32>;677 readonly specName: Text;678}679680/** @name FrameSystemLimitsBlockLength */681export interface FrameSystemLimitsBlockLength extends Struct {682 readonly max: FrameSupportWeightsPerDispatchClassU32;683}684685/** @name FrameSystemLimitsBlockWeights */686export interface FrameSystemLimitsBlockWeights extends Struct {687 readonly baseBlock: u64;688 readonly maxBlock: u64;689 readonly perClass: FrameSupportWeightsPerDispatchClassWeightsPerClass;690}691692/** @name FrameSystemLimitsWeightsPerClass */693export interface FrameSystemLimitsWeightsPerClass extends Struct {694 readonly baseExtrinsic: u64;695 readonly maxExtrinsic: Option<u64>;696 readonly maxTotal: Option<u64>;697 readonly reserved: Option<u64>;698}699700/** @name FrameSystemPhase */701export interface FrameSystemPhase extends Enum {702 readonly isApplyExtrinsic: boolean;703 readonly asApplyExtrinsic: u32;704 readonly isFinalization: boolean;705 readonly isInitialization: boolean;706 readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization';707}708709/** @name OpalRuntimeOriginCaller */710export interface OpalRuntimeOriginCaller extends Enum {711 readonly isVoid: boolean;712 readonly asVoid: SpCoreVoid;713 readonly isSystem: boolean;714 readonly asSystem: FrameSupportDispatchRawOrigin;715 readonly isPolkadotXcm: boolean;716 readonly asPolkadotXcm: PalletXcmOrigin;717 readonly isCumulusXcm: boolean;718 readonly asCumulusXcm: CumulusPalletXcmOrigin;719 readonly isEthereum: boolean;720 readonly asEthereum: PalletEthereumRawOrigin;721 readonly type: 'Void' | 'System' | 'PolkadotXcm' | 'CumulusXcm' | 'Ethereum';722}723724/** @name OpalRuntimeRuntime */725export interface OpalRuntimeRuntime extends Null {}726727/** @name OrmlVestingModuleCall */728export interface OrmlVestingModuleCall extends Enum {729 readonly isClaim: boolean;730 readonly isVestedTransfer: boolean;731 readonly asVestedTransfer: {732 readonly dest: MultiAddress;733 readonly schedule: OrmlVestingVestingSchedule;734 } & Struct;735 readonly isUpdateVestingSchedules: boolean;736 readonly asUpdateVestingSchedules: {737 readonly who: MultiAddress;738 readonly vestingSchedules: Vec<OrmlVestingVestingSchedule>;739 } & Struct;740 readonly isClaimFor: boolean;741 readonly asClaimFor: {742 readonly dest: MultiAddress;743 } & Struct;744 readonly type: 'Claim' | 'VestedTransfer' | 'UpdateVestingSchedules' | 'ClaimFor';745}746747/** @name OrmlVestingModuleError */748export interface OrmlVestingModuleError extends Enum {749 readonly isZeroVestingPeriod: boolean;750 readonly isZeroVestingPeriodCount: boolean;751 readonly isInsufficientBalanceToLock: boolean;752 readonly isTooManyVestingSchedules: boolean;753 readonly isAmountLow: boolean;754 readonly isMaxVestingSchedulesExceeded: boolean;755 readonly type: 'ZeroVestingPeriod' | 'ZeroVestingPeriodCount' | 'InsufficientBalanceToLock' | 'TooManyVestingSchedules' | 'AmountLow' | 'MaxVestingSchedulesExceeded';756}757758/** @name OrmlVestingModuleEvent */759export interface OrmlVestingModuleEvent extends Enum {760 readonly isVestingScheduleAdded: boolean;761 readonly asVestingScheduleAdded: {762 readonly from: AccountId32;763 readonly to: AccountId32;764 readonly vestingSchedule: OrmlVestingVestingSchedule;765 } & Struct;766 readonly isClaimed: boolean;767 readonly asClaimed: {768 readonly who: AccountId32;769 readonly amount: u128;770 } & Struct;771 readonly isVestingSchedulesUpdated: boolean;772 readonly asVestingSchedulesUpdated: {773 readonly who: AccountId32;774 } & Struct;775 readonly type: 'VestingScheduleAdded' | 'Claimed' | 'VestingSchedulesUpdated';776}777778/** @name OrmlVestingVestingSchedule */779export interface OrmlVestingVestingSchedule extends Struct {780 readonly start: u32;781 readonly period: u32;782 readonly periodCount: u32;783 readonly perPeriod: Compact<u128>;784}785786/** @name PalletBalancesAccountData */787export interface PalletBalancesAccountData extends Struct {788 readonly free: u128;789 readonly reserved: u128;790 readonly miscFrozen: u128;791 readonly feeFrozen: u128;792}793794/** @name PalletBalancesBalanceLock */795export interface PalletBalancesBalanceLock extends Struct {796 readonly id: U8aFixed;797 readonly amount: u128;798 readonly reasons: PalletBalancesReasons;799}800801/** @name PalletBalancesCall */802export interface PalletBalancesCall extends Enum {803 readonly isTransfer: boolean;804 readonly asTransfer: {805 readonly dest: MultiAddress;806 readonly value: Compact<u128>;807 } & Struct;808 readonly isSetBalance: boolean;809 readonly asSetBalance: {810 readonly who: MultiAddress;811 readonly newFree: Compact<u128>;812 readonly newReserved: Compact<u128>;813 } & Struct;814 readonly isForceTransfer: boolean;815 readonly asForceTransfer: {816 readonly source: MultiAddress;817 readonly dest: MultiAddress;818 readonly value: Compact<u128>;819 } & Struct;820 readonly isTransferKeepAlive: boolean;821 readonly asTransferKeepAlive: {822 readonly dest: MultiAddress;823 readonly value: Compact<u128>;824 } & Struct;825 readonly isTransferAll: boolean;826 readonly asTransferAll: {827 readonly dest: MultiAddress;828 readonly keepAlive: bool;829 } & Struct;830 readonly isForceUnreserve: boolean;831 readonly asForceUnreserve: {832 readonly who: MultiAddress;833 readonly amount: u128;834 } & Struct;835 readonly type: 'Transfer' | 'SetBalance' | 'ForceTransfer' | 'TransferKeepAlive' | 'TransferAll' | 'ForceUnreserve';836}837838/** @name PalletBalancesError */839export interface PalletBalancesError extends Enum {840 readonly isVestingBalance: boolean;841 readonly isLiquidityRestrictions: boolean;842 readonly isInsufficientBalance: boolean;843 readonly isExistentialDeposit: boolean;844 readonly isKeepAlive: boolean;845 readonly isExistingVestingSchedule: boolean;846 readonly isDeadAccount: boolean;847 readonly isTooManyReserves: boolean;848 readonly type: 'VestingBalance' | 'LiquidityRestrictions' | 'InsufficientBalance' | 'ExistentialDeposit' | 'KeepAlive' | 'ExistingVestingSchedule' | 'DeadAccount' | 'TooManyReserves';849}850851/** @name PalletBalancesEvent */852export interface PalletBalancesEvent extends Enum {853 readonly isEndowed: boolean;854 readonly asEndowed: {855 readonly account: AccountId32;856 readonly freeBalance: u128;857 } & Struct;858 readonly isDustLost: boolean;859 readonly asDustLost: {860 readonly account: AccountId32;861 readonly amount: u128;862 } & Struct;863 readonly isTransfer: boolean;864 readonly asTransfer: {865 readonly from: AccountId32;866 readonly to: AccountId32;867 readonly amount: u128;868 } & Struct;869 readonly isBalanceSet: boolean;870 readonly asBalanceSet: {871 readonly who: AccountId32;872 readonly free: u128;873 readonly reserved: u128;874 } & Struct;875 readonly isReserved: boolean;876 readonly asReserved: {877 readonly who: AccountId32;878 readonly amount: u128;879 } & Struct;880 readonly isUnreserved: boolean;881 readonly asUnreserved: {882 readonly who: AccountId32;883 readonly amount: u128;884 } & Struct;885 readonly isReserveRepatriated: boolean;886 readonly asReserveRepatriated: {887 readonly from: AccountId32;888 readonly to: AccountId32;889 readonly amount: u128;890 readonly destinationStatus: FrameSupportTokensMiscBalanceStatus;891 } & Struct;892 readonly isDeposit: boolean;893 readonly asDeposit: {894 readonly who: AccountId32;895 readonly amount: u128;896 } & Struct;897 readonly isWithdraw: boolean;898 readonly asWithdraw: {899 readonly who: AccountId32;900 readonly amount: u128;901 } & Struct;902 readonly isSlashed: boolean;903 readonly asSlashed: {904 readonly who: AccountId32;905 readonly amount: u128;906 } & Struct;907 readonly type: 'Endowed' | 'DustLost' | 'Transfer' | 'BalanceSet' | 'Reserved' | 'Unreserved' | 'ReserveRepatriated' | 'Deposit' | 'Withdraw' | 'Slashed';908}909910/** @name PalletBalancesReasons */911export interface PalletBalancesReasons extends Enum {912 readonly isFee: boolean;913 readonly isMisc: boolean;914 readonly isAll: boolean;915 readonly type: 'Fee' | 'Misc' | 'All';916}917918/** @name PalletBalancesReleases */919export interface PalletBalancesReleases extends Enum {920 readonly isV100: boolean;921 readonly isV200: boolean;922 readonly type: 'V100' | 'V200';923}924925/** @name PalletBalancesReserveData */926export interface PalletBalancesReserveData extends Struct {927 readonly id: U8aFixed;928 readonly amount: u128;929}930931/** @name PalletCommonError */932export interface PalletCommonError extends Enum {933 readonly isCollectionNotFound: boolean;934 readonly isMustBeTokenOwner: boolean;935 readonly isNoPermission: boolean;936 readonly isCantDestroyNotEmptyCollection: boolean;937 readonly isPublicMintingNotAllowed: boolean;938 readonly isAddressNotInAllowlist: boolean;939 readonly isCollectionNameLimitExceeded: boolean;940 readonly isCollectionDescriptionLimitExceeded: boolean;941 readonly isCollectionTokenPrefixLimitExceeded: boolean;942 readonly isTotalCollectionsLimitExceeded: boolean;943 readonly isCollectionAdminCountExceeded: boolean;944 readonly isCollectionLimitBoundsExceeded: boolean;945 readonly isOwnerPermissionsCantBeReverted: boolean;946 readonly isTransferNotAllowed: boolean;947 readonly isAccountTokenLimitExceeded: boolean;948 readonly isCollectionTokenLimitExceeded: boolean;949 readonly isMetadataFlagFrozen: boolean;950 readonly isTokenNotFound: boolean;951 readonly isTokenValueTooLow: boolean;952 readonly isApprovedValueTooLow: boolean;953 readonly isCantApproveMoreThanOwned: boolean;954 readonly isAddressIsZero: boolean;955 readonly isUnsupportedOperation: boolean;956 readonly isNotSufficientFounds: boolean;957 readonly isUserIsNotAllowedToNest: boolean;958 readonly isSourceCollectionIsNotAllowedToNest: boolean;959 readonly isCollectionFieldSizeExceeded: boolean;960 readonly isNoSpaceForProperty: boolean;961 readonly isPropertyLimitReached: boolean;962 readonly isPropertyKeyIsTooLong: boolean;963 readonly isInvalidCharacterInPropertyKey: boolean;964 readonly isEmptyPropertyKey: boolean;965 readonly isCollectionIsExternal: boolean;966 readonly isCollectionIsInternal: boolean;967 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';968}969970/** @name PalletCommonEvent */971export interface PalletCommonEvent extends Enum {972 readonly isCollectionCreated: boolean;973 readonly asCollectionCreated: ITuple<[u32, u8, AccountId32]>;974 readonly isCollectionDestroyed: boolean;975 readonly asCollectionDestroyed: u32;976 readonly isItemCreated: boolean;977 readonly asItemCreated: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;978 readonly isItemDestroyed: boolean;979 readonly asItemDestroyed: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;980 readonly isTransfer: boolean;981 readonly asTransfer: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;982 readonly isApproved: boolean;983 readonly asApproved: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;984 readonly isCollectionPropertySet: boolean;985 readonly asCollectionPropertySet: ITuple<[u32, Bytes]>;986 readonly isCollectionPropertyDeleted: boolean;987 readonly asCollectionPropertyDeleted: ITuple<[u32, Bytes]>;988 readonly isTokenPropertySet: boolean;989 readonly asTokenPropertySet: ITuple<[u32, u32, Bytes]>;990 readonly isTokenPropertyDeleted: boolean;991 readonly asTokenPropertyDeleted: ITuple<[u32, u32, Bytes]>;992 readonly isPropertyPermissionSet: boolean;993 readonly asPropertyPermissionSet: ITuple<[u32, Bytes]>;994 readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'ItemCreated' | 'ItemDestroyed' | 'Transfer' | 'Approved' | 'CollectionPropertySet' | 'CollectionPropertyDeleted' | 'TokenPropertySet' | 'TokenPropertyDeleted' | 'PropertyPermissionSet';995}996997/** @name PalletEthereumCall */998export interface PalletEthereumCall extends Enum {999 readonly isTransact: boolean;1000 readonly asTransact: {1001 readonly transaction: EthereumTransactionTransactionV2;1002 } & Struct;1003 readonly type: 'Transact';1004}10051006/** @name PalletEthereumError */1007export interface PalletEthereumError extends Enum {1008 readonly isInvalidSignature: boolean;1009 readonly isPreLogExists: boolean;1010 readonly type: 'InvalidSignature' | 'PreLogExists';1011}10121013/** @name PalletEthereumEvent */1014export interface PalletEthereumEvent extends Enum {1015 readonly isExecuted: boolean;1016 readonly asExecuted: ITuple<[H160, H160, H256, EvmCoreErrorExitReason]>;1017 readonly type: 'Executed';1018}10191020/** @name PalletEthereumFakeTransactionFinalizer */1021export interface PalletEthereumFakeTransactionFinalizer extends Null {}10221023/** @name PalletEthereumRawOrigin */1024export interface PalletEthereumRawOrigin extends Enum {1025 readonly isEthereumTransaction: boolean;1026 readonly asEthereumTransaction: H160;1027 readonly type: 'EthereumTransaction';1028}10291030/** @name PalletEvmAccountBasicCrossAccountIdRepr */1031export interface PalletEvmAccountBasicCrossAccountIdRepr extends Enum {1032 readonly isSubstrate: boolean;1033 readonly asSubstrate: AccountId32;1034 readonly isEthereum: boolean;1035 readonly asEthereum: H160;1036 readonly type: 'Substrate' | 'Ethereum';1037}10381039/** @name PalletEvmCall */1040export interface PalletEvmCall extends Enum {1041 readonly isWithdraw: boolean;1042 readonly asWithdraw: {1043 readonly address: H160;1044 readonly value: u128;1045 } & Struct;1046 readonly isCall: boolean;1047 readonly asCall: {1048 readonly source: H160;1049 readonly target: H160;1050 readonly input: Bytes;1051 readonly value: U256;1052 readonly gasLimit: u64;1053 readonly maxFeePerGas: U256;1054 readonly maxPriorityFeePerGas: Option<U256>;1055 readonly nonce: Option<U256>;1056 readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1057 } & Struct;1058 readonly isCreate: boolean;1059 readonly asCreate: {1060 readonly source: H160;1061 readonly init: Bytes;1062 readonly value: U256;1063 readonly gasLimit: u64;1064 readonly maxFeePerGas: U256;1065 readonly maxPriorityFeePerGas: Option<U256>;1066 readonly nonce: Option<U256>;1067 readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1068 } & Struct;1069 readonly isCreate2: boolean;1070 readonly asCreate2: {1071 readonly source: H160;1072 readonly init: Bytes;1073 readonly salt: H256;1074 readonly value: U256;1075 readonly gasLimit: u64;1076 readonly maxFeePerGas: U256;1077 readonly maxPriorityFeePerGas: Option<U256>;1078 readonly nonce: Option<U256>;1079 readonly accessList: Vec<ITuple<[H160, Vec<H256>]>>;1080 } & Struct;1081 readonly type: 'Withdraw' | 'Call' | 'Create' | 'Create2';1082}10831084/** @name PalletEvmCoderSubstrateError */1085export interface PalletEvmCoderSubstrateError extends Enum {1086 readonly isOutOfGas: boolean;1087 readonly isOutOfFund: boolean;1088 readonly type: 'OutOfGas' | 'OutOfFund';1089}10901091/** @name PalletEvmContractHelpersError */1092export interface PalletEvmContractHelpersError extends Enum {1093 readonly isNoPermission: boolean;1094 readonly type: 'NoPermission';1095}10961097/** @name PalletEvmContractHelpersSponsoringModeT */1098export interface PalletEvmContractHelpersSponsoringModeT extends Enum {1099 readonly isDisabled: boolean;1100 readonly isAllowlisted: boolean;1101 readonly isGenerous: boolean;1102 readonly type: 'Disabled' | 'Allowlisted' | 'Generous';1103}11041105/** @name PalletEvmError */1106export interface PalletEvmError extends Enum {1107 readonly isBalanceLow: boolean;1108 readonly isFeeOverflow: boolean;1109 readonly isPaymentOverflow: boolean;1110 readonly isWithdrawFailed: boolean;1111 readonly isGasPriceTooLow: boolean;1112 readonly isInvalidNonce: boolean;1113 readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce';1114}11151116/** @name PalletEvmEvent */1117export interface PalletEvmEvent extends Enum {1118 readonly isLog: boolean;1119 readonly asLog: EthereumLog;1120 readonly isCreated: boolean;1121 readonly asCreated: H160;1122 readonly isCreatedFailed: boolean;1123 readonly asCreatedFailed: H160;1124 readonly isExecuted: boolean;1125 readonly asExecuted: H160;1126 readonly isExecutedFailed: boolean;1127 readonly asExecutedFailed: H160;1128 readonly isBalanceDeposit: boolean;1129 readonly asBalanceDeposit: ITuple<[AccountId32, H160, U256]>;1130 readonly isBalanceWithdraw: boolean;1131 readonly asBalanceWithdraw: ITuple<[AccountId32, H160, U256]>;1132 readonly type: 'Log' | 'Created' | 'CreatedFailed' | 'Executed' | 'ExecutedFailed' | 'BalanceDeposit' | 'BalanceWithdraw';1133}11341135/** @name PalletEvmMigrationCall */1136export interface PalletEvmMigrationCall extends Enum {1137 readonly isBegin: boolean;1138 readonly asBegin: {1139 readonly address: H160;1140 } & Struct;1141 readonly isSetData: boolean;1142 readonly asSetData: {1143 readonly address: H160;1144 readonly data: Vec<ITuple<[H256, H256]>>;1145 } & Struct;1146 readonly isFinish: boolean;1147 readonly asFinish: {1148 readonly address: H160;1149 readonly code: Bytes;1150 } & Struct;1151 readonly type: 'Begin' | 'SetData' | 'Finish';1152}11531154/** @name PalletEvmMigrationError */1155export interface PalletEvmMigrationError extends Enum {1156 readonly isAccountNotEmpty: boolean;1157 readonly isAccountIsNotMigrating: boolean;1158 readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating';1159}11601161/** @name PalletFungibleError */1162export interface PalletFungibleError extends Enum {1163 readonly isNotFungibleDataUsedToMintFungibleCollectionToken: boolean;1164 readonly isFungibleItemsHaveNoId: boolean;1165 readonly isFungibleItemsDontHaveData: boolean;1166 readonly isFungibleDisallowsNesting: boolean;1167 readonly isSettingPropertiesNotAllowed: boolean;1168 readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';1169}11701171/** @name PalletInflationCall */1172export interface PalletInflationCall extends Enum {1173 readonly isStartInflation: boolean;1174 readonly asStartInflation: {1175 readonly inflationStartRelayBlock: u32;1176 } & Struct;1177 readonly type: 'StartInflation';1178}11791180/** @name PalletNonfungibleError */1181export interface PalletNonfungibleError extends Enum {1182 readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean;1183 readonly isNonfungibleItemsHaveNoAmount: boolean;1184 readonly isCantBurnNftWithChildren: boolean;1185 readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren';1186}11871188/** @name PalletNonfungibleItemData */1189export interface PalletNonfungibleItemData extends Struct {1190 readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1191}11921193/** @name PalletRefungibleError */1194export interface PalletRefungibleError extends Enum {1195 readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;1196 readonly isWrongRefungiblePieces: boolean;1197 readonly isRepartitionWhileNotOwningAllPieces: boolean;1198 readonly isRefungibleDisallowsNesting: boolean;1199 readonly isSettingPropertiesNotAllowed: boolean;1200 readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';1201}12021203/** @name PalletRefungibleItemData */1204export interface PalletRefungibleItemData extends Struct {1205 readonly constData: Bytes;1206}12071208/** @name PalletRmrkCoreCall */1209export interface PalletRmrkCoreCall extends Enum {1210 readonly isCreateCollection: boolean;1211 readonly asCreateCollection: {1212 readonly metadata: Bytes;1213 readonly max: Option<u32>;1214 readonly symbol: Bytes;1215 } & Struct;1216 readonly isDestroyCollection: boolean;1217 readonly asDestroyCollection: {1218 readonly collectionId: u32;1219 } & Struct;1220 readonly isChangeCollectionIssuer: boolean;1221 readonly asChangeCollectionIssuer: {1222 readonly collectionId: u32;1223 readonly newIssuer: MultiAddress;1224 } & Struct;1225 readonly isLockCollection: boolean;1226 readonly asLockCollection: {1227 readonly collectionId: u32;1228 } & Struct;1229 readonly isMintNft: boolean;1230 readonly asMintNft: {1231 readonly owner: Option<AccountId32>;1232 readonly collectionId: u32;1233 readonly recipient: Option<AccountId32>;1234 readonly royaltyAmount: Option<Permill>;1235 readonly metadata: Bytes;1236 readonly transferable: bool;1237 readonly resources: Option<Vec<RmrkTraitsResourceResourceTypes>>;1238 } & Struct;1239 readonly isBurnNft: boolean;1240 readonly asBurnNft: {1241 readonly collectionId: u32;1242 readonly nftId: u32;1243 readonly maxBurns: u32;1244 } & Struct;1245 readonly isSend: boolean;1246 readonly asSend: {1247 readonly rmrkCollectionId: u32;1248 readonly rmrkNftId: u32;1249 readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1250 } & Struct;1251 readonly isAcceptNft: boolean;1252 readonly asAcceptNft: {1253 readonly rmrkCollectionId: u32;1254 readonly rmrkNftId: u32;1255 readonly newOwner: RmrkTraitsNftAccountIdOrCollectionNftTuple;1256 } & Struct;1257 readonly isRejectNft: boolean;1258 readonly asRejectNft: {1259 readonly rmrkCollectionId: u32;1260 readonly rmrkNftId: u32;1261 } & Struct;1262 readonly isAcceptResource: boolean;1263 readonly asAcceptResource: {1264 readonly rmrkCollectionId: u32;1265 readonly rmrkNftId: u32;1266 readonly resourceId: u32;1267 } & Struct;1268 readonly isAcceptResourceRemoval: boolean;1269 readonly asAcceptResourceRemoval: {1270 readonly rmrkCollectionId: u32;1271 readonly rmrkNftId: u32;1272 readonly resourceId: u32;1273 } & Struct;1274 readonly isSetProperty: boolean;1275 readonly asSetProperty: {1276 readonly rmrkCollectionId: Compact<u32>;1277 readonly maybeNftId: Option<u32>;1278 readonly key: Bytes;1279 readonly value: Bytes;1280 } & Struct;1281 readonly isSetPriority: boolean;1282 readonly asSetPriority: {1283 readonly rmrkCollectionId: u32;1284 readonly rmrkNftId: u32;1285 readonly priorities: Vec<u32>;1286 } & Struct;1287 readonly isAddBasicResource: boolean;1288 readonly asAddBasicResource: {1289 readonly rmrkCollectionId: u32;1290 readonly nftId: u32;1291 readonly resource: RmrkTraitsResourceBasicResource;1292 } & Struct;1293 readonly isAddComposableResource: boolean;1294 readonly asAddComposableResource: {1295 readonly rmrkCollectionId: u32;1296 readonly nftId: u32;1297 readonly resource: RmrkTraitsResourceComposableResource;1298 } & Struct;1299 readonly isAddSlotResource: boolean;1300 readonly asAddSlotResource: {1301 readonly rmrkCollectionId: u32;1302 readonly nftId: u32;1303 readonly resource: RmrkTraitsResourceSlotResource;1304 } & Struct;1305 readonly isRemoveResource: boolean;1306 readonly asRemoveResource: {1307 readonly rmrkCollectionId: u32;1308 readonly nftId: u32;1309 readonly resourceId: u32;1310 } & Struct;1311 readonly type: 'CreateCollection' | 'DestroyCollection' | 'ChangeCollectionIssuer' | 'LockCollection' | 'MintNft' | 'BurnNft' | 'Send' | 'AcceptNft' | 'RejectNft' | 'AcceptResource' | 'AcceptResourceRemoval' | 'SetProperty' | 'SetPriority' | 'AddBasicResource' | 'AddComposableResource' | 'AddSlotResource' | 'RemoveResource';1312}13131314/** @name PalletRmrkCoreError */1315export interface PalletRmrkCoreError extends Enum {1316 readonly isCorruptedCollectionType: boolean;1317 readonly isNftTypeEncodeError: boolean;1318 readonly isRmrkPropertyKeyIsTooLong: boolean;1319 readonly isRmrkPropertyValueIsTooLong: boolean;1320 readonly isRmrkPropertyIsNotFound: boolean;1321 readonly isUnableToDecodeRmrkData: boolean;1322 readonly isCollectionNotEmpty: boolean;1323 readonly isNoAvailableCollectionId: boolean;1324 readonly isNoAvailableNftId: boolean;1325 readonly isCollectionUnknown: boolean;1326 readonly isNoPermission: boolean;1327 readonly isNonTransferable: boolean;1328 readonly isCollectionFullOrLocked: boolean;1329 readonly isResourceDoesntExist: boolean;1330 readonly isCannotSendToDescendentOrSelf: boolean;1331 readonly isCannotAcceptNonOwnedNft: boolean;1332 readonly isCannotRejectNonOwnedNft: boolean;1333 readonly isCannotRejectNonPendingNft: boolean;1334 readonly isResourceNotPending: boolean;1335 readonly isNoAvailableResourceId: boolean;1336 readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId';1337}13381339/** @name PalletRmrkCoreEvent */1340export interface PalletRmrkCoreEvent extends Enum {1341 readonly isCollectionCreated: boolean;1342 readonly asCollectionCreated: {1343 readonly issuer: AccountId32;1344 readonly collectionId: u32;1345 } & Struct;1346 readonly isCollectionDestroyed: boolean;1347 readonly asCollectionDestroyed: {1348 readonly issuer: AccountId32;1349 readonly collectionId: u32;1350 } & Struct;1351 readonly isIssuerChanged: boolean;1352 readonly asIssuerChanged: {1353 readonly oldIssuer: AccountId32;1354 readonly newIssuer: AccountId32;1355 readonly collectionId: u32;1356 } & Struct;1357 readonly isCollectionLocked: boolean;1358 readonly asCollectionLocked: {1359 readonly issuer: AccountId32;1360 readonly collectionId: u32;1361 } & Struct;1362 readonly isNftMinted: boolean;1363 readonly asNftMinted: {1364 readonly owner: AccountId32;1365 readonly collectionId: u32;1366 readonly nftId: u32;1367 } & Struct;1368 readonly isNftBurned: boolean;1369 readonly asNftBurned: {1370 readonly owner: AccountId32;1371 readonly nftId: u32;1372 } & Struct;1373 readonly isNftSent: boolean;1374 readonly asNftSent: {1375 readonly sender: AccountId32;1376 readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;1377 readonly collectionId: u32;1378 readonly nftId: u32;1379 readonly approvalRequired: bool;1380 } & Struct;1381 readonly isNftAccepted: boolean;1382 readonly asNftAccepted: {1383 readonly sender: AccountId32;1384 readonly recipient: RmrkTraitsNftAccountIdOrCollectionNftTuple;1385 readonly collectionId: u32;1386 readonly nftId: u32;1387 } & Struct;1388 readonly isNftRejected: boolean;1389 readonly asNftRejected: {1390 readonly sender: AccountId32;1391 readonly collectionId: u32;1392 readonly nftId: u32;1393 } & Struct;1394 readonly isPropertySet: boolean;1395 readonly asPropertySet: {1396 readonly collectionId: u32;1397 readonly maybeNftId: Option<u32>;1398 readonly key: Bytes;1399 readonly value: Bytes;1400 } & Struct;1401 readonly isResourceAdded: boolean;1402 readonly asResourceAdded: {1403 readonly nftId: u32;1404 readonly resourceId: u32;1405 } & Struct;1406 readonly isResourceRemoval: boolean;1407 readonly asResourceRemoval: {1408 readonly nftId: u32;1409 readonly resourceId: u32;1410 } & Struct;1411 readonly isResourceAccepted: boolean;1412 readonly asResourceAccepted: {1413 readonly nftId: u32;1414 readonly resourceId: u32;1415 } & Struct;1416 readonly isResourceRemovalAccepted: boolean;1417 readonly asResourceRemovalAccepted: {1418 readonly nftId: u32;1419 readonly resourceId: u32;1420 } & Struct;1421 readonly isPrioritySet: boolean;1422 readonly asPrioritySet: {1423 readonly collectionId: u32;1424 readonly nftId: u32;1425 } & Struct;1426 readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'IssuerChanged' | 'CollectionLocked' | 'NftMinted' | 'NftBurned' | 'NftSent' | 'NftAccepted' | 'NftRejected' | 'PropertySet' | 'ResourceAdded' | 'ResourceRemoval' | 'ResourceAccepted' | 'ResourceRemovalAccepted' | 'PrioritySet';1427}14281429/** @name PalletRmrkEquipCall */1430export interface PalletRmrkEquipCall extends Enum {1431 readonly isCreateBase: boolean;1432 readonly asCreateBase: {1433 readonly baseType: Bytes;1434 readonly symbol: Bytes;1435 readonly parts: Vec<RmrkTraitsPartPartType>;1436 } & Struct;1437 readonly isThemeAdd: boolean;1438 readonly asThemeAdd: {1439 readonly baseId: u32;1440 readonly theme: RmrkTraitsTheme;1441 } & Struct;1442 readonly isEquippable: boolean;1443 readonly asEquippable: {1444 readonly baseId: u32;1445 readonly slotId: u32;1446 readonly equippables: RmrkTraitsPartEquippableList;1447 } & Struct;1448 readonly type: 'CreateBase' | 'ThemeAdd' | 'Equippable';1449}14501451/** @name PalletRmrkEquipError */1452export interface PalletRmrkEquipError extends Enum {1453 readonly isPermissionError: boolean;1454 readonly isNoAvailableBaseId: boolean;1455 readonly isNoAvailablePartId: boolean;1456 readonly isBaseDoesntExist: boolean;1457 readonly isNeedsDefaultThemeFirst: boolean;1458 readonly isPartDoesntExist: boolean;1459 readonly isNoEquippableOnFixedPart: boolean;1460 readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart';1461}14621463/** @name PalletRmrkEquipEvent */1464export interface PalletRmrkEquipEvent extends Enum {1465 readonly isBaseCreated: boolean;1466 readonly asBaseCreated: {1467 readonly issuer: AccountId32;1468 readonly baseId: u32;1469 } & Struct;1470 readonly isEquippablesUpdated: boolean;1471 readonly asEquippablesUpdated: {1472 readonly baseId: u32;1473 readonly slotId: u32;1474 } & Struct;1475 readonly type: 'BaseCreated' | 'EquippablesUpdated';1476}14771478/** @name PalletStructureCall */1479export interface PalletStructureCall extends Null {}14801481/** @name PalletStructureError */1482export interface PalletStructureError extends Enum {1483 readonly isOuroborosDetected: boolean;1484 readonly isDepthLimit: boolean;1485 readonly isBreadthLimit: boolean;1486 readonly isTokenNotFound: boolean;1487 readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound';1488}14891490/** @name PalletStructureEvent */1491export interface PalletStructureEvent extends Enum {1492 readonly isExecuted: boolean;1493 readonly asExecuted: Result<Null, SpRuntimeDispatchError>;1494 readonly type: 'Executed';1495}14961497/** @name PalletSudoCall */1498export interface PalletSudoCall extends Enum {1499 readonly isSudo: boolean;1500 readonly asSudo: {1501 readonly call: Call;1502 } & Struct;1503 readonly isSudoUncheckedWeight: boolean;1504 readonly asSudoUncheckedWeight: {1505 readonly call: Call;1506 readonly weight: u64;1507 } & Struct;1508 readonly isSetKey: boolean;1509 readonly asSetKey: {1510 readonly new_: MultiAddress;1511 } & Struct;1512 readonly isSudoAs: boolean;1513 readonly asSudoAs: {1514 readonly who: MultiAddress;1515 readonly call: Call;1516 } & Struct;1517 readonly type: 'Sudo' | 'SudoUncheckedWeight' | 'SetKey' | 'SudoAs';1518}15191520/** @name PalletSudoError */1521export interface PalletSudoError extends Enum {1522 readonly isRequireSudo: boolean;1523 readonly type: 'RequireSudo';1524}15251526/** @name PalletSudoEvent */1527export interface PalletSudoEvent extends Enum {1528 readonly isSudid: boolean;1529 readonly asSudid: {1530 readonly sudoResult: Result<Null, SpRuntimeDispatchError>;1531 } & Struct;1532 readonly isKeyChanged: boolean;1533 readonly asKeyChanged: {1534 readonly oldSudoer: Option<AccountId32>;1535 } & Struct;1536 readonly isSudoAsDone: boolean;1537 readonly asSudoAsDone: {1538 readonly sudoResult: Result<Null, SpRuntimeDispatchError>;1539 } & Struct;1540 readonly type: 'Sudid' | 'KeyChanged' | 'SudoAsDone';1541}15421543/** @name PalletTemplateTransactionPaymentCall */1544export interface PalletTemplateTransactionPaymentCall extends Null {}15451546/** @name PalletTemplateTransactionPaymentChargeTransactionPayment */1547export interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact<u128> {}15481549/** @name PalletTimestampCall */1550export interface PalletTimestampCall extends Enum {1551 readonly isSet: boolean;1552 readonly asSet: {1553 readonly now: Compact<u64>;1554 } & Struct;1555 readonly type: 'Set';1556}15571558/** @name PalletTransactionPaymentReleases */1559export interface PalletTransactionPaymentReleases extends Enum {1560 readonly isV1Ancient: boolean;1561 readonly isV2: boolean;1562 readonly type: 'V1Ancient' | 'V2';1563}15641565/** @name PalletTreasuryCall */1566export interface PalletTreasuryCall extends Enum {1567 readonly isProposeSpend: boolean;1568 readonly asProposeSpend: {1569 readonly value: Compact<u128>;1570 readonly beneficiary: MultiAddress;1571 } & Struct;1572 readonly isRejectProposal: boolean;1573 readonly asRejectProposal: {1574 readonly proposalId: Compact<u32>;1575 } & Struct;1576 readonly isApproveProposal: boolean;1577 readonly asApproveProposal: {1578 readonly proposalId: Compact<u32>;1579 } & Struct;1580 readonly isRemoveApproval: boolean;1581 readonly asRemoveApproval: {1582 readonly proposalId: Compact<u32>;1583 } & Struct;1584 readonly type: 'ProposeSpend' | 'RejectProposal' | 'ApproveProposal' | 'RemoveApproval';1585}15861587/** @name PalletTreasuryError */1588export interface PalletTreasuryError extends Enum {1589 readonly isInsufficientProposersBalance: boolean;1590 readonly isInvalidIndex: boolean;1591 readonly isTooManyApprovals: boolean;1592 readonly isProposalNotApproved: boolean;1593 readonly type: 'InsufficientProposersBalance' | 'InvalidIndex' | 'TooManyApprovals' | 'ProposalNotApproved';1594}15951596/** @name PalletTreasuryEvent */1597export interface PalletTreasuryEvent extends Enum {1598 readonly isProposed: boolean;1599 readonly asProposed: {1600 readonly proposalIndex: u32;1601 } & Struct;1602 readonly isSpending: boolean;1603 readonly asSpending: {1604 readonly budgetRemaining: u128;1605 } & Struct;1606 readonly isAwarded: boolean;1607 readonly asAwarded: {1608 readonly proposalIndex: u32;1609 readonly award: u128;1610 readonly account: AccountId32;1611 } & Struct;1612 readonly isRejected: boolean;1613 readonly asRejected: {1614 readonly proposalIndex: u32;1615 readonly slashed: u128;1616 } & Struct;1617 readonly isBurnt: boolean;1618 readonly asBurnt: {1619 readonly burntFunds: u128;1620 } & Struct;1621 readonly isRollover: boolean;1622 readonly asRollover: {1623 readonly rolloverBalance: u128;1624 } & Struct;1625 readonly isDeposit: boolean;1626 readonly asDeposit: {1627 readonly value: u128;1628 } & Struct;1629 readonly type: 'Proposed' | 'Spending' | 'Awarded' | 'Rejected' | 'Burnt' | 'Rollover' | 'Deposit';1630}16311632/** @name PalletTreasuryProposal */1633export interface PalletTreasuryProposal extends Struct {1634 readonly proposer: AccountId32;1635 readonly value: u128;1636 readonly beneficiary: AccountId32;1637 readonly bond: u128;1638}16391640/** @name PalletUniqueCall */1641export interface PalletUniqueCall extends Enum {1642 readonly isCreateCollection: boolean;1643 readonly asCreateCollection: {1644 readonly collectionName: Vec<u16>;1645 readonly collectionDescription: Vec<u16>;1646 readonly tokenPrefix: Bytes;1647 readonly mode: UpDataStructsCollectionMode;1648 } & Struct;1649 readonly isCreateCollectionEx: boolean;1650 readonly asCreateCollectionEx: {1651 readonly data: UpDataStructsCreateCollectionData;1652 } & Struct;1653 readonly isDestroyCollection: boolean;1654 readonly asDestroyCollection: {1655 readonly collectionId: u32;1656 } & Struct;1657 readonly isAddToAllowList: boolean;1658 readonly asAddToAllowList: {1659 readonly collectionId: u32;1660 readonly address: PalletEvmAccountBasicCrossAccountIdRepr;1661 } & Struct;1662 readonly isRemoveFromAllowList: boolean;1663 readonly asRemoveFromAllowList: {1664 readonly collectionId: u32;1665 readonly address: PalletEvmAccountBasicCrossAccountIdRepr;1666 } & Struct;1667 readonly isChangeCollectionOwner: boolean;1668 readonly asChangeCollectionOwner: {1669 readonly collectionId: u32;1670 readonly newOwner: AccountId32;1671 } & Struct;1672 readonly isAddCollectionAdmin: boolean;1673 readonly asAddCollectionAdmin: {1674 readonly collectionId: u32;1675 readonly newAdmin: PalletEvmAccountBasicCrossAccountIdRepr;1676 } & Struct;1677 readonly isRemoveCollectionAdmin: boolean;1678 readonly asRemoveCollectionAdmin: {1679 readonly collectionId: u32;1680 readonly accountId: PalletEvmAccountBasicCrossAccountIdRepr;1681 } & Struct;1682 readonly isSetCollectionSponsor: boolean;1683 readonly asSetCollectionSponsor: {1684 readonly collectionId: u32;1685 readonly newSponsor: AccountId32;1686 } & Struct;1687 readonly isConfirmSponsorship: boolean;1688 readonly asConfirmSponsorship: {1689 readonly collectionId: u32;1690 } & Struct;1691 readonly isRemoveCollectionSponsor: boolean;1692 readonly asRemoveCollectionSponsor: {1693 readonly collectionId: u32;1694 } & Struct;1695 readonly isCreateItem: boolean;1696 readonly asCreateItem: {1697 readonly collectionId: u32;1698 readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1699 readonly data: UpDataStructsCreateItemData;1700 } & Struct;1701 readonly isCreateMultipleItems: boolean;1702 readonly asCreateMultipleItems: {1703 readonly collectionId: u32;1704 readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;1705 readonly itemsData: Vec<UpDataStructsCreateItemData>;1706 } & Struct;1707 readonly isSetCollectionProperties: boolean;1708 readonly asSetCollectionProperties: {1709 readonly collectionId: u32;1710 readonly properties: Vec<UpDataStructsProperty>;1711 } & Struct;1712 readonly isDeleteCollectionProperties: boolean;1713 readonly asDeleteCollectionProperties: {1714 readonly collectionId: u32;1715 readonly propertyKeys: Vec<Bytes>;1716 } & Struct;1717 readonly isSetTokenProperties: boolean;1718 readonly asSetTokenProperties: {1719 readonly collectionId: u32;1720 readonly tokenId: u32;1721 readonly properties: Vec<UpDataStructsProperty>;1722 } & Struct;1723 readonly isDeleteTokenProperties: boolean;1724 readonly asDeleteTokenProperties: {1725 readonly collectionId: u32;1726 readonly tokenId: u32;1727 readonly propertyKeys: Vec<Bytes>;1728 } & Struct;1729 readonly isSetTokenPropertyPermissions: boolean;1730 readonly asSetTokenPropertyPermissions: {1731 readonly collectionId: u32;1732 readonly propertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;1733 } & Struct;1734 readonly isCreateMultipleItemsEx: boolean;1735 readonly asCreateMultipleItemsEx: {1736 readonly collectionId: u32;1737 readonly data: UpDataStructsCreateItemExData;1738 } & Struct;1739 readonly isSetTransfersEnabledFlag: boolean;1740 readonly asSetTransfersEnabledFlag: {1741 readonly collectionId: u32;1742 readonly value: bool;1743 } & Struct;1744 readonly isBurnItem: boolean;1745 readonly asBurnItem: {1746 readonly collectionId: u32;1747 readonly itemId: u32;1748 readonly value: u128;1749 } & Struct;1750 readonly isBurnFrom: boolean;1751 readonly asBurnFrom: {1752 readonly collectionId: u32;1753 readonly from: PalletEvmAccountBasicCrossAccountIdRepr;1754 readonly itemId: u32;1755 readonly value: u128;1756 } & Struct;1757 readonly isTransfer: boolean;1758 readonly asTransfer: {1759 readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;1760 readonly collectionId: u32;1761 readonly itemId: u32;1762 readonly value: u128;1763 } & Struct;1764 readonly isApprove: boolean;1765 readonly asApprove: {1766 readonly spender: PalletEvmAccountBasicCrossAccountIdRepr;1767 readonly collectionId: u32;1768 readonly itemId: u32;1769 readonly amount: u128;1770 } & Struct;1771 readonly isTransferFrom: boolean;1772 readonly asTransferFrom: {1773 readonly from: PalletEvmAccountBasicCrossAccountIdRepr;1774 readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;1775 readonly collectionId: u32;1776 readonly itemId: u32;1777 readonly value: u128;1778 } & Struct;1779 readonly isSetCollectionLimits: boolean;1780 readonly asSetCollectionLimits: {1781 readonly collectionId: u32;1782 readonly newLimit: UpDataStructsCollectionLimits;1783 } & Struct;1784 readonly isSetCollectionPermissions: boolean;1785 readonly asSetCollectionPermissions: {1786 readonly collectionId: u32;1787 readonly newPermission: UpDataStructsCollectionPermissions;1788 } & Struct;1789 readonly isRepartition: boolean;1790 readonly asRepartition: {1791 readonly collectionId: u32;1792 readonly tokenId: u32;1793 readonly amount: u128;1794 } & Struct;1795 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';1796}17971798/** @name PalletUniqueError */1799export interface PalletUniqueError extends Enum {1800 readonly isCollectionDecimalPointLimitExceeded: boolean;1801 readonly isConfirmUnsetSponsorFail: boolean;1802 readonly isEmptyArgument: boolean;1803 readonly isRepartitionCalledOnNonRefungibleCollection: boolean;1804 readonly type: 'CollectionDecimalPointLimitExceeded' | 'ConfirmUnsetSponsorFail' | 'EmptyArgument' | 'RepartitionCalledOnNonRefungibleCollection';1805}18061807/** @name PalletUniqueRawEvent */1808export interface PalletUniqueRawEvent extends Enum {1809 readonly isCollectionSponsorRemoved: boolean;1810 readonly asCollectionSponsorRemoved: u32;1811 readonly isCollectionAdminAdded: boolean;1812 readonly asCollectionAdminAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1813 readonly isCollectionOwnedChanged: boolean;1814 readonly asCollectionOwnedChanged: ITuple<[u32, AccountId32]>;1815 readonly isCollectionSponsorSet: boolean;1816 readonly asCollectionSponsorSet: ITuple<[u32, AccountId32]>;1817 readonly isSponsorshipConfirmed: boolean;1818 readonly asSponsorshipConfirmed: ITuple<[u32, AccountId32]>;1819 readonly isCollectionAdminRemoved: boolean;1820 readonly asCollectionAdminRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1821 readonly isAllowListAddressRemoved: boolean;1822 readonly asAllowListAddressRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1823 readonly isAllowListAddressAdded: boolean;1824 readonly asAllowListAddressAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;1825 readonly isCollectionLimitSet: boolean;1826 readonly asCollectionLimitSet: u32;1827 readonly isCollectionPermissionSet: boolean;1828 readonly asCollectionPermissionSet: u32;1829 readonly type: 'CollectionSponsorRemoved' | 'CollectionAdminAdded' | 'CollectionOwnedChanged' | 'CollectionSponsorSet' | 'SponsorshipConfirmed' | 'CollectionAdminRemoved' | 'AllowListAddressRemoved' | 'AllowListAddressAdded' | 'CollectionLimitSet' | 'CollectionPermissionSet';1830}18311832/** @name PalletUniqueSchedulerCall */1833export interface PalletUniqueSchedulerCall extends Enum {1834 readonly isScheduleNamed: boolean;1835 readonly asScheduleNamed: {1836 readonly id: U8aFixed;1837 readonly when: u32;1838 readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1839 readonly priority: u8;1840 readonly call: FrameSupportScheduleMaybeHashed;1841 } & Struct;1842 readonly isCancelNamed: boolean;1843 readonly asCancelNamed: {1844 readonly id: U8aFixed;1845 } & Struct;1846 readonly isScheduleNamedAfter: boolean;1847 readonly asScheduleNamedAfter: {1848 readonly id: U8aFixed;1849 readonly after: u32;1850 readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1851 readonly priority: u8;1852 readonly call: FrameSupportScheduleMaybeHashed;1853 } & Struct;1854 readonly type: 'ScheduleNamed' | 'CancelNamed' | 'ScheduleNamedAfter';1855}18561857/** @name PalletUniqueSchedulerError */1858export interface PalletUniqueSchedulerError extends Enum {1859 readonly isFailedToSchedule: boolean;1860 readonly isNotFound: boolean;1861 readonly isTargetBlockNumberInPast: boolean;1862 readonly isRescheduleNoChange: boolean;1863 readonly type: 'FailedToSchedule' | 'NotFound' | 'TargetBlockNumberInPast' | 'RescheduleNoChange';1864}18651866/** @name PalletUniqueSchedulerEvent */1867export interface PalletUniqueSchedulerEvent extends Enum {1868 readonly isScheduled: boolean;1869 readonly asScheduled: {1870 readonly when: u32;1871 readonly index: u32;1872 } & Struct;1873 readonly isCanceled: boolean;1874 readonly asCanceled: {1875 readonly when: u32;1876 readonly index: u32;1877 } & Struct;1878 readonly isDispatched: boolean;1879 readonly asDispatched: {1880 readonly task: ITuple<[u32, u32]>;1881 readonly id: Option<U8aFixed>;1882 readonly result: Result<Null, SpRuntimeDispatchError>;1883 } & Struct;1884 readonly isCallLookupFailed: boolean;1885 readonly asCallLookupFailed: {1886 readonly task: ITuple<[u32, u32]>;1887 readonly id: Option<U8aFixed>;1888 readonly error: FrameSupportScheduleLookupError;1889 } & Struct;1890 readonly type: 'Scheduled' | 'Canceled' | 'Dispatched' | 'CallLookupFailed';1891}18921893/** @name PalletUniqueSchedulerScheduledV3 */1894export interface PalletUniqueSchedulerScheduledV3 extends Struct {1895 readonly maybeId: Option<U8aFixed>;1896 readonly priority: u8;1897 readonly call: FrameSupportScheduleMaybeHashed;1898 readonly maybePeriodic: Option<ITuple<[u32, u32]>>;1899 readonly origin: OpalRuntimeOriginCaller;1900}19011902/** @name PalletXcmCall */1903export interface PalletXcmCall extends Enum {1904 readonly isSend: boolean;1905 readonly asSend: {1906 readonly dest: XcmVersionedMultiLocation;1907 readonly message: XcmVersionedXcm;1908 } & Struct;1909 readonly isTeleportAssets: boolean;1910 readonly asTeleportAssets: {1911 readonly dest: XcmVersionedMultiLocation;1912 readonly beneficiary: XcmVersionedMultiLocation;1913 readonly assets: XcmVersionedMultiAssets;1914 readonly feeAssetItem: u32;1915 } & Struct;1916 readonly isReserveTransferAssets: boolean;1917 readonly asReserveTransferAssets: {1918 readonly dest: XcmVersionedMultiLocation;1919 readonly beneficiary: XcmVersionedMultiLocation;1920 readonly assets: XcmVersionedMultiAssets;1921 readonly feeAssetItem: u32;1922 } & Struct;1923 readonly isExecute: boolean;1924 readonly asExecute: {1925 readonly message: XcmVersionedXcm;1926 readonly maxWeight: u64;1927 } & Struct;1928 readonly isForceXcmVersion: boolean;1929 readonly asForceXcmVersion: {1930 readonly location: XcmV1MultiLocation;1931 readonly xcmVersion: u32;1932 } & Struct;1933 readonly isForceDefaultXcmVersion: boolean;1934 readonly asForceDefaultXcmVersion: {1935 readonly maybeXcmVersion: Option<u32>;1936 } & Struct;1937 readonly isForceSubscribeVersionNotify: boolean;1938 readonly asForceSubscribeVersionNotify: {1939 readonly location: XcmVersionedMultiLocation;1940 } & Struct;1941 readonly isForceUnsubscribeVersionNotify: boolean;1942 readonly asForceUnsubscribeVersionNotify: {1943 readonly location: XcmVersionedMultiLocation;1944 } & Struct;1945 readonly isLimitedReserveTransferAssets: boolean;1946 readonly asLimitedReserveTransferAssets: {1947 readonly dest: XcmVersionedMultiLocation;1948 readonly beneficiary: XcmVersionedMultiLocation;1949 readonly assets: XcmVersionedMultiAssets;1950 readonly feeAssetItem: u32;1951 readonly weightLimit: XcmV2WeightLimit;1952 } & Struct;1953 readonly isLimitedTeleportAssets: boolean;1954 readonly asLimitedTeleportAssets: {1955 readonly dest: XcmVersionedMultiLocation;1956 readonly beneficiary: XcmVersionedMultiLocation;1957 readonly assets: XcmVersionedMultiAssets;1958 readonly feeAssetItem: u32;1959 readonly weightLimit: XcmV2WeightLimit;1960 } & Struct;1961 readonly type: 'Send' | 'TeleportAssets' | 'ReserveTransferAssets' | 'Execute' | 'ForceXcmVersion' | 'ForceDefaultXcmVersion' | 'ForceSubscribeVersionNotify' | 'ForceUnsubscribeVersionNotify' | 'LimitedReserveTransferAssets' | 'LimitedTeleportAssets';1962}19631964/** @name PalletXcmError */1965export interface PalletXcmError extends Enum {1966 readonly isUnreachable: boolean;1967 readonly isSendFailure: boolean;1968 readonly isFiltered: boolean;1969 readonly isUnweighableMessage: boolean;1970 readonly isDestinationNotInvertible: boolean;1971 readonly isEmpty: boolean;1972 readonly isCannotReanchor: boolean;1973 readonly isTooManyAssets: boolean;1974 readonly isInvalidOrigin: boolean;1975 readonly isBadVersion: boolean;1976 readonly isBadLocation: boolean;1977 readonly isNoSubscription: boolean;1978 readonly isAlreadySubscribed: boolean;1979 readonly type: 'Unreachable' | 'SendFailure' | 'Filtered' | 'UnweighableMessage' | 'DestinationNotInvertible' | 'Empty' | 'CannotReanchor' | 'TooManyAssets' | 'InvalidOrigin' | 'BadVersion' | 'BadLocation' | 'NoSubscription' | 'AlreadySubscribed';1980}19811982/** @name PalletXcmEvent */1983export interface PalletXcmEvent extends Enum {1984 readonly isAttempted: boolean;1985 readonly asAttempted: XcmV2TraitsOutcome;1986 readonly isSent: boolean;1987 readonly asSent: ITuple<[XcmV1MultiLocation, XcmV1MultiLocation, XcmV2Xcm]>;1988 readonly isUnexpectedResponse: boolean;1989 readonly asUnexpectedResponse: ITuple<[XcmV1MultiLocation, u64]>;1990 readonly isResponseReady: boolean;1991 readonly asResponseReady: ITuple<[u64, XcmV2Response]>;1992 readonly isNotified: boolean;1993 readonly asNotified: ITuple<[u64, u8, u8]>;1994 readonly isNotifyOverweight: boolean;1995 readonly asNotifyOverweight: ITuple<[u64, u8, u8, u64, u64]>;1996 readonly isNotifyDispatchError: boolean;1997 readonly asNotifyDispatchError: ITuple<[u64, u8, u8]>;1998 readonly isNotifyDecodeFailed: boolean;1999 readonly asNotifyDecodeFailed: ITuple<[u64, u8, u8]>;2000 readonly isInvalidResponder: boolean;2001 readonly asInvalidResponder: ITuple<[XcmV1MultiLocation, u64, Option<XcmV1MultiLocation>]>;2002 readonly isInvalidResponderVersion: boolean;2003 readonly asInvalidResponderVersion: ITuple<[XcmV1MultiLocation, u64]>;2004 readonly isResponseTaken: boolean;2005 readonly asResponseTaken: u64;2006 readonly isAssetsTrapped: boolean;2007 readonly asAssetsTrapped: ITuple<[H256, XcmV1MultiLocation, XcmVersionedMultiAssets]>;2008 readonly isVersionChangeNotified: boolean;2009 readonly asVersionChangeNotified: ITuple<[XcmV1MultiLocation, u32]>;2010 readonly isSupportedVersionChanged: boolean;2011 readonly asSupportedVersionChanged: ITuple<[XcmV1MultiLocation, u32]>;2012 readonly isNotifyTargetSendFail: boolean;2013 readonly asNotifyTargetSendFail: ITuple<[XcmV1MultiLocation, u64, XcmV2TraitsError]>;2014 readonly isNotifyTargetMigrationFail: boolean;2015 readonly asNotifyTargetMigrationFail: ITuple<[XcmVersionedMultiLocation, u64]>;2016 readonly type: 'Attempted' | 'Sent' | 'UnexpectedResponse' | 'ResponseReady' | 'Notified' | 'NotifyOverweight' | 'NotifyDispatchError' | 'NotifyDecodeFailed' | 'InvalidResponder' | 'InvalidResponderVersion' | 'ResponseTaken' | 'AssetsTrapped' | 'VersionChangeNotified' | 'SupportedVersionChanged' | 'NotifyTargetSendFail' | 'NotifyTargetMigrationFail';2017}20182019/** @name PalletXcmOrigin */2020export interface PalletXcmOrigin extends Enum {2021 readonly isXcm: boolean;2022 readonly asXcm: XcmV1MultiLocation;2023 readonly isResponse: boolean;2024 readonly asResponse: XcmV1MultiLocation;2025 readonly type: 'Xcm' | 'Response';2026}20272028/** @name PhantomTypeUpDataStructs */2029export interface PhantomTypeUpDataStructs extends Vec<ITuple<[UpDataStructsTokenData, UpDataStructsRpcCollection, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftNftInfo, RmrkTraitsResourceResourceInfo, RmrkTraitsPropertyPropertyInfo, RmrkTraitsBaseBaseInfo, RmrkTraitsPartPartType, RmrkTraitsTheme, RmrkTraitsNftNftChild]>> {}20302031/** @name PolkadotCorePrimitivesInboundDownwardMessage */2032export interface PolkadotCorePrimitivesInboundDownwardMessage extends Struct {2033 readonly sentAt: u32;2034 readonly msg: Bytes;2035}20362037/** @name PolkadotCorePrimitivesInboundHrmpMessage */2038export interface PolkadotCorePrimitivesInboundHrmpMessage extends Struct {2039 readonly sentAt: u32;2040 readonly data: Bytes;2041}20422043/** @name PolkadotCorePrimitivesOutboundHrmpMessage */2044export interface PolkadotCorePrimitivesOutboundHrmpMessage extends Struct {2045 readonly recipient: u32;2046 readonly data: Bytes;2047}20482049/** @name PolkadotParachainPrimitivesXcmpMessageFormat */2050export interface PolkadotParachainPrimitivesXcmpMessageFormat extends Enum {2051 readonly isConcatenatedVersionedXcm: boolean;2052 readonly isConcatenatedEncodedBlob: boolean;2053 readonly isSignals: boolean;2054 readonly type: 'ConcatenatedVersionedXcm' | 'ConcatenatedEncodedBlob' | 'Signals';2055}20562057/** @name PolkadotPrimitivesV2AbridgedHostConfiguration */2058export interface PolkadotPrimitivesV2AbridgedHostConfiguration extends Struct {2059 readonly maxCodeSize: u32;2060 readonly maxHeadDataSize: u32;2061 readonly maxUpwardQueueCount: u32;2062 readonly maxUpwardQueueSize: u32;2063 readonly maxUpwardMessageSize: u32;2064 readonly maxUpwardMessageNumPerCandidate: u32;2065 readonly hrmpMaxMessageNumPerCandidate: u32;2066 readonly validationUpgradeCooldown: u32;2067 readonly validationUpgradeDelay: u32;2068}20692070/** @name PolkadotPrimitivesV2AbridgedHrmpChannel */2071export interface PolkadotPrimitivesV2AbridgedHrmpChannel extends Struct {2072 readonly maxCapacity: u32;2073 readonly maxTotalSize: u32;2074 readonly maxMessageSize: u32;2075 readonly msgCount: u32;2076 readonly totalSize: u32;2077 readonly mqcHead: Option<H256>;2078}20792080/** @name PolkadotPrimitivesV2PersistedValidationData */2081export interface PolkadotPrimitivesV2PersistedValidationData extends Struct {2082 readonly parentHead: Bytes;2083 readonly relayParentNumber: u32;2084 readonly relayParentStorageRoot: H256;2085 readonly maxPovSize: u32;2086}20872088/** @name PolkadotPrimitivesV2UpgradeRestriction */2089export interface PolkadotPrimitivesV2UpgradeRestriction extends Enum {2090 readonly isPresent: boolean;2091 readonly type: 'Present';2092}20932094/** @name RmrkTraitsBaseBaseInfo */2095export interface RmrkTraitsBaseBaseInfo extends Struct {2096 readonly issuer: AccountId32;2097 readonly baseType: Bytes;2098 readonly symbol: Bytes;2099}21002101/** @name RmrkTraitsCollectionCollectionInfo */2102export interface RmrkTraitsCollectionCollectionInfo extends Struct {2103 readonly issuer: AccountId32;2104 readonly metadata: Bytes;2105 readonly max: Option<u32>;2106 readonly symbol: Bytes;2107 readonly nftsCount: u32;2108}21092110/** @name RmrkTraitsNftAccountIdOrCollectionNftTuple */2111export interface RmrkTraitsNftAccountIdOrCollectionNftTuple extends Enum {2112 readonly isAccountId: boolean;2113 readonly asAccountId: AccountId32;2114 readonly isCollectionAndNftTuple: boolean;2115 readonly asCollectionAndNftTuple: ITuple<[u32, u32]>;2116 readonly type: 'AccountId' | 'CollectionAndNftTuple';2117}21182119/** @name RmrkTraitsNftNftChild */2120export interface RmrkTraitsNftNftChild extends Struct {2121 readonly collectionId: u32;2122 readonly nftId: u32;2123}21242125/** @name RmrkTraitsNftNftInfo */2126export interface RmrkTraitsNftNftInfo extends Struct {2127 readonly owner: RmrkTraitsNftAccountIdOrCollectionNftTuple;2128 readonly royalty: Option<RmrkTraitsNftRoyaltyInfo>;2129 readonly metadata: Bytes;2130 readonly equipped: bool;2131 readonly pending: bool;2132}21332134/** @name RmrkTraitsNftRoyaltyInfo */2135export interface RmrkTraitsNftRoyaltyInfo extends Struct {2136 readonly recipient: AccountId32;2137 readonly amount: Permill;2138}21392140/** @name RmrkTraitsPartEquippableList */2141export interface RmrkTraitsPartEquippableList extends Enum {2142 readonly isAll: boolean;2143 readonly isEmpty: boolean;2144 readonly isCustom: boolean;2145 readonly asCustom: Vec<u32>;2146 readonly type: 'All' | 'Empty' | 'Custom';2147}21482149/** @name RmrkTraitsPartFixedPart */2150export interface RmrkTraitsPartFixedPart extends Struct {2151 readonly id: u32;2152 readonly z: u32;2153 readonly src: Bytes;2154}21552156/** @name RmrkTraitsPartPartType */2157export interface RmrkTraitsPartPartType extends Enum {2158 readonly isFixedPart: boolean;2159 readonly asFixedPart: RmrkTraitsPartFixedPart;2160 readonly isSlotPart: boolean;2161 readonly asSlotPart: RmrkTraitsPartSlotPart;2162 readonly type: 'FixedPart' | 'SlotPart';2163}21642165/** @name RmrkTraitsPartSlotPart */2166export interface RmrkTraitsPartSlotPart extends Struct {2167 readonly id: u32;2168 readonly equippable: RmrkTraitsPartEquippableList;2169 readonly src: Bytes;2170 readonly z: u32;2171}21722173/** @name RmrkTraitsPropertyPropertyInfo */2174export interface RmrkTraitsPropertyPropertyInfo extends Struct {2175 readonly key: Bytes;2176 readonly value: Bytes;2177}21782179/** @name RmrkTraitsResourceBasicResource */2180export interface RmrkTraitsResourceBasicResource extends Struct {2181 readonly src: Option<Bytes>;2182 readonly metadata: Option<Bytes>;2183 readonly license: Option<Bytes>;2184 readonly thumb: Option<Bytes>;2185}21862187/** @name RmrkTraitsResourceComposableResource */2188export interface RmrkTraitsResourceComposableResource extends Struct {2189 readonly parts: Vec<u32>;2190 readonly base: u32;2191 readonly src: Option<Bytes>;2192 readonly metadata: Option<Bytes>;2193 readonly license: Option<Bytes>;2194 readonly thumb: Option<Bytes>;2195}21962197/** @name RmrkTraitsResourceResourceInfo */2198export interface RmrkTraitsResourceResourceInfo extends Struct {2199 readonly id: u32;2200 readonly resource: RmrkTraitsResourceResourceTypes;2201 readonly pending: bool;2202 readonly pendingRemoval: bool;2203}22042205/** @name RmrkTraitsResourceResourceTypes */2206export interface RmrkTraitsResourceResourceTypes extends Enum {2207 readonly isBasic: boolean;2208 readonly asBasic: RmrkTraitsResourceBasicResource;2209 readonly isComposable: boolean;2210 readonly asComposable: RmrkTraitsResourceComposableResource;2211 readonly isSlot: boolean;2212 readonly asSlot: RmrkTraitsResourceSlotResource;2213 readonly type: 'Basic' | 'Composable' | 'Slot';2214}22152216/** @name RmrkTraitsResourceSlotResource */2217export interface RmrkTraitsResourceSlotResource extends Struct {2218 readonly base: u32;2219 readonly src: Option<Bytes>;2220 readonly metadata: Option<Bytes>;2221 readonly slot: u32;2222 readonly license: Option<Bytes>;2223 readonly thumb: Option<Bytes>;2224}22252226/** @name RmrkTraitsTheme */2227export interface RmrkTraitsTheme extends Struct {2228 readonly name: Bytes;2229 readonly properties: Vec<RmrkTraitsThemeThemeProperty>;2230 readonly inherit: bool;2231}22322233/** @name RmrkTraitsThemeThemeProperty */2234export interface RmrkTraitsThemeThemeProperty extends Struct {2235 readonly key: Bytes;2236 readonly value: Bytes;2237}22382239/** @name SpCoreEcdsaSignature */2240export interface SpCoreEcdsaSignature extends U8aFixed {}22412242/** @name SpCoreEd25519Signature */2243export interface SpCoreEd25519Signature extends U8aFixed {}22442245/** @name SpCoreSr25519Signature */2246export interface SpCoreSr25519Signature extends U8aFixed {}22472248/** @name SpCoreVoid */2249export interface SpCoreVoid extends Null {}22502251/** @name SpRuntimeArithmeticError */2252export interface SpRuntimeArithmeticError extends Enum {2253 readonly isUnderflow: boolean;2254 readonly isOverflow: boolean;2255 readonly isDivisionByZero: boolean;2256 readonly type: 'Underflow' | 'Overflow' | 'DivisionByZero';2257}22582259/** @name SpRuntimeDigest */2260export interface SpRuntimeDigest extends Struct {2261 readonly logs: Vec<SpRuntimeDigestDigestItem>;2262}22632264/** @name SpRuntimeDigestDigestItem */2265export interface SpRuntimeDigestDigestItem extends Enum {2266 readonly isOther: boolean;2267 readonly asOther: Bytes;2268 readonly isConsensus: boolean;2269 readonly asConsensus: ITuple<[U8aFixed, Bytes]>;2270 readonly isSeal: boolean;2271 readonly asSeal: ITuple<[U8aFixed, Bytes]>;2272 readonly isPreRuntime: boolean;2273 readonly asPreRuntime: ITuple<[U8aFixed, Bytes]>;2274 readonly isRuntimeEnvironmentUpdated: boolean;2275 readonly type: 'Other' | 'Consensus' | 'Seal' | 'PreRuntime' | 'RuntimeEnvironmentUpdated';2276}22772278/** @name SpRuntimeDispatchError */2279export interface SpRuntimeDispatchError extends Enum {2280 readonly isOther: boolean;2281 readonly isCannotLookup: boolean;2282 readonly isBadOrigin: boolean;2283 readonly isModule: boolean;2284 readonly asModule: SpRuntimeModuleError;2285 readonly isConsumerRemaining: boolean;2286 readonly isNoProviders: boolean;2287 readonly isTooManyConsumers: boolean;2288 readonly isToken: boolean;2289 readonly asToken: SpRuntimeTokenError;2290 readonly isArithmetic: boolean;2291 readonly asArithmetic: SpRuntimeArithmeticError;2292 readonly isTransactional: boolean;2293 readonly asTransactional: SpRuntimeTransactionalError;2294 readonly type: 'Other' | 'CannotLookup' | 'BadOrigin' | 'Module' | 'ConsumerRemaining' | 'NoProviders' | 'TooManyConsumers' | 'Token' | 'Arithmetic' | 'Transactional';2295}22962297/** @name SpRuntimeModuleError */2298export interface SpRuntimeModuleError extends Struct {2299 readonly index: u8;2300 readonly error: U8aFixed;2301}23022303/** @name SpRuntimeMultiSignature */2304export interface SpRuntimeMultiSignature extends Enum {2305 readonly isEd25519: boolean;2306 readonly asEd25519: SpCoreEd25519Signature;2307 readonly isSr25519: boolean;2308 readonly asSr25519: SpCoreSr25519Signature;2309 readonly isEcdsa: boolean;2310 readonly asEcdsa: SpCoreEcdsaSignature;2311 readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa';2312}23132314/** @name SpRuntimeTokenError */2315export interface SpRuntimeTokenError extends Enum {2316 readonly isNoFunds: boolean;2317 readonly isWouldDie: boolean;2318 readonly isBelowMinimum: boolean;2319 readonly isCannotCreate: boolean;2320 readonly isUnknownAsset: boolean;2321 readonly isFrozen: boolean;2322 readonly isUnsupported: boolean;2323 readonly type: 'NoFunds' | 'WouldDie' | 'BelowMinimum' | 'CannotCreate' | 'UnknownAsset' | 'Frozen' | 'Unsupported';2324}23252326/** @name SpRuntimeTransactionalError */2327export interface SpRuntimeTransactionalError extends Enum {2328 readonly isLimitReached: boolean;2329 readonly isNoLayer: boolean;2330 readonly type: 'LimitReached' | 'NoLayer';2331}23322333/** @name SpTrieStorageProof */2334export interface SpTrieStorageProof extends Struct {2335 readonly trieNodes: BTreeSet<Bytes>;2336}23372338/** @name SpVersionRuntimeVersion */2339export interface SpVersionRuntimeVersion extends Struct {2340 readonly specName: Text;2341 readonly implName: Text;2342 readonly authoringVersion: u32;2343 readonly specVersion: u32;2344 readonly implVersion: u32;2345 readonly apis: Vec<ITuple<[U8aFixed, u32]>>;2346 readonly transactionVersion: u32;2347 readonly stateVersion: u8;2348}23492350/** @name UpDataStructsAccessMode */2351export interface UpDataStructsAccessMode extends Enum {2352 readonly isNormal: boolean;2353 readonly isAllowList: boolean;2354 readonly type: 'Normal' | 'AllowList';2355}23562357/** @name UpDataStructsCollection */2358export interface UpDataStructsCollection extends Struct {2359 readonly owner: AccountId32;2360 readonly mode: UpDataStructsCollectionMode;2361 readonly name: Vec<u16>;2362 readonly description: Vec<u16>;2363 readonly tokenPrefix: Bytes;2364 readonly sponsorship: UpDataStructsSponsorshipState;2365 readonly limits: UpDataStructsCollectionLimits;2366 readonly permissions: UpDataStructsCollectionPermissions;2367 readonly externalCollection: bool;2368}23692370/** @name UpDataStructsCollectionLimits */2371export interface UpDataStructsCollectionLimits extends Struct {2372 readonly accountTokenOwnershipLimit: Option<u32>;2373 readonly sponsoredDataSize: Option<u32>;2374 readonly sponsoredDataRateLimit: Option<UpDataStructsSponsoringRateLimit>;2375 readonly tokenLimit: Option<u32>;2376 readonly sponsorTransferTimeout: Option<u32>;2377 readonly sponsorApproveTimeout: Option<u32>;2378 readonly ownerCanTransfer: Option<bool>;2379 readonly ownerCanDestroy: Option<bool>;2380 readonly transfersEnabled: Option<bool>;2381}23822383/** @name UpDataStructsCollectionMode */2384export interface UpDataStructsCollectionMode extends Enum {2385 readonly isNft: boolean;2386 readonly isFungible: boolean;2387 readonly asFungible: u8;2388 readonly isReFungible: boolean;2389 readonly type: 'Nft' | 'Fungible' | 'ReFungible';2390}23912392/** @name UpDataStructsCollectionPermissions */2393export interface UpDataStructsCollectionPermissions extends Struct {2394 readonly access: Option<UpDataStructsAccessMode>;2395 readonly mintMode: Option<bool>;2396 readonly nesting: Option<UpDataStructsNestingPermissions>;2397}23982399/** @name UpDataStructsCollectionStats */2400export interface UpDataStructsCollectionStats extends Struct {2401 readonly created: u32;2402 readonly destroyed: u32;2403 readonly alive: u32;2404}24052406/** @name UpDataStructsCreateCollectionData */2407export interface UpDataStructsCreateCollectionData extends Struct {2408 readonly mode: UpDataStructsCollectionMode;2409 readonly access: Option<UpDataStructsAccessMode>;2410 readonly name: Vec<u16>;2411 readonly description: Vec<u16>;2412 readonly tokenPrefix: Bytes;2413 readonly pendingSponsor: Option<AccountId32>;2414 readonly limits: Option<UpDataStructsCollectionLimits>;2415 readonly permissions: Option<UpDataStructsCollectionPermissions>;2416 readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2417 readonly properties: Vec<UpDataStructsProperty>;2418}24192420/** @name UpDataStructsCreateFungibleData */2421export interface UpDataStructsCreateFungibleData extends Struct {2422 readonly value: u128;2423}24242425/** @name UpDataStructsCreateItemData */2426export interface UpDataStructsCreateItemData extends Enum {2427 readonly isNft: boolean;2428 readonly asNft: UpDataStructsCreateNftData;2429 readonly isFungible: boolean;2430 readonly asFungible: UpDataStructsCreateFungibleData;2431 readonly isReFungible: boolean;2432 readonly asReFungible: UpDataStructsCreateReFungibleData;2433 readonly type: 'Nft' | 'Fungible' | 'ReFungible';2434}24352436/** @name UpDataStructsCreateItemExData */2437export interface UpDataStructsCreateItemExData extends Enum {2438 readonly isNft: boolean;2439 readonly asNft: Vec<UpDataStructsCreateNftExData>;2440 readonly isFungible: boolean;2441 readonly asFungible: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr,u128>;2442 readonly isRefungibleMultipleItems: boolean;2443 readonly asRefungibleMultipleItems: Vec<UpDataStructsCreateRefungibleExData>;2444 readonly isRefungibleMultipleOwners: boolean;2445 readonly asRefungibleMultipleOwners: UpDataStructsCreateRefungibleExData;2446 readonly type: 'Nft' | 'Fungible' | 'RefungibleMultipleItems' | 'RefungibleMultipleOwners';2447}24482449/** @name UpDataStructsCreateNftData */2450export interface UpDataStructsCreateNftData extends Struct {2451 readonly properties: Vec<UpDataStructsProperty>;2452}24532454/** @name UpDataStructsCreateNftExData */2455export interface UpDataStructsCreateNftExData extends Struct {2456 readonly properties: Vec<UpDataStructsProperty>;2457 readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;2458}24592460/** @name UpDataStructsCreateReFungibleData */2461export interface UpDataStructsCreateReFungibleData extends Struct {2462 readonly constData: Bytes;2463 readonly pieces: u128;2464 readonly properties: Vec<UpDataStructsProperty>;2465}24662467/** @name UpDataStructsCreateRefungibleExData */2468export interface UpDataStructsCreateRefungibleExData extends Struct {2469 readonly constData: Bytes;2470 readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;2471 readonly properties: Vec<UpDataStructsProperty>;2472}24732474/** @name UpDataStructsNestingPermissions */2475export interface UpDataStructsNestingPermissions extends Struct {2476 readonly tokenOwner: bool;2477 readonly collectionAdmin: bool;2478 readonly restricted: Option<UpDataStructsOwnerRestrictedSet>;2479}24802481/** @name UpDataStructsOwnerRestrictedSet */2482export interface UpDataStructsOwnerRestrictedSet extends BTreeSet<u32> {}24832484/** @name UpDataStructsProperties */2485export interface UpDataStructsProperties extends Struct {2486 readonly map: UpDataStructsPropertiesMapBoundedVec;2487 readonly consumedSpace: u32;2488 readonly spaceLimit: u32;2489}24902491/** @name UpDataStructsPropertiesMapBoundedVec */2492export interface UpDataStructsPropertiesMapBoundedVec extends BTreeMap<Bytes, Bytes> {}24932494/** @name UpDataStructsPropertiesMapPropertyPermission */2495export interface UpDataStructsPropertiesMapPropertyPermission extends BTreeMap<Bytes, UpDataStructsPropertyPermission> {}24962497/** @name UpDataStructsProperty */2498export interface UpDataStructsProperty extends Struct {2499 readonly key: Bytes;2500 readonly value: Bytes;2501}25022503/** @name UpDataStructsPropertyKeyPermission */2504export interface UpDataStructsPropertyKeyPermission extends Struct {2505 readonly key: Bytes;2506 readonly permission: UpDataStructsPropertyPermission;2507}25082509/** @name UpDataStructsPropertyPermission */2510export interface UpDataStructsPropertyPermission extends Struct {2511 readonly mutable: bool;2512 readonly collectionAdmin: bool;2513 readonly tokenOwner: bool;2514}25152516/** @name UpDataStructsPropertyScope */2517export interface UpDataStructsPropertyScope extends Enum {2518 readonly isNone: boolean;2519 readonly isRmrk: boolean;2520 readonly type: 'None' | 'Rmrk';2521}25222523/** @name UpDataStructsRpcCollection */2524export interface UpDataStructsRpcCollection extends Struct {2525 readonly owner: AccountId32;2526 readonly mode: UpDataStructsCollectionMode;2527 readonly name: Vec<u16>;2528 readonly description: Vec<u16>;2529 readonly tokenPrefix: Bytes;2530 readonly sponsorship: UpDataStructsSponsorshipState;2531 readonly limits: UpDataStructsCollectionLimits;2532 readonly permissions: UpDataStructsCollectionPermissions;2533 readonly tokenPropertyPermissions: Vec<UpDataStructsPropertyKeyPermission>;2534 readonly properties: Vec<UpDataStructsProperty>;2535 readonly readOnly: bool;2536}25372538/** @name UpDataStructsSponsoringRateLimit */2539export interface UpDataStructsSponsoringRateLimit extends Enum {2540 readonly isSponsoringDisabled: boolean;2541 readonly isBlocks: boolean;2542 readonly asBlocks: u32;2543 readonly type: 'SponsoringDisabled' | 'Blocks';2544}25452546/** @name UpDataStructsSponsorshipState */2547export interface UpDataStructsSponsorshipState extends Enum {2548 readonly isDisabled: boolean;2549 readonly isUnconfirmed: boolean;2550 readonly asUnconfirmed: AccountId32;2551 readonly isConfirmed: boolean;2552 readonly asConfirmed: AccountId32;2553 readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';2554}25552556/** @name UpDataStructsTokenChild */2557export interface UpDataStructsTokenChild extends Struct {2558 readonly token: u32;2559 readonly collection: u32;2560}25612562/** @name UpDataStructsTokenData */2563export interface UpDataStructsTokenData extends Struct {2564 readonly properties: Vec<UpDataStructsProperty>;2565 readonly owner: Option<PalletEvmAccountBasicCrossAccountIdRepr>;2566 readonly pieces: u128;2567}25682569/** @name XcmDoubleEncoded */2570export interface XcmDoubleEncoded extends Struct {2571 readonly encoded: Bytes;2572}25732574/** @name XcmV0Junction */2575export interface XcmV0Junction extends Enum {2576 readonly isParent: boolean;2577 readonly isParachain: boolean;2578 readonly asParachain: Compact<u32>;2579 readonly isAccountId32: boolean;2580 readonly asAccountId32: {2581 readonly network: XcmV0JunctionNetworkId;2582 readonly id: U8aFixed;2583 } & Struct;2584 readonly isAccountIndex64: boolean;2585 readonly asAccountIndex64: {2586 readonly network: XcmV0JunctionNetworkId;2587 readonly index: Compact<u64>;2588 } & Struct;2589 readonly isAccountKey20: boolean;2590 readonly asAccountKey20: {2591 readonly network: XcmV0JunctionNetworkId;2592 readonly key: U8aFixed;2593 } & Struct;2594 readonly isPalletInstance: boolean;2595 readonly asPalletInstance: u8;2596 readonly isGeneralIndex: boolean;2597 readonly asGeneralIndex: Compact<u128>;2598 readonly isGeneralKey: boolean;2599 readonly asGeneralKey: Bytes;2600 readonly isOnlyChild: boolean;2601 readonly isPlurality: boolean;2602 readonly asPlurality: {2603 readonly id: XcmV0JunctionBodyId;2604 readonly part: XcmV0JunctionBodyPart;2605 } & Struct;2606 readonly type: 'Parent' | 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';2607}26082609/** @name XcmV0JunctionBodyId */2610export interface XcmV0JunctionBodyId extends Enum {2611 readonly isUnit: boolean;2612 readonly isNamed: boolean;2613 readonly asNamed: Bytes;2614 readonly isIndex: boolean;2615 readonly asIndex: Compact<u32>;2616 readonly isExecutive: boolean;2617 readonly isTechnical: boolean;2618 readonly isLegislative: boolean;2619 readonly isJudicial: boolean;2620 readonly type: 'Unit' | 'Named' | 'Index' | 'Executive' | 'Technical' | 'Legislative' | 'Judicial';2621}26222623/** @name XcmV0JunctionBodyPart */2624export interface XcmV0JunctionBodyPart extends Enum {2625 readonly isVoice: boolean;2626 readonly isMembers: boolean;2627 readonly asMembers: {2628 readonly count: Compact<u32>;2629 } & Struct;2630 readonly isFraction: boolean;2631 readonly asFraction: {2632 readonly nom: Compact<u32>;2633 readonly denom: Compact<u32>;2634 } & Struct;2635 readonly isAtLeastProportion: boolean;2636 readonly asAtLeastProportion: {2637 readonly nom: Compact<u32>;2638 readonly denom: Compact<u32>;2639 } & Struct;2640 readonly isMoreThanProportion: boolean;2641 readonly asMoreThanProportion: {2642 readonly nom: Compact<u32>;2643 readonly denom: Compact<u32>;2644 } & Struct;2645 readonly type: 'Voice' | 'Members' | 'Fraction' | 'AtLeastProportion' | 'MoreThanProportion';2646}26472648/** @name XcmV0JunctionNetworkId */2649export interface XcmV0JunctionNetworkId extends Enum {2650 readonly isAny: boolean;2651 readonly isNamed: boolean;2652 readonly asNamed: Bytes;2653 readonly isPolkadot: boolean;2654 readonly isKusama: boolean;2655 readonly type: 'Any' | 'Named' | 'Polkadot' | 'Kusama';2656}26572658/** @name XcmV0MultiAsset */2659export interface XcmV0MultiAsset extends Enum {2660 readonly isNone: boolean;2661 readonly isAll: boolean;2662 readonly isAllFungible: boolean;2663 readonly isAllNonFungible: boolean;2664 readonly isAllAbstractFungible: boolean;2665 readonly asAllAbstractFungible: {2666 readonly id: Bytes;2667 } & Struct;2668 readonly isAllAbstractNonFungible: boolean;2669 readonly asAllAbstractNonFungible: {2670 readonly class: Bytes;2671 } & Struct;2672 readonly isAllConcreteFungible: boolean;2673 readonly asAllConcreteFungible: {2674 readonly id: XcmV0MultiLocation;2675 } & Struct;2676 readonly isAllConcreteNonFungible: boolean;2677 readonly asAllConcreteNonFungible: {2678 readonly class: XcmV0MultiLocation;2679 } & Struct;2680 readonly isAbstractFungible: boolean;2681 readonly asAbstractFungible: {2682 readonly id: Bytes;2683 readonly amount: Compact<u128>;2684 } & Struct;2685 readonly isAbstractNonFungible: boolean;2686 readonly asAbstractNonFungible: {2687 readonly class: Bytes;2688 readonly instance: XcmV1MultiassetAssetInstance;2689 } & Struct;2690 readonly isConcreteFungible: boolean;2691 readonly asConcreteFungible: {2692 readonly id: XcmV0MultiLocation;2693 readonly amount: Compact<u128>;2694 } & Struct;2695 readonly isConcreteNonFungible: boolean;2696 readonly asConcreteNonFungible: {2697 readonly class: XcmV0MultiLocation;2698 readonly instance: XcmV1MultiassetAssetInstance;2699 } & Struct;2700 readonly type: 'None' | 'All' | 'AllFungible' | 'AllNonFungible' | 'AllAbstractFungible' | 'AllAbstractNonFungible' | 'AllConcreteFungible' | 'AllConcreteNonFungible' | 'AbstractFungible' | 'AbstractNonFungible' | 'ConcreteFungible' | 'ConcreteNonFungible';2701}27022703/** @name XcmV0MultiLocation */2704export interface XcmV0MultiLocation extends Enum {2705 readonly isNull: boolean;2706 readonly isX1: boolean;2707 readonly asX1: XcmV0Junction;2708 readonly isX2: boolean;2709 readonly asX2: ITuple<[XcmV0Junction, XcmV0Junction]>;2710 readonly isX3: boolean;2711 readonly asX3: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2712 readonly isX4: boolean;2713 readonly asX4: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2714 readonly isX5: boolean;2715 readonly asX5: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2716 readonly isX6: boolean;2717 readonly asX6: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2718 readonly isX7: boolean;2719 readonly asX7: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2720 readonly isX8: boolean;2721 readonly asX8: ITuple<[XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction, XcmV0Junction]>;2722 readonly type: 'Null' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';2723}27242725/** @name XcmV0Order */2726export interface XcmV0Order extends Enum {2727 readonly isNull: boolean;2728 readonly isDepositAsset: boolean;2729 readonly asDepositAsset: {2730 readonly assets: Vec<XcmV0MultiAsset>;2731 readonly dest: XcmV0MultiLocation;2732 } & Struct;2733 readonly isDepositReserveAsset: boolean;2734 readonly asDepositReserveAsset: {2735 readonly assets: Vec<XcmV0MultiAsset>;2736 readonly dest: XcmV0MultiLocation;2737 readonly effects: Vec<XcmV0Order>;2738 } & Struct;2739 readonly isExchangeAsset: boolean;2740 readonly asExchangeAsset: {2741 readonly give: Vec<XcmV0MultiAsset>;2742 readonly receive: Vec<XcmV0MultiAsset>;2743 } & Struct;2744 readonly isInitiateReserveWithdraw: boolean;2745 readonly asInitiateReserveWithdraw: {2746 readonly assets: Vec<XcmV0MultiAsset>;2747 readonly reserve: XcmV0MultiLocation;2748 readonly effects: Vec<XcmV0Order>;2749 } & Struct;2750 readonly isInitiateTeleport: boolean;2751 readonly asInitiateTeleport: {2752 readonly assets: Vec<XcmV0MultiAsset>;2753 readonly dest: XcmV0MultiLocation;2754 readonly effects: Vec<XcmV0Order>;2755 } & Struct;2756 readonly isQueryHolding: boolean;2757 readonly asQueryHolding: {2758 readonly queryId: Compact<u64>;2759 readonly dest: XcmV0MultiLocation;2760 readonly assets: Vec<XcmV0MultiAsset>;2761 } & Struct;2762 readonly isBuyExecution: boolean;2763 readonly asBuyExecution: {2764 readonly fees: XcmV0MultiAsset;2765 readonly weight: u64;2766 readonly debt: u64;2767 readonly haltOnError: bool;2768 readonly xcm: Vec<XcmV0Xcm>;2769 } & Struct;2770 readonly type: 'Null' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';2771}27722773/** @name XcmV0OriginKind */2774export interface XcmV0OriginKind extends Enum {2775 readonly isNative: boolean;2776 readonly isSovereignAccount: boolean;2777 readonly isSuperuser: boolean;2778 readonly isXcm: boolean;2779 readonly type: 'Native' | 'SovereignAccount' | 'Superuser' | 'Xcm';2780}27812782/** @name XcmV0Response */2783export interface XcmV0Response extends Enum {2784 readonly isAssets: boolean;2785 readonly asAssets: Vec<XcmV0MultiAsset>;2786 readonly type: 'Assets';2787}27882789/** @name XcmV0Xcm */2790export interface XcmV0Xcm extends Enum {2791 readonly isWithdrawAsset: boolean;2792 readonly asWithdrawAsset: {2793 readonly assets: Vec<XcmV0MultiAsset>;2794 readonly effects: Vec<XcmV0Order>;2795 } & Struct;2796 readonly isReserveAssetDeposit: boolean;2797 readonly asReserveAssetDeposit: {2798 readonly assets: Vec<XcmV0MultiAsset>;2799 readonly effects: Vec<XcmV0Order>;2800 } & Struct;2801 readonly isTeleportAsset: boolean;2802 readonly asTeleportAsset: {2803 readonly assets: Vec<XcmV0MultiAsset>;2804 readonly effects: Vec<XcmV0Order>;2805 } & Struct;2806 readonly isQueryResponse: boolean;2807 readonly asQueryResponse: {2808 readonly queryId: Compact<u64>;2809 readonly response: XcmV0Response;2810 } & Struct;2811 readonly isTransferAsset: boolean;2812 readonly asTransferAsset: {2813 readonly assets: Vec<XcmV0MultiAsset>;2814 readonly dest: XcmV0MultiLocation;2815 } & Struct;2816 readonly isTransferReserveAsset: boolean;2817 readonly asTransferReserveAsset: {2818 readonly assets: Vec<XcmV0MultiAsset>;2819 readonly dest: XcmV0MultiLocation;2820 readonly effects: Vec<XcmV0Order>;2821 } & Struct;2822 readonly isTransact: boolean;2823 readonly asTransact: {2824 readonly originType: XcmV0OriginKind;2825 readonly requireWeightAtMost: u64;2826 readonly call: XcmDoubleEncoded;2827 } & Struct;2828 readonly isHrmpNewChannelOpenRequest: boolean;2829 readonly asHrmpNewChannelOpenRequest: {2830 readonly sender: Compact<u32>;2831 readonly maxMessageSize: Compact<u32>;2832 readonly maxCapacity: Compact<u32>;2833 } & Struct;2834 readonly isHrmpChannelAccepted: boolean;2835 readonly asHrmpChannelAccepted: {2836 readonly recipient: Compact<u32>;2837 } & Struct;2838 readonly isHrmpChannelClosing: boolean;2839 readonly asHrmpChannelClosing: {2840 readonly initiator: Compact<u32>;2841 readonly sender: Compact<u32>;2842 readonly recipient: Compact<u32>;2843 } & Struct;2844 readonly isRelayedFrom: boolean;2845 readonly asRelayedFrom: {2846 readonly who: XcmV0MultiLocation;2847 readonly message: XcmV0Xcm;2848 } & Struct;2849 readonly type: 'WithdrawAsset' | 'ReserveAssetDeposit' | 'TeleportAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom';2850}28512852/** @name XcmV1Junction */2853export interface XcmV1Junction extends Enum {2854 readonly isParachain: boolean;2855 readonly asParachain: Compact<u32>;2856 readonly isAccountId32: boolean;2857 readonly asAccountId32: {2858 readonly network: XcmV0JunctionNetworkId;2859 readonly id: U8aFixed;2860 } & Struct;2861 readonly isAccountIndex64: boolean;2862 readonly asAccountIndex64: {2863 readonly network: XcmV0JunctionNetworkId;2864 readonly index: Compact<u64>;2865 } & Struct;2866 readonly isAccountKey20: boolean;2867 readonly asAccountKey20: {2868 readonly network: XcmV0JunctionNetworkId;2869 readonly key: U8aFixed;2870 } & Struct;2871 readonly isPalletInstance: boolean;2872 readonly asPalletInstance: u8;2873 readonly isGeneralIndex: boolean;2874 readonly asGeneralIndex: Compact<u128>;2875 readonly isGeneralKey: boolean;2876 readonly asGeneralKey: Bytes;2877 readonly isOnlyChild: boolean;2878 readonly isPlurality: boolean;2879 readonly asPlurality: {2880 readonly id: XcmV0JunctionBodyId;2881 readonly part: XcmV0JunctionBodyPart;2882 } & Struct;2883 readonly type: 'Parachain' | 'AccountId32' | 'AccountIndex64' | 'AccountKey20' | 'PalletInstance' | 'GeneralIndex' | 'GeneralKey' | 'OnlyChild' | 'Plurality';2884}28852886/** @name XcmV1MultiAsset */2887export interface XcmV1MultiAsset extends Struct {2888 readonly id: XcmV1MultiassetAssetId;2889 readonly fun: XcmV1MultiassetFungibility;2890}28912892/** @name XcmV1MultiassetAssetId */2893export interface XcmV1MultiassetAssetId extends Enum {2894 readonly isConcrete: boolean;2895 readonly asConcrete: XcmV1MultiLocation;2896 readonly isAbstract: boolean;2897 readonly asAbstract: Bytes;2898 readonly type: 'Concrete' | 'Abstract';2899}29002901/** @name XcmV1MultiassetAssetInstance */2902export interface XcmV1MultiassetAssetInstance extends Enum {2903 readonly isUndefined: boolean;2904 readonly isIndex: boolean;2905 readonly asIndex: Compact<u128>;2906 readonly isArray4: boolean;2907 readonly asArray4: U8aFixed;2908 readonly isArray8: boolean;2909 readonly asArray8: U8aFixed;2910 readonly isArray16: boolean;2911 readonly asArray16: U8aFixed;2912 readonly isArray32: boolean;2913 readonly asArray32: U8aFixed;2914 readonly isBlob: boolean;2915 readonly asBlob: Bytes;2916 readonly type: 'Undefined' | 'Index' | 'Array4' | 'Array8' | 'Array16' | 'Array32' | 'Blob';2917}29182919/** @name XcmV1MultiassetFungibility */2920export interface XcmV1MultiassetFungibility extends Enum {2921 readonly isFungible: boolean;2922 readonly asFungible: Compact<u128>;2923 readonly isNonFungible: boolean;2924 readonly asNonFungible: XcmV1MultiassetAssetInstance;2925 readonly type: 'Fungible' | 'NonFungible';2926}29272928/** @name XcmV1MultiassetMultiAssetFilter */2929export interface XcmV1MultiassetMultiAssetFilter extends Enum {2930 readonly isDefinite: boolean;2931 readonly asDefinite: XcmV1MultiassetMultiAssets;2932 readonly isWild: boolean;2933 readonly asWild: XcmV1MultiassetWildMultiAsset;2934 readonly type: 'Definite' | 'Wild';2935}29362937/** @name XcmV1MultiassetMultiAssets */2938export interface XcmV1MultiassetMultiAssets extends Vec<XcmV1MultiAsset> {}29392940/** @name XcmV1MultiassetWildFungibility */2941export interface XcmV1MultiassetWildFungibility extends Enum {2942 readonly isFungible: boolean;2943 readonly isNonFungible: boolean;2944 readonly type: 'Fungible' | 'NonFungible';2945}29462947/** @name XcmV1MultiassetWildMultiAsset */2948export interface XcmV1MultiassetWildMultiAsset extends Enum {2949 readonly isAll: boolean;2950 readonly isAllOf: boolean;2951 readonly asAllOf: {2952 readonly id: XcmV1MultiassetAssetId;2953 readonly fun: XcmV1MultiassetWildFungibility;2954 } & Struct;2955 readonly type: 'All' | 'AllOf';2956}29572958/** @name XcmV1MultiLocation */2959export interface XcmV1MultiLocation extends Struct {2960 readonly parents: u8;2961 readonly interior: XcmV1MultilocationJunctions;2962}29632964/** @name XcmV1MultilocationJunctions */2965export interface XcmV1MultilocationJunctions extends Enum {2966 readonly isHere: boolean;2967 readonly isX1: boolean;2968 readonly asX1: XcmV1Junction;2969 readonly isX2: boolean;2970 readonly asX2: ITuple<[XcmV1Junction, XcmV1Junction]>;2971 readonly isX3: boolean;2972 readonly asX3: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2973 readonly isX4: boolean;2974 readonly asX4: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2975 readonly isX5: boolean;2976 readonly asX5: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2977 readonly isX6: boolean;2978 readonly asX6: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2979 readonly isX7: boolean;2980 readonly asX7: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2981 readonly isX8: boolean;2982 readonly asX8: ITuple<[XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction, XcmV1Junction]>;2983 readonly type: 'Here' | 'X1' | 'X2' | 'X3' | 'X4' | 'X5' | 'X6' | 'X7' | 'X8';2984}29852986/** @name XcmV1Order */2987export interface XcmV1Order extends Enum {2988 readonly isNoop: boolean;2989 readonly isDepositAsset: boolean;2990 readonly asDepositAsset: {2991 readonly assets: XcmV1MultiassetMultiAssetFilter;2992 readonly maxAssets: u32;2993 readonly beneficiary: XcmV1MultiLocation;2994 } & Struct;2995 readonly isDepositReserveAsset: boolean;2996 readonly asDepositReserveAsset: {2997 readonly assets: XcmV1MultiassetMultiAssetFilter;2998 readonly maxAssets: u32;2999 readonly dest: XcmV1MultiLocation;3000 readonly effects: Vec<XcmV1Order>;3001 } & Struct;3002 readonly isExchangeAsset: boolean;3003 readonly asExchangeAsset: {3004 readonly give: XcmV1MultiassetMultiAssetFilter;3005 readonly receive: XcmV1MultiassetMultiAssets;3006 } & Struct;3007 readonly isInitiateReserveWithdraw: boolean;3008 readonly asInitiateReserveWithdraw: {3009 readonly assets: XcmV1MultiassetMultiAssetFilter;3010 readonly reserve: XcmV1MultiLocation;3011 readonly effects: Vec<XcmV1Order>;3012 } & Struct;3013 readonly isInitiateTeleport: boolean;3014 readonly asInitiateTeleport: {3015 readonly assets: XcmV1MultiassetMultiAssetFilter;3016 readonly dest: XcmV1MultiLocation;3017 readonly effects: Vec<XcmV1Order>;3018 } & Struct;3019 readonly isQueryHolding: boolean;3020 readonly asQueryHolding: {3021 readonly queryId: Compact<u64>;3022 readonly dest: XcmV1MultiLocation;3023 readonly assets: XcmV1MultiassetMultiAssetFilter;3024 } & Struct;3025 readonly isBuyExecution: boolean;3026 readonly asBuyExecution: {3027 readonly fees: XcmV1MultiAsset;3028 readonly weight: u64;3029 readonly debt: u64;3030 readonly haltOnError: bool;3031 readonly instructions: Vec<XcmV1Xcm>;3032 } & Struct;3033 readonly type: 'Noop' | 'DepositAsset' | 'DepositReserveAsset' | 'ExchangeAsset' | 'InitiateReserveWithdraw' | 'InitiateTeleport' | 'QueryHolding' | 'BuyExecution';3034}30353036/** @name XcmV1Response */3037export interface XcmV1Response extends Enum {3038 readonly isAssets: boolean;3039 readonly asAssets: XcmV1MultiassetMultiAssets;3040 readonly isVersion: boolean;3041 readonly asVersion: u32;3042 readonly type: 'Assets' | 'Version';3043}30443045/** @name XcmV1Xcm */3046export interface XcmV1Xcm extends Enum {3047 readonly isWithdrawAsset: boolean;3048 readonly asWithdrawAsset: {3049 readonly assets: XcmV1MultiassetMultiAssets;3050 readonly effects: Vec<XcmV1Order>;3051 } & Struct;3052 readonly isReserveAssetDeposited: boolean;3053 readonly asReserveAssetDeposited: {3054 readonly assets: XcmV1MultiassetMultiAssets;3055 readonly effects: Vec<XcmV1Order>;3056 } & Struct;3057 readonly isReceiveTeleportedAsset: boolean;3058 readonly asReceiveTeleportedAsset: {3059 readonly assets: XcmV1MultiassetMultiAssets;3060 readonly effects: Vec<XcmV1Order>;3061 } & Struct;3062 readonly isQueryResponse: boolean;3063 readonly asQueryResponse: {3064 readonly queryId: Compact<u64>;3065 readonly response: XcmV1Response;3066 } & Struct;3067 readonly isTransferAsset: boolean;3068 readonly asTransferAsset: {3069 readonly assets: XcmV1MultiassetMultiAssets;3070 readonly beneficiary: XcmV1MultiLocation;3071 } & Struct;3072 readonly isTransferReserveAsset: boolean;3073 readonly asTransferReserveAsset: {3074 readonly assets: XcmV1MultiassetMultiAssets;3075 readonly dest: XcmV1MultiLocation;3076 readonly effects: Vec<XcmV1Order>;3077 } & Struct;3078 readonly isTransact: boolean;3079 readonly asTransact: {3080 readonly originType: XcmV0OriginKind;3081 readonly requireWeightAtMost: u64;3082 readonly call: XcmDoubleEncoded;3083 } & Struct;3084 readonly isHrmpNewChannelOpenRequest: boolean;3085 readonly asHrmpNewChannelOpenRequest: {3086 readonly sender: Compact<u32>;3087 readonly maxMessageSize: Compact<u32>;3088 readonly maxCapacity: Compact<u32>;3089 } & Struct;3090 readonly isHrmpChannelAccepted: boolean;3091 readonly asHrmpChannelAccepted: {3092 readonly recipient: Compact<u32>;3093 } & Struct;3094 readonly isHrmpChannelClosing: boolean;3095 readonly asHrmpChannelClosing: {3096 readonly initiator: Compact<u32>;3097 readonly sender: Compact<u32>;3098 readonly recipient: Compact<u32>;3099 } & Struct;3100 readonly isRelayedFrom: boolean;3101 readonly asRelayedFrom: {3102 readonly who: XcmV1MultilocationJunctions;3103 readonly message: XcmV1Xcm;3104 } & Struct;3105 readonly isSubscribeVersion: boolean;3106 readonly asSubscribeVersion: {3107 readonly queryId: Compact<u64>;3108 readonly maxResponseWeight: Compact<u64>;3109 } & Struct;3110 readonly isUnsubscribeVersion: boolean;3111 readonly type: 'WithdrawAsset' | 'ReserveAssetDeposited' | 'ReceiveTeleportedAsset' | 'QueryResponse' | 'TransferAsset' | 'TransferReserveAsset' | 'Transact' | 'HrmpNewChannelOpenRequest' | 'HrmpChannelAccepted' | 'HrmpChannelClosing' | 'RelayedFrom' | 'SubscribeVersion' | 'UnsubscribeVersion';3112}31133114/** @name XcmV2Instruction */3115export interface XcmV2Instruction extends Enum {3116 readonly isWithdrawAsset: boolean;3117 readonly asWithdrawAsset: XcmV1MultiassetMultiAssets;3118 readonly isReserveAssetDeposited: boolean;3119 readonly asReserveAssetDeposited: XcmV1MultiassetMultiAssets;3120 readonly isReceiveTeleportedAsset: boolean;3121 readonly asReceiveTeleportedAsset: XcmV1MultiassetMultiAssets;3122 readonly isQueryResponse: boolean;3123 readonly asQueryResponse: {3124 readonly queryId: Compact<u64>;3125 readonly response: XcmV2Response;3126 readonly maxWeight: Compact<u64>;3127 } & Struct;3128 readonly isTransferAsset: boolean;3129 readonly asTransferAsset: {3130 readonly assets: XcmV1MultiassetMultiAssets;3131 readonly beneficiary: XcmV1MultiLocation;3132 } & Struct;3133 readonly isTransferReserveAsset: boolean;3134 readonly asTransferReserveAsset: {3135 readonly assets: XcmV1MultiassetMultiAssets;3136 readonly dest: XcmV1MultiLocation;3137 readonly xcm: XcmV2Xcm;3138 } & Struct;3139 readonly isTransact: boolean;3140 readonly asTransact: {3141 readonly originType: XcmV0OriginKind;3142 readonly requireWeightAtMost: Compact<u64>;3143 readonly call: XcmDoubleEncoded;3144 } & Struct;3145 readonly isHrmpNewChannelOpenRequest: boolean;3146 readonly asHrmpNewChannelOpenRequest: {3147 readonly sender: Compact<u32>;3148 readonly maxMessageSize: Compact<u32>;3149 readonly maxCapacity: Compact<u32>;3150 } & Struct;3151 readonly isHrmpChannelAccepted: boolean;3152 readonly asHrmpChannelAccepted: {3153 readonly recipient: Compact<u32>;3154 } & Struct;3155 readonly isHrmpChannelClosing: boolean;3156 readonly asHrmpChannelClosing: {3157 readonly initiator: Compact<u32>;3158 readonly sender: Compact<u32>;3159 readonly recipient: Compact<u32>;3160 } & Struct;3161 readonly isClearOrigin: boolean;3162 readonly isDescendOrigin: boolean;3163 readonly asDescendOrigin: XcmV1MultilocationJunctions;3164 readonly isReportError: boolean;3165 readonly asReportError: {3166 readonly queryId: Compact<u64>;3167 readonly dest: XcmV1MultiLocation;3168 readonly maxResponseWeight: Compact<u64>;3169 } & Struct;3170 readonly isDepositAsset: boolean;3171 readonly asDepositAsset: {3172 readonly assets: XcmV1MultiassetMultiAssetFilter;3173 readonly maxAssets: Compact<u32>;3174 readonly beneficiary: XcmV1MultiLocation;3175 } & Struct;3176 readonly isDepositReserveAsset: boolean;3177 readonly asDepositReserveAsset: {3178 readonly assets: XcmV1MultiassetMultiAssetFilter;3179 readonly maxAssets: Compact<u32>;3180 readonly dest: XcmV1MultiLocation;3181 readonly xcm: XcmV2Xcm;3182 } & Struct;3183 readonly isExchangeAsset: boolean;3184 readonly asExchangeAsset: {3185 readonly give: XcmV1MultiassetMultiAssetFilter;3186 readonly receive: XcmV1MultiassetMultiAssets;3187 } & Struct;3188 readonly isInitiateReserveWithdraw: boolean;3189 readonly asInitiateReserveWithdraw: {3190 readonly assets: XcmV1MultiassetMultiAssetFilter;3191 readonly reserve: XcmV1MultiLocation;3192 readonly xcm: XcmV2Xcm;3193 } & Struct;3194 readonly isInitiateTeleport: boolean;3195 readonly asInitiateTeleport: {3196 readonly assets: XcmV1MultiassetMultiAssetFilter;3197 readonly dest: XcmV1MultiLocation;3198 readonly xcm: XcmV2Xcm;3199 } & Struct;3200 readonly isQueryHolding: boolean;3201 readonly asQueryHolding: {3202 readonly queryId: Compact<u64>;3203 readonly dest: XcmV1MultiLocation;3204 readonly assets: XcmV1MultiassetMultiAssetFilter;3205 readonly maxResponseWeight: Compact<u64>;3206 } & Struct;3207 readonly isBuyExecution: boolean;3208 readonly asBuyExecution: {3209 readonly fees: XcmV1MultiAsset;3210 readonly weightLimit: XcmV2WeightLimit;3211 } & Struct;3212 readonly isRefundSurplus: boolean;3213 readonly isSetErrorHandler: boolean;3214 readonly asSetErrorHandler: XcmV2Xcm;3215 readonly isSetAppendix: boolean;3216 readonly asSetAppendix: XcmV2Xcm;3217 readonly isClearError: boolean;3218 readonly isClaimAsset: boolean;3219 readonly asClaimAsset: {3220 readonly assets: XcmV1MultiassetMultiAssets;3221 readonly ticket: XcmV1MultiLocation;3222 } & Struct;3223 readonly isTrap: boolean;3224 readonly asTrap: Compact<u64>;3225 readonly isSubscribeVersion: boolean;3226 readonly asSubscribeVersion: {3227 readonly queryId: Compact<u64>;3228 readonly maxResponseWeight: Compact<u64>;3229 } & Struct;3230 readonly isUnsubscribeVersion: boolean;3231 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';3232}32333234/** @name XcmV2Response */3235export interface XcmV2Response extends Enum {3236 readonly isNull: boolean;3237 readonly isAssets: boolean;3238 readonly asAssets: XcmV1MultiassetMultiAssets;3239 readonly isExecutionResult: boolean;3240 readonly asExecutionResult: Option<ITuple<[u32, XcmV2TraitsError]>>;3241 readonly isVersion: boolean;3242 readonly asVersion: u32;3243 readonly type: 'Null' | 'Assets' | 'ExecutionResult' | 'Version';3244}32453246/** @name XcmV2TraitsError */3247export interface XcmV2TraitsError extends Enum {3248 readonly isOverflow: boolean;3249 readonly isUnimplemented: boolean;3250 readonly isUntrustedReserveLocation: boolean;3251 readonly isUntrustedTeleportLocation: boolean;3252 readonly isMultiLocationFull: boolean;3253 readonly isMultiLocationNotInvertible: boolean;3254 readonly isBadOrigin: boolean;3255 readonly isInvalidLocation: boolean;3256 readonly isAssetNotFound: boolean;3257 readonly isFailedToTransactAsset: boolean;3258 readonly isNotWithdrawable: boolean;3259 readonly isLocationCannotHold: boolean;3260 readonly isExceedsMaxMessageSize: boolean;3261 readonly isDestinationUnsupported: boolean;3262 readonly isTransport: boolean;3263 readonly isUnroutable: boolean;3264 readonly isUnknownClaim: boolean;3265 readonly isFailedToDecode: boolean;3266 readonly isMaxWeightInvalid: boolean;3267 readonly isNotHoldingFees: boolean;3268 readonly isTooExpensive: boolean;3269 readonly isTrap: boolean;3270 readonly asTrap: u64;3271 readonly isUnhandledXcmVersion: boolean;3272 readonly isWeightLimitReached: boolean;3273 readonly asWeightLimitReached: u64;3274 readonly isBarrier: boolean;3275 readonly isWeightNotComputable: boolean;3276 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';3277}32783279/** @name XcmV2TraitsOutcome */3280export interface XcmV2TraitsOutcome extends Enum {3281 readonly isComplete: boolean;3282 readonly asComplete: u64;3283 readonly isIncomplete: boolean;3284 readonly asIncomplete: ITuple<[u64, XcmV2TraitsError]>;3285 readonly isError: boolean;3286 readonly asError: XcmV2TraitsError;3287 readonly type: 'Complete' | 'Incomplete' | 'Error';3288}32893290/** @name XcmV2WeightLimit */3291export interface XcmV2WeightLimit extends Enum {3292 readonly isUnlimited: boolean;3293 readonly isLimited: boolean;3294 readonly asLimited: Compact<u64>;3295 readonly type: 'Unlimited' | 'Limited';3296}32973298/** @name XcmV2Xcm */3299export interface XcmV2Xcm extends Vec<XcmV2Instruction> {}33003301/** @name XcmVersionedMultiAssets */3302export interface XcmVersionedMultiAssets extends Enum {3303 readonly isV0: boolean;3304 readonly asV0: Vec<XcmV0MultiAsset>;3305 readonly isV1: boolean;3306 readonly asV1: XcmV1MultiassetMultiAssets;3307 readonly type: 'V0' | 'V1';3308}33093310/** @name XcmVersionedMultiLocation */3311export interface XcmVersionedMultiLocation extends Enum {3312 readonly isV0: boolean;3313 readonly asV0: XcmV0MultiLocation;3314 readonly isV1: boolean;3315 readonly asV1: XcmV1MultiLocation;3316 readonly type: 'V0' | 'V1';3317}33183319/** @name XcmVersionedXcm */3320export interface XcmVersionedXcm extends Enum {3321 readonly isV0: boolean;3322 readonly asV0: XcmV0Xcm;3323 readonly isV1: boolean;3324 readonly asV1: XcmV1Xcm;3325 readonly isV2: boolean;3326 readonly asV2: XcmV2Xcm;3327 readonly type: 'V0' | 'V1' | 'V2';3328}33293330export type PHANTOM_DEFAULT = 'default';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.tsdiffbeforeafterboth--- a/tests/src/interfaces/types-lookup.ts
+++ b/tests/src/interfaces/types-lookup.ts
@@ -1629,6 +1629,7 @@
export interface UpDataStructsCreateReFungibleData extends Struct {
readonly constData: Bytes;
readonly pieces: u128;
+ readonly properties: Vec<UpDataStructsProperty>;
}
/** @name UpDataStructsCreateItemExData (193) */
@@ -1654,6 +1655,7 @@
export interface UpDataStructsCreateRefungibleExData extends Struct {
readonly constData: Bytes;
readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;
+ readonly properties: Vec<UpDataStructsProperty>;
}
/** @name PalletUniqueSchedulerCall (204) */
tests/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);