difftreelog
style fix clippy/rustfmt warnings
in: master
35 files changed
crates/evm-coder-macros/src/lib.rsdiffbeforeafterboth--- a/crates/evm-coder-macros/src/lib.rs
+++ b/crates/evm-coder-macros/src/lib.rs
@@ -1,3 +1,5 @@
+#![allow(dead_code)]
+
use darling::FromMeta;
use inflector::cases;
use proc_macro::TokenStream;
crates/evm-coder-macros/src/solidity_interface.rsdiffbeforeafterboth--- a/crates/evm-coder-macros/src/solidity_interface.rs
+++ b/crates/evm-coder-macros/src/solidity_interface.rs
@@ -1,3 +1,5 @@
+#![allow(dead_code)]
+
use quote::quote;
use darling::FromMeta;
use inflector::cases;
@@ -545,6 +547,7 @@
#(
#call_inner
)*
+ #[allow(unreachable_code)] // In case of no inner calls
fn call(&mut self, c: Msg<#call_name>) -> ::core::result::Result<::evm_coder::abi::AbiWriter, Self::Error> {
use ::evm_coder::abi::AbiWrite;
type InternalCall = #call_name;
crates/evm-coder/tests/a.rsdiffbeforeafterboth--- a/crates/evm-coder/tests/a.rs
+++ b/crates/evm-coder/tests/a.rs
@@ -1,3 +1,5 @@
+#![allow(dead_code)] // This test only checks that macros is not panicking
+
use evm_coder::{solidity_interface, types::*, ToLog};
use evm_coder_macros::solidity;
node/cli/build.rsdiffbeforeafterboth--- a/node/cli/build.rs
+++ b/node/cli/build.rs
@@ -6,7 +6,7 @@
use substrate_build_script_utils::{generate_cargo_keys, rerun_if_git_head_changed};
fn main() {
- generate_cargo_keys();
+ generate_cargo_keys();
- rerun_if_git_head_changed();
+ rerun_if_git_head_changed();
}
node/cli/src/chain_spec.rsdiffbeforeafterboth--- a/node/cli/src/chain_spec.rs
+++ b/node/cli/src/chain_spec.rs
@@ -64,20 +64,22 @@
// ID
"dev",
ChainType::Local,
- move || testnet_genesis(
- // Sudo account
- get_account_id_from_seed::<sr25519::Public>("Alice"),
- vec![
- get_from_seed::<AuraId>("Alice"),
- get_from_seed::<AuraId>("Bob"),
- ],
- // Pre-funded accounts
- vec![
+ move || {
+ testnet_genesis(
+ // Sudo account
get_account_id_from_seed::<sr25519::Public>("Alice"),
- get_account_id_from_seed::<sr25519::Public>("Bob"),
- ],
- id,
- ),
+ vec![
+ get_from_seed::<AuraId>("Alice"),
+ get_from_seed::<AuraId>("Bob"),
+ ],
+ // Pre-funded accounts
+ vec![
+ get_account_id_from_seed::<sr25519::Public>("Alice"),
+ get_account_id_from_seed::<sr25519::Public>("Bob"),
+ ],
+ id,
+ )
+ },
// Bootnodes
vec![],
// Telemetry
@@ -101,30 +103,32 @@
// ID
"local_testnet",
ChainType::Local,
- move || testnet_genesis(
- // Sudo account
- get_account_id_from_seed::<sr25519::Public>("Alice"),
- vec![
- get_from_seed::<AuraId>("Alice"),
- get_from_seed::<AuraId>("Bob"),
- ],
- // Pre-funded accounts
- vec![
+ move || {
+ testnet_genesis(
+ // Sudo account
get_account_id_from_seed::<sr25519::Public>("Alice"),
- get_account_id_from_seed::<sr25519::Public>("Bob"),
- get_account_id_from_seed::<sr25519::Public>("Charlie"),
- get_account_id_from_seed::<sr25519::Public>("Dave"),
- get_account_id_from_seed::<sr25519::Public>("Eve"),
- get_account_id_from_seed::<sr25519::Public>("Ferdie"),
- get_account_id_from_seed::<sr25519::Public>("Alice//stash"),
- get_account_id_from_seed::<sr25519::Public>("Bob//stash"),
- get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),
- get_account_id_from_seed::<sr25519::Public>("Dave//stash"),
- get_account_id_from_seed::<sr25519::Public>("Eve//stash"),
- get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),
- ],
- id,
- ),
+ vec![
+ get_from_seed::<AuraId>("Alice"),
+ get_from_seed::<AuraId>("Bob"),
+ ],
+ // Pre-funded accounts
+ vec![
+ get_account_id_from_seed::<sr25519::Public>("Alice"),
+ get_account_id_from_seed::<sr25519::Public>("Bob"),
+ get_account_id_from_seed::<sr25519::Public>("Charlie"),
+ get_account_id_from_seed::<sr25519::Public>("Dave"),
+ get_account_id_from_seed::<sr25519::Public>("Eve"),
+ get_account_id_from_seed::<sr25519::Public>("Ferdie"),
+ get_account_id_from_seed::<sr25519::Public>("Alice//stash"),
+ get_account_id_from_seed::<sr25519::Public>("Bob//stash"),
+ get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),
+ get_account_id_from_seed::<sr25519::Public>("Dave//stash"),
+ get_account_id_from_seed::<sr25519::Public>("Eve//stash"),
+ get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),
+ ],
+ id,
+ )
+ },
// Bootnodes
vec![],
// Telemetry
@@ -142,75 +146,74 @@
}
fn testnet_genesis(
- root_key: AccountId,
+ root_key: AccountId,
initial_authorities: Vec<AuraId>,
- endowed_accounts: Vec<AccountId>,
+ endowed_accounts: Vec<AccountId>,
id: ParaId,
) -> GenesisConfig {
-
- let vested_accounts = vec![
- get_account_id_from_seed::<sr25519::Public>("Bob"),
- ];
+ let vested_accounts = vec![get_account_id_from_seed::<sr25519::Public>("Bob")];
- GenesisConfig {
+ GenesisConfig {
system: nft_runtime::SystemConfig {
code: nft_runtime::WASM_BINARY
.expect("WASM binary was not build, please build it!")
.to_vec(),
changes_trie_config: Default::default(),
},
- pallet_balances: BalancesConfig {
- balances: endowed_accounts
- .iter()
- .cloned()
- .map(|k| (k, 1 << 70))
- .collect(),
- },
+ pallet_balances: BalancesConfig {
+ balances: endowed_accounts
+ .iter()
+ .cloned()
+ .map(|k| (k, 1 << 70))
+ .collect(),
+ },
pallet_treasury: Default::default(),
pallet_sudo: SudoConfig { key: root_key },
pallet_vesting: VestingConfig {
- vesting: vested_accounts
- .iter()
- .cloned()
- .map(|k| (k, 1000, 100, 1 << 98))
- .collect(),
- },
- pallet_nft: NftConfig {
- collection_id: vec![(
- 1,
- Collection {
- owner: get_account_id_from_seed::<sr25519::Public>("Alice"),
- mode: CollectionMode::NFT,
- access: AccessMode::Normal,
- decimal_points: 0,
- name: vec![],
- description: vec![],
- token_prefix: vec![],
- mint_mode: false,
+ vesting: vested_accounts
+ .iter()
+ .cloned()
+ .map(|k| (k, 1000, 100, 1 << 98))
+ .collect(),
+ },
+ pallet_nft: NftConfig {
+ collection_id: vec![(
+ 1,
+ Collection {
+ owner: get_account_id_from_seed::<sr25519::Public>("Alice"),
+ mode: CollectionMode::NFT,
+ access: AccessMode::Normal,
+ decimal_points: 0,
+ name: vec![],
+ description: vec![],
+ token_prefix: vec![],
+ mint_mode: false,
offchain_schema: vec![],
schema_version: SchemaVersion::default(),
- sponsorship: SponsorshipState::Confirmed(get_account_id_from_seed::<sr25519::Public>("Alice")),
- const_on_chain_schema: vec![],
+ sponsorship: SponsorshipState::Confirmed(get_account_id_from_seed::<
+ sr25519::Public,
+ >("Alice")),
+ const_on_chain_schema: vec![],
variable_on_chain_schema: vec![],
- limits: CollectionLimits::default()
- },
- )],
- nft_item_id: vec![],
- fungible_item_id: vec![],
- refungible_item_id: vec![],
- chain_limit: ChainLimits {
- collection_numbers_limit: 100000,
- account_token_ownership_limit: 1000000,
- collections_admins_limit: 5,
- custom_data_limit: 2048,
- nft_sponsor_transfer_timeout: 15,
- fungible_sponsor_transfer_timeout: 15,
+ limits: CollectionLimits::default(),
+ },
+ )],
+ nft_item_id: vec![],
+ fungible_item_id: vec![],
+ refungible_item_id: vec![],
+ chain_limit: ChainLimits {
+ collection_numbers_limit: 100000,
+ account_token_ownership_limit: 1000000,
+ collections_admins_limit: 5,
+ custom_data_limit: 2048,
+ nft_sponsor_transfer_timeout: 15,
+ fungible_sponsor_transfer_timeout: 15,
refungible_sponsor_transfer_timeout: 15,
offchain_schema_limit: 1024,
variable_on_chain_schema_limit: 1024,
const_on_chain_schema_limit: 1024,
- },
- },
+ },
+ },
parachain_info: nft_runtime::ParachainInfoConfig { parachain_id: id },
pallet_aura: nft_runtime::AuraConfig {
authorities: initial_authorities,
@@ -220,5 +223,5 @@
accounts: BTreeMap::new(),
},
pallet_ethereum: EthereumConfig {},
- }
+ }
}
node/cli/src/command.rsdiffbeforeafterboth--- a/node/cli/src/command.rs
+++ b/node/cli/src/command.rs
@@ -18,7 +18,7 @@
use crate::{
chain_spec,
cli::{Cli, RelayChainCli, Subcommand},
- service::{new_partial, ParachainRuntimeExecutor}
+ service::{new_partial, ParachainRuntimeExecutor},
};
use codec::Encode;
use cumulus_primitives_core::ParaId;
@@ -31,7 +31,7 @@
NetworkParams, Result, RuntimeVersion, SharedParams, SubstrateCli,
};
use sc_service::{
- config::{BasePath, PrometheusConfig}
+ config::{BasePath, PrometheusConfig},
};
use sp_core::hexdisplay::HexDisplay;
use sp_runtime::traits::Block as BlockT;
@@ -251,7 +251,7 @@
}
Ok(())
- },
+ }
Some(Subcommand::Benchmark(cmd)) => {
if cfg!(feature = "runtime-benchmarks") {
let runner = cli.create_runner(cmd)?;
@@ -259,9 +259,10 @@
runner.sync_run(|config| cmd.run::<Block, ParachainRuntimeExecutor>(config))
} else {
Err("Benchmarking wasn't enabled when building the node. \
- You can enable it with `--features runtime-benchmarks`.".into())
+ You can enable it with `--features runtime-benchmarks`."
+ .into())
}
- },
+ }
None => {
let runner = cli.create_runner(&cli.run.normalize())?;
@@ -289,12 +290,9 @@
let genesis_state = format!("0x{:?}", HexDisplay::from(&block.header().encode()));
let task_executor = config.task_executor.clone();
- let polkadot_config = SubstrateCli::create_configuration(
- &polkadot_cli,
- &polkadot_cli,
- task_executor,
- )
- .map_err(|err| format!("Relay chain argument error: {}", err))?;
+ let polkadot_config =
+ SubstrateCli::create_configuration(&polkadot_cli, &polkadot_cli, task_executor)
+ .map_err(|err| format!("Relay chain argument error: {}", err))?;
info!("Parachain id: {:?}", id);
info!("Parachain Account: {}", parachain_account);
@@ -443,4 +441,4 @@
) -> Result<Option<sc_telemetry::TelemetryEndpoints>> {
self.base.base.telemetry_endpoints(chain_spec)
}
-}
\ No newline at end of file
+}
node/cli/src/service.rsdiffbeforeafterboth--- a/node/cli/src/service.rs
+++ b/node/cli/src/service.rs
@@ -15,9 +15,7 @@
use nft_runtime::RuntimeApi;
// Cumulus Imports
-use cumulus_client_consensus_aura::{
- build_aura_consensus, BuildAuraConsensusParams, SlotProportion,
-};
+use cumulus_client_consensus_aura::{build_aura_consensus, BuildAuraConsensusParams, SlotProportion};
use cumulus_client_consensus_common::ParachainConsensus;
use cumulus_client_network::build_block_announce_validator;
use cumulus_client_service::{
@@ -59,20 +57,23 @@
);
pub fn open_frontier_backend(config: &Configuration) -> Result<Arc<fc_db::Backend<Block>>, String> {
- let config_dir = config.base_path.as_ref()
+ let config_dir = config
+ .base_path
+ .as_ref()
.map(|base_path| base_path.config_dir(config.chain_spec.id()))
.unwrap_or_else(|| {
- BasePath::from_project("", "", "nft")
- .config_dir(config.chain_spec.id())
+ BasePath::from_project("", "", "nft").config_dir(config.chain_spec.id())
});
let database_dir = config_dir.join("frontier").join("db");
- Ok(Arc::new(fc_db::Backend::<Block>::new(&fc_db::DatabaseSettings {
- source: fc_db::DatabaseSettingsSrc::RocksDb {
- path: database_dir,
- cache_size: 0,
- }
- })?))
+ Ok(Arc::new(fc_db::Backend::<Block>::new(
+ &fc_db::DatabaseSettings {
+ source: fc_db::DatabaseSettingsSrc::RocksDb {
+ path: database_dir,
+ cache_size: 0,
+ },
+ },
+ )?))
}
type Executor = ParachainRuntimeExecutor;
@@ -85,6 +86,7 @@
///
/// Use this macro if you don't actually need the full service, but just the builder in order to
/// be able to perform chain operations.
+#[allow(clippy::type_complexity)]
pub fn new_partial<BIQ>(
config: &Configuration,
build_import_queue: BIQ,
@@ -95,7 +97,13 @@
FullSelectChain,
sp_consensus::DefaultImportQueue<Block, FullClient>,
sc_transaction_pool::FullPool<Block, FullClient>,
- (Option<Telemetry>, PendingTransactions, Option<FilterPool>, Arc<fc_db::Backend<Block>>, Option<TelemetryWorkerHandle>),
+ (
+ Option<Telemetry>,
+ PendingTransactions,
+ Option<FilterPool>,
+ Arc<fc_db::Backend<Block>>,
+ Option<TelemetryWorkerHandle>,
+ ),
>,
sc_service::Error,
>
@@ -107,12 +115,9 @@
&Configuration,
Option<TelemetryHandle>,
&TaskManager,
- ) -> Result<
- sp_consensus::DefaultImportQueue<Block, FullClient>,
- sc_service::Error,
- >,
+ ) -> Result<sp_consensus::DefaultImportQueue<Block, FullClient>, sc_service::Error>,
{
- let telemetry = config
+ let _telemetry = config
.telemetry_endpoints
.clone()
.filter(|x| !x.is_empty())
@@ -123,7 +128,9 @@
})
.transpose()?;
- let telemetry = config.telemetry_endpoints.clone()
+ let telemetry = config
+ .telemetry_endpoints
+ .clone()
.filter(|x| !x.is_empty())
.map(|endpoints| -> Result<_, sc_telemetry::Error> {
let worker = TelemetryWorker::new(16)?;
@@ -158,8 +165,7 @@
let pending_transactions: PendingTransactions = Some(Arc::new(Mutex::new(HashMap::new())));
- let filter_pool: Option<FilterPool>
- = Some(Arc::new(Mutex::new(BTreeMap::new())));
+ let filter_pool: Option<FilterPool> = Some(Arc::new(Mutex::new(BTreeMap::new())));
let frontier_backend = open_frontier_backend(config)?;
@@ -178,7 +184,13 @@
task_manager,
transaction_pool,
select_chain,
- other: (telemetry, pending_transactions, filter_pool, frontier_backend, telemetry_worker_handle),
+ other: (
+ telemetry,
+ pending_transactions,
+ filter_pool,
+ frontier_backend,
+ telemetry_worker_handle,
+ ),
};
Ok(params)
@@ -204,10 +216,7 @@
&Configuration,
Option<TelemetryHandle>,
&TaskManager,
- ) -> Result<
- sp_consensus::DefaultImportQueue<Block, FullClient>,
- sc_service::Error,
- >,
+ ) -> Result<sp_consensus::DefaultImportQueue<Block, FullClient>, sc_service::Error>,
BIC: FnOnce(
Arc<FullClient>,
Option<&Registry>,
@@ -227,7 +236,13 @@
let parachain_config = prepare_node_config(parachain_config);
let params = new_partial::<BIQ>(¶chain_config, build_import_queue)?;
- let (mut telemetry, pending_transactions, filter_pool, frontier_backend, telemetry_worker_handle) = params.other;
+ let (
+ mut telemetry,
+ pending_transactions,
+ filter_pool,
+ frontier_backend,
+ telemetry_worker_handle,
+ ) = params.other;
let relay_chain_full_node = cumulus_client_service::build_polkadot_full_node(
polkadot_config,
@@ -283,7 +298,7 @@
network: rpc_network.clone(),
pending_transactions: pending_transactions.clone(),
select_chain: select_chain.clone(),
- is_authority: is_authority.clone(),
+ is_authority,
// TODO: Unhardcode
max_past_logs: 10000,
};
@@ -364,16 +379,9 @@
config: &Configuration,
telemetry: Option<TelemetryHandle>,
task_manager: &TaskManager,
-) -> Result<
- sp_consensus::DefaultImportQueue<
- Block,
- FullClient,
- >,
- sc_service::Error,
-> {
+) -> Result<sp_consensus::DefaultImportQueue<Block, FullClient>, sc_service::Error> {
let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?;
-
cumulus_client_consensus_aura::import_queue::<
sp_consensus_aura::sr25519::AuthorityPair,
_,
@@ -383,7 +391,7 @@
_,
_,
>(cumulus_client_consensus_aura::ImportQueueParams {
- block_import: client.clone(),
+ block_import: client.clone(),
client: client.clone(),
create_inherent_data_providers: move |_, _| async move {
let time = sp_timestamp::InherentDataProvider::from_system_time();
@@ -396,7 +404,7 @@
Ok((time, slot))
},
- registry: config.prometheus_registry().clone(),
+ registry: config.prometheus_registry(),
can_author_with: sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()),
spawner: &task_manager.spawn_essential_handle(),
telemetry,
@@ -432,7 +440,7 @@
task_manager.spawn_handle(),
client.clone(),
transaction_pool,
- prometheus_registry.clone(),
+ prometheus_registry,
telemetry.clone(),
);
@@ -480,7 +488,7 @@
block_import: client.clone(),
relay_chain_client: relay_chain_node.client.clone(),
relay_chain_backend: relay_chain_node.backend.clone(),
- para_client: client.clone(),
+ para_client: client,
backoff_authoring_blocks: Option::<()>::None,
sync_oracle,
keystore,
@@ -493,4 +501,4 @@
},
)
.await
-}
\ No newline at end of file
+}
node/rpc/src/lib.rsdiffbeforeafterboth--- a/node/rpc/src/lib.rs
+++ b/node/rpc/src/lib.rs
@@ -189,7 +189,7 @@
pool.clone(),
nft_runtime::TransactionConverter,
network.clone(),
- pending_transactions.clone(),
+ pending_transactions,
signers,
overrides.clone(),
backend,
@@ -200,8 +200,8 @@
if let Some(filter_pool) = filter_pool {
io.extend_with(EthFilterApiServer::to_delegate(EthFilterApi::new(
client.clone(),
- filter_pool.clone(),
- 500 as usize, // max stored filters
+ filter_pool,
+ 500_usize, // max stored filters
overrides.clone(),
max_past_logs,
)));
@@ -217,9 +217,9 @@
io.extend_with(Web3ApiServer::to_delegate(Web3Api::new(client.clone())));
io.extend_with(EthPubSubApiServer::to_delegate(EthPubSubApi::new(
- pool.clone(),
- client.clone(),
- network.clone(),
+ pool,
+ client,
+ network,
SubscriptionManager::<HexEncodedIdProvider>::with_id_provider(
HexEncodedIdProvider::default(),
Arc::new(subscription_task_executor),
pallets/contract-helpers/src/lib.rsdiffbeforeafterboth--- a/pallets/contract-helpers/src/lib.rs
+++ b/pallets/contract-helpers/src/lib.rs
@@ -15,11 +15,11 @@
use sp_std::vec::Vec;
use up_sponsorship::SponsorshipHandler;
- #[pallet::error]
- pub enum Error<T> {
- /// Should be contract owner
- NoPermission,
- }
+ #[pallet::error]
+ pub enum Error<T> {
+ /// Should be contract owner
+ NoPermission,
+ }
#[pallet::config]
pub trait Config: frame_system::Config + pallet_contracts::Config {}
@@ -81,7 +81,10 @@
sponsoring: bool,
) -> DispatchResult {
let sender = ensure_signed(origin)?;
- ensure!(<Owner<T>>::get(&contract) == sender, <Error<T>>::NoPermission);
+ ensure!(
+ <Owner<T>>::get(&contract) == sender,
+ <Error<T>>::NoPermission
+ );
if sponsoring {
<SelfSponsoring<T>>::insert(contract, true);
@@ -98,7 +101,10 @@
enabled: bool,
) -> DispatchResult {
let sender = ensure_signed(origin)?;
- ensure!(<Owner<T>>::get(&contract) == sender, <Error<T>>::NoPermission);
+ ensure!(
+ <Owner<T>>::get(&contract) == sender,
+ <Error<T>>::NoPermission
+ );
if enabled {
<AllowlistEnabled<T>>::insert(contract, true);
@@ -116,7 +122,10 @@
allowed: bool,
) -> DispatchResult {
let sender = ensure_signed(origin)?;
- ensure!(<Owner<T>>::get(&contract) == sender, <Error<T>>::NoPermission);
+ ensure!(
+ <Owner<T>>::get(&contract) == sender,
+ <Error<T>>::NoPermission
+ );
if allowed {
<Allowlist<T>>::insert(contract, user, true);
@@ -133,7 +142,10 @@
rate_limit: T::BlockNumber,
) -> DispatchResult {
let sender = ensure_signed(origin)?;
- ensure!(<Owner<T>>::get(&contract) == sender, <Error<T>>::NoPermission);
+ ensure!(
+ <Owner<T>>::get(&contract) == sender,
+ <Error<T>>::NoPermission
+ );
<SponsoringRateLimit<T>>::insert(contract, rate_limit);
Ok(())
@@ -174,19 +186,17 @@
_info: &DispatchInfoOf<Self::Call>,
_len: usize,
) -> transaction_validity::TransactionValidity {
- match IsSubType::<pallet_contracts::Call<T>>::is_sub_type(call) {
- Some(pallet_contracts::Call::call(dest, _value, _gas_limit, _data)) => {
- let called_contract: T::AccountId =
- T::Lookup::lookup((*dest).clone()).unwrap_or(T::AccountId::default());
- if <AllowlistEnabled<T>>::get(&called_contract) {
- if !<Allowlist<T>>::get(&called_contract, who)
- && &<Owner<T>>::get(&called_contract) != who
- {
- return Err(transaction_validity::InvalidTransaction::Call.into());
- }
- }
+ if let Some(pallet_contracts::Call::call(dest, _value, _gas_limit, _data)) =
+ IsSubType::<pallet_contracts::Call<T>>::is_sub_type(call)
+ {
+ let called_contract: T::AccountId =
+ T::Lookup::lookup((*dest).clone()).unwrap_or_default();
+ if <AllowlistEnabled<T>>::get(&called_contract)
+ && !<Allowlist<T>>::get(&called_contract, who)
+ && &<Owner<T>>::get(&called_contract) != who
+ {
+ return Err(transaction_validity::InvalidTransaction::Call.into());
}
- _ => {}
}
Ok(transaction_validity::ValidTransaction::default())
}
@@ -200,11 +210,11 @@
) -> Result<Self::Pre, TransactionValidityError> {
match IsSubType::<pallet_contracts::Call<T>>::is_sub_type(call) {
Some(pallet_contracts::Call::instantiate(_, _, code_hash, _, salt)) => {
- Ok(Some((who.clone(), code_hash.clone(), salt.clone())))
+ Ok(Some((who.clone(), *code_hash, salt.clone())))
}
Some(pallet_contracts::Call::instantiate_with_code(_, _, code, _, salt)) => {
let code_hash = &T::Hashing::hash(&code);
- Ok(Some((who.clone(), code_hash.clone(), salt.clone())))
+ Ok(Some((who.clone(), *code_hash, salt.clone())))
}
_ => Ok(None),
}
@@ -236,24 +246,22 @@
T::AccountId: AsRef<[u8]>,
{
fn get_sponsor(who: &T::AccountId, call: &C) -> Option<T::AccountId> {
- match IsSubType::<pallet_contracts::Call<T>>::is_sub_type(call) {
- Some(pallet_contracts::Call::call(dest, _value, _gas_limit, _data)) => {
- let called_contract: T::AccountId =
- T::Lookup::lookup((*dest).clone()).unwrap_or_default();
- if <SelfSponsoring<T>>::get(&called_contract) {
- let last_tx_block = SponsorBasket::<T>::get(&called_contract, &who);
- let block_number =
- <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
- let rate_limit = SponsoringRateLimit::<T>::get(&called_contract);
- let limit_time = last_tx_block + rate_limit;
+ if let Some(pallet_contracts::Call::call(dest, _value, _gas_limit, _data)) =
+ IsSubType::<pallet_contracts::Call<T>>::is_sub_type(call)
+ {
+ let called_contract: T::AccountId =
+ T::Lookup::lookup((*dest).clone()).unwrap_or_default();
+ if <SelfSponsoring<T>>::get(&called_contract) {
+ let last_tx_block = SponsorBasket::<T>::get(&called_contract, &who);
+ let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
+ let rate_limit = SponsoringRateLimit::<T>::get(&called_contract);
+ let limit_time = last_tx_block + rate_limit;
- if block_number >= limit_time {
- SponsorBasket::<T>::insert(&called_contract, who, block_number);
- return Some(called_contract);
- }
+ if block_number >= limit_time {
+ SponsorBasket::<T>::insert(&called_contract, who, block_number);
+ return Some(called_contract);
}
}
- _ => {}
}
None
}
pallets/inflation/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/inflation/src/benchmarking.rs
+++ b/pallets/inflation/src/benchmarking.rs
@@ -5,15 +5,15 @@
use sp_std::prelude::*;
use frame_system::RawOrigin;
-use frame_benchmarking::{benchmarks};
+use frame_benchmarking::{benchmarks};
use frame_support::traits::OnInitialize;
benchmarks! {
on_initialize {
- let block1: T::BlockNumber = T::BlockNumber::from(1u32);
- let block2: T::BlockNumber = T::BlockNumber::from(2u32);
- Inflation::<T>::on_initialize(block1); // Create Treasury account
+ let block1: T::BlockNumber = T::BlockNumber::from(1u32);
+ let block2: T::BlockNumber = T::BlockNumber::from(2u32);
+ Inflation::<T>::on_initialize(block1); // Create Treasury account
}: { Inflation::<T>::on_initialize(block2); } // Benchmark deposit_into_existing path
}
pallets/inflation/src/lib.rsdiffbeforeafterboth--- a/pallets/inflation/src/lib.rs
+++ b/pallets/inflation/src/lib.rs
@@ -4,7 +4,6 @@
//
#![recursion_limit = "1024"]
-
#![cfg_attr(not(feature = "std"), no_std)]
#[cfg(feature = "std")]
@@ -19,8 +18,7 @@
mod tests;
pub use frame_support::{
- construct_runtime, decl_module, decl_storage,
- ensure,
+ construct_runtime, decl_module, decl_storage, ensure,
traits::{
Currency, ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced,
Randomness, IsSubType, WithdrawReasons,
@@ -30,8 +28,7 @@
DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,
WeightToFeePolynomial, DispatchClass,
},
- StorageValue,
- transactional,
+ StorageValue, transactional,
};
// #[cfg(feature = "runtime-benchmarks")]
@@ -39,7 +36,7 @@
use sp_runtime::{
Perbill,
- traits::{Zero}
+ traits::{Zero},
};
use sp_std::convert::TryInto;
@@ -71,13 +68,13 @@
}
decl_module! {
- pub struct Module<T: Config> for enum Call
- where
+ pub struct Module<T: Config> for enum Call
+ where
origin: T::Origin,
{
const InflationBlockInterval: T::BlockNumber = T::InflationBlockInterval::get();
- fn on_initialize(now: T::BlockNumber) -> Weight
+ fn on_initialize(now: T::BlockNumber) -> Weight
{
let mut consumed_weight = 0;
let mut add_weight = |reads, writes, weight| {
@@ -95,14 +92,14 @@
if current_year <= TOTAL_YEARS_UNTIL_FLAT {
let amount: BalanceOf<T> = Perbill::from_rational(
- block_interval * (START_INFLATION_PERCENT * TOTAL_YEARS_UNTIL_FLAT - current_year * (START_INFLATION_PERCENT - END_INFLATION_PERCENT)),
+ block_interval * (START_INFLATION_PERCENT * TOTAL_YEARS_UNTIL_FLAT - current_year * (START_INFLATION_PERCENT - END_INFLATION_PERCENT)),
YEAR * TOTAL_YEARS_UNTIL_FLAT
) * ( one_percent * T::Currency::total_issuance() );
<BlockInflation<T>>::put(amount);
}
else {
let amount: BalanceOf<T> = Perbill::from_rational(
- block_interval * END_INFLATION_PERCENT,
+ block_interval * END_INFLATION_PERCENT,
YEAR
) * (one_percent * T::Currency::total_issuance());
<BlockInflation<T>>::put(amount);
pallets/inflation/src/tests.rsdiffbeforeafterboth--- a/pallets/inflation/src/tests.rs
+++ b/pallets/inflation/src/tests.rs
@@ -1,242 +1,242 @@
-#[cfg(test)]
-mod tests {
- use crate as pallet_inflation;
+#![cfg(test)]
+#![allow(clippy::from_over_into)]
+use crate as pallet_inflation;
- use frame_system;
- use frame_support::{traits::{Currency}, parameter_types};
- use frame_support::{traits::OnInitialize};
- use sp_core::H256;
- use sp_runtime::{traits::{BlakeTwo256, IdentityLookup}, testing::Header};
+use frame_support::{
+ traits::{Currency},
+ parameter_types,
+};
+use frame_support::{traits::OnInitialize};
+use sp_core::H256;
+use sp_runtime::{
+ traits::{BlakeTwo256, IdentityLookup},
+ testing::Header,
+};
- type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;
- type Block = frame_system::mocking::MockBlock<Test>;
+type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;
+type Block = frame_system::mocking::MockBlock<Test>;
- const YEAR: u64 = 5_259_600;
+const YEAR: u64 = 5_259_600;
- parameter_types! {
- pub const ExistentialDeposit: u64 = 1;
- pub const MaxLocks: u32 = 50;
- }
-
- impl pallet_balances::Config for Test {
- type AccountStore = System;
- type Balance = u64;
- type DustRemoval = ();
- type Event = ();
- type ExistentialDeposit = ExistentialDeposit;
- type WeightInfo = ();
- type MaxLocks = MaxLocks;
- }
-
- frame_support::construct_runtime!(
- pub enum Test where
- Block = Block,
- NodeBlock = Block,
- UncheckedExtrinsic = UncheckedExtrinsic,
- {
- Balances: pallet_balances::{Pallet, Call, Storage},
- System: frame_system::{Pallet, Call, Config, Storage, Event<T>},
- Inflation: pallet_inflation::{Pallet, Call, Storage},
- }
- );
+parameter_types! {
+ pub const ExistentialDeposit: u64 = 1;
+ pub const MaxLocks: u32 = 50;
+}
- parameter_types! {
- pub const BlockHashCount: u64 = 250;
- pub BlockWeights: frame_system::limits::BlockWeights =
- frame_system::limits::BlockWeights::simple_max(1024);
- pub const SS58Prefix: u8 = 42;
- }
+impl pallet_balances::Config for Test {
+ type AccountStore = System;
+ type Balance = u64;
+ type DustRemoval = ();
+ type Event = ();
+ type ExistentialDeposit = ExistentialDeposit;
+ type WeightInfo = ();
+ type MaxLocks = MaxLocks;
+}
- impl frame_system::Config for Test {
- type BaseCallFilter = ();
- type BlockWeights = ();
- type BlockLength = ();
- type DbWeight = ();
- type Origin = Origin;
- type Call = Call;
- type Index = u64;
- type BlockNumber = u64;
- type Hash = H256;
- type Hashing = BlakeTwo256;
- type AccountId = u64;
- type Lookup = IdentityLookup<Self::AccountId>;
- type Header = Header;
- type Event = ();
- type BlockHashCount = BlockHashCount;
- type Version = ();
- type PalletInfo = PalletInfo;
- type AccountData = pallet_balances::AccountData<u64>;
- type OnNewAccount = ();
- type OnKilledAccount = ();
- type SystemWeightInfo = ();
- type SS58Prefix = SS58Prefix;
- type OnSetCode = ();
+frame_support::construct_runtime!(
+ pub enum Test where
+ Block = Block,
+ NodeBlock = Block,
+ UncheckedExtrinsic = UncheckedExtrinsic,
+ {
+ Balances: pallet_balances::{Pallet, Call, Storage},
+ System: frame_system::{Pallet, Call, Config, Storage, Event<T>},
+ Inflation: pallet_inflation::{Pallet, Call, Storage},
}
+);
+
+parameter_types! {
+ pub const BlockHashCount: u64 = 250;
+ pub BlockWeights: frame_system::limits::BlockWeights =
+ frame_system::limits::BlockWeights::simple_max(1024);
+ pub const SS58Prefix: u8 = 42;
+}
+
+impl frame_system::Config for Test {
+ type BaseCallFilter = ();
+ type BlockWeights = ();
+ type BlockLength = ();
+ type DbWeight = ();
+ type Origin = Origin;
+ type Call = Call;
+ type Index = u64;
+ type BlockNumber = u64;
+ type Hash = H256;
+ type Hashing = BlakeTwo256;
+ type AccountId = u64;
+ type Lookup = IdentityLookup<Self::AccountId>;
+ type Header = Header;
+ type Event = ();
+ type BlockHashCount = BlockHashCount;
+ type Version = ();
+ type PalletInfo = PalletInfo;
+ type AccountData = pallet_balances::AccountData<u64>;
+ type OnNewAccount = ();
+ type OnKilledAccount = ();
+ type SystemWeightInfo = ();
+ type SS58Prefix = SS58Prefix;
+ type OnSetCode = ();
+}
- parameter_types! {
- pub TreasuryAccountId: u64 = 1234;
- pub const InflationBlockInterval: u32 = 100; // every time per how many blocks inflation is applied
- }
-
- impl pallet_inflation::Config for Test {
- type Currency = Balances;
- type TreasuryAccountId = TreasuryAccountId;
- type InflationBlockInterval = InflationBlockInterval;
- }
+parameter_types! {
+ pub TreasuryAccountId: u64 = 1234;
+ pub const InflationBlockInterval: u32 = 100; // every time per how many blocks inflation is applied
+}
- // Build genesis storage according to the mock runtime.
- pub fn new_test_ext() -> sp_io::TestExternalities {
- frame_system::GenesisConfig::default().build_storage::<Test>().unwrap().into()
- }
+impl pallet_inflation::Config for Test {
+ type Currency = Balances;
+ type TreasuryAccountId = TreasuryAccountId;
+ type InflationBlockInterval = InflationBlockInterval;
+}
- #[test]
- fn inflation_works() {
- new_test_ext().execute_with(|| {
- // Total issuance = 1_000_000_000
- let initial_issuance: u64 = 1_000_000_000;
- let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);
- assert_eq!(Balances::free_balance(1234), initial_issuance);
+// Build genesis storage according to the mock runtime.
+pub fn new_test_ext() -> sp_io::TestExternalities {
+ frame_system::GenesisConfig::default()
+ .build_storage::<Test>()
+ .unwrap()
+ .into()
+}
- // BlockInflation should be set after 1st block and
- // first inflation deposit should be equal to BlockInflation
- Inflation::on_initialize(1);
- assert!(Inflation::block_inflation() > 0);
- assert_eq!(Balances::free_balance(1234) - initial_issuance, Inflation::block_inflation());
- });
- }
+#[test]
+fn inflation_works() {
+ new_test_ext().execute_with(|| {
+ // Total issuance = 1_000_000_000
+ let initial_issuance: u64 = 1_000_000_000;
+ let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);
+ assert_eq!(Balances::free_balance(1234), initial_issuance);
- #[test]
- fn inflation_second_deposit() {
- new_test_ext().execute_with(|| {
- // Total issuance = 1_000_000_000
- let initial_issuance: u64 = 1_000_000_000;
- let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);
- assert_eq!(Balances::free_balance(1234), initial_issuance);
- Inflation::on_initialize(1);
+ // BlockInflation should be set after 1st block and
+ // first inflation deposit should be equal to BlockInflation
+ Inflation::on_initialize(1);
+ assert!(Inflation::block_inflation() > 0);
+ assert_eq!(
+ Balances::free_balance(1234) - initial_issuance,
+ Inflation::block_inflation()
+ );
+ });
+}
- // Next inflation deposit happens when block is multiple of InflationBlockInterval
- let mut block: u32 = 2;
- let balance_before: u64 = Balances::free_balance(1234);
- while block % InflationBlockInterval::get() != 0 {
- Inflation::on_initialize(block as u64);
- block += 1;
- }
- let balance_just_before: u64 = Balances::free_balance(1234);
- assert_eq!(balance_before, balance_just_before);
+#[test]
+fn inflation_second_deposit() {
+ new_test_ext().execute_with(|| {
+ // Total issuance = 1_000_000_000
+ let initial_issuance: u64 = 1_000_000_000;
+ let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);
+ assert_eq!(Balances::free_balance(1234), initial_issuance);
+ Inflation::on_initialize(1);
- // The block with inflation
+ // Next inflation deposit happens when block is multiple of InflationBlockInterval
+ let mut block: u32 = 2;
+ let balance_before: u64 = Balances::free_balance(1234);
+ while block % InflationBlockInterval::get() != 0 {
Inflation::on_initialize(block as u64);
- let balance_after: u64 = Balances::free_balance(1234);
- assert_eq!(balance_after - balance_just_before, Inflation::block_inflation());
- });
- }
+ block += 1;
+ }
+ let balance_just_before: u64 = Balances::free_balance(1234);
+ assert_eq!(balance_before, balance_just_before);
- #[test]
- fn inflation_in_1_year() {
- new_test_ext().execute_with(|| {
- // Total issuance = 1_000_000_000
- let initial_issuance: u64 = 1_000_000_000;
- let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);
- assert_eq!(Balances::free_balance(1234), initial_issuance);
- Inflation::on_initialize(1);
- let block_inflation_year_0 = Inflation::block_inflation();
+ // The block with inflation
+ Inflation::on_initialize(block as u64);
+ let balance_after: u64 = Balances::free_balance(1234);
+ assert_eq!(
+ balance_after - balance_just_before,
+ Inflation::block_inflation()
+ );
+ });
+}
- Inflation::on_initialize(YEAR);
- let block_inflation_year_1 = Inflation::block_inflation();
+#[test]
+fn inflation_in_1_year() {
+ new_test_ext().execute_with(|| {
+ // Total issuance = 1_000_000_000
+ let initial_issuance: u64 = 1_000_000_000;
+ let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);
+ assert_eq!(Balances::free_balance(1234), initial_issuance);
+ Inflation::on_initialize(1);
+ let block_inflation_year_0 = Inflation::block_inflation();
- // Assert that year 1 inflation is less than year 0
- assert!(block_inflation_year_0 > block_inflation_year_1);
- });
- }
+ Inflation::on_initialize(YEAR);
+ let block_inflation_year_1 = Inflation::block_inflation();
- #[test]
- fn inflation_in_1_to_9_years() {
- new_test_ext().execute_with(|| {
- // Total issuance = 1_000_000_000
- let initial_issuance: u64 = 1_000_000_000;
- let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);
- assert_eq!(Balances::free_balance(1234), initial_issuance);
- Inflation::on_initialize(1);
+ // Assert that year 1 inflation is less than year 0
+ assert!(block_inflation_year_0 > block_inflation_year_1);
+ });
+}
- for year in 1..=9 {
- let block_inflation_year_before = Inflation::block_inflation();
- Inflation::on_initialize(YEAR * year);
- let block_inflation_year_after = Inflation::block_inflation();
+#[test]
+fn inflation_in_1_to_9_years() {
+ new_test_ext().execute_with(|| {
+ // Total issuance = 1_000_000_000
+ let initial_issuance: u64 = 1_000_000_000;
+ let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);
+ assert_eq!(Balances::free_balance(1234), initial_issuance);
+ Inflation::on_initialize(1);
- // Assert that next year inflation is less than previous year inflation
- assert!(block_inflation_year_before > block_inflation_year_after);
- }
+ for year in 1..=9 {
+ let block_inflation_year_before = Inflation::block_inflation();
+ Inflation::on_initialize(YEAR * year);
+ let block_inflation_year_after = Inflation::block_inflation();
- });
- }
+ // Assert that next year inflation is less than previous year inflation
+ assert!(block_inflation_year_before > block_inflation_year_after);
+ }
+ });
+}
- #[test]
- fn inflation_after_year_10_is_flat() {
- new_test_ext().execute_with(|| {
- // Total issuance = 1_000_000_000
- let initial_issuance: u64 = 1_000_000_000;
- let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);
- assert_eq!(Balances::free_balance(1234), initial_issuance);
- Inflation::on_initialize(YEAR * 9);
+#[test]
+fn inflation_after_year_10_is_flat() {
+ new_test_ext().execute_with(|| {
+ // Total issuance = 1_000_000_000
+ let initial_issuance: u64 = 1_000_000_000;
+ let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);
+ assert_eq!(Balances::free_balance(1234), initial_issuance);
+ Inflation::on_initialize(YEAR * 9);
- for year in 10..=20 {
- let block_inflation_year_before = Inflation::block_inflation();
- Inflation::on_initialize(YEAR * year);
- let block_inflation_year_after = Inflation::block_inflation();
+ for year in 10..=20 {
+ let block_inflation_year_before = Inflation::block_inflation();
+ Inflation::on_initialize(YEAR * year);
+ let block_inflation_year_after = Inflation::block_inflation();
- // Assert that next year inflation is equal to previous year inflation
- assert_eq!(block_inflation_year_before, block_inflation_year_after);
- }
- });
- }
+ // Assert that next year inflation is equal to previous year inflation
+ assert_eq!(block_inflation_year_before, block_inflation_year_after);
+ }
+ });
+}
- #[test]
- fn inflation_rate_by_year() {
- new_test_ext().execute_with(|| {
- let payouts: u64 = YEAR / InflationBlockInterval::get() as u64;
+#[test]
+fn inflation_rate_by_year() {
+ new_test_ext().execute_with(|| {
+ let payouts: u64 = YEAR / InflationBlockInterval::get() as u64;
- // Inflation starts at 10% and does down by 2/3% every year until year 9 (included),
- // then it is flat.
- let payout_by_year: [u64; 11] = [
- 1000,
- 933,
- 867,
- 800,
- 733,
- 667,
- 600,
- 533,
- 467,
- 400,
- 400
- ];
+ // Inflation starts at 10% and does down by 2/3% every year until year 9 (included),
+ // then it is flat.
+ let payout_by_year: [u64; 11] = [1000, 933, 867, 800, 733, 667, 600, 533, 467, 400, 400];
- // For accuracy total issuance = payout0 * payouts * 10;
- let initial_issuance: u64 = payout_by_year[0] * payouts * 10;
- let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);
- assert_eq!(Balances::free_balance(1234), initial_issuance);
+ // For accuracy total issuance = payout0 * payouts * 10;
+ let initial_issuance: u64 = payout_by_year[0] * payouts * 10;
+ let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);
+ assert_eq!(Balances::free_balance(1234), initial_issuance);
- for year in 0..=10 {
- // Year first block
- Inflation::on_initialize(year*YEAR);
- let mut actual_payout = Inflation::block_inflation();
- assert_eq!(actual_payout, payout_by_year[year as usize]);
+ for year in 0..=10 {
+ // Year first block
+ Inflation::on_initialize(year * YEAR);
+ let mut actual_payout = Inflation::block_inflation();
+ assert_eq!(actual_payout, payout_by_year[year as usize]);
- // Year second block
- Inflation::on_initialize(year*YEAR+1);
- actual_payout = Inflation::block_inflation();
- assert_eq!(actual_payout, payout_by_year[year as usize]);
+ // Year second block
+ Inflation::on_initialize(year * YEAR + 1);
+ actual_payout = Inflation::block_inflation();
+ assert_eq!(actual_payout, payout_by_year[year as usize]);
- // Year middle block
- Inflation::on_initialize(year*YEAR + YEAR/2);
- actual_payout = Inflation::block_inflation();
- assert_eq!(actual_payout, payout_by_year[year as usize]);
+ // Year middle block
+ Inflation::on_initialize(year * YEAR + YEAR / 2);
+ actual_payout = Inflation::block_inflation();
+ assert_eq!(actual_payout, payout_by_year[year as usize]);
- // Year last block
- Inflation::on_initialize((year + 1)*YEAR-1);
- actual_payout = Inflation::block_inflation();
- assert_eq!(actual_payout, payout_by_year[year as usize]);
- }
- });
- }
+ // Year last block
+ Inflation::on_initialize((year + 1) * YEAR - 1);
+ actual_payout = Inflation::block_inflation();
+ assert_eq!(actual_payout, payout_by_year[year as usize]);
+ }
+ });
}
pallets/nft-charge-transaction/src/lib.rsdiffbeforeafterboth--- a/pallets/nft-charge-transaction/src/lib.rs
+++ b/pallets/nft-charge-transaction/src/lib.rs
@@ -11,47 +11,38 @@
#[cfg(feature = "std")]
pub use serde::*;
-#[cfg(feature = "runtime-benchmarks")]
-mod benchmarking;
-
use codec::{Decode, Encode};
use frame_support::traits::Get;
use frame_support::{
decl_module, decl_storage,
- weights::{
- DispatchInfo, PostDispatchInfo, DispatchClass
- }
+ weights::{DispatchInfo, PostDispatchInfo, DispatchClass},
};
use sp_runtime::{
- traits::{
- DispatchInfoOf, Dispatchable, PostDispatchInfoOf, Saturating, SaturatedConversion, SignedExtension, Zero,
+ traits::{
+ DispatchInfoOf, Dispatchable, PostDispatchInfoOf, Saturating, SaturatedConversion,
+ SignedExtension, Zero,
},
- transaction_validity::{
+ transaction_validity::{
TransactionPriority, TransactionValidity, TransactionValidityError, ValidTransaction,
},
- FixedPointOperand, DispatchResult
+ FixedPointOperand, DispatchResult,
};
use pallet_transaction_payment::OnChargeTransaction;
use sp_std::prelude::*;
-
-pub trait Config: frame_system::Config +
- pallet_nft_transaction_payment::Config
-{
-
-}
+pub trait Config: frame_system::Config + pallet_nft_transaction_payment::Config {}
decl_storage! {
- trait Store for Module<T: Config> as NftTransactionPayment
- {}
+ trait Store for Module<T: Config> as NftTransactionPayment
+ {}
}
decl_module! {
- pub struct Module<T: Config> for enum Call
- where
+ pub struct Module<T: Config> for enum Call
+ where
origin: T::Origin,
- {}
+ {}
}
type BalanceOf<T> = <<T as pallet_transaction_payment::Config>::OnChargeTransaction as pallet_transaction_payment::OnChargeTransaction<T>>::Balance;
@@ -61,9 +52,7 @@
#[derive(Encode, Decode, Clone, Eq, PartialEq)]
pub struct ChargeTransactionPayment<T: Config>(#[codec(compact)] BalanceOf<T>);
-impl<T: Config + Send + Sync> sp_std::fmt::Debug
- for ChargeTransactionPayment<T>
-{
+impl<T: Config + Send + Sync> sp_std::fmt::Debug for ChargeTransactionPayment<T> {
#[cfg(feature = "std")]
fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result {
write!(f, "ChargeTransactionPayment<{:?}>", self.0)
@@ -76,32 +65,37 @@
impl<T: Config> ChargeTransactionPayment<T>
where
- T::Call: Dispatchable<Info=DispatchInfo, PostInfo=PostDispatchInfo>,
- BalanceOf<T>: Send + Sync + From<u64> + FixedPointOperand,
+ T::Call: Dispatchable<Info = DispatchInfo, PostInfo = PostDispatchInfo>,
+ BalanceOf<T>: Send + Sync + From<u64> + FixedPointOperand,
{
- fn traditional_fee(
- len: usize,
- info: &DispatchInfoOf<T::Call>,
- tip: BalanceOf<T>,
- ) -> BalanceOf<T>
- where
- T::Call: Dispatchable<Info = DispatchInfo>,
- {
- <pallet_transaction_payment::Module<T>>::compute_fee(len as u32, info, tip)
- }
+ fn traditional_fee(
+ len: usize,
+ info: &DispatchInfoOf<T::Call>,
+ tip: BalanceOf<T>,
+ ) -> BalanceOf<T>
+ where
+ T::Call: Dispatchable<Info = DispatchInfo>,
+ {
+ <pallet_transaction_payment::Module<T>>::compute_fee(len as u32, info, tip)
+ }
- fn get_priority(len: usize, info: &DispatchInfoOf<T::Call>, final_fee: BalanceOf<T>) -> TransactionPriority {
- let weight_saturation = T::BlockWeights::get().max_block / info.weight.max(1);
- let max_block_length = *T::BlockLength::get().max.get(DispatchClass::Normal);
- let len_saturation = max_block_length as u64 / (len as u64).max(1);
- let coefficient: BalanceOf<T> = weight_saturation
- .min(len_saturation)
- .saturated_into::<BalanceOf<T>>();
- final_fee
- .saturating_mul(coefficient)
- .saturated_into::<TransactionPriority>()
- }
+ fn get_priority(
+ len: usize,
+ info: &DispatchInfoOf<T::Call>,
+ final_fee: BalanceOf<T>,
+ ) -> TransactionPriority {
+ let weight_saturation = T::BlockWeights::get().max_block / info.weight.max(1);
+ let max_block_length = *T::BlockLength::get().max.get(DispatchClass::Normal);
+ let len_saturation = max_block_length as u64 / (len as u64).max(1);
+ let coefficient: BalanceOf<T> = weight_saturation
+ .min(len_saturation)
+ .saturated_into::<BalanceOf<T>>();
+ final_fee
+ .saturating_mul(coefficient)
+ .saturated_into::<TransactionPriority>()
+ }
+ #[allow(clippy::type_complexity)]
fn withdraw_fee(
&self,
who: &T::AccountId,
@@ -114,39 +108,38 @@
<<T as pallet_transaction_payment::Config>::OnChargeTransaction as pallet_transaction_payment::OnChargeTransaction<T>>::LiquidityInfo,
),
TransactionValidityError,
- > {
- let tip = self.0;
+ >{
+ let tip = self.0;
- let fee = Self::traditional_fee(len, info, tip);
+ let fee = Self::traditional_fee(len, info, tip);
- // Only mess with balances if fee is not zero.
- if fee.is_zero() {
- return <<T as pallet_transaction_payment::Config>::OnChargeTransaction as pallet_transaction_payment::OnChargeTransaction<T>>::withdraw_fee(who, call, info, fee, tip)
+ // Only mess with balances if fee is not zero.
+ if fee.is_zero() {
+ return <<T as pallet_transaction_payment::Config>::OnChargeTransaction as pallet_transaction_payment::OnChargeTransaction<T>>::withdraw_fee(who, call, info, fee, tip)
.map(|i| (fee, i));
- }
+ }
- // Determine who is paying transaction fee based on ecnomic model
- // Parse call to extract collection ID and access collection sponsor
+ // Determine who is paying transaction fee based on ecnomic model
+ // Parse call to extract collection ID and access collection sponsor
let sponsor = <pallet_nft_transaction_payment::Module<T>>::withdraw_type(who, call);
- let who_pays_fee = sponsor.unwrap_or_else(|| who.clone());
+ let who_pays_fee = sponsor.unwrap_or_else(|| who.clone());
<<T as pallet_transaction_payment::Config>::OnChargeTransaction as pallet_transaction_payment::OnChargeTransaction<T>>::withdraw_fee(&who_pays_fee, call, info, fee, tip)
.map(|i| (fee, i))
- }
+ }
}
-impl<T: Config + Send + Sync> SignedExtension
- for ChargeTransactionPayment<T>
+impl<T: Config + Send + Sync> SignedExtension for ChargeTransactionPayment<T>
where
- BalanceOf<T>: Send + Sync + From<u64> + FixedPointOperand,
- T::Call: Dispatchable<Info=DispatchInfo, PostInfo=PostDispatchInfo>,
+ BalanceOf<T>: Send + Sync + From<u64> + FixedPointOperand,
+ T::Call: Dispatchable<Info = DispatchInfo, PostInfo = PostDispatchInfo>,
{
- const IDENTIFIER: &'static str = "ChargeTransactionPayment";
- type AccountId = T::AccountId;
- type Call = T::Call;
- type AdditionalSigned = ();
- type Pre = (
+ const IDENTIFIER: &'static str = "ChargeTransactionPayment";
+ type AccountId = T::AccountId;
+ type Call = T::Call;
+ type AdditionalSigned = ();
+ type Pre = (
// tip
BalanceOf<T>,
// who pays fee
@@ -154,50 +147,49 @@
// imbalance resulting from withdrawing the fee
<<T as pallet_transaction_payment::Config>::OnChargeTransaction as pallet_transaction_payment::OnChargeTransaction<T>>::LiquidityInfo,
);
- fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> {
- Ok(())
- }
+ fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> {
+ Ok(())
+ }
- fn validate(
- &self,
- who: &Self::AccountId,
- call: &Self::Call,
- info: &DispatchInfoOf<Self::Call>,
- len: usize,
- ) -> TransactionValidity {
+ fn validate(
+ &self,
+ who: &Self::AccountId,
+ call: &Self::Call,
+ info: &DispatchInfoOf<Self::Call>,
+ len: usize,
+ ) -> TransactionValidity {
let (fee, _) = self.withdraw_fee(who, call, info, len)?;
Ok(ValidTransaction {
priority: Self::get_priority(len, info, fee),
..Default::default()
})
- }
+ }
- fn pre_dispatch(
- self,
- who: &Self::AccountId,
- call: &Self::Call,
- info: &DispatchInfoOf<Self::Call>,
- len: usize,
- ) -> Result<Self::Pre, TransactionValidityError> {
- let (_fee, imbalance) = self.withdraw_fee(who, call, info, len)?;
- Ok((self.0, who.clone(), imbalance))
- }
+ fn pre_dispatch(
+ self,
+ who: &Self::AccountId,
+ call: &Self::Call,
+ info: &DispatchInfoOf<Self::Call>,
+ len: usize,
+ ) -> Result<Self::Pre, TransactionValidityError> {
+ let (_fee, imbalance) = self.withdraw_fee(who, call, info, len)?;
+ Ok((self.0, who.clone(), imbalance))
+ }
- fn post_dispatch(
- pre: Self::Pre,
- info: &DispatchInfoOf<Self::Call>,
- post_info: &PostDispatchInfoOf<Self::Call>,
- len: usize,
- _result: &DispatchResult,
- ) -> Result<(), TransactionValidityError> {
+ fn post_dispatch(
+ pre: Self::Pre,
+ info: &DispatchInfoOf<Self::Call>,
+ post_info: &PostDispatchInfoOf<Self::Call>,
+ len: usize,
+ _result: &DispatchResult,
+ ) -> Result<(), TransactionValidityError> {
let (tip, who, imbalance) = pre;
let actual_fee = pallet_transaction_payment::Pallet::<T>::compute_actual_fee(
- len as u32,
- info,
- post_info,
- tip,
+ len as u32, info, post_info, tip,
);
- <T as pallet_transaction_payment::Config>::OnChargeTransaction::correct_and_deposit_fee(&who, info, post_info, actual_fee, tip, imbalance)?;
+ <T as pallet_transaction_payment::Config>::OnChargeTransaction::correct_and_deposit_fee(
+ &who, info, post_info, actual_fee, tip, imbalance,
+ )?;
Ok(())
- }
-}
\ No newline at end of file
+ }
+}
pallets/nft-transaction-payment/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/nft-transaction-payment/src/benchmarking.rs
+++ b/pallets/nft-transaction-payment/src/benchmarking.rs
@@ -4,15 +4,15 @@
use sp_std::prelude::*;
use frame_system::RawOrigin;
-use frame_benchmarking::{benchmarks};
+use frame_benchmarking::{benchmarks};
use frame_support::traits::OnInitialize;
benchmarks! {
// on_initialize {
- // let block1: T::BlockNumber = T::BlockNumber::from(1u32);
- // let block2: T::BlockNumber = T::BlockNumber::from(2u32);
- // Inflation::<T>::on_initialize(block1); // Create Treasury account
+ // let block1: T::BlockNumber = T::BlockNumber::from(1u32);
+ // let block2: T::BlockNumber = T::BlockNumber::from(2u32);
+ // Inflation::<T>::on_initialize(block1); // Create Treasury account
// }: { Inflation::<T>::on_initialize(block2); } // Benchmark deposit_into_existing path
}
pallets/nft-transaction-payment/src/lib.rsdiffbeforeafterboth--- a/pallets/nft-transaction-payment/src/lib.rs
+++ b/pallets/nft-transaction-payment/src/lib.rs
@@ -28,18 +28,15 @@
}
decl_module! {
- pub struct Module<T: Config> for enum Call
- where
+ pub struct Module<T: Config> for enum Call
+ where
origin: T::Origin,
- {
+ {
}
}
impl<T: Config> Module<T> {
- pub fn withdraw_type(
- who: &T::AccountId,
- call: &T::Call
- ) -> Option<T::AccountId> {
+ pub fn withdraw_type(who: &T::AccountId, call: &T::Call) -> Option<T::AccountId> {
T::SponsorshipHandler::get_sponsor(who, call)
}
-}
\ No newline at end of file
+}
pallets/nft/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/nft/src/benchmarking.rs
+++ b/pallets/nft/src/benchmarking.rs
@@ -5,415 +5,415 @@
use sp_std::prelude::*;
use frame_system::RawOrigin;
-use frame_benchmarking::{benchmarks, account, whitelisted_caller}; // , TrackedStorageKey,
+use frame_benchmarking::{benchmarks, account, whitelisted_caller}; // , TrackedStorageKey,
const SEED: u32 = 1;
/*
fn default_nft_data() -> CreateItemData {
- CreateItemData::NFT(CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })
+ CreateItemData::NFT(CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })
}
fn default_fungible_data () -> CreateItemData {
- CreateItemData::Fungible(CreateFungibleData { })
+ CreateItemData::Fungible(CreateFungibleData { })
}
fn default_re_fungible_data () -> CreateItemData {
- CreateItemData::ReFungible(CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })
+ CreateItemData::ReFungible(CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })
}
*/
benchmarks! {
- create_collection {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = account("caller", 0, SEED);
- }: _(RawOrigin::Signed(caller.clone()), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode)
+ create_collection {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = account("caller", 0, SEED);
+ }: _(RawOrigin::Signed(caller.clone()), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode)
/*
- verify {
- assert_eq!(Nft::<T>::collection_id(2).owner, caller);
- }
- destroy_collection {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- }: _(RawOrigin::Signed(caller.clone()), 2)
+ verify {
+ assert_eq!(Nft::<T>::collection_id(2).owner, caller);
+ }
+ destroy_collection {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ }: _(RawOrigin::Signed(caller.clone()), 2)
- add_to_white_list {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- let whitelist_account: T::AccountId = account("admin", 0, SEED);
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- }: add_to_white_list(RawOrigin::Signed(caller.clone()), 2, whitelist_account)
+ add_to_white_list {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ let whitelist_account: T::AccountId = account("admin", 0, SEED);
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ }: add_to_white_list(RawOrigin::Signed(caller.clone()), 2, whitelist_account)
- remove_from_white_list {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- let whitelist_account: T::AccountId = account("admin", 0, SEED);
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- Nft::<T>::add_to_white_list(RawOrigin::Signed(caller.clone()).into(), 2, whitelist_account.clone())?;
- }: remove_from_white_list(RawOrigin::Signed(caller.clone()), 2, whitelist_account)
+ remove_from_white_list {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ let whitelist_account: T::AccountId = account("admin", 0, SEED);
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ Nft::<T>::add_to_white_list(RawOrigin::Signed(caller.clone()).into(), 2, whitelist_account.clone())?;
+ }: remove_from_white_list(RawOrigin::Signed(caller.clone()), 2, whitelist_account)
- set_public_access_mode {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- }: set_public_access_mode(RawOrigin::Signed(caller.clone()), 2, AccessMode::WhiteList)
+ set_public_access_mode {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ }: set_public_access_mode(RawOrigin::Signed(caller.clone()), 2, AccessMode::WhiteList)
- set_mint_permission {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- }: set_mint_permission(RawOrigin::Signed(caller.clone()), 2, true)
+ set_mint_permission {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ }: set_mint_permission(RawOrigin::Signed(caller.clone()), 2, true)
- change_collection_owner {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let new_owner: T::AccountId = account("admin", 0, SEED);
- }: change_collection_owner(RawOrigin::Signed(caller.clone()), 2, new_owner)
+ change_collection_owner {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let new_owner: T::AccountId = account("admin", 0, SEED);
+ }: change_collection_owner(RawOrigin::Signed(caller.clone()), 2, new_owner)
- add_collection_admin {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let new_admin: T::AccountId = account("admin", 0, SEED);
- }: add_collection_admin(RawOrigin::Signed(caller.clone()), 2, new_admin)
+ add_collection_admin {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let new_admin: T::AccountId = account("admin", 0, SEED);
+ }: add_collection_admin(RawOrigin::Signed(caller.clone()), 2, new_admin)
- remove_collection_admin {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let new_admin: T::AccountId = account("admin", 0, SEED);
- Nft::<T>::add_collection_admin(RawOrigin::Signed(caller.clone()).into(), 2, new_admin.clone())?;
- }: remove_collection_admin(RawOrigin::Signed(caller.clone()), 2, new_admin)
+ remove_collection_admin {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let new_admin: T::AccountId = account("admin", 0, SEED);
+ Nft::<T>::add_collection_admin(RawOrigin::Signed(caller.clone()).into(), 2, new_admin.clone())?;
+ }: remove_collection_admin(RawOrigin::Signed(caller.clone()), 2, new_admin)
- set_collection_sponsor {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- }: set_collection_sponsor(RawOrigin::Signed(caller.clone()), 2, caller.clone())
+ set_collection_sponsor {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ }: set_collection_sponsor(RawOrigin::Signed(caller.clone()), 2, caller.clone())
- confirm_sponsorship {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;
- }: confirm_sponsorship(RawOrigin::Signed(caller.clone()), 2)
+ confirm_sponsorship {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;
+ }: confirm_sponsorship(RawOrigin::Signed(caller.clone()), 2)
- remove_collection_sponsor {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;
- Nft::<T>::confirm_sponsorship(RawOrigin::Signed(caller.clone()).into(), 2)?;
- }: remove_collection_sponsor(RawOrigin::Signed(caller.clone()), 2)
+ remove_collection_sponsor {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;
+ Nft::<T>::confirm_sponsorship(RawOrigin::Signed(caller.clone()).into(), 2)?;
+ }: remove_collection_sponsor(RawOrigin::Signed(caller.clone()), 2)
- // nft item
- create_item_nft {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let data = default_nft_data();
-
- }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
+ // nft item
+ create_item_nft {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let data = default_nft_data();
- #[extra]
- create_item_nft_large {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- let mut nft_data = CreateNftData {
- const_data: vec![],
- variable_data: vec![]
- };
- for i in 0..1998 {
- nft_data.const_data.push(10);
- nft_data.variable_data.push(10);
- }
- let data = CreateItemData::NFT(nft_data);
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
+
+ #[extra]
+ create_item_nft_large {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ let mut nft_data = CreateNftData {
+ const_data: vec![],
+ variable_data: vec![]
+ };
+ for i in 0..1998 {
+ nft_data.const_data.push(10);
+ nft_data.variable_data.push(10);
+ }
+ let data = CreateItemData::NFT(nft_data);
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+
+ }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
- }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
+ // fungible item
+ create_item_fungible {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::Fungible(3);
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let data = default_fungible_data();
+
+ }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
+
+ // refungible item
+ create_item_refungible {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::ReFungible(3);
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let data = default_re_fungible_data();
- // fungible item
- create_item_fungible {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::Fungible(3);
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let data = default_fungible_data();
+ }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
- }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
+ burn_item {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let data = default_nft_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
- // refungible item
- create_item_refungible {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::ReFungible(3);
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let data = default_re_fungible_data();
+ }: burn_item(RawOrigin::Signed(caller.clone()), 2, 1)
- }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
+ transfer_nft {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let recipient: T::AccountId = account("recipient", 0, SEED);
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let data = default_nft_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
- burn_item {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let data = default_nft_data();
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
+ }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)
- }: burn_item(RawOrigin::Signed(caller.clone()), 2, 1)
+ transfer_fungible {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::Fungible(3);
+ let recipient: T::AccountId = account("recipient", 0, SEED);
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let data = default_fungible_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
- transfer_nft {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let recipient: T::AccountId = account("recipient", 0, SEED);
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let data = default_nft_data();
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
+ }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)
- }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)
-
- transfer_fungible {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::Fungible(3);
- let recipient: T::AccountId = account("recipient", 0, SEED);
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let data = default_fungible_data();
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
+ transfer_refungible {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::ReFungible(3);
+ let recipient: T::AccountId = account("recipient", 0, SEED);
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let data = default_re_fungible_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
- }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)
+ }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)
- transfer_refungible {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::ReFungible(3);
- let recipient: T::AccountId = account("recipient", 0, SEED);
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let data = default_re_fungible_data();
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
+ approve {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::ReFungible(3);
+ let recipient: T::AccountId = account("recipient", 0, SEED);
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let data = default_re_fungible_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
- }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)
+ }: approve(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1)
- approve {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::ReFungible(3);
- let recipient: T::AccountId = account("recipient", 0, SEED);
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let data = default_re_fungible_data();
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
+ // Nft
+ transfer_from_nft {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let recipient: T::AccountId = account("recipient", 0, SEED);
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let data = default_nft_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
+ Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;
- }: approve(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1)
+ }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)
- // Nft
- transfer_from_nft {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let recipient: T::AccountId = account("recipient", 0, SEED);
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let data = default_nft_data();
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
- Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;
+ // Fungible
+ transfer_from_fungible {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::Fungible(3);
+ let recipient: T::AccountId = account("recipient", 0, SEED);
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let data = default_fungible_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
+ Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;
- }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)
+ }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)
- // Fungible
- transfer_from_fungible {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::Fungible(3);
- let recipient: T::AccountId = account("recipient", 0, SEED);
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let data = default_fungible_data();
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
- Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;
+ // ReFungible
+ transfer_from_refungible {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::ReFungible(3);
+ let recipient: T::AccountId = account("recipient", 0, SEED);
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let data = default_re_fungible_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
+ Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;
- }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)
+ }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)
- // ReFungible
- transfer_from_refungible {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::ReFungible(3);
- let recipient: T::AccountId = account("recipient", 0, SEED);
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let data = default_re_fungible_data();
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
- Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;
+ enable_contract_sponsoring {
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)
+ }: enable_contract_sponsoring(RawOrigin::Signed(caller.clone()), caller.clone(), true)
- enable_contract_sponsoring {
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ set_offchain_schema {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::ReFungible(3);
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- }: enable_contract_sponsoring(RawOrigin::Signed(caller.clone()), caller.clone(), true)
+ }: set_offchain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())
- set_offchain_schema {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::ReFungible(3);
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ set_const_on_chain_schema {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::ReFungible(3);
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ }: set_const_on_chain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())
- }: set_offchain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())
+ set_variable_on_chain_schema {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::ReFungible(3);
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ }: set_variable_on_chain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())
- set_const_on_chain_schema {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::ReFungible(3);
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- }: set_const_on_chain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())
-
- set_variable_on_chain_schema {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::ReFungible(3);
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- }: set_variable_on_chain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())
+ set_variable_meta_data {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let data = default_nft_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
- set_variable_meta_data {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let data = default_nft_data();
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
+ }: set_variable_meta_data(RawOrigin::Signed(caller.clone()), 2, 1, [1, 2, 3].to_vec())
- }: set_variable_meta_data(RawOrigin::Signed(caller.clone()), 2, 1, [1, 2, 3].to_vec())
+ set_schema_version {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ }: set_schema_version(RawOrigin::Signed(caller.clone()), 2, SchemaVersion::Unique)
- set_schema_version {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- }: set_schema_version(RawOrigin::Signed(caller.clone()), 2, SchemaVersion::Unique)
+ set_chain_limits {
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ let limits = ChainLimits {
+ collection_numbers_limit: 0,
+ account_token_ownership_limit: 0,
+ collections_admins_limit: 0,
+ custom_data_limit: 0,
+ nft_sponsor_transfer_timeout: 0,
+ fungible_sponsor_transfer_timeout: 0,
+ refungible_sponsor_transfer_timeout: 0
+ };
+ }: set_chain_limits(RawOrigin::Signed(caller.clone()), limits)
- set_chain_limits {
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- let limits = ChainLimits {
- collection_numbers_limit: 0,
- account_token_ownership_limit: 0,
- collections_admins_limit: 0,
- custom_data_limit: 0,
- nft_sponsor_transfer_timeout: 0,
- fungible_sponsor_transfer_timeout: 0,
- refungible_sponsor_transfer_timeout: 0
- };
- }: set_chain_limits(RawOrigin::Signed(caller.clone()), limits)
+ set_contract_sponsoring_rate_limit {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let block_number: T::BlockNumber = 0.into();
+ }: set_contract_sponsoring_rate_limit(RawOrigin::Signed(caller.clone()), caller.clone(), block_number)
- set_contract_sponsoring_rate_limit {
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- let block_number: T::BlockNumber = 0.into();
- }: set_contract_sponsoring_rate_limit(RawOrigin::Signed(caller.clone()), caller.clone(), block_number)
+ set_collection_limits{
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- set_collection_limits{
- let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
-
- let cl = CollectionLimits {
- account_token_ownership_limit: 0,
- sponsored_data_size: 0,
- token_limit: 0,
- sponsor_transfer_timeout: 0
- };
+ let cl = CollectionLimits {
+ account_token_ownership_limit: 0,
+ sponsored_data_size: 0,
+ token_limit: 0,
+ sponsor_transfer_timeout: 0
+ };
- }: set_collection_limits(RawOrigin::Signed(caller.clone()), 2, cl)
+ }: set_collection_limits(RawOrigin::Signed(caller.clone()), 2, cl)
- add_to_contract_white_list{
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- }: add_to_contract_white_list(RawOrigin::Signed(caller.clone()), caller.clone(), caller.clone())
+ add_to_contract_white_list{
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ }: add_to_contract_white_list(RawOrigin::Signed(caller.clone()), caller.clone(), caller.clone())
- remove_from_contract_white_list{
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- Nft::<T>::add_to_contract_white_list(RawOrigin::Signed(caller.clone()).into(), caller.clone(), caller.clone())?;
- }: remove_from_contract_white_list(RawOrigin::Signed(caller.clone()), caller.clone(), caller.clone())
+ remove_from_contract_white_list{
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::add_to_contract_white_list(RawOrigin::Signed(caller.clone()).into(), caller.clone(), caller.clone())?;
+ }: remove_from_contract_white_list(RawOrigin::Signed(caller.clone()), caller.clone(), caller.clone())
- toggle_contract_white_list{
- let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- }: toggle_contract_white_list(RawOrigin::Signed(caller.clone()), caller.clone(), true)
+ toggle_contract_white_list{
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ }: toggle_contract_white_list(RawOrigin::Signed(caller.clone()), caller.clone(), true)
*/
}
pallets/nft/src/default_weights.rsdiffbeforeafterboth--- a/pallets/nft/src/default_weights.rs
+++ b/pallets/nft/src/default_weights.rs
@@ -2,154 +2,154 @@
impl crate::WeightInfo for () {
fn create_collection() -> Weight {
- (70_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(7 as Weight))
- .saturating_add(DbWeight::get().writes(5 as Weight))
+ 70_000_000_u64
+ .saturating_add(DbWeight::get().reads(7_u64))
+ .saturating_add(DbWeight::get().writes(5_u64))
}
fn destroy_collection() -> Weight {
- (90_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(5 as Weight))
+ 90_000_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(5_u64))
}
fn add_to_white_list() -> Weight {
- (30_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(3 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn remove_from_white_list() -> Weight {
- (35_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(3 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
+ 30_000_000_u64
+ .saturating_add(DbWeight::get().reads(3_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn remove_from_white_list() -> Weight {
+ 35_000_000_u64
+ .saturating_add(DbWeight::get().reads(3_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
}
fn set_public_access_mode() -> Weight {
- (27_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(1 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
+ 27_000_000_u64
+ .saturating_add(DbWeight::get().reads(1_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
}
fn set_mint_permission() -> Weight {
- (27_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(1 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
+ 27_000_000_u64
+ .saturating_add(DbWeight::get().reads(1_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
}
fn change_collection_owner() -> Weight {
- (27_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(1 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
+ 27_000_000_u64
+ .saturating_add(DbWeight::get().reads(1_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
}
fn add_collection_admin() -> Weight {
- (32_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(3 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
+ 32_000_000_u64
+ .saturating_add(DbWeight::get().reads(3_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
}
fn remove_collection_admin() -> Weight {
- (50_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn set_collection_sponsor() -> Weight {
- (32_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn confirm_sponsorship() -> Weight {
- (22_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(1 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn remove_collection_sponsor() -> Weight {
- (24_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(1 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn create_item(s: usize, ) -> Weight {
- (130_000_000 as Weight)
- .saturating_add((2135 as Weight).saturating_mul(s as Weight).saturating_mul(500 as Weight)) // 500 is temporary multiplier, fee for storage
- .saturating_add(DbWeight::get().reads(10 as Weight))
- .saturating_add(DbWeight::get().writes(8 as Weight))
- }
- fn burn_item() -> Weight {
- (170_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(9 as Weight))
- .saturating_add(DbWeight::get().writes(7 as Weight))
- }
- fn transfer() -> Weight {
- (125_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(7 as Weight))
- .saturating_add(DbWeight::get().writes(7 as Weight))
- }
- fn approve() -> Weight {
- (45_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(3 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn transfer_from() -> Weight {
- (150_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(9 as Weight))
- .saturating_add(DbWeight::get().writes(8 as Weight))
- }
- fn set_offchain_schema() -> Weight {
- (33_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn set_const_on_chain_schema() -> Weight {
- (11_100_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn set_variable_on_chain_schema() -> Weight {
- (11_100_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn set_variable_meta_data() -> Weight {
- (17_500_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn enable_contract_sponsoring() -> Weight {
- (13_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(1 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn set_schema_version() -> Weight {
- (8_500_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn set_chain_limits() -> Weight {
- (1_300_000 as Weight)
- .saturating_add(DbWeight::get().reads(0 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn set_contract_sponsoring_rate_limit() -> Weight {
- (3_500_000 as Weight)
- .saturating_add(DbWeight::get().reads(0 as Weight))
- .saturating_add(DbWeight::get().writes(2 as Weight))
- }
- fn set_variable_meta_data_sponsoring_rate_limit() -> Weight {
- (3_500_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn toggle_contract_white_list() -> Weight {
- (3_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(0 as Weight))
- .saturating_add(DbWeight::get().writes(2 as Weight))
- }
- fn add_to_contract_white_list() -> Weight {
- (3_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(0 as Weight))
- .saturating_add(DbWeight::get().writes(2 as Weight))
- }
- fn remove_from_contract_white_list() -> Weight {
- (3_200_000 as Weight)
- .saturating_add(DbWeight::get().reads(0 as Weight))
- .saturating_add(DbWeight::get().writes(2 as Weight))
- }
- fn set_collection_limits() -> Weight {
- (8_900_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
+ 50_000_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn set_collection_sponsor() -> Weight {
+ 32_000_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn confirm_sponsorship() -> Weight {
+ 22_000_000_u64
+ .saturating_add(DbWeight::get().reads(1_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn remove_collection_sponsor() -> Weight {
+ 24_000_000_u64
+ .saturating_add(DbWeight::get().reads(1_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn create_item(s: usize) -> Weight {
+ 130_000_000_u64
+ .saturating_add(2135_u64.saturating_mul(s as Weight).saturating_mul(500_u64)) // 500 is temporary multiplier, fee for storage
+ .saturating_add(DbWeight::get().reads(10_u64))
+ .saturating_add(DbWeight::get().writes(8_u64))
+ }
+ fn burn_item() -> Weight {
+ 170_000_000_u64
+ .saturating_add(DbWeight::get().reads(9_u64))
+ .saturating_add(DbWeight::get().writes(7_u64))
+ }
+ fn transfer() -> Weight {
+ 125_000_000_u64
+ .saturating_add(DbWeight::get().reads(7_u64))
+ .saturating_add(DbWeight::get().writes(7_u64))
+ }
+ fn approve() -> Weight {
+ 45_000_000_u64
+ .saturating_add(DbWeight::get().reads(3_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn transfer_from() -> Weight {
+ 150_000_000_u64
+ .saturating_add(DbWeight::get().reads(9_u64))
+ .saturating_add(DbWeight::get().writes(8_u64))
+ }
+ fn set_offchain_schema() -> Weight {
+ 33_000_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn set_const_on_chain_schema() -> Weight {
+ 11_100_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn set_variable_on_chain_schema() -> Weight {
+ 11_100_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn set_variable_meta_data() -> Weight {
+ 17_500_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn enable_contract_sponsoring() -> Weight {
+ 13_000_000_u64
+ .saturating_add(DbWeight::get().reads(1_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn set_schema_version() -> Weight {
+ 8_500_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn set_chain_limits() -> Weight {
+ 1_300_000_u64
+ .saturating_add(DbWeight::get().reads(0_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn set_contract_sponsoring_rate_limit() -> Weight {
+ 3_500_000_u64
+ .saturating_add(DbWeight::get().reads(0_u64))
+ .saturating_add(DbWeight::get().writes(2_u64))
+ }
+ fn set_variable_meta_data_sponsoring_rate_limit() -> Weight {
+ 3_500_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn toggle_contract_white_list() -> Weight {
+ 3_000_000_u64
+ .saturating_add(DbWeight::get().reads(0_u64))
+ .saturating_add(DbWeight::get().writes(2_u64))
+ }
+ fn add_to_contract_white_list() -> Weight {
+ 3_000_000_u64
+ .saturating_add(DbWeight::get().reads(0_u64))
+ .saturating_add(DbWeight::get().writes(2_u64))
+ }
+ fn remove_from_contract_white_list() -> Weight {
+ 3_200_000_u64
+ .saturating_add(DbWeight::get().reads(0_u64))
+ .saturating_add(DbWeight::get().writes(2_u64))
+ }
+ fn set_collection_limits() -> Weight {
+ 8_900_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
}
pallets/nft/src/eth/account.rsdiffbeforeafterboth--- a/pallets/nft/src/eth/account.rs
+++ b/pallets/nft/src/eth/account.rs
@@ -8,128 +8,129 @@
use sp_std::vec::Vec;
use sp_std::clone::Clone;
-pub trait CrossAccountId<AccountId>:
- Encode + EncodeLike + Decode +
- Clone + PartialEq + Ord + core::fmt::Debug // +
- // Serialize + Deserialize<'static>
+pub trait CrossAccountId<AccountId>:
+ Encode + EncodeLike + Decode + Clone + PartialEq + Ord + core::fmt::Debug
+// +
+// Serialize + Deserialize<'static>
{
- fn as_sub(&self) -> &AccountId;
- fn as_eth(&self) -> &H160;
+ fn as_sub(&self) -> &AccountId;
+ fn as_eth(&self) -> &H160;
- fn from_sub(account: AccountId) -> Self;
- fn from_eth(account: H160) -> Self;
+ fn from_sub(account: AccountId) -> Self;
+ fn from_eth(account: H160) -> Self;
}
-#[derive(Eq)]
-#[derive(Serialize, Deserialize)]
+#[derive(Eq, Serialize, Deserialize)]
pub struct BasicCrossAccountId<T: Config> {
- /// If true - then ethereum is canonical encoding
- from_ethereum: bool,
- substrate: T::AccountId,
- ethereum: H160,
+ /// If true - then ethereum is canonical encoding
+ from_ethereum: bool,
+ substrate: T::AccountId,
+ ethereum: H160,
}
impl<T: Config> core::fmt::Debug for BasicCrossAccountId<T> {
- fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
- if self.from_ethereum {
- fmt.debug_tuple("CrossAccountId::Ethereum")
- .field(&self.ethereum)
- .finish()
- } else {
- fmt.debug_tuple("CrossAccountId::Substrate")
- .field(&self.substrate)
- .finish()
- }
- }
+ fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
+ if self.from_ethereum {
+ fmt.debug_tuple("CrossAccountId::Ethereum")
+ .field(&self.ethereum)
+ .finish()
+ } else {
+ fmt.debug_tuple("CrossAccountId::Substrate")
+ .field(&self.substrate)
+ .finish()
+ }
+ }
}
impl<T: Config> PartialOrd for BasicCrossAccountId<T> {
- fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
- Some(self.substrate.cmp(&other.substrate))
- }
+ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+ Some(self.substrate.cmp(&other.substrate))
+ }
}
impl<T: Config> Ord for BasicCrossAccountId<T> {
- fn cmp(&self, other: &Self) -> Ordering {
- self.partial_cmp(other).expect("substrate account is total ordered")
- }
+ fn cmp(&self, other: &Self) -> Ordering {
+ self.partial_cmp(other)
+ .expect("substrate account is total ordered")
+ }
}
impl<T: Config> PartialEq for BasicCrossAccountId<T> {
- fn eq(&self, other: &Self) -> bool {
- if self.from_ethereum == other.from_ethereum {
- self.substrate == other.substrate && self.ethereum == other.ethereum
- } else if self.from_ethereum {
- // ethereum is canonical encoding, but we need to compare derived address
- self.substrate == other.substrate
- } else {
- self.ethereum == other.ethereum
- }
- }
+ fn eq(&self, other: &Self) -> bool {
+ if self.from_ethereum == other.from_ethereum {
+ self.substrate == other.substrate && self.ethereum == other.ethereum
+ } else if self.from_ethereum {
+ // ethereum is canonical encoding, but we need to compare derived address
+ self.substrate == other.substrate
+ } else {
+ self.ethereum == other.ethereum
+ }
+ }
}
impl<T: Config> Clone for BasicCrossAccountId<T> {
- fn clone(&self) -> Self {
- Self {
- from_ethereum: self.from_ethereum,
- substrate: self.substrate.clone(),
- ethereum: self.ethereum,
- }
- }
+ fn clone(&self) -> Self {
+ Self {
+ from_ethereum: self.from_ethereum,
+ substrate: self.substrate.clone(),
+ ethereum: self.ethereum,
+ }
+ }
}
impl<T: Config> Encode for BasicCrossAccountId<T> {
- fn encode(&self) -> Vec<u8> {
- let as_result = if !self.from_ethereum {
- Ok(self.substrate.clone())
- } else {
- Err(self.ethereum)
- };
- as_result.encode()
- }
+ fn encode(&self) -> Vec<u8> {
+ let as_result = if !self.from_ethereum {
+ Ok(self.substrate.clone())
+ } else {
+ Err(self.ethereum)
+ };
+ as_result.encode()
+ }
}
impl<T: Config> EncodeLike for BasicCrossAccountId<T> {}
impl<T: Config> Decode for BasicCrossAccountId<T> {
- fn decode<I>(input: &mut I) -> Result<Self, codec::Error>
- where I: codec::Input
- {
- Ok(match <Result<T::AccountId, H160>>::decode(input)? {
- Ok(s) => Self::from_sub(s),
- Err(e) => Self::from_eth(e),
- })
- }
+ fn decode<I>(input: &mut I) -> Result<Self, codec::Error>
+ where
+ I: codec::Input,
+ {
+ Ok(match <Result<T::AccountId, H160>>::decode(input)? {
+ Ok(s) => Self::from_sub(s),
+ Err(e) => Self::from_eth(e),
+ })
+ }
}
impl<T: Config> CrossAccountId<T::AccountId> for BasicCrossAccountId<T> {
- fn as_sub(&self) -> &T::AccountId {
- &self.substrate
- }
- fn as_eth(&self) -> &H160 {
- &self.ethereum
- }
- fn from_sub(substrate: T::AccountId) -> Self {
- Self {
- ethereum: T::EvmBackwardsAddressMapping::from_account_id(substrate.clone()),
- substrate,
- from_ethereum: false,
- }
- }
- fn from_eth(ethereum: H160) -> Self {
- Self {
- ethereum,
- substrate: T::EvmAddressMapping::into_account_id(ethereum),
- from_ethereum: true,
- }
- }
+ fn as_sub(&self) -> &T::AccountId {
+ &self.substrate
+ }
+ fn as_eth(&self) -> &H160 {
+ &self.ethereum
+ }
+ fn from_sub(substrate: T::AccountId) -> Self {
+ Self {
+ ethereum: T::EvmBackwardsAddressMapping::from_account_id(substrate.clone()),
+ substrate,
+ from_ethereum: false,
+ }
+ }
+ fn from_eth(ethereum: H160) -> Self {
+ Self {
+ ethereum,
+ substrate: T::EvmAddressMapping::into_account_id(ethereum),
+ from_ethereum: true,
+ }
+ }
}
pub trait EvmBackwardsAddressMapping<AccountId> {
- fn from_account_id(account_id: AccountId) -> H160;
+ fn from_account_id(account_id: AccountId) -> H160;
}
/// Should have same mapping as EnsureAddressTruncated
pub struct MapBackwardsAddressTruncated;
impl EvmBackwardsAddressMapping<AccountId32> for MapBackwardsAddressTruncated {
- fn from_account_id(account_id: AccountId32) -> H160 {
- let mut out = [0; 20];
- out.copy_from_slice(&(account_id.as_ref() as &[u8])[0..20]);
- H160(out)
- }
-}
\ No newline at end of file
+ fn from_account_id(account_id: AccountId32) -> H160 {
+ let mut out = [0; 20];
+ out.copy_from_slice(&(account_id.as_ref() as &[u8])[0..20]);
+ H160(out)
+ }
+}
pallets/nft/src/eth/erc.rsdiffbeforeafterboth--- a/pallets/nft/src/eth/erc.rs
+++ b/pallets/nft/src/eth/erc.rs
@@ -3,132 +3,199 @@
#[solidity_interface]
pub trait InlineNameSymbol {
- type Error;
+ type Error;
- fn name(&self) -> Result<string, Self::Error>;
- fn symbol(&self) -> Result<string, Self::Error>;
+ fn name(&self) -> Result<string, Self::Error>;
+ fn symbol(&self) -> Result<string, Self::Error>;
}
#[solidity_interface]
pub trait InlineTotalSupply {
- type Error;
+ type Error;
- fn total_supply(&self) -> Result<uint256, Self::Error>;
+ fn total_supply(&self) -> Result<uint256, Self::Error>;
}
#[solidity_interface]
pub trait ERC165 {
- type Error;
+ type Error;
- fn supports_interface(&self, interface_id: bytes4) -> Result<bool, Self::Error>;
+ fn supports_interface(&self, interface_id: bytes4) -> Result<bool, Self::Error>;
}
#[solidity_interface(inline_is(InlineNameSymbol))]
pub trait ERC721Metadata {
- type Error;
+ type Error;
- #[solidity(rename_selector = "tokenURI")]
- fn token_uri(&self, token_id: uint256) -> Result<string, Self::Error>;
+ #[solidity(rename_selector = "tokenURI")]
+ fn token_uri(&self, token_id: uint256) -> Result<string, Self::Error>;
}
#[solidity_interface(inline_is(InlineTotalSupply))]
pub trait ERC721Enumerable {
- type Error;
+ type Error;
- fn token_by_index(&self, index: uint256) -> Result<uint256, Self::Error>;
- fn token_of_owner_by_index(&self, owner: address, index: uint256) -> Result<uint256, Self::Error>;
+ fn token_by_index(&self, index: uint256) -> Result<uint256, Self::Error>;
+ fn token_of_owner_by_index(
+ &self,
+ owner: address,
+ index: uint256,
+ ) -> Result<uint256, Self::Error>;
}
-
#[derive(ToLog)]
pub enum ERC721Events {
- Transfer {
- #[indexed] from: address,
- #[indexed] to: address,
- #[indexed] token_id: uint256,
- },
- Approval {
- #[indexed] owner: address,
- #[indexed] approved: address,
- #[indexed] token_id: uint256,
- },
- #[allow(dead_code)]
- ApprovalForAll {
- #[indexed] owner: address,
- #[indexed] operator: address,
- approved: bool,
- }
+ Transfer {
+ #[indexed]
+ from: address,
+ #[indexed]
+ to: address,
+ #[indexed]
+ token_id: uint256,
+ },
+ Approval {
+ #[indexed]
+ owner: address,
+ #[indexed]
+ approved: address,
+ #[indexed]
+ token_id: uint256,
+ },
+ #[allow(dead_code)]
+ ApprovalForAll {
+ #[indexed]
+ owner: address,
+ #[indexed]
+ operator: address,
+ approved: bool,
+ },
}
#[solidity_interface(is(ERC165), events(ERC721Events))]
pub trait ERC721 {
- type Error;
+ type Error;
- fn balance_of(&self, owner: address) -> Result<uint256, Self::Error>;
- fn owner_of(&self, token_id: uint256) -> Result<address, Self::Error>;
+ fn balance_of(&self, owner: address) -> Result<uint256, Self::Error>;
+ fn owner_of(&self, token_id: uint256) -> Result<address, Self::Error>;
- #[solidity(rename_selector = "safeTransferFrom")]
- fn safe_transfer_from_with_data(&mut self, from: address, to: address, token_id: uint256, data: bytes, value: value) -> Result<void, Self::Error>;
- fn safe_transfer_from(&mut self, from: address, to: address, token_id: uint256, value: value) -> Result<void, Self::Error>;
+ #[solidity(rename_selector = "safeTransferFrom")]
+ fn safe_transfer_from_with_data(
+ &mut self,
+ from: address,
+ to: address,
+ token_id: uint256,
+ data: bytes,
+ value: value,
+ ) -> Result<void, Self::Error>;
+ fn safe_transfer_from(
+ &mut self,
+ from: address,
+ to: address,
+ token_id: uint256,
+ value: value,
+ ) -> Result<void, Self::Error>;
- fn transfer_from(&mut self, caller: caller, from: address, to: address, token_id: uint256, value: value) -> Result<void, Self::Error>;
- fn approve(&mut self, caller: caller, approved: address, token_id: uint256, value: value) -> Result<void, Self::Error>;
- fn set_approval_for_all(&mut self, caller: caller, operator: address, approved: bool) -> Result<void, Self::Error>;
+ fn transfer_from(
+ &mut self,
+ caller: caller,
+ from: address,
+ to: address,
+ token_id: uint256,
+ value: value,
+ ) -> Result<void, Self::Error>;
+ fn approve(
+ &mut self,
+ caller: caller,
+ approved: address,
+ token_id: uint256,
+ value: value,
+ ) -> Result<void, Self::Error>;
+ fn set_approval_for_all(
+ &mut self,
+ caller: caller,
+ operator: address,
+ approved: bool,
+ ) -> Result<void, Self::Error>;
- fn get_approved(&self, token_id: uint256) -> Result<address, Self::Error>;
- fn is_approved_for_all(&self, owner: address, operator: address) -> Result<address, Self::Error>;
+ fn get_approved(&self, token_id: uint256) -> Result<address, Self::Error>;
+ fn is_approved_for_all(
+ &self,
+ owner: address,
+ operator: address,
+ ) -> Result<address, Self::Error>;
}
#[solidity_interface]
pub trait ERC721UniqueExtensions {
- type Error;
+ type Error;
- fn transfer(&mut self, caller: caller, to: address, token_id: uint256, value: value) -> Result<void, Self::Error>;
+ fn transfer(
+ &mut self,
+ caller: caller,
+ to: address,
+ token_id: uint256,
+ value: value,
+ ) -> Result<void, Self::Error>;
}
-#[solidity_interface(is(ERC165, ERC721, ERC721Metadata, ERC721Enumerable, ERC721UniqueExtensions))]
+#[solidity_interface(is(
+ ERC165,
+ ERC721,
+ ERC721Metadata,
+ ERC721Enumerable,
+ ERC721UniqueExtensions
+))]
pub trait UniqueNFT {
- type Error;
+ type Error;
}
#[derive(ToLog)]
pub enum ERC20Events {
- Transfer {
- #[indexed] from: address,
- #[indexed] to: address,
- value: uint256,
- },
- Approval {
- #[indexed] owner: address,
- #[indexed] spender: address,
- value: uint256,
- }
+ Transfer {
+ #[indexed]
+ from: address,
+ #[indexed]
+ to: address,
+ value: uint256,
+ },
+ Approval {
+ #[indexed]
+ owner: address,
+ #[indexed]
+ spender: address,
+ value: uint256,
+ },
}
#[solidity_interface(inline_is(InlineNameSymbol, InlineTotalSupply), events(ERC20Events))]
pub trait ERC20 {
- type Error;
-
- fn decimals(&self) -> Result<uint8, Self::Error>;
- fn balance_of(&self, owner: address) -> Result<uint256, Self::Error>;
- fn transfer(&mut self, caller: caller, to: address, value: uint256) -> Result<bool, Self::Error>;
- fn transfer_from(&mut self, caller: caller, from: address, to: address, value: uint256) -> Result<bool, Self::Error>;
- fn approve(&mut self, caller: caller, spender: address, value: uint256) -> Result<bool, Self::Error>;
- fn allowance(&self, owner: address, spender: address) -> Result<uint256, Self::Error>;
+ type Error;
+
+ fn decimals(&self) -> Result<uint8, Self::Error>;
+ fn balance_of(&self, owner: address) -> Result<uint256, Self::Error>;
+ fn transfer(
+ &mut self,
+ caller: caller,
+ to: address,
+ value: uint256,
+ ) -> Result<bool, Self::Error>;
+ fn transfer_from(
+ &mut self,
+ caller: caller,
+ from: address,
+ to: address,
+ value: uint256,
+ ) -> Result<bool, Self::Error>;
+ fn approve(
+ &mut self,
+ caller: caller,
+ spender: address,
+ value: uint256,
+ ) -> Result<bool, Self::Error>;
+ fn allowance(&self, owner: address, spender: address) -> Result<uint256, Self::Error>;
}
#[solidity_interface(is(ERC165, ERC20))]
pub trait UniqueFungible {
- type Error;
+ type Error;
}
-
-/// Runtime metadata like helpers for evm
-#[solidity_interface]
-trait UniqueHelpers {
- type Error;
-
- /// Returns interface for NFT collections
- fn nft_interface(&self) -> Result<string, Self::Error>;
- /// Returns interface for Fungible collections
- fn fungible_interface(&self) -> Result<string, Self::Error>;
-}
\ No newline at end of file
pallets/nft/src/eth/erc_impl.rsdiffbeforeafterboth--- a/pallets/nft/src/eth/erc_impl.rs
+++ b/pallets/nft/src/eth/erc_impl.rs
@@ -56,7 +56,7 @@
Ok(index)
}
- fn token_of_owner_by_index(&self, owner: address, index: uint256) -> Result<uint256> {
+ fn token_of_owner_by_index(&self, _owner: address, _index: uint256) -> Result<uint256> {
// TODO: Not implemetable
Err("not implemented".into())
}
@@ -77,7 +77,7 @@
fn owner_of(&self, token_id: uint256) -> Result<address> {
let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;
let token = <NftItemList<T>>::get(self.id, token_id).ok_or("unknown token")?;
- Ok(token.owner.as_eth().clone())
+ Ok(*token.owner.as_eth())
}
fn safe_transfer_from_with_data(
&mut self,
@@ -170,7 +170,7 @@
caller: caller,
to: address,
token_id: uint256,
- value: value,
+ _value: value,
) -> Result<void> {
let caller = T::CrossAccountId::from_eth(caller);
let to = T::CrossAccountId::from_eth(to);
pallets/nft/src/eth/log.rsdiffbeforeafterboth--- a/pallets/nft/src/eth/log.rs
+++ b/pallets/nft/src/eth/log.rs
@@ -1,19 +1,19 @@
use sp_std::cell::RefCell;
use sp_std::vec::Vec;
-use sp_core::{H160, H256};
+
use ethereum::Log;
#[derive(Default)]
pub struct LogRecorder(RefCell<Vec<Log>>);
impl LogRecorder {
- pub fn is_empty(&self) -> bool {
- self.0.borrow().is_empty()
- }
- pub fn log(&self, log: Log) {
- self.0.borrow_mut().push(log);
- }
- pub fn retrieve_logs(self) -> Vec<Log> {
- self.0.into_inner()
- }
+ pub fn is_empty(&self) -> bool {
+ self.0.borrow().is_empty()
+ }
+ pub fn log(&self, log: Log) {
+ self.0.borrow_mut().push(log);
+ }
+ pub fn retrieve_logs(self) -> Vec<Log> {
+ self.0.into_inner()
+ }
}
pallets/nft/src/eth/mod.rsdiffbeforeafterboth--- a/pallets/nft/src/eth/mod.rs
+++ b/pallets/nft/src/eth/mod.rs
@@ -28,7 +28,7 @@
];
fn map_eth_to_id(eth: &H160) -> Option<CollectionId> {
- if ð[0..16] != ETH_ACCOUNT_PREFIX {
+ if eth[0..16] != ETH_ACCOUNT_PREFIX {
return None;
}
let mut id_bytes = [0; 4];
@@ -92,12 +92,9 @@
},
)?))
}
- _ => {
- return Err(StringError::from(
- "erc calls only supported to fungible and nft collections for now",
- )
- .into())
- }
+ _ => Err(StringError::from(
+ "erc calls only supported to fungible and nft collections for now",
+ )),
}
}
@@ -156,11 +153,10 @@
// TODO: This function is slow, and output can be memoized
pub fn generate_transaction(collection_id: u32, chain_id: u64) -> ethereum::Transaction {
- let contract = collection_id_to_address(collection_id);
-
// FIXME: Can be done on wasm runtime with https://github.com/paritytech/substrate/pull/8728
#[cfg(feature = "std")]
{
+ let contract = collection_id_to_address(collection_id);
let signed = ethereum_tx_sign::RawTransaction {
nonce: 0.into(),
to: Some(contract.0.into()),
@@ -183,6 +179,6 @@
}
#[cfg(not(feature = "std"))]
{
- panic!("transaction generation not yet supported by wasm runtime")
+ panic!("transaction generation not yet supported by wasm runtime while generating transaction for collection_id {}, chain_id {}", collection_id, chain_id)
}
}
pallets/nft/src/eth/sponsoring.rsdiffbeforeafterboth--- a/pallets/nft/src/eth/sponsoring.rs
+++ b/pallets/nft/src/eth/sponsoring.rs
@@ -1,142 +1,170 @@
//! Implements EVM sponsoring logic via OnChargeEVMTransaction
-use crate::{Collection, ChainLimit, CollectionById, Config, NftTransferBasket, FungibleTransferBasket, eth::account::EvmBackwardsAddressMapping};
+use crate::{
+ Collection, ChainLimit, CollectionById, Config, NftTransferBasket, FungibleTransferBasket,
+ eth::account::EvmBackwardsAddressMapping,
+};
use evm_coder::abi::AbiReader;
-use frame_support::{storage::{StorageMap, StorageDoubleMap, StorageValue}, traits::Currency};
+use frame_support::{
+ storage::{StorageMap, StorageDoubleMap, StorageValue},
+ traits::Currency,
+};
use pallet_evm::{EVMCurrencyAdapter, WithdrawReason};
use sp_core::{H160, U256};
use sp_std::prelude::*;
-use super::{account::CrossAccountId, erc::{UniqueFungibleCall, UniqueNFTCall, ERC721Call, ERC20Call, ERC721UniqueExtensionsCall}};
+use super::{
+ account::CrossAccountId,
+ erc::{UniqueFungibleCall, UniqueNFTCall, ERC721Call, ERC20Call, ERC721UniqueExtensionsCall},
+};
use core::convert::TryInto;
type NegativeImbalanceOf<C, T> =
- <C as Currency<<T as frame_system::Config>::AccountId>>::NegativeImbalance;
+ <C as Currency<<T as frame_system::Config>::AccountId>>::NegativeImbalance;
pub struct ChargeEvmTransaction;
pub struct ChargeEvmLiquidityInfo<T>
where
- T: Config,
- T: pallet_evm::Config,
+ T: Config,
+ T: pallet_evm::Config,
{
- who: H160,
- negative_imbalance: NegativeImbalanceOf<<T as Config>::Currency, T>,
+ who: H160,
+ negative_imbalance: NegativeImbalanceOf<<T as Config>::Currency, T>,
}
struct AnyError;
-fn try_sponsor<T: Config>(caller: &H160, collection_id: u32, collection: &Collection<T>, call: &[u8]) -> Result<(), AnyError> {
- let (method_id, mut reader) = AbiReader::new_call(call).map_err(|_| AnyError)?;
- match &collection.mode {
- crate::CollectionMode::NFT => {
- let call: UniqueNFTCall = UniqueNFTCall::parse(method_id, &mut reader).map_err(|_| AnyError)?.ok_or(AnyError)?;
- match call {
- UniqueNFTCall::ERC721UniqueExtensions(ERC721UniqueExtensionsCall::Transfer {token_id, ..}) | UniqueNFTCall::ERC721(ERC721Call::TransferFrom {token_id, ..}) => {
- let token_id: u32 = token_id.try_into().map_err(|_| AnyError)?;
- let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
- let collection_limits = &collection.limits;
- let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
- collection_limits.sponsor_transfer_timeout
- } else {
- ChainLimit::get().nft_sponsor_transfer_timeout
- };
+fn try_sponsor<T: Config>(
+ caller: &H160,
+ collection_id: u32,
+ collection: &Collection<T>,
+ call: &[u8],
+) -> Result<(), AnyError> {
+ let (method_id, mut reader) = AbiReader::new_call(call).map_err(|_| AnyError)?;
+ match &collection.mode {
+ crate::CollectionMode::NFT => {
+ let call: UniqueNFTCall = UniqueNFTCall::parse(method_id, &mut reader)
+ .map_err(|_| AnyError)?
+ .ok_or(AnyError)?;
+ match call {
+ UniqueNFTCall::ERC721UniqueExtensions(ERC721UniqueExtensionsCall::Transfer {
+ token_id,
+ ..
+ })
+ | UniqueNFTCall::ERC721(ERC721Call::TransferFrom { token_id, .. }) => {
+ let token_id: u32 = token_id.try_into().map_err(|_| AnyError)?;
+ let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
+ let collection_limits = &collection.limits;
+ let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
+ collection_limits.sponsor_transfer_timeout
+ } else {
+ ChainLimit::get().nft_sponsor_transfer_timeout
+ };
- let mut sponsor = true;
- if <NftTransferBasket<T>>::contains_key(collection_id, token_id) {
- let last_tx_block = <NftTransferBasket<T>>::get(collection_id, token_id);
- let limit_time = last_tx_block + limit.into();
- if block_number <= limit_time {
- sponsor = false;
- }
- }
- if sponsor {
- <NftTransferBasket<T>>::insert(collection_id, token_id, block_number);
- return Ok(())
- }
- },
- _ => {},
- }
- },
- crate::CollectionMode::Fungible(_) => {
- let call: UniqueFungibleCall = UniqueFungibleCall::parse(method_id, &mut reader).map_err(|_| AnyError)?.ok_or(AnyError)?;
- match call {
- UniqueFungibleCall::ERC20(ERC20Call::Transfer {..}) => {
- let who = T::CrossAccountId::from_eth(caller.clone());
- let collection_limits = &collection.limits;
- let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
- collection_limits.sponsor_transfer_timeout
- } else {
- ChainLimit::get().fungible_sponsor_transfer_timeout
- };
+ let mut sponsor = true;
+ if <NftTransferBasket<T>>::contains_key(collection_id, token_id) {
+ let last_tx_block = <NftTransferBasket<T>>::get(collection_id, token_id);
+ let limit_time = last_tx_block + limit.into();
+ if block_number <= limit_time {
+ sponsor = false;
+ }
+ }
+ if sponsor {
+ <NftTransferBasket<T>>::insert(collection_id, token_id, block_number);
+ return Ok(());
+ }
+ }
+ _ => {}
+ }
+ }
+ crate::CollectionMode::Fungible(_) => {
+ let call: UniqueFungibleCall = UniqueFungibleCall::parse(method_id, &mut reader)
+ .map_err(|_| AnyError)?
+ .ok_or(AnyError)?;
+ #[allow(clippy::single_match)]
+ match call {
+ UniqueFungibleCall::ERC20(ERC20Call::Transfer { .. }) => {
+ let who = T::CrossAccountId::from_eth(*caller);
+ let collection_limits = &collection.limits;
+ let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
+ collection_limits.sponsor_transfer_timeout
+ } else {
+ ChainLimit::get().fungible_sponsor_transfer_timeout
+ };
- let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
- let mut sponsored = true;
- if <FungibleTransferBasket<T>>::contains_key(collection_id, who.as_sub()) {
- let last_tx_block = <FungibleTransferBasket<T>>::get(collection_id, who.as_sub());
- let limit_time = last_tx_block + limit.into();
- if block_number <= limit_time {
- sponsored = false;
- }
- }
- if sponsored {
- <FungibleTransferBasket<T>>::insert(collection_id, who.as_sub(), block_number);
- return Ok(())
- }
- },
- _ => {},
- }
- },
- _ => {},
- }
- return Err(AnyError)
+ let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
+ let mut sponsored = true;
+ if <FungibleTransferBasket<T>>::contains_key(collection_id, who.as_sub()) {
+ let last_tx_block =
+ <FungibleTransferBasket<T>>::get(collection_id, who.as_sub());
+ let limit_time = last_tx_block + limit.into();
+ if block_number <= limit_time {
+ sponsored = false;
+ }
+ }
+ if sponsored {
+ <FungibleTransferBasket<T>>::insert(
+ collection_id,
+ who.as_sub(),
+ block_number,
+ );
+ return Ok(());
+ }
+ }
+ _ => {}
+ }
+ }
+ _ => {}
+ }
+ Err(AnyError)
}
impl<T> pallet_evm::OnChargeEVMTransaction<T> for ChargeEvmTransaction
where
- T: Config,
- T: pallet_evm::Config,
+ T: Config,
+ T: pallet_evm::Config,
{
- type LiquidityInfo = Option<ChargeEvmLiquidityInfo<T>>;
+ type LiquidityInfo = Option<ChargeEvmLiquidityInfo<T>>;
- fn withdraw_fee(
- who: &H160,
- reason: WithdrawReason,
- fee: U256,
- ) -> Result<Self::LiquidityInfo, pallet_evm::Error<T>> {
- let mut who_pays_fee = *who;
- if let WithdrawReason::Call { target, input } = &reason {
- if let Some(collection_id) = crate::eth::map_eth_to_id(&target) {
- if let Some(collection) = <CollectionById<T>>::get(collection_id) {
- if let Some(sponsor) = collection.sponsorship.sponsor() {
- if try_sponsor(who, collection_id, &collection, &input).is_ok() {
- who_pays_fee =
- T::EvmBackwardsAddressMapping::from_account_id(sponsor.clone());
- }
- }
- }
- }
- }
+ fn withdraw_fee(
+ who: &H160,
+ reason: WithdrawReason,
+ fee: U256,
+ ) -> Result<Self::LiquidityInfo, pallet_evm::Error<T>> {
+ let mut who_pays_fee = *who;
+ if let WithdrawReason::Call { target, input } = &reason {
+ if let Some(collection_id) = crate::eth::map_eth_to_id(&target) {
+ if let Some(collection) = <CollectionById<T>>::get(collection_id) {
+ if let Some(sponsor) = collection.sponsorship.sponsor() {
+ if try_sponsor(who, collection_id, &collection, &input).is_ok() {
+ who_pays_fee =
+ T::EvmBackwardsAddressMapping::from_account_id(sponsor.clone());
+ }
+ }
+ }
+ }
+ }
- // TODO: Pay fee from substrate address
- let negative_imbalance = EVMCurrencyAdapter::<<T as Config>::Currency, ()>::withdraw_fee(
- &who_pays_fee,
- reason,
- fee,
- )?;
- Ok(negative_imbalance.map(|i| ChargeEvmLiquidityInfo {
- who: who_pays_fee,
- negative_imbalance: i,
- }))
- }
+ // TODO: Pay fee from substrate address
+ let negative_imbalance = EVMCurrencyAdapter::<<T as Config>::Currency, ()>::withdraw_fee(
+ &who_pays_fee,
+ reason,
+ fee,
+ )?;
+ Ok(negative_imbalance.map(|i| ChargeEvmLiquidityInfo {
+ who: who_pays_fee,
+ negative_imbalance: i,
+ }))
+ }
- fn correct_and_deposit_fee(
- who: &H160,
- corrected_fee: U256,
- already_withdrawn: Self::LiquidityInfo,
- ) -> Result<(), pallet_evm::Error<T>> {
- EVMCurrencyAdapter::<<T as Config>::Currency, ()>::correct_and_deposit_fee(
- &already_withdrawn.as_ref().map(|e| e.who).unwrap_or(*who),
- corrected_fee,
- already_withdrawn.map(|e| e.negative_imbalance),
- )
- }
+ fn correct_and_deposit_fee(
+ who: &H160,
+ corrected_fee: U256,
+ already_withdrawn: Self::LiquidityInfo,
+ ) -> Result<(), pallet_evm::Error<T>> {
+ EVMCurrencyAdapter::<<T as Config>::Currency, ()>::correct_and_deposit_fee(
+ &already_withdrawn.as_ref().map(|e| e.who).unwrap_or(*who),
+ corrected_fee,
+ already_withdrawn.map(|e| e.negative_imbalance),
+ )
+ }
}
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -4,41 +4,44 @@
//
#![recursion_limit = "1024"]
-
#![cfg_attr(not(feature = "std"), no_std)]
+#![allow(
+ clippy::too_many_arguments,
+ clippy::unnecessary_mut_passed,
+ clippy::unused_unit
+)]
extern crate alloc;
pub use serde::{Serialize, Deserialize};
pub use frame_support::{
- construct_runtime, decl_event, decl_module, decl_storage, decl_error,
- dispatch::DispatchResult,
- ensure, fail, parameter_types,
- traits::{
- Currency, ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced,
- Randomness, IsSubType, WithdrawReasons,
- },
- weights::{
- constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},
- DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,
- WeightToFeePolynomial, DispatchClass,
- },
- StorageValue,
- transactional,
+ construct_runtime, decl_event, decl_module, decl_storage, decl_error,
+ dispatch::DispatchResult,
+ ensure, fail, parameter_types,
+ traits::{
+ Currency, ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced,
+ Randomness, IsSubType, WithdrawReasons,
+ },
+ weights::{
+ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},
+ DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,
+ WeightToFeePolynomial, DispatchClass,
+ },
+ StorageValue, transactional,
};
use frame_system::{self as system, ensure_signed, ensure_root};
use sp_core::H160;
+use sp_std::vec;
use sp_runtime::sp_std::prelude::Vec;
use core::ops::{Deref, DerefMut};
use core::cell::RefCell;
use nft_data_structs::{
- MAX_DECIMAL_POINTS, MAX_SPONSOR_TIMEOUT, MAX_TOKEN_OWNERSHIP, MAX_REFUNGIBLE_PIECES,
- AccessMode, ChainLimits, Collection, CreateItemData, CollectionLimits,
- CollectionId, CollectionMode, TokenId,
- SchemaVersion, SponsorshipState, Ownership,
- NftItemType, FungibleItemType, ReFungibleItemType
+ MAX_DECIMAL_POINTS, MAX_SPONSOR_TIMEOUT, MAX_TOKEN_OWNERSHIP, MAX_REFUNGIBLE_PIECES,
+ AccessMode, ChainLimits, Collection, CreateItemData, CollectionLimits, CollectionId,
+ CollectionMode, TokenId, SchemaVersion, SponsorshipState, Ownership, NftItemType,
+ FungibleItemType, ReFungibleItemType,
};
use pallet_ethereum::EthereumTransactionSender;
@@ -65,185 +68,186 @@
fn destroy_collection() -> Weight;
fn add_to_white_list() -> Weight;
fn remove_from_white_list() -> Weight;
- fn set_public_access_mode() -> Weight;
- fn set_mint_permission() -> Weight;
- fn change_collection_owner() -> Weight;
- fn add_collection_admin() -> Weight;
- fn remove_collection_admin() -> Weight;
- fn set_collection_sponsor() -> Weight;
- fn confirm_sponsorship() -> Weight;
- fn remove_collection_sponsor() -> Weight;
- fn create_item(s: usize) -> Weight;
- fn burn_item() -> Weight;
- fn transfer() -> Weight;
- fn approve() -> Weight;
- fn transfer_from() -> Weight;
- fn set_offchain_schema() -> Weight;
- fn set_const_on_chain_schema() -> Weight;
- fn set_variable_on_chain_schema() -> Weight;
- fn set_variable_meta_data() -> Weight;
- fn enable_contract_sponsoring() -> Weight;
- fn set_schema_version() -> Weight;
- fn set_chain_limits() -> Weight;
- fn set_contract_sponsoring_rate_limit() -> Weight;
- fn set_variable_meta_data_sponsoring_rate_limit() -> Weight;
- fn toggle_contract_white_list() -> Weight;
- fn add_to_contract_white_list() -> Weight;
- fn remove_from_contract_white_list() -> Weight;
- fn set_collection_limits() -> Weight;
+ fn set_public_access_mode() -> Weight;
+ fn set_mint_permission() -> Weight;
+ fn change_collection_owner() -> Weight;
+ fn add_collection_admin() -> Weight;
+ fn remove_collection_admin() -> Weight;
+ fn set_collection_sponsor() -> Weight;
+ fn confirm_sponsorship() -> Weight;
+ fn remove_collection_sponsor() -> Weight;
+ fn create_item(s: usize) -> Weight;
+ fn burn_item() -> Weight;
+ fn transfer() -> Weight;
+ fn approve() -> Weight;
+ fn transfer_from() -> Weight;
+ fn set_offchain_schema() -> Weight;
+ fn set_const_on_chain_schema() -> Weight;
+ fn set_variable_on_chain_schema() -> Weight;
+ fn set_variable_meta_data() -> Weight;
+ fn enable_contract_sponsoring() -> Weight;
+ fn set_schema_version() -> Weight;
+ fn set_chain_limits() -> Weight;
+ fn set_contract_sponsoring_rate_limit() -> Weight;
+ fn set_variable_meta_data_sponsoring_rate_limit() -> Weight;
+ fn toggle_contract_white_list() -> Weight;
+ fn add_to_contract_white_list() -> Weight;
+ fn remove_from_contract_white_list() -> Weight;
+ fn set_collection_limits() -> Weight;
}
decl_error! {
/// Error for non-fungible-token module.
pub enum Error for Module<T: Config> {
- /// Total collections bound exceeded.
- TotalCollectionsLimitExceeded,
+ /// Total collections bound exceeded.
+ TotalCollectionsLimitExceeded,
/// Decimal_points parameter must be lower than MAX_DECIMAL_POINTS constant, currently it is 30.
- CollectionDecimalPointLimitExceeded,
- /// Collection name can not be longer than 63 char.
- CollectionNameLimitExceeded,
- /// Collection description can not be longer than 255 char.
- CollectionDescriptionLimitExceeded,
- /// Token prefix can not be longer than 15 char.
- CollectionTokenPrefixLimitExceeded,
- /// This collection does not exist.
- CollectionNotFound,
- /// Item not exists.
- TokenNotFound,
- /// Admin not found
- AdminNotFound,
- /// Arithmetic calculation overflow.
- NumOverflow,
- /// Account already has admin role.
- AlreadyAdmin,
- /// You do not own this collection.
- NoPermission,
- /// This address is not set as sponsor, use setCollectionSponsor first.
- ConfirmUnsetSponsorFail,
- /// Collection is not in mint mode.
- PublicMintingNotAllowed,
- /// Sender parameter and item owner must be equal.
- MustBeTokenOwner,
- /// Item balance not enough.
- TokenValueTooLow,
- /// Size of item is too large.
- NftSizeLimitExceeded,
- /// No approve found
- ApproveNotFound,
- /// Requested value more than approved.
- TokenValueNotEnough,
- /// Only approved addresses can call this method.
- ApproveRequired,
- /// Address is not in white list.
- AddresNotInWhiteList,
- /// Number of collection admins bound exceeded.
- CollectionAdminsLimitExceeded,
- /// Owned tokens by a single address bound exceeded.
- AddressOwnershipLimitExceeded,
- /// Length of items properties must be greater than 0.
- EmptyArgument,
- /// const_data exceeded data limit.
- TokenConstDataLimitExceeded,
- /// variable_data exceeded data limit.
- TokenVariableDataLimitExceeded,
- /// Not NFT item data used to mint in NFT collection.
- NotNftDataUsedToMintNftCollectionToken,
- /// Not Fungible item data used to mint in Fungible collection.
- NotFungibleDataUsedToMintFungibleCollectionToken,
- /// Not Re Fungible item data used to mint in Re Fungible collection.
- NotReFungibleDataUsedToMintReFungibleCollectionToken,
- /// Unexpected collection type.
- UnexpectedCollectionType,
- /// Can't store metadata in fungible tokens.
- CantStoreMetadataInFungibleTokens,
- /// Collection token limit exceeded
- CollectionTokenLimitExceeded,
- /// Account token limit exceeded per collection
- AccountTokenLimitExceeded,
- /// Collection limit bounds per collection exceeded
- CollectionLimitBoundsExceeded,
- /// Tried to enable permissions which are only permitted to be disabled
- OwnerPermissionsCantBeReverted,
- /// Schema data size limit bound exceeded
- SchemaDataLimitExceeded,
- /// Maximum refungibility exceeded
- WrongRefungiblePieces,
- /// createRefungible should be called with one owner
- BadCreateRefungibleCall,
- /// Gas limit exceeded
- OutOfGas,
+ CollectionDecimalPointLimitExceeded,
+ /// Collection name can not be longer than 63 char.
+ CollectionNameLimitExceeded,
+ /// Collection description can not be longer than 255 char.
+ CollectionDescriptionLimitExceeded,
+ /// Token prefix can not be longer than 15 char.
+ CollectionTokenPrefixLimitExceeded,
+ /// This collection does not exist.
+ CollectionNotFound,
+ /// Item not exists.
+ TokenNotFound,
+ /// Admin not found
+ AdminNotFound,
+ /// Arithmetic calculation overflow.
+ NumOverflow,
+ /// Account already has admin role.
+ AlreadyAdmin,
+ /// You do not own this collection.
+ NoPermission,
+ /// This address is not set as sponsor, use setCollectionSponsor first.
+ ConfirmUnsetSponsorFail,
+ /// Collection is not in mint mode.
+ PublicMintingNotAllowed,
+ /// Sender parameter and item owner must be equal.
+ MustBeTokenOwner,
+ /// Item balance not enough.
+ TokenValueTooLow,
+ /// Size of item is too large.
+ NftSizeLimitExceeded,
+ /// No approve found
+ ApproveNotFound,
+ /// Requested value more than approved.
+ TokenValueNotEnough,
+ /// Only approved addresses can call this method.
+ ApproveRequired,
+ /// Address is not in white list.
+ AddresNotInWhiteList,
+ /// Number of collection admins bound exceeded.
+ CollectionAdminsLimitExceeded,
+ /// Owned tokens by a single address bound exceeded.
+ AddressOwnershipLimitExceeded,
+ /// Length of items properties must be greater than 0.
+ EmptyArgument,
+ /// const_data exceeded data limit.
+ TokenConstDataLimitExceeded,
+ /// variable_data exceeded data limit.
+ TokenVariableDataLimitExceeded,
+ /// Not NFT item data used to mint in NFT collection.
+ NotNftDataUsedToMintNftCollectionToken,
+ /// Not Fungible item data used to mint in Fungible collection.
+ NotFungibleDataUsedToMintFungibleCollectionToken,
+ /// Not Re Fungible item data used to mint in Re Fungible collection.
+ NotReFungibleDataUsedToMintReFungibleCollectionToken,
+ /// Unexpected collection type.
+ UnexpectedCollectionType,
+ /// Can't store metadata in fungible tokens.
+ CantStoreMetadataInFungibleTokens,
+ /// Collection token limit exceeded
+ CollectionTokenLimitExceeded,
+ /// Account token limit exceeded per collection
+ AccountTokenLimitExceeded,
+ /// Collection limit bounds per collection exceeded
+ CollectionLimitBoundsExceeded,
+ /// Tried to enable permissions which are only permitted to be disabled
+ OwnerPermissionsCantBeReverted,
+ /// Schema data size limit bound exceeded
+ SchemaDataLimitExceeded,
+ /// Maximum refungibility exceeded
+ WrongRefungiblePieces,
+ /// createRefungible should be called with one owner
+ BadCreateRefungibleCall,
+ /// Gas limit exceeded
+ OutOfGas,
}
}
pub struct CollectionHandle<T: Config> {
- pub id: CollectionId,
- collection: Collection<T>,
- logs: eth::log::LogRecorder,
- evm_address: H160,
- gas_limit: RefCell<u64>,
+ pub id: CollectionId,
+ collection: Collection<T>,
+ logs: eth::log::LogRecorder,
+ evm_address: H160,
+ gas_limit: RefCell<u64>,
}
impl<T: Config> CollectionHandle<T> {
pub fn get_with_gas_limit(id: CollectionId, gas_limit: u64) -> Option<Self> {
- <CollectionById<T>>::get(id)
- .map(|collection| Self {
- id,
- collection,
- logs: eth::log::LogRecorder::default(),
- evm_address: eth::collection_id_to_address(id),
- gas_limit: RefCell::new(gas_limit),
- })
+ <CollectionById<T>>::get(id).map(|collection| Self {
+ id,
+ collection,
+ logs: eth::log::LogRecorder::default(),
+ evm_address: eth::collection_id_to_address(id),
+ gas_limit: RefCell::new(gas_limit),
+ })
+ }
+ pub fn get(id: CollectionId) -> Option<Self> {
+ Self::get_with_gas_limit(id, u64::MAX)
+ }
+ pub fn gas_left(&self) -> u64 {
+ *self.gas_limit.borrow()
+ }
+ pub fn consume_gas(&self, gas: u64) -> DispatchResult {
+ let mut gas_limit = self.gas_limit.borrow_mut();
+ if *gas_limit < gas {
+ fail!(Error::<T>::OutOfGas);
+ }
+ *gas_limit -= gas;
+ Ok(())
+ }
+ pub fn log(&self, log: impl evm_coder::ToLog) {
+ self.logs.log(log.to_log(self.evm_address))
+ }
+ pub fn into_inner(self) -> Collection<T> {
+ self.collection
}
- pub fn get(id: CollectionId) -> Option<Self> {
- Self::get_with_gas_limit(id, u64::MAX)
- }
- pub fn gas_left(&self) -> u64 {
- *self.gas_limit.borrow()
- }
- pub fn consume_gas(&self, gas: u64) -> DispatchResult {
- let mut gas_limit = self.gas_limit.borrow_mut();
- if *gas_limit < gas {
- fail!(Error::<T>::OutOfGas);
- }
- *gas_limit -= gas;
- Ok(())
- }
- pub fn log(&self, log: impl evm_coder::ToLog) {
- self.logs.log(log.to_log(self.evm_address))
- }
- pub fn into_inner(self) -> Collection<T> {
- self.collection.clone()
- }
}
impl<T: Config> Deref for CollectionHandle<T> {
- type Target = Collection<T>;
+ type Target = Collection<T>;
- fn deref(&self) -> &Self::Target {
- &self.collection
- }
+ fn deref(&self) -> &Self::Target {
+ &self.collection
+ }
}
impl<T: Config> DerefMut for CollectionHandle<T> {
- fn deref_mut(&mut self) -> &mut Self::Target {
- &mut self.collection
- }
+ fn deref_mut(&mut self) -> &mut Self::Target {
+ &mut self.collection
+ }
}
pub trait Config: system::Config + Sized {
- type Event: From<Event<Self>> + Into<<Self as system::Config>::Event>;
+ type Event: From<Event<Self>> + Into<<Self as system::Config>::Event>;
- /// Weight information for extrinsics in this pallet.
+ /// Weight information for extrinsics in this pallet.
type WeightInfo: WeightInfo;
- type EvmAddressMapping: pallet_evm::AddressMapping<Self::AccountId>;
- type EvmBackwardsAddressMapping: EvmBackwardsAddressMapping<Self::AccountId>;
+ type EvmAddressMapping: pallet_evm::AddressMapping<Self::AccountId>;
+ type EvmBackwardsAddressMapping: EvmBackwardsAddressMapping<Self::AccountId>;
type CrossAccountId: CrossAccountId<Self::AccountId>;
- type Currency: Currency<Self::AccountId>;
- type CollectionCreationPrice: Get<<<Self as Config>::Currency as Currency<Self::AccountId>>::Balance>;
- type TreasuryAccountId: Get<Self::AccountId>;
+ type Currency: Currency<Self::AccountId>;
+ type CollectionCreationPrice: Get<
+ <<Self as Config>::Currency as Currency<Self::AccountId>>::Balance,
+ >;
+ type TreasuryAccountId: Get<Self::AccountId>;
- type EthereumChainId: Get<u64>;
- type EthereumTransactionSender: pallet_ethereum::EthereumTransactionSender;
+ type EthereumChainId: Get<u64>;
+ type EthereumTransactionSender: pallet_ethereum::EthereumTransactionSender;
}
// # Used definitions
@@ -269,1057 +273,1078 @@
// ?3 - real -> controlled
// no confirmation required, so addresses can be easily generated
decl_storage! {
- trait Store for Module<T: Config> as Nft {
+ trait Store for Module<T: Config> as Nft {
- //#region Private members
- /// Id of next collection
- CreatedCollectionCount: u32;
- /// Used for migrations
- ChainVersion: u64;
- /// Id of last collection token
- /// Collection id (controlled?1)
- ItemListIndex: map hasher(blake2_128_concat) CollectionId => TokenId;
- //#endregion
+ //#region Private members
+ /// Id of next collection
+ CreatedCollectionCount: u32;
+ /// Used for migrations
+ ChainVersion: u64;
+ /// Id of last collection token
+ /// Collection id (controlled?1)
+ ItemListIndex: map hasher(blake2_128_concat) CollectionId => TokenId;
+ //#endregion
- //#region Chain limits struct
- pub ChainLimit get(fn chain_limit) config(): ChainLimits;
- //#endregion
+ //#region Chain limits struct
+ pub ChainLimit get(fn chain_limit) config(): ChainLimits;
+ //#endregion
- //#region Bound counters
- /// Amount of collections destroyed, used for total amount tracking with
- /// CreatedCollectionCount
- DestroyedCollectionCount: u32;
- /// Total amount of account owned tokens (NFTs + RFTs + unique fungibles)
- /// Account id (real)
- pub AccountItemCount get(fn account_item_count): map hasher(twox_64_concat) T::AccountId => u32;
- //#endregion
+ //#region Bound counters
+ /// Amount of collections destroyed, used for total amount tracking with
+ /// CreatedCollectionCount
+ DestroyedCollectionCount: u32;
+ /// Total amount of account owned tokens (NFTs + RFTs + unique fungibles)
+ /// Account id (real)
+ pub AccountItemCount get(fn account_item_count): map hasher(twox_64_concat) T::AccountId => u32;
+ //#endregion
- //#region Basic collections
- /// Collection info
- /// Collection id (controlled?1)
- pub CollectionById get(fn collection_id) config(): map hasher(blake2_128_concat) CollectionId => Option<Collection<T>> = None;
- /// List of collection admins
- /// Collection id (controlled?2)
- pub AdminList get(fn admin_list_collection): map hasher(blake2_128_concat) CollectionId => Vec<T::CrossAccountId>;
- /// Whitelisted collection users
- /// Collection id (controlled?2), user id (controlled?3)
- pub WhiteList get(fn white_list): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) T::AccountId => bool;
- //#endregion
+ //#region Basic collections
+ /// Collection info
+ /// Collection id (controlled?1)
+ pub CollectionById get(fn collection_id) config(): map hasher(blake2_128_concat) CollectionId => Option<Collection<T>> = None;
+ /// List of collection admins
+ /// Collection id (controlled?2)
+ pub AdminList get(fn admin_list_collection): map hasher(blake2_128_concat) CollectionId => Vec<T::CrossAccountId>;
+ /// Whitelisted collection users
+ /// Collection id (controlled?2), user id (controlled?3)
+ pub WhiteList get(fn white_list): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) T::AccountId => bool;
+ //#endregion
- /// How many of collection items user have
- /// Collection id (controlled?2), account id (real)
- pub Balance get(fn balance_count): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => u128;
+ /// How many of collection items user have
+ /// Collection id (controlled?2), account id (real)
+ pub Balance get(fn balance_count): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => u128;
- /// Amount of items which spender can transfer out of owners account (via transferFrom)
- /// Collection id (controlled?2), (token id (controlled ?2) + owner account id (real) + spender account id (controlled?3))
- /// TODO: Off chain worker should remove from this map when token gets removed
- pub Allowances get(fn approved): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) (TokenId, T::AccountId, T::AccountId) => u128;
+ /// Amount of items which spender can transfer out of owners account (via transferFrom)
+ /// Collection id (controlled?2), (token id (controlled ?2) + owner account id (real) + spender account id (controlled?3))
+ /// TODO: Off chain worker should remove from this map when token gets removed
+ pub Allowances get(fn approved): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) (TokenId, T::AccountId, T::AccountId) => u128;
- //#region Item collections
- /// Collection id (controlled?2), token id (controlled?1)
- pub NftItemList get(fn nft_item_id) config(): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<NftItemType<T::CrossAccountId>>;
- /// Collection id (controlled?2), owner (controlled?2)
- pub FungibleItemList get(fn fungible_item_id) config(): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) T::AccountId => FungibleItemType;
- /// Collection id (controlled?2), token id (controlled?1)
- pub ReFungibleItemList get(fn refungible_item_id) config(): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<ReFungibleItemType<T::CrossAccountId>>;
- //#endregion
+ //#region Item collections
+ /// Collection id (controlled?2), token id (controlled?1)
+ pub NftItemList get(fn nft_item_id) config(): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<NftItemType<T::CrossAccountId>>;
+ /// Collection id (controlled?2), owner (controlled?2)
+ pub FungibleItemList get(fn fungible_item_id) config(): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) T::AccountId => FungibleItemType;
+ /// Collection id (controlled?2), token id (controlled?1)
+ pub ReFungibleItemList get(fn refungible_item_id) config(): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<ReFungibleItemType<T::CrossAccountId>>;
+ //#endregion
- //#region Index list
- /// Collection id (controlled?2), tokens owner (controlled?2)
- pub AddressTokens get(fn address_tokens): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) T::AccountId => Vec<TokenId>;
- //#endregion
+ //#region Index list
+ /// Collection id (controlled?2), tokens owner (controlled?2)
+ pub AddressTokens get(fn address_tokens): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) T::AccountId => Vec<TokenId>;
+ //#endregion
- //#region Tokens transfer rate limit baskets
- /// (Collection id (controlled?2), who created (real))
- /// TODO: Off chain worker should remove from this map when collection gets removed
- pub CreateItemBasket get(fn create_item_basket): map hasher(blake2_128_concat) (CollectionId, T::AccountId) => T::BlockNumber;
- /// Collection id (controlled?2), token id (controlled?2)
- pub NftTransferBasket get(fn nft_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => T::BlockNumber;
- /// Collection id (controlled?2), owning user (real)
- pub FungibleTransferBasket get(fn fungible_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => T::BlockNumber;
- /// Collection id (controlled?2), token id (controlled?2)
- pub ReFungibleTransferBasket get(fn refungible_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => T::BlockNumber;
- //#endregion
+ //#region Tokens transfer rate limit baskets
+ /// (Collection id (controlled?2), who created (real))
+ /// TODO: Off chain worker should remove from this map when collection gets removed
+ pub CreateItemBasket get(fn create_item_basket): map hasher(blake2_128_concat) (CollectionId, T::AccountId) => T::BlockNumber;
+ /// Collection id (controlled?2), token id (controlled?2)
+ pub NftTransferBasket get(fn nft_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => T::BlockNumber;
+ /// Collection id (controlled?2), owning user (real)
+ pub FungibleTransferBasket get(fn fungible_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => T::BlockNumber;
+ /// Collection id (controlled?2), token id (controlled?2)
+ pub ReFungibleTransferBasket get(fn refungible_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => T::BlockNumber;
+ //#endregion
- /// Variable metadata sponsoring
- /// Collection id (controlled?2), token id (controlled?2)
- pub VariableMetaDataBasket get(fn variable_meta_data_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber> = None;
- }
- add_extra_genesis {
- build(|config: &GenesisConfig<T>| {
- // Modification of storage
- for (_num, _c) in &config.collection_id {
- <Module<T>>::init_collection(_c);
- }
+ /// Variable metadata sponsoring
+ /// Collection id (controlled?2), token id (controlled?2)
+ pub VariableMetaDataBasket get(fn variable_meta_data_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber> = None;
+ }
+ add_extra_genesis {
+ build(|config: &GenesisConfig<T>| {
+ // Modification of storage
+ for (_num, _c) in &config.collection_id {
+ <Module<T>>::init_collection(_c);
+ }
- for (_num, _c, _i) in &config.nft_item_id {
- <Module<T>>::init_nft_token(*_c, _i);
- }
+ for (_num, _c, _i) in &config.nft_item_id {
+ <Module<T>>::init_nft_token(*_c, _i);
+ }
- for (collection_id, account_id, fungible_item) in &config.fungible_item_id {
- <Module<T>>::init_fungible_token(*collection_id, &T::CrossAccountId::from_sub(account_id.clone()), fungible_item);
- }
+ for (collection_id, account_id, fungible_item) in &config.fungible_item_id {
+ <Module<T>>::init_fungible_token(*collection_id, &T::CrossAccountId::from_sub(account_id.clone()), fungible_item);
+ }
- for (_num, _c, _i) in &config.refungible_item_id {
- <Module<T>>::init_refungible_token(*_c, _i);
- }
- })
- }
+ for (_num, _c, _i) in &config.refungible_item_id {
+ <Module<T>>::init_refungible_token(*_c, _i);
+ }
+ })
+ }
}
decl_event!(
- pub enum Event<T>
- where
- AccountId = <T as frame_system::Config>::AccountId,
- CrossAccountId = <T as Config>::CrossAccountId,
- {
- /// 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, AccountId),
+ pub enum Event<T>
+ where
+ AccountId = <T as frame_system::Config>::AccountId,
+ CrossAccountId = <T as Config>::CrossAccountId,
+ {
+ /// 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, AccountId),
- /// New item was created.
- ///
- /// # Arguments
- ///
- /// * collection_id: Id of the collection where item was created.
- ///
- /// * item_id: Id of an item. Unique within the collection.
- ///
- /// * recipient: Owner of newly created item
- ItemCreated(CollectionId, TokenId, CrossAccountId),
+ /// New item was created.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: Id of the collection where item was created.
+ ///
+ /// * item_id: Id of an item. Unique within the collection.
+ ///
+ /// * recipient: Owner of newly created item
+ ItemCreated(CollectionId, TokenId, CrossAccountId),
- /// Collection item was burned.
- ///
- /// # Arguments
- ///
- /// collection_id.
- ///
- /// item_id: Identifier of burned NFT.
- ItemDestroyed(CollectionId, TokenId),
+ /// Collection item was burned.
+ ///
+ /// # Arguments
+ ///
+ /// collection_id.
+ ///
+ /// item_id: Identifier of burned NFT.
+ ItemDestroyed(CollectionId, TokenId),
- /// Item was transferred
- ///
- /// * collection_id: Id of collection to which item is belong
- ///
- /// * item_id: Id of an item
- ///
- /// * sender: Original owner of item
- ///
- /// * recipient: New owner of item
- ///
- /// * amount: Always 1 for NFT
- Transfer(CollectionId, TokenId, CrossAccountId, CrossAccountId, u128),
+ /// Item was transferred
+ ///
+ /// * collection_id: Id of collection to which item is belong
+ ///
+ /// * item_id: Id of an item
+ ///
+ /// * sender: Original owner of item
+ ///
+ /// * recipient: New owner of item
+ ///
+ /// * amount: Always 1 for NFT
+ Transfer(CollectionId, TokenId, CrossAccountId, CrossAccountId, u128),
- /// * collection_id
- ///
- /// * item_id
- ///
- /// * sender
- ///
- /// * spender
- ///
- /// * amount
- Approved(CollectionId, TokenId, CrossAccountId, CrossAccountId, u128),
- }
+ /// * collection_id
+ ///
+ /// * item_id
+ ///
+ /// * sender
+ ///
+ /// * spender
+ ///
+ /// * amount
+ Approved(CollectionId, TokenId, CrossAccountId, CrossAccountId, u128),
+ }
);
decl_module! {
- pub struct Module<T: Config> for enum Call
- where
- origin: T::Origin
- {
- fn deposit_event() = default;
- type Error = Error<T>;
+ pub struct Module<T: Config> for enum Call
+ where
+ origin: T::Origin
+ {
+ fn deposit_event() = default;
+ type Error = Error<T>;
- fn on_initialize(_now: T::BlockNumber) -> Weight {
- 0
- }
+ fn on_initialize(_now: T::BlockNumber) -> Weight {
+ 0
+ }
- /// 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 and admin of the collection are set to the address that signed the transaction. Both addresses can be changed later.
- ///
- /// # Permissions
- ///
- /// * Anyone.
- ///
- /// # 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.
- // returns collection ID
- #[weight = <T as Config>::WeightInfo::create_collection()]
- #[transactional]
- pub fn create_collection(origin,
- collection_name: Vec<u16>,
- collection_description: Vec<u16>,
- token_prefix: Vec<u8>,
- mode: CollectionMode) -> DispatchResult {
+ /// 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 and admin of the collection are set to the address that signed the transaction. Both addresses can be changed later.
+ ///
+ /// # Permissions
+ ///
+ /// * Anyone.
+ ///
+ /// # 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.
+ // returns collection ID
+ #[weight = <T as Config>::WeightInfo::create_collection()]
+ #[transactional]
+ pub fn create_collection(origin,
+ collection_name: Vec<u16>,
+ collection_description: Vec<u16>,
+ token_prefix: Vec<u8>,
+ mode: CollectionMode) -> DispatchResult {
- // Anyone can create a collection
- let who = ensure_signed(origin)?;
+ // Anyone can create a collection
+ let who = ensure_signed(origin)?;
- // Take a (non-refundable) deposit of collection creation
- let mut imbalance = <<<T as Config>::Currency as Currency<T::AccountId>>::PositiveImbalance>::zero();
- imbalance.subsume(<<T as Config>::Currency as Currency<T::AccountId>>::deposit_creating(
- &T::TreasuryAccountId::get(),
- T::CollectionCreationPrice::get(),
- ));
- <T as Config>::Currency::settle(
- &who,
- imbalance,
- WithdrawReasons::TRANSFER,
- ExistenceRequirement::KeepAlive,
- ).map_err(|_| Error::<T>::NoPermission)?;
+ // Take a (non-refundable) deposit of collection creation
+ let mut imbalance = <<<T as Config>::Currency as Currency<T::AccountId>>::PositiveImbalance>::zero();
+ imbalance.subsume(<<T as Config>::Currency as Currency<T::AccountId>>::deposit_creating(
+ &T::TreasuryAccountId::get(),
+ T::CollectionCreationPrice::get(),
+ ));
+ <T as Config>::Currency::settle(
+ &who,
+ imbalance,
+ WithdrawReasons::TRANSFER,
+ ExistenceRequirement::KeepAlive,
+ ).map_err(|_| Error::<T>::NoPermission)?;
- let decimal_points = match mode {
- CollectionMode::Fungible(points) => points,
- _ => 0
- };
+ let decimal_points = match mode {
+ CollectionMode::Fungible(points) => points,
+ _ => 0
+ };
- let chain_limit = ChainLimit::get();
+ let chain_limit = ChainLimit::get();
- let created_count = CreatedCollectionCount::get();
- let destroyed_count = DestroyedCollectionCount::get();
+ let created_count = CreatedCollectionCount::get();
+ let destroyed_count = DestroyedCollectionCount::get();
- // bound Total number of collections
- ensure!(created_count - destroyed_count < chain_limit.collection_numbers_limit, Error::<T>::TotalCollectionsLimitExceeded);
+ // bound Total number of collections
+ ensure!(created_count - destroyed_count < chain_limit.collection_numbers_limit, Error::<T>::TotalCollectionsLimitExceeded);
- // check params
- ensure!(decimal_points <= MAX_DECIMAL_POINTS, Error::<T>::CollectionDecimalPointLimitExceeded);
- ensure!(collection_name.len() <= 64, Error::<T>::CollectionNameLimitExceeded);
- ensure!(collection_description.len() <= 256, Error::<T>::CollectionDescriptionLimitExceeded);
- ensure!(token_prefix.len() <= 16, Error::<T>::CollectionTokenPrefixLimitExceeded);
+ // check params
+ ensure!(decimal_points <= MAX_DECIMAL_POINTS, Error::<T>::CollectionDecimalPointLimitExceeded);
+ ensure!(collection_name.len() <= 64, Error::<T>::CollectionNameLimitExceeded);
+ ensure!(collection_description.len() <= 256, Error::<T>::CollectionDescriptionLimitExceeded);
+ ensure!(token_prefix.len() <= 16, Error::<T>::CollectionTokenPrefixLimitExceeded);
- // Generate next collection ID
- let next_id = created_count
- .checked_add(1)
- .ok_or(Error::<T>::NumOverflow)?;
+ // Generate next collection ID
+ let next_id = created_count
+ .checked_add(1)
+ .ok_or(Error::<T>::NumOverflow)?;
- CreatedCollectionCount::put(next_id);
+ CreatedCollectionCount::put(next_id);
- let limits = CollectionLimits {
- sponsored_data_size: chain_limit.custom_data_limit,
- ..Default::default()
- };
+ let limits = CollectionLimits {
+ sponsored_data_size: chain_limit.custom_data_limit,
+ ..Default::default()
+ };
- // Create new collection
- let new_collection = Collection {
- owner: who.clone(),
- name: collection_name,
- mode: mode.clone(),
- mint_mode: false,
- access: AccessMode::Normal,
- description: collection_description,
- decimal_points: decimal_points,
- token_prefix: token_prefix,
- offchain_schema: Vec::new(),
- schema_version: SchemaVersion::ImageURL,
- sponsorship: SponsorshipState::Disabled,
- variable_on_chain_schema: Vec::new(),
- const_on_chain_schema: Vec::new(),
- limits,
- };
+ // Create new collection
+ let new_collection = Collection {
+ owner: who.clone(),
+ name: collection_name,
+ mode: mode.clone(),
+ mint_mode: false,
+ access: AccessMode::Normal,
+ description: collection_description,
+ decimal_points,
+ token_prefix,
+ offchain_schema: Vec::new(),
+ schema_version: SchemaVersion::ImageURL,
+ sponsorship: SponsorshipState::Disabled,
+ variable_on_chain_schema: Vec::new(),
+ const_on_chain_schema: Vec::new(),
+ limits,
+ };
- // Add new collection to map
- <CollectionById<T>>::insert(next_id, new_collection);
+ // Add new collection to map
+ <CollectionById<T>>::insert(next_id, new_collection);
- // call event
- Self::deposit_event(RawEvent::CollectionCreated(next_id, mode.into(), who));
+ // call event
+ Self::deposit_event(RawEvent::CollectionCreated(next_id, mode.id(), who));
- Ok(())
- }
+ Ok(())
+ }
- /// **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- ///
- /// # Arguments
- ///
- /// * collection_id: collection to destroy.
- #[weight = <T as Config>::WeightInfo::destroy_collection()]
- #[transactional]
- pub fn destroy_collection(origin, collection_id: CollectionId) -> DispatchResult {
+ /// **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: collection to destroy.
+ #[weight = <T as Config>::WeightInfo::destroy_collection()]
+ #[transactional]
+ pub fn destroy_collection(origin, collection_id: CollectionId) -> DispatchResult {
- let sender = ensure_signed(origin)?;
- let collection = Self::get_collection(collection_id)?;
- Self::check_owner_permissions(&collection, &sender)?;
- if !collection.limits.owner_can_destroy {
- fail!(Error::<T>::NoPermission);
- }
+ let sender = ensure_signed(origin)?;
+ let collection = Self::get_collection(collection_id)?;
+ Self::check_owner_permissions(&collection, &sender)?;
+ if !collection.limits.owner_can_destroy {
+ fail!(Error::<T>::NoPermission);
+ }
- <AddressTokens<T>>::remove_prefix(collection_id);
- <Allowances<T>>::remove_prefix(collection_id);
- <Balance<T>>::remove_prefix(collection_id);
- <ItemListIndex>::remove(collection_id);
- <AdminList<T>>::remove(collection_id);
- <CollectionById<T>>::remove(collection_id);
- <WhiteList<T>>::remove_prefix(collection_id);
+ <AddressTokens<T>>::remove_prefix(collection_id);
+ <Allowances<T>>::remove_prefix(collection_id);
+ <Balance<T>>::remove_prefix(collection_id);
+ <ItemListIndex>::remove(collection_id);
+ <AdminList<T>>::remove(collection_id);
+ <CollectionById<T>>::remove(collection_id);
+ <WhiteList<T>>::remove_prefix(collection_id);
- <NftItemList<T>>::remove_prefix(collection_id);
- <FungibleItemList<T>>::remove_prefix(collection_id);
- <ReFungibleItemList<T>>::remove_prefix(collection_id);
+ <NftItemList<T>>::remove_prefix(collection_id);
+ <FungibleItemList<T>>::remove_prefix(collection_id);
+ <ReFungibleItemList<T>>::remove_prefix(collection_id);
- <NftTransferBasket<T>>::remove_prefix(collection_id);
- <FungibleTransferBasket<T>>::remove_prefix(collection_id);
- <ReFungibleTransferBasket<T>>::remove_prefix(collection_id);
+ <NftTransferBasket<T>>::remove_prefix(collection_id);
+ <FungibleTransferBasket<T>>::remove_prefix(collection_id);
+ <ReFungibleTransferBasket<T>>::remove_prefix(collection_id);
- <VariableMetaDataBasket<T>>::remove_prefix(collection_id);
+ <VariableMetaDataBasket<T>>::remove_prefix(collection_id);
- DestroyedCollectionCount::put(DestroyedCollectionCount::get()
- .checked_add(1)
- .ok_or(Error::<T>::NumOverflow)?);
+ DestroyedCollectionCount::put(DestroyedCollectionCount::get()
+ .checked_add(1)
+ .ok_or(Error::<T>::NumOverflow)?);
- Ok(())
- }
+ Ok(())
+ }
- /// Add an address to white list.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * address.
- #[weight = <T as Config>::WeightInfo::add_to_white_list()]
- #[transactional]
- pub fn add_to_white_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{
+ /// Add an address to white list.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * address.
+ #[weight = <T as Config>::WeightInfo::add_to_white_list()]
+ #[transactional]
+ pub fn add_to_white_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let collection = Self::get_collection(collection_id)?;
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let collection = Self::get_collection(collection_id)?;
- Self::toggle_white_list_internal(
- &sender,
- &collection,
- &address,
- true,
- )?;
+ Self::toggle_white_list_internal(
+ &sender,
+ &collection,
+ &address,
+ true,
+ )?;
- Ok(())
- }
+ Ok(())
+ }
- /// Remove an address from white list.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * address.
- #[weight = <T as Config>::WeightInfo::remove_from_white_list()]
- #[transactional]
- pub fn remove_from_white_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{
+ /// Remove an address from white list.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * address.
+ #[weight = <T as Config>::WeightInfo::remove_from_white_list()]
+ #[transactional]
+ pub fn remove_from_white_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let collection = Self::get_collection(collection_id)?;
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let collection = Self::get_collection(collection_id)?;
- Self::toggle_white_list_internal(
- &sender,
- &collection,
- &address,
- false,
- )?;
+ Self::toggle_white_list_internal(
+ &sender,
+ &collection,
+ &address,
+ false,
+ )?;
- Ok(())
- }
+ Ok(())
+ }
- /// Toggle between normal and white list access for the methods with access for `Anyone`.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * mode: [AccessMode]
- #[weight = <T as Config>::WeightInfo::set_public_access_mode()]
- #[transactional]
- pub fn set_public_access_mode(origin, collection_id: CollectionId, mode: AccessMode) -> DispatchResult
- {
- let sender = ensure_signed(origin)?;
+ /// Toggle between normal and white list access for the methods with access for `Anyone`.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * mode: [AccessMode]
+ #[weight = <T as Config>::WeightInfo::set_public_access_mode()]
+ #[transactional]
+ pub fn set_public_access_mode(origin, collection_id: CollectionId, mode: AccessMode) -> DispatchResult
+ {
+ let sender = ensure_signed(origin)?;
- let mut target_collection = Self::get_collection(collection_id)?;
- Self::check_owner_permissions(&target_collection, &sender)?;
- target_collection.access = mode;
- Self::save_collection(target_collection);
+ let mut target_collection = Self::get_collection(collection_id)?;
+ Self::check_owner_permissions(&target_collection, &sender)?;
+ target_collection.access = mode;
+ Self::save_collection(target_collection);
- Ok(())
- }
+ Ok(())
+ }
- /// Allows Anyone to create tokens if:
- /// * White List is enabled, and
- /// * Address is added to white list, and
- /// * This method was called with True parameter
- ///
- /// # Permissions
- /// * Collection Owner
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * mint_permission: Boolean parameter. If True, allows minting to Anyone with conditions above.
- #[weight = <T as Config>::WeightInfo::set_mint_permission()]
- #[transactional]
- pub fn set_mint_permission(origin, collection_id: CollectionId, mint_permission: bool) -> DispatchResult
- {
- let sender = ensure_signed(origin)?;
+ /// Allows Anyone to create tokens if:
+ /// * White List is enabled, and
+ /// * Address is added to white list, and
+ /// * This method was called with True parameter
+ ///
+ /// # Permissions
+ /// * Collection Owner
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * mint_permission: Boolean parameter. If True, allows minting to Anyone with conditions above.
+ #[weight = <T as Config>::WeightInfo::set_mint_permission()]
+ #[transactional]
+ pub fn set_mint_permission(origin, collection_id: CollectionId, mint_permission: bool) -> DispatchResult
+ {
+ let sender = ensure_signed(origin)?;
- let mut target_collection = Self::get_collection(collection_id)?;
- Self::check_owner_permissions(&target_collection, &sender)?;
- target_collection.mint_mode = mint_permission;
- Self::save_collection(target_collection);
+ let mut target_collection = Self::get_collection(collection_id)?;
+ Self::check_owner_permissions(&target_collection, &sender)?;
+ target_collection.mint_mode = mint_permission;
+ Self::save_collection(target_collection);
- Ok(())
- }
+ Ok(())
+ }
- /// Change the owner of the collection.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * new_owner.
- #[weight = <T as Config>::WeightInfo::change_collection_owner()]
- #[transactional]
- pub fn change_collection_owner(origin, collection_id: CollectionId, new_owner: T::AccountId) -> DispatchResult {
+ /// Change the owner of the collection.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * new_owner.
+ #[weight = <T as Config>::WeightInfo::change_collection_owner()]
+ #[transactional]
+ pub fn change_collection_owner(origin, collection_id: CollectionId, new_owner: T::AccountId) -> DispatchResult {
- let sender = ensure_signed(origin)?;
- let mut target_collection = Self::get_collection(collection_id)?;
- Self::check_owner_permissions(&target_collection, &sender)?;
- target_collection.owner = new_owner;
- Self::save_collection(target_collection);
+ let sender = ensure_signed(origin)?;
+ let mut target_collection = Self::get_collection(collection_id)?;
+ Self::check_owner_permissions(&target_collection, &sender)?;
+ target_collection.owner = new_owner;
+ Self::save_collection(target_collection);
- Ok(())
- }
+ Ok(())
+ }
- /// 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.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- /// * Collection Admin.
- ///
- /// # Arguments
- ///
- /// * collection_id: ID of the Collection to add admin for.
- ///
- /// * new_admin_id: Address of new admin to add.
- #[weight = <T as Config>::WeightInfo::add_collection_admin()]
- #[transactional]
- pub fn add_collection_admin(origin, collection_id: CollectionId, new_admin_id: T::CrossAccountId) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let collection = Self::get_collection(collection_id)?;
- Self::check_owner_or_admin_permissions(&collection, &sender)?;
- let mut admin_arr = <AdminList<T>>::get(collection_id);
+ /// 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.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ /// * Collection Admin.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: ID of the Collection to add admin for.
+ ///
+ /// * new_admin_id: Address of new admin to add.
+ #[weight = <T as Config>::WeightInfo::add_collection_admin()]
+ #[transactional]
+ pub fn add_collection_admin(origin, collection_id: CollectionId, new_admin_id: T::CrossAccountId) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let collection = Self::get_collection(collection_id)?;
+ Self::check_owner_or_admin_permissions(&collection, &sender)?;
+ let mut admin_arr = <AdminList<T>>::get(collection_id);
- match admin_arr.binary_search(&new_admin_id) {
- Ok(_) => {},
- Err(idx) => {
- let limits = ChainLimit::get();
- ensure!(admin_arr.len() < limits.collections_admins_limit as usize, Error::<T>::CollectionAdminsLimitExceeded);
- admin_arr.insert(idx, new_admin_id);
- <AdminList<T>>::insert(collection_id, admin_arr);
- }
- }
- Ok(())
- }
+ match admin_arr.binary_search(&new_admin_id) {
+ Ok(_) => {},
+ Err(idx) => {
+ let limits = ChainLimit::get();
+ ensure!(admin_arr.len() < limits.collections_admins_limit as usize, Error::<T>::CollectionAdminsLimitExceeded);
+ admin_arr.insert(idx, new_admin_id);
+ <AdminList<T>>::insert(collection_id, admin_arr);
+ }
+ }
+ Ok(())
+ }
- /// 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.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- /// * Collection Admin.
- ///
- /// # Arguments
- ///
- /// * collection_id: ID of the Collection to remove admin for.
- ///
- /// * account_id: Address of admin to remove.
- #[weight = <T as Config>::WeightInfo::remove_collection_admin()]
- #[transactional]
- pub fn remove_collection_admin(origin, collection_id: CollectionId, account_id: T::CrossAccountId) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let collection = Self::get_collection(collection_id)?;
- Self::check_owner_or_admin_permissions(&collection, &sender)?;
- let mut admin_arr = <AdminList<T>>::get(collection_id);
+ /// 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.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ /// * Collection Admin.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: ID of the Collection to remove admin for.
+ ///
+ /// * account_id: Address of admin to remove.
+ #[weight = <T as Config>::WeightInfo::remove_collection_admin()]
+ #[transactional]
+ pub fn remove_collection_admin(origin, collection_id: CollectionId, account_id: T::CrossAccountId) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let collection = Self::get_collection(collection_id)?;
+ Self::check_owner_or_admin_permissions(&collection, &sender)?;
+ let mut admin_arr = <AdminList<T>>::get(collection_id);
- match admin_arr.binary_search(&account_id) {
- Ok(idx) => {
- admin_arr.remove(idx);
- <AdminList<T>>::insert(collection_id, admin_arr);
- },
- Err(_) => {}
- }
- Ok(())
- }
+ if let Ok(idx) = admin_arr.binary_search(&account_id) {
+ admin_arr.remove(idx);
+ <AdminList<T>>::insert(collection_id, admin_arr);
+ }
+ Ok(())
+ }
- /// # Permissions
- ///
- /// * Collection Owner
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * new_sponsor.
- #[weight = <T as Config>::WeightInfo::set_collection_sponsor()]
- #[transactional]
- pub fn set_collection_sponsor(origin, collection_id: CollectionId, new_sponsor: T::AccountId) -> DispatchResult {
- let sender = ensure_signed(origin)?;
- let mut target_collection = Self::get_collection(collection_id)?;
- Self::check_owner_permissions(&target_collection, &sender)?;
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * new_sponsor.
+ #[weight = <T as Config>::WeightInfo::set_collection_sponsor()]
+ #[transactional]
+ pub fn set_collection_sponsor(origin, collection_id: CollectionId, new_sponsor: T::AccountId) -> DispatchResult {
+ let sender = ensure_signed(origin)?;
+ let mut target_collection = Self::get_collection(collection_id)?;
+ Self::check_owner_permissions(&target_collection, &sender)?;
- target_collection.sponsorship = SponsorshipState::Unconfirmed(new_sponsor);
- Self::save_collection(target_collection);
+ target_collection.sponsorship = SponsorshipState::Unconfirmed(new_sponsor);
+ Self::save_collection(target_collection);
- Ok(())
- }
+ Ok(())
+ }
- /// # Permissions
- ///
- /// * Sponsor.
- ///
- /// # Arguments
- ///
- /// * collection_id.
- #[weight = <T as Config>::WeightInfo::confirm_sponsorship()]
- #[transactional]
- pub fn confirm_sponsorship(origin, collection_id: CollectionId) -> DispatchResult {
- let sender = ensure_signed(origin)?;
+ /// # Permissions
+ ///
+ /// * Sponsor.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ #[weight = <T as Config>::WeightInfo::confirm_sponsorship()]
+ #[transactional]
+ pub fn confirm_sponsorship(origin, collection_id: CollectionId) -> DispatchResult {
+ let sender = ensure_signed(origin)?;
- let mut target_collection = Self::get_collection(collection_id)?;
- ensure!(
- target_collection.sponsorship.pending_sponsor() == Some(&sender),
- Error::<T>::ConfirmUnsetSponsorFail
- );
+ let mut target_collection = Self::get_collection(collection_id)?;
+ ensure!(
+ target_collection.sponsorship.pending_sponsor() == Some(&sender),
+ Error::<T>::ConfirmUnsetSponsorFail
+ );
- target_collection.sponsorship = SponsorshipState::Confirmed(sender);
- Self::save_collection(target_collection);
+ target_collection.sponsorship = SponsorshipState::Confirmed(sender);
+ Self::save_collection(target_collection);
- Ok(())
- }
+ Ok(())
+ }
- /// Switch back to pay-per-own-transaction model.
- ///
- /// # Permissions
- ///
- /// * Collection owner.
- ///
- /// # Arguments
- ///
- /// * collection_id.
- #[weight = <T as Config>::WeightInfo::remove_collection_sponsor()]
- #[transactional]
- pub fn remove_collection_sponsor(origin, collection_id: CollectionId) -> DispatchResult {
- let sender = ensure_signed(origin)?;
+ /// Switch back to pay-per-own-transaction model.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection owner.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ #[weight = <T as Config>::WeightInfo::remove_collection_sponsor()]
+ #[transactional]
+ pub fn remove_collection_sponsor(origin, collection_id: CollectionId) -> DispatchResult {
+ let sender = ensure_signed(origin)?;
- let mut target_collection = Self::get_collection(collection_id)?;
- Self::check_owner_permissions(&target_collection, &sender)?;
+ let mut target_collection = Self::get_collection(collection_id)?;
+ Self::check_owner_permissions(&target_collection, &sender)?;
- target_collection.sponsorship = SponsorshipState::Disabled;
- Self::save_collection(target_collection);
+ target_collection.sponsorship = SponsorshipState::Disabled;
+ Self::save_collection(target_collection);
- Ok(())
- }
+ Ok(())
+ }
- /// This method creates a concrete instance of NFT Collection created with CreateCollection method.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- /// * Collection Admin.
- /// * Anyone if
- /// * White List is enabled, and
- /// * Address is added to white list, and
- /// * MintPermission is enabled (see SetMintPermission method)
- ///
- /// # Arguments
- ///
- /// * collection_id: ID of the collection.
- ///
- /// * owner: Address, initial owner of the NFT.
- ///
- /// * data: Token data to store on chain.
- // #[weight =
- // (130_000_000 as Weight)
- // .saturating_add((2135 as Weight).saturating_mul((properties.len() as u64) as Weight))
- // .saturating_add(RocksDbWeight::get().reads(10 as Weight))
- // .saturating_add(RocksDbWeight::get().writes(8 as Weight))]
+ /// This method creates a concrete instance of NFT Collection created with CreateCollection method.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ /// * Collection Admin.
+ /// * Anyone if
+ /// * White List is enabled, and
+ /// * Address is added to white list, and
+ /// * MintPermission is enabled (see SetMintPermission method)
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: ID of the collection.
+ ///
+ /// * owner: Address, initial owner of the NFT.
+ ///
+ /// * data: Token data to store on chain.
+ // #[weight =
+ // (130_000_000 as Weight)
+ // .saturating_add((2135 as Weight).saturating_mul((properties.len() as u64) as Weight))
+ // .saturating_add(RocksDbWeight::get().reads(10 as Weight))
+ // .saturating_add(RocksDbWeight::get().writes(8 as Weight))]
- #[weight = <T as Config>::WeightInfo::create_item(data.len())]
- #[transactional]
- pub fn create_item(origin, collection_id: CollectionId, owner: T::CrossAccountId, data: CreateItemData) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let collection = Self::get_collection(collection_id)?;
+ #[weight = <T as Config>::WeightInfo::create_item(data.data_size())]
+ #[transactional]
+ pub fn create_item(origin, collection_id: CollectionId, owner: T::CrossAccountId, data: CreateItemData) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let collection = Self::get_collection(collection_id)?;
- Self::create_item_internal(&sender, &collection, &owner, data)?;
+ Self::create_item_internal(&sender, &collection, &owner, data)?;
- Self::submit_logs(collection)?;
- Ok(())
- }
+ Self::submit_logs(collection)?;
+ Ok(())
+ }
- /// This method creates multiple items in a collection created with CreateCollection method.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- /// * Collection Admin.
- /// * Anyone if
- /// * White List is enabled, and
- /// * Address is added to white list, and
- /// * MintPermission is enabled (see SetMintPermission method)
- ///
- /// # Arguments
- ///
- /// * collection_id: ID of the collection.
- ///
- /// * itemsData: Array items properties. Each property is an array of bytes itself, see [create_item].
- ///
- /// * owner: Address, initial owner of the NFT.
- #[weight = <T as Config>::WeightInfo::create_item(items_data.into_iter()
- .map(|data| { data.len() })
- .sum())]
- #[transactional]
- pub fn create_multiple_items(origin, collection_id: CollectionId, owner: T::CrossAccountId, items_data: Vec<CreateItemData>) -> DispatchResult {
+ /// This method creates multiple items in a collection created with CreateCollection method.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ /// * Collection Admin.
+ /// * Anyone if
+ /// * White List is enabled, and
+ /// * Address is added to white list, and
+ /// * MintPermission is enabled (see SetMintPermission method)
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: ID of the collection.
+ ///
+ /// * itemsData: Array items properties. Each property is an array of bytes itself, see [create_item].
+ ///
+ /// * owner: Address, initial owner of the NFT.
+ #[weight = <T as Config>::WeightInfo::create_item(items_data.iter()
+ .map(|data| { data.data_size() })
+ .sum())]
+ #[transactional]
+ pub fn create_multiple_items(origin, collection_id: CollectionId, owner: T::CrossAccountId, items_data: Vec<CreateItemData>) -> DispatchResult {
- ensure!(items_data.len() > 0, Error::<T>::EmptyArgument);
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let collection = Self::get_collection(collection_id)?;
+ ensure!(!items_data.is_empty(), Error::<T>::EmptyArgument);
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let collection = Self::get_collection(collection_id)?;
- Self::create_multiple_items_internal(&sender, &collection, &owner, items_data)?;
+ Self::create_multiple_items_internal(&sender, &collection, &owner, items_data)?;
- Self::submit_logs(collection)?;
- Ok(())
- }
+ Self::submit_logs(collection)?;
+ Ok(())
+ }
- /// Destroys a concrete instance of NFT.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- /// * Collection Admin.
- /// * Current NFT Owner.
- ///
- /// # Arguments
- ///
- /// * collection_id: ID of the collection.
- ///
- /// * item_id: ID of NFT to burn.
- #[weight = <T as Config>::WeightInfo::burn_item()]
- #[transactional]
- pub fn burn_item(origin, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResult {
+ /// Destroys a concrete instance of NFT.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ /// * Collection Admin.
+ /// * Current NFT Owner.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: ID of the collection.
+ ///
+ /// * item_id: ID of NFT to burn.
+ #[weight = <T as Config>::WeightInfo::burn_item()]
+ #[transactional]
+ pub fn burn_item(origin, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let target_collection = Self::get_collection(collection_id)?;
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let target_collection = Self::get_collection(collection_id)?;
- Self::burn_item_internal(&sender, &target_collection, item_id, value)?;
+ Self::burn_item_internal(&sender, &target_collection, item_id, value)?;
- Self::submit_logs(target_collection)?;
- Ok(())
- }
+ Self::submit_logs(target_collection)?;
+ Ok(())
+ }
- /// Change ownership of the token.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- /// * Current NFT owner
- ///
- /// # Arguments
- ///
- /// * recipient: Address of token recipient.
- ///
- /// * collection_id.
- ///
- /// * 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)
- #[weight = <T as Config>::WeightInfo::transfer()]
- #[transactional]
- pub fn transfer(origin, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let collection = Self::get_collection(collection_id)?;
+ /// Change ownership of the token.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ /// * Current NFT owner
+ ///
+ /// # Arguments
+ ///
+ /// * recipient: Address of token recipient.
+ ///
+ /// * collection_id.
+ ///
+ /// * 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)
+ #[weight = <T as Config>::WeightInfo::transfer()]
+ #[transactional]
+ pub fn transfer(origin, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let collection = Self::get_collection(collection_id)?;
- Self::transfer_internal(&sender, &recipient, &collection, item_id, value)?;
+ Self::transfer_internal(&sender, &recipient, &collection, item_id, value)?;
- Self::submit_logs(collection)?;
- Ok(())
- }
+ Self::submit_logs(collection)?;
+ Ok(())
+ }
- /// Set, change, or remove approved address to transfer the ownership of the NFT.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- /// * Current NFT 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.
- #[weight = <T as Config>::WeightInfo::approve()]
- #[transactional]
- pub fn approve(origin, spender: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, amount: u128) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let collection = Self::get_collection(collection_id)?;
+ /// Set, change, or remove approved address to transfer the ownership of the NFT.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ /// * Current NFT 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.
+ #[weight = <T as Config>::WeightInfo::approve()]
+ #[transactional]
+ pub fn approve(origin, spender: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, amount: u128) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let collection = Self::get_collection(collection_id)?;
- Self::approve_internal(&sender, &spender, &collection, item_id, amount)?;
+ Self::approve_internal(&sender, &spender, &collection, item_id, amount)?;
- Self::submit_logs(collection)?;
- Ok(())
- }
-
- /// 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.
- ///
- /// # Permissions
- /// * Collection Owner
- /// * Collection Admin
- /// * Current NFT owner
- /// * Address approved by current NFT owner
- ///
- /// # Arguments
- ///
- /// * from: Address that owns token.
- ///
- /// * recipient: Address of token recipient.
- ///
- /// * collection_id.
- ///
- /// * item_id: ID of the item.
- ///
- /// * value: Amount to transfer.
- #[weight = <T as Config>::WeightInfo::transfer_from()]
- #[transactional]
- pub fn transfer_from(origin, from: T::CrossAccountId, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128 ) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let collection = Self::get_collection(collection_id)?;
+ Self::submit_logs(collection)?;
+ Ok(())
+ }
- Self::transfer_from_internal(&sender, &from, &recipient, &collection, item_id, value)?;
+ /// 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.
+ ///
+ /// # Permissions
+ /// * Collection Owner
+ /// * Collection Admin
+ /// * Current NFT owner
+ /// * Address approved by current NFT owner
+ ///
+ /// # Arguments
+ ///
+ /// * from: Address that owns token.
+ ///
+ /// * recipient: Address of token recipient.
+ ///
+ /// * collection_id.
+ ///
+ /// * item_id: ID of the item.
+ ///
+ /// * value: Amount to transfer.
+ #[weight = <T as Config>::WeightInfo::transfer_from()]
+ #[transactional]
+ pub fn transfer_from(origin, from: T::CrossAccountId, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128 ) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let collection = Self::get_collection(collection_id)?;
- Self::submit_logs(collection)?;
- Ok(())
- }
- // #[weight = 0]
- // // let no_perm_mes = "You do not have permissions to modify this collection";
- // // ensure!(<ApprovedList<T>>::contains_key((collection_id, item_id)), no_perm_mes);
- // // let list_itm = <ApprovedList<T>>::get((collection_id, item_id));
- // // ensure!(list_itm.contains(&new_owner.clone()), no_perm_mes);
+ Self::transfer_from_internal(&sender, &from, &recipient, &collection, item_id, value)?;
- // // // on_nft_received call
+ Self::submit_logs(collection)?;
+ Ok(())
+ }
+ // #[weight = 0]
+ // // let no_perm_mes = "You do not have permissions to modify this collection";
+ // // ensure!(<ApprovedList<T>>::contains_key((collection_id, item_id)), no_perm_mes);
+ // // let list_itm = <ApprovedList<T>>::get((collection_id, item_id));
+ // // ensure!(list_itm.contains(&new_owner.clone()), no_perm_mes);
- // // Self::transfer(origin, collection_id, item_id, new_owner)?;
+ // // // on_nft_received call
- // Ok(())
- // }
+ // // Self::transfer(origin, collection_id, item_id, new_owner)?;
- /// Set off-chain data schema.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * schema: String representing the offchain data schema.
- #[weight = <T as Config>::WeightInfo::set_variable_meta_data()]
- #[transactional]
- pub fn set_variable_meta_data (
- origin,
- collection_id: CollectionId,
- item_id: TokenId,
- data: Vec<u8>
- ) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- let collection = Self::get_collection(collection_id)?;
+ // Ok(())
+ // }
- Self::set_variable_meta_data_internal(&sender, &collection, item_id, data)?;
+ /// Set off-chain data schema.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * schema: String representing the offchain data schema.
+ #[weight = <T as Config>::WeightInfo::set_variable_meta_data()]
+ #[transactional]
+ pub fn set_variable_meta_data (
+ origin,
+ collection_id: CollectionId,
+ item_id: TokenId,
+ data: Vec<u8>
+ ) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- Ok(())
- }
-
- /// Set schema standard
- /// ImageURL
- /// Unique
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * schema: SchemaVersion: enum
- #[weight = <T as Config>::WeightInfo::set_schema_version()]
- #[transactional]
- pub fn set_schema_version(
- origin,
- collection_id: CollectionId,
- version: SchemaVersion
- ) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let mut target_collection = Self::get_collection(collection_id)?;
- Self::check_owner_or_admin_permissions(&target_collection, &sender)?;
- target_collection.schema_version = version;
- Self::save_collection(target_collection);
+ let collection = Self::get_collection(collection_id)?;
- Ok(())
- }
+ Self::set_variable_meta_data_internal(&sender, &collection, item_id, data)?;
- /// Set off-chain data schema.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * schema: String representing the offchain data schema.
- #[weight = <T as Config>::WeightInfo::set_offchain_schema()]
- #[transactional]
- pub fn set_offchain_schema(
- origin,
- collection_id: CollectionId,
- schema: Vec<u8>
- ) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let mut target_collection = Self::get_collection(collection_id)?;
- Self::check_owner_or_admin_permissions(&target_collection, &sender)?;
+ Ok(())
+ }
- // check schema limit
- ensure!(schema.len() as u32 <= ChainLimit::get().offchain_schema_limit, "");
+ /// Set schema standard
+ /// ImageURL
+ /// Unique
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * schema: SchemaVersion: enum
+ #[weight = <T as Config>::WeightInfo::set_schema_version()]
+ #[transactional]
+ pub fn set_schema_version(
+ origin,
+ collection_id: CollectionId,
+ version: SchemaVersion
+ ) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let mut target_collection = Self::get_collection(collection_id)?;
+ Self::check_owner_or_admin_permissions(&target_collection, &sender)?;
+ target_collection.schema_version = version;
+ Self::save_collection(target_collection);
- target_collection.offchain_schema = schema;
- Self::save_collection(target_collection);
+ Ok(())
+ }
- Ok(())
- }
+ /// Set off-chain data schema.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * schema: String representing the offchain data schema.
+ #[weight = <T as Config>::WeightInfo::set_offchain_schema()]
+ #[transactional]
+ pub fn set_offchain_schema(
+ origin,
+ collection_id: CollectionId,
+ schema: Vec<u8>
+ ) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let mut target_collection = Self::get_collection(collection_id)?;
+ Self::check_owner_or_admin_permissions(&target_collection, &sender)?;
- /// Set const on-chain data schema.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * schema: String representing the const on-chain data schema.
- #[weight = <T as Config>::WeightInfo::set_const_on_chain_schema()]
- #[transactional]
- pub fn set_const_on_chain_schema (
- origin,
- collection_id: CollectionId,
- schema: Vec<u8>
- ) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let mut target_collection = Self::get_collection(collection_id)?;
- Self::check_owner_or_admin_permissions(&target_collection, &sender)?;
+ // check schema limit
+ ensure!(schema.len() as u32 <= ChainLimit::get().offchain_schema_limit, "");
- // check schema limit
- ensure!(schema.len() as u32 <= ChainLimit::get().const_on_chain_schema_limit, "");
+ target_collection.offchain_schema = schema;
+ Self::save_collection(target_collection);
- target_collection.const_on_chain_schema = schema;
- Self::save_collection(target_collection);
+ Ok(())
+ }
- Ok(())
- }
+ /// Set const on-chain data schema.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * schema: String representing the const on-chain data schema.
+ #[weight = <T as Config>::WeightInfo::set_const_on_chain_schema()]
+ #[transactional]
+ pub fn set_const_on_chain_schema (
+ origin,
+ collection_id: CollectionId,
+ schema: Vec<u8>
+ ) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let mut target_collection = Self::get_collection(collection_id)?;
+ Self::check_owner_or_admin_permissions(&target_collection, &sender)?;
- /// Set variable on-chain data schema.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * schema: String representing the variable on-chain data schema.
- #[weight = <T as Config>::WeightInfo::set_const_on_chain_schema()]
- #[transactional]
- pub fn set_variable_on_chain_schema (
- origin,
- collection_id: CollectionId,
- schema: Vec<u8>
- ) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let mut target_collection = Self::get_collection(collection_id)?;
- Self::check_owner_or_admin_permissions(&target_collection, &sender)?;
+ // check schema limit
+ ensure!(schema.len() as u32 <= ChainLimit::get().const_on_chain_schema_limit, "");
- // check schema limit
- ensure!(schema.len() as u32 <= ChainLimit::get().variable_on_chain_schema_limit, "");
+ target_collection.const_on_chain_schema = schema;
+ Self::save_collection(target_collection);
- target_collection.variable_on_chain_schema = schema;
- Self::save_collection(target_collection);
+ Ok(())
+ }
- Ok(())
- }
+ /// Set variable on-chain data schema.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * schema: String representing the variable on-chain data schema.
+ #[weight = <T as Config>::WeightInfo::set_const_on_chain_schema()]
+ #[transactional]
+ pub fn set_variable_on_chain_schema (
+ origin,
+ collection_id: CollectionId,
+ schema: Vec<u8>
+ ) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let mut target_collection = Self::get_collection(collection_id)?;
+ Self::check_owner_or_admin_permissions(&target_collection, &sender)?;
- // Sudo permissions function
- #[weight = <T as Config>::WeightInfo::set_chain_limits()]
- #[transactional]
- pub fn set_chain_limits(
- origin,
- limits: ChainLimits
- ) -> DispatchResult {
+ // check schema limit
+ ensure!(schema.len() as u32 <= ChainLimit::get().variable_on_chain_schema_limit, "");
- #[cfg(not(feature = "runtime-benchmarks"))]
- ensure_root(origin)?;
+ target_collection.variable_on_chain_schema = schema;
+ Self::save_collection(target_collection);
- <ChainLimit>::put(limits);
- Ok(())
- }
+ Ok(())
+ }
- #[weight = <T as Config>::WeightInfo::set_collection_limits()]
- #[transactional]
- pub fn set_collection_limits(
- origin,
- collection_id: u32,
- new_limits: CollectionLimits<T::BlockNumber>,
- ) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let mut target_collection = Self::get_collection(collection_id)?;
- Self::check_owner_permissions(&target_collection, &sender.as_sub())?;
- let old_limits = &target_collection.limits;
- let chain_limits = ChainLimit::get();
+ // Sudo permissions function
+ #[weight = <T as Config>::WeightInfo::set_chain_limits()]
+ #[transactional]
+ pub fn set_chain_limits(
+ origin,
+ limits: ChainLimits
+ ) -> DispatchResult {
- // collection bounds
- ensure!(new_limits.sponsor_transfer_timeout <= MAX_SPONSOR_TIMEOUT &&
- new_limits.account_token_ownership_limit <= MAX_TOKEN_OWNERSHIP &&
- new_limits.sponsored_data_size <= chain_limits.custom_data_limit,
- Error::<T>::CollectionLimitBoundsExceeded);
+ #[cfg(not(feature = "runtime-benchmarks"))]
+ ensure_root(origin)?;
- // token_limit check prev
- ensure!(old_limits.token_limit >= new_limits.token_limit, Error::<T>::CollectionTokenLimitExceeded);
- ensure!(new_limits.token_limit > 0, Error::<T>::CollectionTokenLimitExceeded);
+ <ChainLimit>::put(limits);
+ Ok(())
+ }
- ensure!(
- (old_limits.owner_can_transfer || !new_limits.owner_can_transfer) &&
- (old_limits.owner_can_destroy || !new_limits.owner_can_destroy),
- Error::<T>::OwnerPermissionsCantBeReverted,
- );
+ #[weight = <T as Config>::WeightInfo::set_collection_limits()]
+ #[transactional]
+ pub fn set_collection_limits(
+ origin,
+ collection_id: u32,
+ new_limits: CollectionLimits<T::BlockNumber>,
+ ) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let mut target_collection = Self::get_collection(collection_id)?;
+ Self::check_owner_permissions(&target_collection, &sender.as_sub())?;
+ let old_limits = &target_collection.limits;
+ let chain_limits = ChainLimit::get();
- target_collection.limits = new_limits;
- Self::save_collection(target_collection);
+ // collection bounds
+ ensure!(new_limits.sponsor_transfer_timeout <= MAX_SPONSOR_TIMEOUT &&
+ new_limits.account_token_ownership_limit <= MAX_TOKEN_OWNERSHIP &&
+ new_limits.sponsored_data_size <= chain_limits.custom_data_limit,
+ Error::<T>::CollectionLimitBoundsExceeded);
+
+ // token_limit check prev
+ ensure!(old_limits.token_limit >= new_limits.token_limit, Error::<T>::CollectionTokenLimitExceeded);
+ ensure!(new_limits.token_limit > 0, Error::<T>::CollectionTokenLimitExceeded);
- Ok(())
- }
- }
+ ensure!(
+ (old_limits.owner_can_transfer || !new_limits.owner_can_transfer) &&
+ (old_limits.owner_can_destroy || !new_limits.owner_can_destroy),
+ Error::<T>::OwnerPermissionsCantBeReverted,
+ );
+
+ target_collection.limits = new_limits;
+ Self::save_collection(target_collection);
+
+ Ok(())
+ }
+ }
}
impl<T: Config> Module<T> {
- pub fn create_item_internal(sender: &T::CrossAccountId, collection: &CollectionHandle<T>, owner: &T::CrossAccountId, data: CreateItemData) -> DispatchResult {
- Self::can_create_items_in_collection(&collection, &sender, &owner, 1)?;
- Self::validate_create_item_args(&collection, &data)?;
- Self::create_item_no_validation(&collection, owner, data)?;
+ pub fn create_item_internal(
+ sender: &T::CrossAccountId,
+ collection: &CollectionHandle<T>,
+ owner: &T::CrossAccountId,
+ data: CreateItemData,
+ ) -> DispatchResult {
+ Self::can_create_items_in_collection(&collection, &sender, &owner, 1)?;
+ Self::validate_create_item_args(&collection, &data)?;
+ Self::create_item_no_validation(&collection, owner, data)?;
- Ok(())
- }
+ Ok(())
+ }
- pub fn transfer_internal(sender: &T::CrossAccountId, recipient: &T::CrossAccountId, target_collection: &CollectionHandle<T>, item_id: TokenId, value: u128) -> DispatchResult {
- target_collection.consume_gas(2000000)?;
- // Limits check
- Self::is_correct_transfer(target_collection, &recipient)?;
+ pub fn transfer_internal(
+ sender: &T::CrossAccountId,
+ recipient: &T::CrossAccountId,
+ target_collection: &CollectionHandle<T>,
+ item_id: TokenId,
+ value: u128,
+ ) -> DispatchResult {
+ target_collection.consume_gas(2000000)?;
+ // Limits check
+ Self::is_correct_transfer(target_collection, &recipient)?;
- // Transfer permissions check
- ensure!(Self::is_item_owner(&sender, target_collection, item_id) ||
- Self::is_owner_or_admin_permissions(target_collection, &sender),
- Error::<T>::NoPermission);
+ // Transfer permissions check
+ ensure!(
+ Self::is_item_owner(&sender, target_collection, item_id)
+ || Self::is_owner_or_admin_permissions(target_collection, &sender),
+ Error::<T>::NoPermission
+ );
- if target_collection.access == AccessMode::WhiteList {
- Self::check_white_list(target_collection, &sender)?;
- Self::check_white_list(target_collection, &recipient)?;
- }
+ if target_collection.access == AccessMode::WhiteList {
+ Self::check_white_list(target_collection, &sender)?;
+ Self::check_white_list(target_collection, &recipient)?;
+ }
- match target_collection.mode
- {
- CollectionMode::NFT => Self::transfer_nft(target_collection, item_id, sender.clone(), recipient.clone())?,
- CollectionMode::Fungible(_) => Self::transfer_fungible(target_collection, value, &sender, &recipient)?,
- CollectionMode::ReFungible => Self::transfer_refungible(target_collection, item_id, value, sender.clone(), recipient.clone())?,
- _ => ()
- };
+ match target_collection.mode {
+ CollectionMode::NFT => Self::transfer_nft(
+ target_collection,
+ item_id,
+ sender.clone(),
+ recipient.clone(),
+ )?,
+ CollectionMode::Fungible(_) => {
+ Self::transfer_fungible(target_collection, value, &sender, &recipient)?
+ }
+ CollectionMode::ReFungible => Self::transfer_refungible(
+ target_collection,
+ item_id,
+ value,
+ sender.clone(),
+ recipient.clone(),
+ )?,
+ _ => (),
+ };
- Self::deposit_event(RawEvent::Transfer(target_collection.id, item_id, sender.clone(), recipient.clone(), value));
+ Self::deposit_event(RawEvent::Transfer(
+ target_collection.id,
+ item_id,
+ sender.clone(),
+ recipient.clone(),
+ value,
+ ));
- Ok(())
- }
+ Ok(())
+ }
pub fn approve_internal(
sender: &T::CrossAccountId,
spender: &T::CrossAccountId,
collection: &CollectionHandle<T>,
item_id: TokenId,
- amount: u128
+ amount: u128,
) -> DispatchResult {
- collection.consume_gas(2000000)?;
+ collection.consume_gas(2000000)?;
Self::token_exists(&collection, item_id)?;
// Transfer permissions check
- let bypasses_limits = collection.limits.owner_can_transfer &&
- Self::is_owner_or_admin_permissions(
- &collection,
- &sender,
- );
+ let bypasses_limits = collection.limits.owner_can_transfer
+ && Self::is_owner_or_admin_permissions(&collection, &sender);
let allowance_limit = if bypasses_limits {
None
- } else if let Some(amount) = Self::owned_amount(
- &sender,
- &collection,
- item_id,
- ) {
+ } else if let Some(amount) = Self::owned_amount(&sender, &collection, item_id) {
Some(amount)
} else {
fail!(Error::<T>::NoPermission);
@@ -1331,32 +1356,45 @@
}
let allowance: u128 = amount
- .checked_add(<Allowances<T>>::get(collection.id, (item_id, sender.as_sub(), spender.as_sub())))
+ .checked_add(<Allowances<T>>::get(
+ collection.id,
+ (item_id, sender.as_sub(), spender.as_sub()),
+ ))
.ok_or(Error::<T>::NumOverflow)?;
if let Some(limit) = allowance_limit {
ensure!(limit >= allowance, Error::<T>::TokenValueTooLow);
}
- <Allowances<T>>::insert(collection.id, (item_id, sender.as_sub(), spender.as_sub()), allowance);
+ <Allowances<T>>::insert(
+ collection.id,
+ (item_id, sender.as_sub(), spender.as_sub()),
+ allowance,
+ );
if matches!(collection.mode, CollectionMode::NFT) {
// TODO: NFT: only one owner may exist for token in ERC721
collection.log(ERC721Events::Approval {
- owner: *sender.as_eth(),
- approved: *spender.as_eth(),
- token_id: item_id.into(),
- });
+ owner: *sender.as_eth(),
+ approved: *spender.as_eth(),
+ token_id: item_id.into(),
+ });
}
if matches!(collection.mode, CollectionMode::Fungible(_)) {
// TODO: NFT: only one owner may exist for token in ERC20
collection.log(ERC20Events::Approval {
- owner: *sender.as_eth(),
- spender: *spender.as_eth(),
- value: allowance.into()
- });
+ owner: *sender.as_eth(),
+ spender: *spender.as_eth(),
+ value: allowance.into(),
+ });
}
- Self::deposit_event(RawEvent::Approved(collection.id, item_id, sender.clone(), spender.clone(), allowance));
+ Self::deposit_event(RawEvent::Approved(
+ collection.id,
+ item_id,
+ sender.clone(),
+ spender.clone(),
+ allowance,
+ ));
Ok(())
}
@@ -1368,20 +1406,19 @@
item_id: TokenId,
amount: u128,
) -> DispatchResult {
- collection.consume_gas(2000000)?;
+ collection.consume_gas(2000000)?;
// Check approval
- let approval: u128 = <Allowances<T>>::get(collection.id, (item_id, from.as_sub(), sender.as_sub()));
+ let approval: u128 =
+ <Allowances<T>>::get(collection.id, (item_id, from.as_sub(), sender.as_sub()));
// Limits check
Self::is_correct_transfer(&collection, &recipient)?;
// Transfer permissions check
ensure!(
- approval >= amount ||
- (
- collection.limits.owner_can_transfer &&
- Self::is_owner_or_admin_permissions(&collection, &sender)
- ),
+ approval >= amount
+ || (collection.limits.owner_can_transfer
+ && Self::is_owner_or_admin_permissions(&collection, &sender)),
Error::<T>::NoPermission
);
@@ -1393,7 +1430,11 @@
// Reduce approval by transferred amount or remove if remaining approval drops to 0
let allowance = approval.saturating_sub(amount);
if allowance > 0 {
- <Allowances<T>>::insert(collection.id, (item_id, from.as_sub(), sender.as_sub()), allowance);
+ <Allowances<T>>::insert(
+ collection.id,
+ (item_id, from.as_sub(), sender.as_sub()),
+ allowance,
+ );
} else {
<Allowances<T>>::remove(collection.id, (item_id, from.as_sub(), sender.as_sub()));
}
@@ -1405,842 +1446,948 @@
CollectionMode::Fungible(_) => {
Self::transfer_fungible(&collection, amount, &from, &recipient)?
}
- CollectionMode::ReFungible => {
- Self::transfer_refungible(&collection, item_id, amount, from.clone(), recipient.clone())?
- }
- _ => ()
+ CollectionMode::ReFungible => Self::transfer_refungible(
+ &collection,
+ item_id,
+ amount,
+ from.clone(),
+ recipient.clone(),
+ )?,
+ _ => (),
};
if matches!(collection.mode, CollectionMode::Fungible(_)) {
collection.log(ERC20Events::Approval {
- owner: *from.as_eth(),
- spender: *sender.as_eth(),
- value: allowance.into()
- });
+ owner: *from.as_eth(),
+ spender: *sender.as_eth(),
+ value: allowance.into(),
+ });
}
Ok(())
}
- pub fn set_variable_meta_data_internal(
- sender: &T::CrossAccountId,
- collection: &CollectionHandle<T>,
- item_id: TokenId,
- data: Vec<u8>,
- ) -> DispatchResult {
- Self::token_exists(&collection, item_id)?;
+ pub fn set_variable_meta_data_internal(
+ sender: &T::CrossAccountId,
+ collection: &CollectionHandle<T>,
+ item_id: TokenId,
+ data: Vec<u8>,
+ ) -> DispatchResult {
+ Self::token_exists(&collection, item_id)?;
- ensure!(ChainLimit::get().custom_data_limit >= data.len() as u32, Error::<T>::TokenVariableDataLimitExceeded);
+ ensure!(
+ ChainLimit::get().custom_data_limit >= data.len() as u32,
+ Error::<T>::TokenVariableDataLimitExceeded
+ );
- // Modify permissions check
- ensure!(Self::is_item_owner(&sender, &collection, item_id) ||
- Self::is_owner_or_admin_permissions(&collection, &sender),
- Error::<T>::NoPermission);
+ // Modify permissions check
+ ensure!(
+ Self::is_item_owner(&sender, &collection, item_id)
+ || Self::is_owner_or_admin_permissions(&collection, &sender),
+ Error::<T>::NoPermission
+ );
- match collection.mode
- {
- CollectionMode::NFT => Self::set_nft_variable_data(&collection, item_id, data)?,
- CollectionMode::ReFungible => Self::set_re_fungible_variable_data(&collection, item_id, data)?,
- CollectionMode::Fungible(_) => fail!(Error::<T>::CantStoreMetadataInFungibleTokens),
- _ => fail!(Error::<T>::UnexpectedCollectionType)
- };
+ match collection.mode {
+ CollectionMode::NFT => Self::set_nft_variable_data(&collection, item_id, data)?,
+ CollectionMode::ReFungible => {
+ Self::set_re_fungible_variable_data(&collection, item_id, data)?
+ }
+ CollectionMode::Fungible(_) => fail!(Error::<T>::CantStoreMetadataInFungibleTokens),
+ _ => fail!(Error::<T>::UnexpectedCollectionType),
+ };
- Ok(())
- }
+ Ok(())
+ }
- pub fn create_multiple_items_internal(
- sender: &T::CrossAccountId,
- collection: &CollectionHandle<T>,
- owner: &T::CrossAccountId,
- items_data: Vec<CreateItemData>,
- ) -> DispatchResult {
- Self::can_create_items_in_collection(&collection, &sender, &owner, items_data.len() as u32)?;
+ pub fn create_multiple_items_internal(
+ sender: &T::CrossAccountId,
+ collection: &CollectionHandle<T>,
+ owner: &T::CrossAccountId,
+ items_data: Vec<CreateItemData>,
+ ) -> DispatchResult {
+ Self::can_create_items_in_collection(
+ &collection,
+ &sender,
+ &owner,
+ items_data.len() as u32,
+ )?;
- for data in &items_data {
- Self::validate_create_item_args(&collection, data)?;
- }
- for data in &items_data {
- Self::create_item_no_validation(&collection, owner, data.clone())?;
- }
+ for data in &items_data {
+ Self::validate_create_item_args(&collection, data)?;
+ }
+ for data in &items_data {
+ Self::create_item_no_validation(&collection, owner, data.clone())?;
+ }
- Ok(())
- }
+ Ok(())
+ }
- pub fn burn_item_internal(
- sender: &T::CrossAccountId,
- collection: &CollectionHandle<T>,
- item_id: TokenId,
- value: u128,
- ) -> DispatchResult {
- ensure!(
- Self::is_item_owner(&sender, &collection, item_id) ||
- (
- collection.limits.owner_can_transfer &&
- Self::is_owner_or_admin_permissions(&collection, &sender)
- ),
- Error::<T>::NoPermission
- );
+ pub fn burn_item_internal(
+ sender: &T::CrossAccountId,
+ collection: &CollectionHandle<T>,
+ item_id: TokenId,
+ value: u128,
+ ) -> DispatchResult {
+ ensure!(
+ Self::is_item_owner(&sender, &collection, item_id)
+ || (collection.limits.owner_can_transfer
+ && Self::is_owner_or_admin_permissions(&collection, &sender)),
+ Error::<T>::NoPermission
+ );
- if collection.access == AccessMode::WhiteList {
- Self::check_white_list(&collection, &sender)?;
- }
+ if collection.access == AccessMode::WhiteList {
+ Self::check_white_list(&collection, &sender)?;
+ }
- match collection.mode
- {
- CollectionMode::NFT => Self::burn_nft_item(&collection, item_id)?,
- CollectionMode::Fungible(_) => Self::burn_fungible_item(&sender, &collection, value)?,
- CollectionMode::ReFungible => Self::burn_refungible_item(&collection, item_id, &sender)?,
- _ => ()
- };
+ match collection.mode {
+ CollectionMode::NFT => Self::burn_nft_item(&collection, item_id)?,
+ CollectionMode::Fungible(_) => Self::burn_fungible_item(&sender, &collection, value)?,
+ CollectionMode::ReFungible => {
+ Self::burn_refungible_item(&collection, item_id, &sender)?
+ }
+ _ => (),
+ };
- Ok(())
- }
+ Ok(())
+ }
- pub fn toggle_white_list_internal(
- sender: &T::CrossAccountId,
- collection: &CollectionHandle<T>,
- address: &T::CrossAccountId,
- whitelisted: bool,
- ) -> DispatchResult {
- Self::check_owner_or_admin_permissions(&collection, &sender)?;
+ pub fn toggle_white_list_internal(
+ sender: &T::CrossAccountId,
+ collection: &CollectionHandle<T>,
+ address: &T::CrossAccountId,
+ whitelisted: bool,
+ ) -> DispatchResult {
+ Self::check_owner_or_admin_permissions(&collection, &sender)?;
- if whitelisted {
- <WhiteList<T>>::insert(collection.id, address.as_sub(), true);
- } else {
- <WhiteList<T>>::remove(collection.id, address.as_sub());
- }
+ if whitelisted {
+ <WhiteList<T>>::insert(collection.id, address.as_sub(), true);
+ } else {
+ <WhiteList<T>>::remove(collection.id, address.as_sub());
+ }
- Ok(())
- }
+ Ok(())
+ }
- fn is_correct_transfer(collection: &CollectionHandle<T>, recipient: &T::CrossAccountId) -> DispatchResult {
- let collection_id = collection.id;
+ fn is_correct_transfer(
+ collection: &CollectionHandle<T>,
+ recipient: &T::CrossAccountId,
+ ) -> DispatchResult {
+ let collection_id = collection.id;
- // check token limit and account token limit
- let account_items: u32 = <AddressTokens<T>>::get(collection_id, recipient.as_sub()).len() as u32;
- ensure!(collection.limits.account_token_ownership_limit > account_items, Error::<T>::AccountTokenLimitExceeded);
-
- Ok(())
- }
+ // check token limit and account token limit
+ let account_items: u32 =
+ <AddressTokens<T>>::get(collection_id, recipient.as_sub()).len() as u32;
+ ensure!(
+ collection.limits.account_token_ownership_limit > account_items,
+ Error::<T>::AccountTokenLimitExceeded
+ );
- fn can_create_items_in_collection(collection: &CollectionHandle<T>, sender: &T::CrossAccountId, owner: &T::CrossAccountId, amount: u32) -> DispatchResult {
- let collection_id = collection.id;
+ Ok(())
+ }
- // check token limit and account token limit
- let total_items: u32 = ItemListIndex::get(collection_id)
- .checked_add(amount)
- .ok_or(Error::<T>::CollectionTokenLimitExceeded)?;
- let account_items: u32 = (<AddressTokens<T>>::get(collection_id, owner.as_sub()).len() as u32)
- .checked_add(amount)
- .ok_or(Error::<T>::AccountTokenLimitExceeded)?;
- ensure!(collection.limits.token_limit >= total_items, Error::<T>::CollectionTokenLimitExceeded);
- ensure!(collection.limits.account_token_ownership_limit >= account_items, Error::<T>::AccountTokenLimitExceeded);
+ fn can_create_items_in_collection(
+ collection: &CollectionHandle<T>,
+ sender: &T::CrossAccountId,
+ owner: &T::CrossAccountId,
+ amount: u32,
+ ) -> DispatchResult {
+ let collection_id = collection.id;
- if !Self::is_owner_or_admin_permissions(collection, &sender) {
- ensure!(collection.mint_mode == true, Error::<T>::PublicMintingNotAllowed);
- Self::check_white_list(collection, owner)?;
- Self::check_white_list(collection, sender)?;
- }
+ // check token limit and account token limit
+ let total_items: u32 = ItemListIndex::get(collection_id)
+ .checked_add(amount)
+ .ok_or(Error::<T>::CollectionTokenLimitExceeded)?;
+ let account_items: u32 = (<AddressTokens<T>>::get(collection_id, owner.as_sub()).len()
+ as u32)
+ .checked_add(amount)
+ .ok_or(Error::<T>::AccountTokenLimitExceeded)?;
+ ensure!(
+ collection.limits.token_limit >= total_items,
+ Error::<T>::CollectionTokenLimitExceeded
+ );
+ ensure!(
+ collection.limits.account_token_ownership_limit >= account_items,
+ Error::<T>::AccountTokenLimitExceeded
+ );
- Ok(())
- }
+ if !Self::is_owner_or_admin_permissions(collection, &sender) {
+ ensure!(collection.mint_mode, Error::<T>::PublicMintingNotAllowed);
+ Self::check_white_list(collection, owner)?;
+ Self::check_white_list(collection, sender)?;
+ }
- fn validate_create_item_args(target_collection: &CollectionHandle<T>, data: &CreateItemData) -> DispatchResult {
- match target_collection.mode
- {
- CollectionMode::NFT => {
- if let CreateItemData::NFT(data) = data {
- // check sizes
- ensure!(ChainLimit::get().custom_data_limit >= data.const_data.len() as u32, Error::<T>::TokenConstDataLimitExceeded);
- ensure!(ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32, Error::<T>::TokenVariableDataLimitExceeded);
- } else {
- fail!(Error::<T>::NotNftDataUsedToMintNftCollectionToken);
- }
- },
- CollectionMode::Fungible(_) => {
- if let CreateItemData::Fungible(_) = data {
- } else {
- fail!(Error::<T>::NotFungibleDataUsedToMintFungibleCollectionToken);
- }
- },
- CollectionMode::ReFungible => {
- if let CreateItemData::ReFungible(data) = data {
+ Ok(())
+ }
- // check sizes
- ensure!(ChainLimit::get().custom_data_limit >= data.const_data.len() as u32, Error::<T>::TokenConstDataLimitExceeded);
- ensure!(ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32, Error::<T>::TokenVariableDataLimitExceeded);
+ fn validate_create_item_args(
+ target_collection: &CollectionHandle<T>,
+ data: &CreateItemData,
+ ) -> DispatchResult {
+ match target_collection.mode {
+ CollectionMode::NFT => {
+ if let CreateItemData::NFT(data) = data {
+ // check sizes
+ ensure!(
+ ChainLimit::get().custom_data_limit >= data.const_data.len() as u32,
+ Error::<T>::TokenConstDataLimitExceeded
+ );
+ ensure!(
+ ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32,
+ Error::<T>::TokenVariableDataLimitExceeded
+ );
+ } else {
+ fail!(Error::<T>::NotNftDataUsedToMintNftCollectionToken);
+ }
+ }
+ CollectionMode::Fungible(_) => {
+ if let CreateItemData::Fungible(_) = data {
+ } else {
+ fail!(Error::<T>::NotFungibleDataUsedToMintFungibleCollectionToken);
+ }
+ }
+ CollectionMode::ReFungible => {
+ if let CreateItemData::ReFungible(data) = data {
+ // check sizes
+ ensure!(
+ ChainLimit::get().custom_data_limit >= data.const_data.len() as u32,
+ Error::<T>::TokenConstDataLimitExceeded
+ );
+ ensure!(
+ ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32,
+ Error::<T>::TokenVariableDataLimitExceeded
+ );
- // Check refungibility limits
- ensure!(data.pieces <= MAX_REFUNGIBLE_PIECES, Error::<T>::WrongRefungiblePieces);
- ensure!(data.pieces > 0, Error::<T>::WrongRefungiblePieces);
- } else {
- fail!(Error::<T>::NotReFungibleDataUsedToMintReFungibleCollectionToken);
- }
- },
- _ => { fail!(Error::<T>::UnexpectedCollectionType); }
- };
+ // Check refungibility limits
+ ensure!(
+ data.pieces <= MAX_REFUNGIBLE_PIECES,
+ Error::<T>::WrongRefungiblePieces
+ );
+ ensure!(data.pieces > 0, Error::<T>::WrongRefungiblePieces);
+ } else {
+ fail!(Error::<T>::NotReFungibleDataUsedToMintReFungibleCollectionToken);
+ }
+ }
+ _ => {
+ fail!(Error::<T>::UnexpectedCollectionType);
+ }
+ };
- Ok(())
- }
+ Ok(())
+ }
- fn create_item_no_validation(collection: &CollectionHandle<T>, owner: &T::CrossAccountId, data: CreateItemData) -> DispatchResult {
- match data
- {
- CreateItemData::NFT(data) => {
- let item = NftItemType {
- owner: owner.clone(),
- const_data: data.const_data,
- variable_data: data.variable_data
- };
+ fn create_item_no_validation(
+ collection: &CollectionHandle<T>,
+ owner: &T::CrossAccountId,
+ data: CreateItemData,
+ ) -> DispatchResult {
+ match data {
+ CreateItemData::NFT(data) => {
+ let item = NftItemType {
+ owner: owner.clone(),
+ const_data: data.const_data,
+ variable_data: data.variable_data,
+ };
- Self::add_nft_item(collection, item)?;
- },
- CreateItemData::Fungible(data) => {
- Self::add_fungible_item(collection, &owner, data.value)?;
- },
- CreateItemData::ReFungible(data) => {
- let mut owner_list = Vec::new();
- owner_list.push(Ownership {owner: owner.clone(), fraction: data.pieces});
+ Self::add_nft_item(collection, item)?;
+ }
+ CreateItemData::Fungible(data) => {
+ Self::add_fungible_item(collection, &owner, data.value)?;
+ }
+ CreateItemData::ReFungible(data) => {
+ let owner_list = vec![Ownership {
+ owner: owner.clone(),
+ fraction: data.pieces,
+ }];
- let item = ReFungibleItemType {
- owner: owner_list,
- const_data: data.const_data,
- variable_data: data.variable_data
- };
+ let item = ReFungibleItemType {
+ owner: owner_list,
+ const_data: data.const_data,
+ variable_data: data.variable_data,
+ };
- Self::add_refungible_item(collection, item)?;
- }
- };
+ Self::add_refungible_item(collection, item)?;
+ }
+ };
- Ok(())
- }
+ Ok(())
+ }
- fn add_fungible_item(collection: &CollectionHandle<T>, owner: &T::CrossAccountId, value: u128) -> DispatchResult {
- let collection_id = collection.id;
+ fn add_fungible_item(
+ collection: &CollectionHandle<T>,
+ owner: &T::CrossAccountId,
+ value: u128,
+ ) -> DispatchResult {
+ let collection_id = collection.id;
- // Does new owner already have an account?
- let balance: u128 = <FungibleItemList<T>>::get(collection_id, owner.as_sub()).value;
+ // Does new owner already have an account?
+ let balance: u128 = <FungibleItemList<T>>::get(collection_id, owner.as_sub()).value;
- // Mint
- let item = FungibleItemType {
- value: balance.checked_add(value).ok_or(Error::<T>::NumOverflow)?,
- };
- <FungibleItemList<T>>::insert(collection_id, owner.as_sub(), item);
+ // Mint
+ let item = FungibleItemType {
+ value: balance.checked_add(value).ok_or(Error::<T>::NumOverflow)?,
+ };
+ <FungibleItemList<T>>::insert(collection_id, owner.as_sub(), item);
- // Update balance
- let new_balance = <Balance<T>>::get(collection_id, owner.as_sub())
- .checked_add(value)
- .ok_or(Error::<T>::NumOverflow)?;
- <Balance<T>>::insert(collection_id, owner.as_sub(), new_balance);
+ // Update balance
+ let new_balance = <Balance<T>>::get(collection_id, owner.as_sub())
+ .checked_add(value)
+ .ok_or(Error::<T>::NumOverflow)?;
+ <Balance<T>>::insert(collection_id, owner.as_sub(), new_balance);
- Self::deposit_event(RawEvent::ItemCreated(collection_id, 0, owner.clone()));
- Ok(())
- }
+ Self::deposit_event(RawEvent::ItemCreated(collection_id, 0, owner.clone()));
+ Ok(())
+ }
- fn add_refungible_item(collection: &CollectionHandle<T>, item: ReFungibleItemType<T::CrossAccountId>) -> DispatchResult {
- let collection_id = collection.id;
+ fn add_refungible_item(
+ collection: &CollectionHandle<T>,
+ item: ReFungibleItemType<T::CrossAccountId>,
+ ) -> DispatchResult {
+ let collection_id = collection.id;
- let current_index = <ItemListIndex>::get(collection_id)
- .checked_add(1)
- .ok_or(Error::<T>::NumOverflow)?;
- let itemcopy = item.clone();
+ let current_index = <ItemListIndex>::get(collection_id)
+ .checked_add(1)
+ .ok_or(Error::<T>::NumOverflow)?;
+ let itemcopy = item.clone();
- ensure!(
- item.owner.len() == 1,
- Error::<T>::BadCreateRefungibleCall,
- );
- let item_owner = item.owner.first().expect("only one owner is defined");
+ ensure!(item.owner.len() == 1, Error::<T>::BadCreateRefungibleCall,);
+ let item_owner = item.owner.first().expect("only one owner is defined");
- let value = item_owner.fraction;
- let owner = item_owner.owner.clone();
+ let value = item_owner.fraction;
+ let owner = item_owner.owner.clone();
- Self::add_token_index(collection_id, current_index, &owner)?;
+ Self::add_token_index(collection_id, current_index, &owner)?;
- <ItemListIndex>::insert(collection_id, current_index);
- <ReFungibleItemList<T>>::insert(collection_id, current_index, itemcopy);
+ <ItemListIndex>::insert(collection_id, current_index);
+ <ReFungibleItemList<T>>::insert(collection_id, current_index, itemcopy);
- // Update balance
- let new_balance = <Balance<T>>::get(collection_id, owner.as_sub())
- .checked_add(value)
- .ok_or(Error::<T>::NumOverflow)?;
- <Balance<T>>::insert(collection_id, owner.as_sub(), new_balance);
+ // Update balance
+ let new_balance = <Balance<T>>::get(collection_id, owner.as_sub())
+ .checked_add(value)
+ .ok_or(Error::<T>::NumOverflow)?;
+ <Balance<T>>::insert(collection_id, owner.as_sub(), new_balance);
- Self::deposit_event(RawEvent::ItemCreated(collection_id, current_index, owner));
- Ok(())
- }
+ Self::deposit_event(RawEvent::ItemCreated(collection_id, current_index, owner));
+ Ok(())
+ }
- fn add_nft_item(collection: &CollectionHandle<T>, item: NftItemType<T::CrossAccountId>) -> DispatchResult {
- let collection_id = collection.id;
+ fn add_nft_item(
+ collection: &CollectionHandle<T>,
+ item: NftItemType<T::CrossAccountId>,
+ ) -> DispatchResult {
+ let collection_id = collection.id;
- let current_index = <ItemListIndex>::get(collection_id)
- .checked_add(1)
- .ok_or(Error::<T>::NumOverflow)?;
+ let current_index = <ItemListIndex>::get(collection_id)
+ .checked_add(1)
+ .ok_or(Error::<T>::NumOverflow)?;
- let item_owner = item.owner.clone();
- Self::add_token_index(collection_id, current_index, &item.owner)?;
+ let item_owner = item.owner.clone();
+ Self::add_token_index(collection_id, current_index, &item.owner)?;
- <ItemListIndex>::insert(collection_id, current_index);
- <NftItemList<T>>::insert(collection_id, current_index, item);
+ <ItemListIndex>::insert(collection_id, current_index);
+ <NftItemList<T>>::insert(collection_id, current_index, item);
- // Update balance
- let new_balance = <Balance<T>>::get(collection_id, item_owner.as_sub())
- .checked_add(1)
- .ok_or(Error::<T>::NumOverflow)?;
- <Balance<T>>::insert(collection_id, item_owner.as_sub(), new_balance);
+ // Update balance
+ let new_balance = <Balance<T>>::get(collection_id, item_owner.as_sub())
+ .checked_add(1)
+ .ok_or(Error::<T>::NumOverflow)?;
+ <Balance<T>>::insert(collection_id, item_owner.as_sub(), new_balance);
- collection.log(ERC721Events::Transfer {
- from: H160::default(),
- to: *item_owner.as_eth(),
- token_id: current_index.into(),
- });
- Self::deposit_event(RawEvent::ItemCreated(collection_id, current_index, item_owner));
- Ok(())
- }
+ collection.log(ERC721Events::Transfer {
+ from: H160::default(),
+ to: *item_owner.as_eth(),
+ token_id: current_index.into(),
+ });
+ Self::deposit_event(RawEvent::ItemCreated(
+ collection_id,
+ current_index,
+ item_owner,
+ ));
+ Ok(())
+ }
- fn burn_refungible_item(
- collection: &CollectionHandle<T>,
- item_id: TokenId,
- owner: &T::CrossAccountId,
- ) -> DispatchResult {
- let collection_id = collection.id;
+ fn burn_refungible_item(
+ collection: &CollectionHandle<T>,
+ item_id: TokenId,
+ owner: &T::CrossAccountId,
+ ) -> DispatchResult {
+ let collection_id = collection.id;
- let mut token = <ReFungibleItemList<T>>::get(collection_id, item_id)
- .ok_or(Error::<T>::TokenNotFound)?;
- let rft_balance = token
- .owner
- .iter()
- .find(|&i| i.owner == *owner)
- .ok_or(Error::<T>::TokenNotFound)?;
- Self::remove_token_index(collection_id, item_id, owner)?;
+ let mut token = <ReFungibleItemList<T>>::get(collection_id, item_id)
+ .ok_or(Error::<T>::TokenNotFound)?;
+ let rft_balance = token
+ .owner
+ .iter()
+ .find(|&i| i.owner == *owner)
+ .ok_or(Error::<T>::TokenNotFound)?;
+ Self::remove_token_index(collection_id, item_id, owner)?;
- // update balance
- let new_balance = <Balance<T>>::get(collection_id, rft_balance.owner.as_sub())
- .checked_sub(rft_balance.fraction)
- .ok_or(Error::<T>::NumOverflow)?;
- <Balance<T>>::insert(collection_id, rft_balance.owner.as_sub(), new_balance);
+ // update balance
+ let new_balance = <Balance<T>>::get(collection_id, rft_balance.owner.as_sub())
+ .checked_sub(rft_balance.fraction)
+ .ok_or(Error::<T>::NumOverflow)?;
+ <Balance<T>>::insert(collection_id, rft_balance.owner.as_sub(), new_balance);
- // Re-create owners list with sender removed
- let index = token
- .owner
- .iter()
- .position(|i| i.owner == *owner)
- .expect("owned item is exists");
- token.owner.remove(index);
- let owner_count = token.owner.len();
+ // Re-create owners list with sender removed
+ let index = token
+ .owner
+ .iter()
+ .position(|i| i.owner == *owner)
+ .expect("owned item is exists");
+ token.owner.remove(index);
+ let owner_count = token.owner.len();
- // Burn the token completely if this was the last (only) owner
- if owner_count == 0 {
- <ReFungibleItemList<T>>::remove(collection_id, item_id);
- <VariableMetaDataBasket<T>>::remove(collection_id, item_id);
- }
- else {
- <ReFungibleItemList<T>>::insert(collection_id, item_id, token);
- }
+ // Burn the token completely if this was the last (only) owner
+ if owner_count == 0 {
+ <ReFungibleItemList<T>>::remove(collection_id, item_id);
+ <VariableMetaDataBasket<T>>::remove(collection_id, item_id);
+ } else {
+ <ReFungibleItemList<T>>::insert(collection_id, item_id, token);
+ }
- Ok(())
- }
+ Ok(())
+ }
- fn burn_nft_item(collection: &CollectionHandle<T>, item_id: TokenId) -> DispatchResult {
- let collection_id = collection.id;
+ fn burn_nft_item(collection: &CollectionHandle<T>, item_id: TokenId) -> DispatchResult {
+ let collection_id = collection.id;
- let item = <NftItemList<T>>::get(collection_id, item_id)
- .ok_or(Error::<T>::TokenNotFound)?;
- Self::remove_token_index(collection_id, item_id, &item.owner)?;
+ let item =
+ <NftItemList<T>>::get(collection_id, item_id).ok_or(Error::<T>::TokenNotFound)?;
+ Self::remove_token_index(collection_id, item_id, &item.owner)?;
- // update balance
- let new_balance = <Balance<T>>::get(collection_id, item.owner.as_sub())
- .checked_sub(1)
- .ok_or(Error::<T>::NumOverflow)?;
- <Balance<T>>::insert(collection_id, item.owner.as_sub(), new_balance);
- <NftItemList<T>>::remove(collection_id, item_id);
- <VariableMetaDataBasket<T>>::remove(collection_id, item_id);
+ // update balance
+ let new_balance = <Balance<T>>::get(collection_id, item.owner.as_sub())
+ .checked_sub(1)
+ .ok_or(Error::<T>::NumOverflow)?;
+ <Balance<T>>::insert(collection_id, item.owner.as_sub(), new_balance);
+ <NftItemList<T>>::remove(collection_id, item_id);
+ <VariableMetaDataBasket<T>>::remove(collection_id, item_id);
- Self::deposit_event(RawEvent::ItemDestroyed(collection.id, item_id));
- Ok(())
- }
+ Self::deposit_event(RawEvent::ItemDestroyed(collection.id, item_id));
+ Ok(())
+ }
- fn burn_fungible_item(owner: &T::CrossAccountId, collection: &CollectionHandle<T>, value: u128) -> DispatchResult {
- let collection_id = collection.id;
+ fn burn_fungible_item(
+ owner: &T::CrossAccountId,
+ collection: &CollectionHandle<T>,
+ value: u128,
+ ) -> DispatchResult {
+ let collection_id = collection.id;
- let mut balance = <FungibleItemList<T>>::get(collection_id, owner.as_sub());
- ensure!(balance.value >= value, Error::<T>::TokenValueNotEnough);
+ let mut balance = <FungibleItemList<T>>::get(collection_id, owner.as_sub());
+ ensure!(balance.value >= value, Error::<T>::TokenValueNotEnough);
- // update balance
- let new_balance = <Balance<T>>::get(collection_id, owner.as_sub())
- .checked_sub(value)
- .ok_or(Error::<T>::NumOverflow)?;
- <Balance<T>>::insert(collection_id, owner.as_sub(), new_balance);
+ // update balance
+ let new_balance = <Balance<T>>::get(collection_id, owner.as_sub())
+ .checked_sub(value)
+ .ok_or(Error::<T>::NumOverflow)?;
+ <Balance<T>>::insert(collection_id, owner.as_sub(), new_balance);
- if balance.value - value > 0 {
- balance.value -= value;
- <FungibleItemList<T>>::insert(collection_id, owner.as_sub(), balance);
- }
- else {
- <FungibleItemList<T>>::remove(collection_id, owner.as_sub());
- }
+ if balance.value - value > 0 {
+ balance.value -= value;
+ <FungibleItemList<T>>::insert(collection_id, owner.as_sub(), balance);
+ } else {
+ <FungibleItemList<T>>::remove(collection_id, owner.as_sub());
+ }
- collection.log(ERC20Events::Transfer {
- from: *owner.as_eth(),
- to: H160::default(),
- value: value.into(),
- });
- Ok(())
- }
+ collection.log(ERC20Events::Transfer {
+ from: *owner.as_eth(),
+ to: H160::default(),
+ value: value.into(),
+ });
+ Ok(())
+ }
- pub fn get_collection(collection_id: CollectionId) -> Result<CollectionHandle<T>, sp_runtime::DispatchError> {
- Ok(<CollectionHandle<T>>::get(collection_id)
- .ok_or(Error::<T>::CollectionNotFound)?)
- }
+ pub fn get_collection(
+ collection_id: CollectionId,
+ ) -> Result<CollectionHandle<T>, sp_runtime::DispatchError> {
+ Ok(<CollectionHandle<T>>::get(collection_id).ok_or(Error::<T>::CollectionNotFound)?)
+ }
- fn save_collection(collection: CollectionHandle<T>) {
- <CollectionById<T>>::insert(collection.id, collection.into_inner());
- }
+ fn save_collection(collection: CollectionHandle<T>) {
+ <CollectionById<T>>::insert(collection.id, collection.into_inner());
+ }
- pub fn submit_logs(collection: CollectionHandle<T>) -> DispatchResult {
- if collection.logs.is_empty() {
- return Ok(())
- }
- T::EthereumTransactionSender::submit_logs_transaction(
- eth::generate_transaction(collection.id, T::EthereumChainId::get()),
- collection.logs.retrieve_logs(),
- )
- }
+ pub fn submit_logs(collection: CollectionHandle<T>) -> DispatchResult {
+ if collection.logs.is_empty() {
+ return Ok(());
+ }
+ T::EthereumTransactionSender::submit_logs_transaction(
+ eth::generate_transaction(collection.id, T::EthereumChainId::get()),
+ collection.logs.retrieve_logs(),
+ )
+ }
- fn check_owner_permissions(target_collection: &CollectionHandle<T>, subject: &T::AccountId) -> DispatchResult {
- ensure!(
- *subject == target_collection.owner,
- Error::<T>::NoPermission
- );
+ fn check_owner_permissions(
+ target_collection: &CollectionHandle<T>,
+ subject: &T::AccountId,
+ ) -> DispatchResult {
+ ensure!(
+ *subject == target_collection.owner,
+ Error::<T>::NoPermission
+ );
- Ok(())
- }
+ Ok(())
+ }
- fn is_owner_or_admin_permissions(collection: &CollectionHandle<T>, subject: &T::CrossAccountId) -> bool {
- *subject.as_sub() == collection.owner || <AdminList<T>>::get(collection.id).contains(&subject)
- }
+ fn is_owner_or_admin_permissions(
+ collection: &CollectionHandle<T>,
+ subject: &T::CrossAccountId,
+ ) -> bool {
+ *subject.as_sub() == collection.owner
+ || <AdminList<T>>::get(collection.id).contains(&subject)
+ }
- fn check_owner_or_admin_permissions(
- collection: &CollectionHandle<T>,
- subject: &T::CrossAccountId,
- ) -> DispatchResult {
- ensure!(Self::is_owner_or_admin_permissions(collection, subject), Error::<T>::NoPermission);
+ fn check_owner_or_admin_permissions(
+ collection: &CollectionHandle<T>,
+ subject: &T::CrossAccountId,
+ ) -> DispatchResult {
+ ensure!(
+ Self::is_owner_or_admin_permissions(collection, subject),
+ Error::<T>::NoPermission
+ );
- Ok(())
- }
+ Ok(())
+ }
- fn owned_amount(
- subject: &T::CrossAccountId,
- target_collection: &CollectionHandle<T>,
- item_id: TokenId,
- ) -> Option<u128> {
- let collection_id = target_collection.id;
+ fn owned_amount(
+ subject: &T::CrossAccountId,
+ target_collection: &CollectionHandle<T>,
+ item_id: TokenId,
+ ) -> Option<u128> {
+ let collection_id = target_collection.id;
- match target_collection.mode {
- CollectionMode::NFT => (<NftItemList<T>>::get(collection_id, item_id)?.owner == *subject)
- .then(|| 1),
- CollectionMode::Fungible(_) => Some(<FungibleItemList<T>>::get(collection_id, &subject.as_sub())
- .value),
- CollectionMode::ReFungible => <ReFungibleItemList<T>>::get(collection_id, item_id)?
- .owner
- .iter()
- .find(|i| i.owner == *subject)
- .map(|i| i.fraction),
- CollectionMode::Invalid => None,
- }
- }
+ match target_collection.mode {
+ CollectionMode::NFT => {
+ (<NftItemList<T>>::get(collection_id, item_id)?.owner == *subject).then(|| 1)
+ }
+ CollectionMode::Fungible(_) => {
+ Some(<FungibleItemList<T>>::get(collection_id, &subject.as_sub()).value)
+ }
+ CollectionMode::ReFungible => <ReFungibleItemList<T>>::get(collection_id, item_id)?
+ .owner
+ .iter()
+ .find(|i| i.owner == *subject)
+ .map(|i| i.fraction),
+ CollectionMode::Invalid => None,
+ }
+ }
- fn is_item_owner(subject: &T::CrossAccountId, target_collection: &CollectionHandle<T>, item_id: TokenId) -> bool {
- match target_collection.mode {
- CollectionMode::Fungible(_) => true,
- _ => Self::owned_amount(&subject, target_collection, item_id).is_some(),
- }
- }
+ fn is_item_owner(
+ subject: &T::CrossAccountId,
+ target_collection: &CollectionHandle<T>,
+ item_id: TokenId,
+ ) -> bool {
+ match target_collection.mode {
+ CollectionMode::Fungible(_) => true,
+ _ => Self::owned_amount(&subject, target_collection, item_id).is_some(),
+ }
+ }
- fn check_white_list(collection: &CollectionHandle<T>, address: &T::CrossAccountId) -> DispatchResult {
- let collection_id = collection.id;
+ fn check_white_list(
+ collection: &CollectionHandle<T>,
+ address: &T::CrossAccountId,
+ ) -> DispatchResult {
+ let collection_id = collection.id;
- let mes = Error::<T>::AddresNotInWhiteList;
- ensure!(<WhiteList<T>>::contains_key(collection_id, address.as_sub()), mes);
+ let mes = Error::<T>::AddresNotInWhiteList;
+ ensure!(
+ <WhiteList<T>>::contains_key(collection_id, address.as_sub()),
+ mes
+ );
- Ok(())
- }
+ Ok(())
+ }
- /// Check if token exists. In case of Fungible, check if there is an entry for
- /// the owner in fungible balances double map
- fn token_exists(
- target_collection: &CollectionHandle<T>,
- item_id: TokenId,
- ) -> DispatchResult {
- let collection_id = target_collection.id;
- let exists = match target_collection.mode
- {
- CollectionMode::NFT => <NftItemList<T>>::contains_key(collection_id, item_id),
- CollectionMode::Fungible(_) => true,
- CollectionMode::ReFungible => <ReFungibleItemList<T>>::contains_key(collection_id, item_id),
- _ => false
- };
+ /// Check if token exists. In case of Fungible, check if there is an entry for
+ /// the owner in fungible balances double map
+ fn token_exists(target_collection: &CollectionHandle<T>, item_id: TokenId) -> DispatchResult {
+ let collection_id = target_collection.id;
+ let exists = match target_collection.mode {
+ CollectionMode::NFT => <NftItemList<T>>::contains_key(collection_id, item_id),
+ CollectionMode::Fungible(_) => true,
+ CollectionMode::ReFungible => {
+ <ReFungibleItemList<T>>::contains_key(collection_id, item_id)
+ }
+ _ => false,
+ };
- ensure!(exists == true, Error::<T>::TokenNotFound);
- Ok(())
- }
+ ensure!(exists, Error::<T>::TokenNotFound);
+ Ok(())
+ }
- fn transfer_fungible(
- collection: &CollectionHandle<T>,
- value: u128,
- owner: &T::CrossAccountId,
- recipient: &T::CrossAccountId,
- ) -> DispatchResult {
- let collection_id = collection.id;
+ fn transfer_fungible(
+ collection: &CollectionHandle<T>,
+ value: u128,
+ owner: &T::CrossAccountId,
+ recipient: &T::CrossAccountId,
+ ) -> DispatchResult {
+ let collection_id = collection.id;
- let mut balance = <FungibleItemList<T>>::get(collection_id, owner.as_sub());
- ensure!(balance.value >= value, Error::<T>::TokenValueTooLow);
+ let mut balance = <FungibleItemList<T>>::get(collection_id, owner.as_sub());
+ ensure!(balance.value >= value, Error::<T>::TokenValueTooLow);
- // Send balance to recipient (updates balanceOf of recipient)
- Self::add_fungible_item(collection, recipient, value)?;
+ // Send balance to recipient (updates balanceOf of recipient)
+ Self::add_fungible_item(collection, recipient, value)?;
- // update balanceOf of sender
- <Balance<T>>::insert(collection_id, owner.as_sub(), balance.value - value);
+ // update balanceOf of sender
+ <Balance<T>>::insert(collection_id, owner.as_sub(), balance.value - value);
- // Reduce or remove sender
- if balance.value == value {
- <FungibleItemList<T>>::remove(collection_id, owner.as_sub());
- }
- else {
- balance.value -= value;
- <FungibleItemList<T>>::insert(collection_id, owner.as_sub(), balance);
- }
+ // Reduce or remove sender
+ if balance.value == value {
+ <FungibleItemList<T>>::remove(collection_id, owner.as_sub());
+ } else {
+ balance.value -= value;
+ <FungibleItemList<T>>::insert(collection_id, owner.as_sub(), balance);
+ }
- collection.log(ERC20Events::Transfer {
- from: *owner.as_eth(),
- to: *recipient.as_eth(),
- value: value.into(),
- });
- Self::deposit_event(RawEvent::Transfer(collection.id, 1, owner.clone(), recipient.clone(), value));
+ collection.log(ERC20Events::Transfer {
+ from: *owner.as_eth(),
+ to: *recipient.as_eth(),
+ value: value.into(),
+ });
+ Self::deposit_event(RawEvent::Transfer(
+ collection.id,
+ 1,
+ owner.clone(),
+ recipient.clone(),
+ value,
+ ));
- Ok(())
- }
+ Ok(())
+ }
- fn transfer_refungible(
- collection: &CollectionHandle<T>,
- item_id: TokenId,
- value: u128,
- owner: T::CrossAccountId,
- new_owner: T::CrossAccountId,
- ) -> DispatchResult {
- let collection_id = collection.id;
- let full_item = <ReFungibleItemList<T>>::get(collection_id, item_id)
- .ok_or(Error::<T>::TokenNotFound)?;
+ fn transfer_refungible(
+ collection: &CollectionHandle<T>,
+ item_id: TokenId,
+ value: u128,
+ owner: T::CrossAccountId,
+ new_owner: T::CrossAccountId,
+ ) -> DispatchResult {
+ let collection_id = collection.id;
+ let full_item = <ReFungibleItemList<T>>::get(collection_id, item_id)
+ .ok_or(Error::<T>::TokenNotFound)?;
- let item = full_item
- .owner
- .iter()
- .filter(|i| i.owner == owner)
- .next()
- .ok_or(Error::<T>::TokenNotFound)?;
- let amount = item.fraction;
+ let item = full_item
+ .owner
+ .iter()
+ .find(|i| i.owner == owner)
+ .ok_or(Error::<T>::TokenNotFound)?;
+ let amount = item.fraction;
- ensure!(amount >= value, Error::<T>::TokenValueTooLow);
+ ensure!(amount >= value, Error::<T>::TokenValueTooLow);
- // update balance
- let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.as_sub())
- .checked_sub(value)
- .ok_or(Error::<T>::NumOverflow)?;
- <Balance<T>>::insert(collection_id, item.owner.as_sub(), balance_old_owner);
+ // update balance
+ let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.as_sub())
+ .checked_sub(value)
+ .ok_or(Error::<T>::NumOverflow)?;
+ <Balance<T>>::insert(collection_id, item.owner.as_sub(), balance_old_owner);
- let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.as_sub())
- .checked_add(value)
- .ok_or(Error::<T>::NumOverflow)?;
- <Balance<T>>::insert(collection_id, new_owner.as_sub(), balance_new_owner);
+ let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.as_sub())
+ .checked_add(value)
+ .ok_or(Error::<T>::NumOverflow)?;
+ <Balance<T>>::insert(collection_id, new_owner.as_sub(), balance_new_owner);
- let old_owner = item.owner.clone();
- let new_owner_has_account = full_item.owner.iter().any(|i| i.owner == new_owner);
+ let old_owner = item.owner.clone();
+ let new_owner_has_account = full_item.owner.iter().any(|i| i.owner == new_owner);
- // transfer
- if amount == value && !new_owner_has_account {
- // change owner
- // new owner do not have account
- let mut new_full_item = full_item.clone();
- new_full_item
- .owner
- .iter_mut()
- .find(|i| i.owner == owner)
- .expect("old owner does present in refungible")
- .owner = new_owner.clone();
- <ReFungibleItemList<T>>::insert(collection_id, item_id, new_full_item);
+ let mut new_full_item = full_item.clone();
+ // transfer
+ if amount == value && !new_owner_has_account {
+ // change owner
+ // new owner do not have account
+ new_full_item
+ .owner
+ .iter_mut()
+ .find(|i| i.owner == owner)
+ .expect("old owner does present in refungible")
+ .owner = new_owner.clone();
+ <ReFungibleItemList<T>>::insert(collection_id, item_id, new_full_item);
- // update index collection
- Self::move_token_index(collection_id, item_id, &old_owner, &new_owner)?;
- } else {
- let mut new_full_item = full_item.clone();
- new_full_item
- .owner
- .iter_mut()
- .find(|i| i.owner == owner)
- .expect("old owner does present in refungible")
- .fraction -= value;
+ // update index collection
+ Self::move_token_index(collection_id, item_id, &old_owner, &new_owner)?;
+ } else {
+ new_full_item
+ .owner
+ .iter_mut()
+ .find(|i| i.owner == owner)
+ .expect("old owner does present in refungible")
+ .fraction -= value;
- // separate amount
- if new_owner_has_account {
- // new owner has account
- new_full_item
- .owner
- .iter_mut()
- .find(|i| i.owner == new_owner)
- .expect("new owner has account")
- .fraction += value;
- } else {
- // new owner do not have account
- new_full_item.owner.push(Ownership {
- owner: new_owner.clone(),
- fraction: value,
- });
- Self::add_token_index(collection_id, item_id, &new_owner)?;
- }
+ // separate amount
+ if new_owner_has_account {
+ // new owner has account
+ new_full_item
+ .owner
+ .iter_mut()
+ .find(|i| i.owner == new_owner)
+ .expect("new owner has account")
+ .fraction += value;
+ } else {
+ // new owner do not have account
+ new_full_item.owner.push(Ownership {
+ owner: new_owner.clone(),
+ fraction: value,
+ });
+ Self::add_token_index(collection_id, item_id, &new_owner)?;
+ }
- <ReFungibleItemList<T>>::insert(collection_id, item_id, new_full_item);
- }
+ <ReFungibleItemList<T>>::insert(collection_id, item_id, new_full_item);
+ }
- Self::deposit_event(RawEvent::Transfer(collection.id, item_id, owner, new_owner, amount));
+ Self::deposit_event(RawEvent::Transfer(
+ collection.id,
+ item_id,
+ owner,
+ new_owner,
+ amount,
+ ));
- Ok(())
- }
+ Ok(())
+ }
- fn transfer_nft(
- collection: &CollectionHandle<T>,
- item_id: TokenId,
- sender: T::CrossAccountId,
- new_owner: T::CrossAccountId,
- ) -> DispatchResult {
- let collection_id = collection.id;
- let mut item = <NftItemList<T>>::get(collection_id, item_id)
- .ok_or(Error::<T>::TokenNotFound)?;
+ fn transfer_nft(
+ collection: &CollectionHandle<T>,
+ item_id: TokenId,
+ sender: T::CrossAccountId,
+ new_owner: T::CrossAccountId,
+ ) -> DispatchResult {
+ let collection_id = collection.id;
+ let mut item =
+ <NftItemList<T>>::get(collection_id, item_id).ok_or(Error::<T>::TokenNotFound)?;
- ensure!(
- sender == item.owner,
- Error::<T>::MustBeTokenOwner
- );
+ ensure!(sender == item.owner, Error::<T>::MustBeTokenOwner);
- // update balance
- let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.as_sub())
- .checked_sub(1)
- .ok_or(Error::<T>::NumOverflow)?;
- <Balance<T>>::insert(collection_id, item.owner.as_sub(), balance_old_owner);
+ // update balance
+ let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.as_sub())
+ .checked_sub(1)
+ .ok_or(Error::<T>::NumOverflow)?;
+ <Balance<T>>::insert(collection_id, item.owner.as_sub(), balance_old_owner);
- let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.as_sub())
- .checked_add(1)
- .ok_or(Error::<T>::NumOverflow)?;
- <Balance<T>>::insert(collection_id, new_owner.as_sub(), balance_new_owner);
+ let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.as_sub())
+ .checked_add(1)
+ .ok_or(Error::<T>::NumOverflow)?;
+ <Balance<T>>::insert(collection_id, new_owner.as_sub(), balance_new_owner);
- // change owner
- let old_owner = item.owner.clone();
- item.owner = new_owner.clone();
- <NftItemList<T>>::insert(collection_id, item_id, item);
+ // change owner
+ let old_owner = item.owner.clone();
+ item.owner = new_owner.clone();
+ <NftItemList<T>>::insert(collection_id, item_id, item);
- // update index collection
- Self::move_token_index(collection_id, item_id, &old_owner, &new_owner)?;
+ // update index collection
+ Self::move_token_index(collection_id, item_id, &old_owner, &new_owner)?;
- collection.log(ERC721Events::Transfer {
- from: *sender.as_eth(),
- to: *new_owner.as_eth(),
- token_id: item_id.into(),
- });
- Self::deposit_event(RawEvent::Transfer(collection.id, item_id, sender, new_owner, 1));
+ collection.log(ERC721Events::Transfer {
+ from: *sender.as_eth(),
+ to: *new_owner.as_eth(),
+ token_id: item_id.into(),
+ });
+ Self::deposit_event(RawEvent::Transfer(
+ collection.id,
+ item_id,
+ sender,
+ new_owner,
+ 1,
+ ));
- Ok(())
- }
-
- fn set_re_fungible_variable_data(
- collection: &CollectionHandle<T>,
- item_id: TokenId,
- data: Vec<u8>
- ) -> DispatchResult {
- let collection_id = collection.id;
- let mut item = <ReFungibleItemList<T>>::get(collection_id, item_id)
- .ok_or(Error::<T>::TokenNotFound)?;
+ Ok(())
+ }
- item.variable_data = data;
+ fn set_re_fungible_variable_data(
+ collection: &CollectionHandle<T>,
+ item_id: TokenId,
+ data: Vec<u8>,
+ ) -> DispatchResult {
+ let collection_id = collection.id;
+ let mut item = <ReFungibleItemList<T>>::get(collection_id, item_id)
+ .ok_or(Error::<T>::TokenNotFound)?;
- <ReFungibleItemList<T>>::insert(collection_id, item_id, item);
+ item.variable_data = data;
- Ok(())
- }
+ <ReFungibleItemList<T>>::insert(collection_id, item_id, item);
- fn set_nft_variable_data(
- collection: &CollectionHandle<T>,
- item_id: TokenId,
- data: Vec<u8>
- ) -> DispatchResult {
- let collection_id = collection.id;
- let mut item = <NftItemList<T>>::get(collection_id, item_id)
- .ok_or(Error::<T>::TokenNotFound)?;
-
- item.variable_data = data;
+ Ok(())
+ }
- <NftItemList<T>>::insert(collection_id, item_id, item);
-
- Ok(())
- }
+ fn set_nft_variable_data(
+ collection: &CollectionHandle<T>,
+ item_id: TokenId,
+ data: Vec<u8>,
+ ) -> DispatchResult {
+ let collection_id = collection.id;
+ let mut item =
+ <NftItemList<T>>::get(collection_id, item_id).ok_or(Error::<T>::TokenNotFound)?;
- #[allow(dead_code)]
- fn init_collection(item: &Collection<T>) {
- // check params
- assert!(
- item.decimal_points <= MAX_DECIMAL_POINTS,
- "decimal_points parameter must be lower than MAX_DECIMAL_POINTS"
- );
- assert!(
- item.name.len() <= 64,
- "Collection name can not be longer than 63 char"
- );
- assert!(
- item.name.len() <= 256,
- "Collection description can not be longer than 255 char"
- );
- assert!(
- item.token_prefix.len() <= 16,
- "Token prefix can not be longer than 15 char"
- );
+ item.variable_data = data;
- // Generate next collection ID
- let next_id = CreatedCollectionCount::get()
- .checked_add(1)
- .unwrap();
+ <NftItemList<T>>::insert(collection_id, item_id, item);
- CreatedCollectionCount::put(next_id);
- }
+ Ok(())
+ }
- #[allow(dead_code)]
- fn init_nft_token(collection_id: CollectionId, item: &NftItemType<T::CrossAccountId>) {
- let current_index = <ItemListIndex>::get(collection_id)
- .checked_add(1)
- .unwrap();
+ #[allow(dead_code)]
+ fn init_collection(item: &Collection<T>) {
+ // check params
+ assert!(
+ item.decimal_points <= MAX_DECIMAL_POINTS,
+ "decimal_points parameter must be lower than MAX_DECIMAL_POINTS"
+ );
+ assert!(
+ item.name.len() <= 64,
+ "Collection name can not be longer than 63 char"
+ );
+ assert!(
+ item.name.len() <= 256,
+ "Collection description can not be longer than 255 char"
+ );
+ assert!(
+ item.token_prefix.len() <= 16,
+ "Token prefix can not be longer than 15 char"
+ );
- Self::add_token_index(collection_id, current_index, &item.owner).unwrap();
+ // Generate next collection ID
+ let next_id = CreatedCollectionCount::get().checked_add(1).unwrap();
- <ItemListIndex>::insert(collection_id, current_index);
+ CreatedCollectionCount::put(next_id);
+ }
- // Update balance
- let new_balance = <Balance<T>>::get(collection_id, item.owner.as_sub())
- .checked_add(1)
- .unwrap();
- <Balance<T>>::insert(collection_id, item.owner.as_sub(), new_balance);
- }
+ #[allow(dead_code)]
+ fn init_nft_token(collection_id: CollectionId, item: &NftItemType<T::CrossAccountId>) {
+ let current_index = <ItemListIndex>::get(collection_id).checked_add(1).unwrap();
- #[allow(dead_code)]
- fn init_fungible_token(collection_id: CollectionId, owner: &T::CrossAccountId, item: &FungibleItemType) {
- let current_index = <ItemListIndex>::get(collection_id)
- .checked_add(1)
- .unwrap();
+ Self::add_token_index(collection_id, current_index, &item.owner).unwrap();
- Self::add_token_index(collection_id, current_index, owner).unwrap();
+ <ItemListIndex>::insert(collection_id, current_index);
- <ItemListIndex>::insert(collection_id, current_index);
+ // Update balance
+ let new_balance = <Balance<T>>::get(collection_id, item.owner.as_sub())
+ .checked_add(1)
+ .unwrap();
+ <Balance<T>>::insert(collection_id, item.owner.as_sub(), new_balance);
+ }
- // Update balance
- let new_balance = <Balance<T>>::get(collection_id, owner.as_sub())
- .checked_add(item.value)
- .unwrap();
- <Balance<T>>::insert(collection_id, owner.as_sub(), new_balance);
- }
+ #[allow(dead_code)]
+ fn init_fungible_token(
+ collection_id: CollectionId,
+ owner: &T::CrossAccountId,
+ item: &FungibleItemType,
+ ) {
+ let current_index = <ItemListIndex>::get(collection_id).checked_add(1).unwrap();
- #[allow(dead_code)]
- fn init_refungible_token(collection_id: CollectionId, item: &ReFungibleItemType<T::CrossAccountId>) {
- let current_index = <ItemListIndex>::get(collection_id)
- .checked_add(1)
- .unwrap();
+ Self::add_token_index(collection_id, current_index, owner).unwrap();
- let value = item.owner.first().unwrap().fraction;
- let owner = item.owner.first().unwrap().owner.clone();
+ <ItemListIndex>::insert(collection_id, current_index);
- Self::add_token_index(collection_id, current_index, &owner).unwrap();
+ // Update balance
+ let new_balance = <Balance<T>>::get(collection_id, owner.as_sub())
+ .checked_add(item.value)
+ .unwrap();
+ <Balance<T>>::insert(collection_id, owner.as_sub(), new_balance);
+ }
- <ItemListIndex>::insert(collection_id, current_index);
+ #[allow(dead_code)]
+ fn init_refungible_token(
+ collection_id: CollectionId,
+ item: &ReFungibleItemType<T::CrossAccountId>,
+ ) {
+ let current_index = <ItemListIndex>::get(collection_id).checked_add(1).unwrap();
- // Update balance
- let new_balance = <Balance<T>>::get(collection_id, &owner.as_sub())
- .checked_add(value)
- .unwrap();
- <Balance<T>>::insert(collection_id, owner.as_sub(), new_balance);
- }
+ let value = item.owner.first().unwrap().fraction;
+ let owner = item.owner.first().unwrap().owner.clone();
- fn add_token_index(collection_id: CollectionId, item_index: TokenId, owner: &T::CrossAccountId) -> DispatchResult {
- // add to account limit
- if <AccountItemCount<T>>::contains_key(owner.as_sub()) {
+ Self::add_token_index(collection_id, current_index, &owner).unwrap();
- // bound Owned tokens by a single address
- let count = <AccountItemCount<T>>::get(owner.as_sub());
- ensure!(count < ChainLimit::get().account_token_ownership_limit, Error::<T>::AddressOwnershipLimitExceeded);
+ <ItemListIndex>::insert(collection_id, current_index);
- <AccountItemCount<T>>::insert(owner.as_sub(), count
- .checked_add(1)
- .ok_or(Error::<T>::NumOverflow)?);
- }
- else {
- <AccountItemCount<T>>::insert(owner.as_sub(), 1);
- }
+ // Update balance
+ let new_balance = <Balance<T>>::get(collection_id, &owner.as_sub())
+ .checked_add(value)
+ .unwrap();
+ <Balance<T>>::insert(collection_id, owner.as_sub(), new_balance);
+ }
- let list_exists = <AddressTokens<T>>::contains_key(collection_id, owner.as_sub());
- if list_exists {
- let mut list = <AddressTokens<T>>::get(collection_id, owner.as_sub());
- let item_contains = list.contains(&item_index.clone());
+ fn add_token_index(
+ collection_id: CollectionId,
+ item_index: TokenId,
+ owner: &T::CrossAccountId,
+ ) -> DispatchResult {
+ // add to account limit
+ if <AccountItemCount<T>>::contains_key(owner.as_sub()) {
+ // bound Owned tokens by a single address
+ let count = <AccountItemCount<T>>::get(owner.as_sub());
+ ensure!(
+ count < ChainLimit::get().account_token_ownership_limit,
+ Error::<T>::AddressOwnershipLimitExceeded
+ );
- if !item_contains {
- list.push(item_index.clone());
- }
+ <AccountItemCount<T>>::insert(
+ owner.as_sub(),
+ count.checked_add(1).ok_or(Error::<T>::NumOverflow)?,
+ );
+ } else {
+ <AccountItemCount<T>>::insert(owner.as_sub(), 1);
+ }
- <AddressTokens<T>>::insert(collection_id, owner.as_sub(), list);
- } else {
- let mut itm = Vec::new();
- itm.push(item_index.clone());
- <AddressTokens<T>>::insert(collection_id, owner.as_sub(), itm);
- }
+ let list_exists = <AddressTokens<T>>::contains_key(collection_id, owner.as_sub());
+ if list_exists {
+ let mut list = <AddressTokens<T>>::get(collection_id, owner.as_sub());
+ let item_contains = list.contains(&item_index.clone());
- Ok(())
- }
+ if !item_contains {
+ list.push(item_index);
+ }
- fn remove_token_index(
- collection_id: CollectionId,
- item_index: TokenId,
- owner: &T::CrossAccountId,
- ) -> DispatchResult {
+ <AddressTokens<T>>::insert(collection_id, owner.as_sub(), list);
+ } else {
+ let itm = vec![item_index];
+ <AddressTokens<T>>::insert(collection_id, owner.as_sub(), itm);
+ }
- // update counter
- <AccountItemCount<T>>::insert(owner.as_sub(),
- <AccountItemCount<T>>::get(owner.as_sub())
- .checked_sub(1)
- .ok_or(Error::<T>::NumOverflow)?);
+ Ok(())
+ }
+ fn remove_token_index(
+ collection_id: CollectionId,
+ item_index: TokenId,
+ owner: &T::CrossAccountId,
+ ) -> DispatchResult {
+ // update counter
+ <AccountItemCount<T>>::insert(
+ owner.as_sub(),
+ <AccountItemCount<T>>::get(owner.as_sub())
+ .checked_sub(1)
+ .ok_or(Error::<T>::NumOverflow)?,
+ );
- let list_exists = <AddressTokens<T>>::contains_key(collection_id, owner.as_sub());
- if list_exists {
- let mut list = <AddressTokens<T>>::get(collection_id, owner.as_sub());
- let item_contains = list.contains(&item_index.clone());
+ let list_exists = <AddressTokens<T>>::contains_key(collection_id, owner.as_sub());
+ if list_exists {
+ let mut list = <AddressTokens<T>>::get(collection_id, owner.as_sub());
+ let item_contains = list.contains(&item_index.clone());
- if item_contains {
- list.retain(|&item| item != item_index);
- <AddressTokens<T>>::insert(collection_id, owner.as_sub(), list);
- }
- }
+ if item_contains {
+ list.retain(|&item| item != item_index);
+ <AddressTokens<T>>::insert(collection_id, owner.as_sub(), list);
+ }
+ }
- Ok(())
- }
+ Ok(())
+ }
- fn move_token_index(
- collection_id: CollectionId,
- item_index: TokenId,
- old_owner: &T::CrossAccountId,
- new_owner: &T::CrossAccountId,
- ) -> DispatchResult {
- Self::remove_token_index(collection_id, item_index, old_owner)?;
- Self::add_token_index(collection_id, item_index, new_owner)?;
+ fn move_token_index(
+ collection_id: CollectionId,
+ item_index: TokenId,
+ old_owner: &T::CrossAccountId,
+ new_owner: &T::CrossAccountId,
+ ) -> DispatchResult {
+ Self::remove_token_index(collection_id, item_index, old_owner)?;
+ Self::add_token_index(collection_id, item_index, new_owner)?;
- Ok(())
- }
+ Ok(())
+ }
}
sp_api::decl_runtime_apis! {
- pub trait NftApi {
- /// Used for ethereum integration
- fn eth_contract_code(account: H160) -> Option<Vec<u8>>;
- }
-}
\ No newline at end of file
+ pub trait NftApi {
+ /// Used for ethereum integration
+ fn eth_contract_code(account: H160) -> Option<Vec<u8>>;
+ }
+}
pallets/nft/src/mock.rsdiffbeforeafterboth--- a/pallets/nft/src/mock.rs
+++ b/pallets/nft/src/mock.rs
@@ -1,22 +1,21 @@
+#![allow(clippy::from_over_into)]
+
use crate as pallet_template;
use sp_core::H256;
-use frame_support::{
- parameter_types,
- weights::IdentityFee,
-};
+use frame_support::{parameter_types, weights::IdentityFee};
use sp_runtime::{
- traits::{BlakeTwo256, IdentityLookup},
- testing::Header,
+ traits::{BlakeTwo256, IdentityLookup},
+ testing::Header,
Perbill,
};
-use pallet_transaction_payment::{ CurrencyAdapter};
+use pallet_transaction_payment::{CurrencyAdapter};
use frame_system as system;
use pallet_evm::AddressMapping;
use crate::{EvmBackwardsAddressMapping, CrossAccountId};
use codec::{Encode, Decode};
type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;
-type Block = frame_system::mocking::MockBlock<Test>;
+type Block = frame_system::mocking::MockBlock<Test>;
// Configure a mock runtime to test the pallet.
frame_support::construct_runtime!(
@@ -59,7 +58,7 @@
type OnKilledAccount = ();
type SystemWeightInfo = ();
type SS58Prefix = SS58Prefix;
- type OnSetCode = ();
+ type OnSetCode = ();
}
parameter_types! {
@@ -68,10 +67,10 @@
}
//frame_system::Module<Test>;
impl pallet_balances::Config for Test {
- type AccountStore = System;
- type Balance = u64;
- type DustRemoval = ();
- type Event = ();
+ type AccountStore = System;
+ type Balance = u64;
+ type DustRemoval = ();
+ type Event = ();
type ExistentialDeposit = ExistentialDeposit;
type WeightInfo = ();
type MaxLocks = MaxLocks;
@@ -132,70 +131,76 @@
type ChainExtension = ();
type WeightPrice = ();
type WeightInfo = pallet_contracts::weights::SubstrateWeight<Self>;
- type Schedule = Schedule;
- type CallStack = [pallet_contracts::Frame<Self>; 31];
+ type Schedule = Schedule;
+ type CallStack = [pallet_contracts::Frame<Self>; 31];
}
parameter_types! {
pub const CollectionCreationPrice: u32 = 0;
- pub TreasuryAccountId: u64 = 1234;
- pub EthereumChainId: u32 = 1111;
+ pub TreasuryAccountId: u64 = 1234;
+ pub EthereumChainId: u32 = 1111;
}
pub struct TestEvmAddressMapping;
impl AddressMapping<u64> for TestEvmAddressMapping {
- fn into_account_id(addr: sp_core::H160) -> u64 {
- unimplemented!()
- }
+ fn into_account_id(_addr: sp_core::H160) -> u64 {
+ unimplemented!()
+ }
}
pub struct TestEvmBackwardsAddressMapping;
impl EvmBackwardsAddressMapping<u64> for TestEvmBackwardsAddressMapping {
- fn from_account_id(account_id: u64) -> sp_core::H160 {
- unimplemented!()
- }
+ fn from_account_id(_account_id: u64) -> sp_core::H160 {
+ unimplemented!()
+ }
}
#[derive(Encode, Decode, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)]
pub struct TestCrossAccountId(u64, sp_core::H160);
impl CrossAccountId<u64> for TestCrossAccountId {
- fn from_sub(sub: u64) -> Self {
- let mut eth = [0; 20];
- eth[12..20].copy_from_slice(&sub.to_be_bytes());
- Self(sub, sp_core::H160(eth))
- }
- fn as_sub(&self) -> &u64 {
- &self.0
- }
- fn from_eth(eth: sp_core::H160) -> Self {
- unimplemented!()
- }
- fn as_eth(&self) -> &sp_core::H160 {
- &self.1
- }
+ fn from_sub(sub: u64) -> Self {
+ let mut eth = [0; 20];
+ eth[12..20].copy_from_slice(&sub.to_be_bytes());
+ Self(sub, sp_core::H160(eth))
+ }
+ fn as_sub(&self) -> &u64 {
+ &self.0
+ }
+ fn from_eth(_eth: sp_core::H160) -> Self {
+ unimplemented!()
+ }
+ fn as_eth(&self) -> &sp_core::H160 {
+ &self.1
+ }
}
pub struct TestEtheremTransactionSender;
impl pallet_ethereum::EthereumTransactionSender for TestEtheremTransactionSender {
- fn submit_logs_transaction(tx: pallet_ethereum::Transaction, logs: Vec<pallet_ethereum::Log>) -> Result<(), sp_runtime::DispatchError> {
- Ok(())
- }
+ fn submit_logs_transaction(
+ _tx: pallet_ethereum::Transaction,
+ _logs: Vec<pallet_ethereum::Log>,
+ ) -> Result<(), sp_runtime::DispatchError> {
+ Ok(())
+ }
}
impl pallet_template::Config for Test {
type Event = ();
type WeightInfo = ();
type CollectionCreationPrice = CollectionCreationPrice;
- type Currency = pallet_balances::Pallet<Test>;
- type TreasuryAccountId = TreasuryAccountId;
- type EvmAddressMapping = TestEvmAddressMapping;
- type EvmBackwardsAddressMapping = TestEvmBackwardsAddressMapping;
- type CrossAccountId = TestCrossAccountId;
- type EthereumChainId = EthereumChainId;
- type EthereumTransactionSender = TestEtheremTransactionSender;
+ type Currency = pallet_balances::Pallet<Test>;
+ type TreasuryAccountId = TreasuryAccountId;
+ type EvmAddressMapping = TestEvmAddressMapping;
+ type EvmBackwardsAddressMapping = TestEvmBackwardsAddressMapping;
+ type CrossAccountId = TestCrossAccountId;
+ type EthereumChainId = EthereumChainId;
+ type EthereumTransactionSender = TestEtheremTransactionSender;
}
// Build genesis storage according to the mock runtime.
pub fn new_test_ext() -> sp_io::TestExternalities {
- system::GenesisConfig::default().build_storage::<Test>().unwrap().into()
-}
\ No newline at end of file
+ system::GenesisConfig::default()
+ .build_storage::<Test>()
+ .unwrap()
+ .into()
+}
pallets/nft/src/sponsorship.rsdiffbeforeafterboth--- a/pallets/nft/src/sponsorship.rs
+++ b/pallets/nft/src/sponsorship.rs
@@ -1,4 +1,8 @@
-use crate::{Config, Call, CollectionById, CreateItemBasket, VariableMetaDataBasket, ReFungibleTransferBasket, FungibleTransferBasket, NftTransferBasket, ChainLimit, CreateItemData, CollectionMode};
+use crate::{
+ Config, Call, CollectionById, CreateItemBasket, VariableMetaDataBasket,
+ ReFungibleTransferBasket, FungibleTransferBasket, NftTransferBasket, ChainLimit,
+ CreateItemData, CollectionMode,
+};
use core::marker::PhantomData;
use up_sponsorship::SponsorshipHandler;
use frame_support::{
@@ -6,7 +10,6 @@
storage::{StorageMap, StorageDoubleMap, StorageValue},
};
use nft_data_structs::{TokenId, CollectionId};
-use alloc::vec::Vec;
pub struct NftSponsorshipHandler<T>(PhantomData<T>);
impl<T: Config> NftSponsorshipHandler<T> {
@@ -15,7 +18,6 @@
collection_id: &CollectionId,
_properties: &CreateItemData,
) -> Option<T::AccountId> {
-
let collection = CollectionById::<T>::get(collection_id)?;
// sponsor timeout
@@ -32,9 +34,8 @@
CreateItemBasket::<T>::insert((collection_id, who.clone()), block_number);
// check free create limit
- if collection.limits.sponsored_data_size >= (_properties.len() as u32) {
- collection.sponsorship.sponsor()
- .cloned()
+ if collection.limits.sponsored_data_size >= (_properties.data_size() as u32) {
+ collection.sponsorship.sponsor().cloned()
} else {
None
}
@@ -45,13 +46,11 @@
collection_id: &CollectionId,
item_id: &TokenId,
) -> Option<T::AccountId> {
-
let collection = CollectionById::<T>::get(collection_id)?;
let limits = ChainLimit::get();
let mut sponsor_transfer = false;
if collection.sponsorship.confirmed() {
-
let collection_limits = collection.limits.clone();
let collection_mode = collection.mode.clone();
@@ -59,7 +58,6 @@
let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
sponsor_transfer = match collection_mode {
CollectionMode::NFT => {
-
// get correct limit
let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
collection_limits.sponsor_transfer_timeout
@@ -82,7 +80,6 @@
sponsored
}
CollectionMode::Fungible(_) => {
-
// get correct limit
let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
collection_limits.sponsor_transfer_timeout
@@ -106,7 +103,6 @@
sponsored
}
CollectionMode::ReFungible => {
-
// get correct limit
let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
collection_limits.sponsor_transfer_timeout
@@ -116,7 +112,8 @@
let mut sponsored = true;
if ReFungibleTransferBasket::<T>::contains_key(collection_id, item_id) {
- let last_tx_block = ReFungibleTransferBasket::<T>::get(collection_id, item_id);
+ let last_tx_block =
+ ReFungibleTransferBasket::<T>::get(collection_id, item_id);
let limit_time = last_tx_block + limit.into();
if block_number <= limit_time {
sponsored = false;
@@ -128,32 +125,27 @@
sponsored
}
- _ => {
- false
- },
+ _ => false,
};
}
if !sponsor_transfer {
None
} else {
- collection.sponsorship.sponsor()
- .cloned()
+ collection.sponsorship.sponsor().cloned()
}
}
-
+
pub fn withdraw_set_variable_meta_data(
collection_id: &CollectionId,
item_id: &TokenId,
- data: &Vec<u8>,
+ data: &[u8],
) -> Option<T::AccountId> {
-
let mut sponsor_metadata_changes = false;
let collection = CollectionById::<T>::get(collection_id)?;
- if
- collection.sponsorship.confirmed() &&
+ if collection.sponsorship.confirmed() &&
// Can't sponsor fungible collection, this tx will be rejected
// as invalid
!matches!(collection.mode, CollectionMode::Fungible(_)) &&
@@ -164,7 +156,7 @@
if VariableMetaDataBasket::<T>::get(collection_id, item_id)
.map(|last_block| block_number - last_block > rate_limit)
- .unwrap_or(true)
+ .unwrap_or(true)
{
sponsor_metadata_changes = true;
VariableMetaDataBasket::<T>::insert(collection_id, item_id, block_number);
@@ -177,27 +169,26 @@
} else {
collection.sponsorship.sponsor().cloned()
}
-
}
}
impl<T, C> SponsorshipHandler<T::AccountId, C> for NftSponsorshipHandler<T>
-where
- T: Config,
- C: IsSubType<Call<T>>
+where
+ T: Config,
+ C: IsSubType<Call<T>>,
{
- fn get_sponsor(who: &T::AccountId, call: &C) -> Option<T::AccountId> {
- match IsSubType::<Call<T>>::is_sub_type(call)? {
- Call::create_item(collection_id, _owner, _properties) => {
- Self::withdraw_create_item(who, collection_id, &_properties)
- },
- Call::transfer(_new_owner, collection_id, item_id, _value) => {
- Self::withdraw_transfer(who, collection_id, item_id)
- },
- Call::set_variable_meta_data(collection_id, item_id, data) => {
- Self::withdraw_set_variable_meta_data(collection_id, item_id, &data)
- },
+ fn get_sponsor(who: &T::AccountId, call: &C) -> Option<T::AccountId> {
+ match IsSubType::<Call<T>>::is_sub_type(call)? {
+ Call::create_item(collection_id, _owner, _properties) => {
+ Self::withdraw_create_item(who, collection_id, &_properties)
+ }
+ Call::transfer(_new_owner, collection_id, item_id, _value) => {
+ Self::withdraw_transfer(who, collection_id, item_id)
+ }
+ Call::set_variable_meta_data(collection_id, item_id, data) => {
+ Self::withdraw_set_variable_meta_data(collection_id, item_id, &data)
+ }
_ => None,
- }
- }
-}
\ No newline at end of file
+ }
+ }
+}
pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{5 AccessMode, CollectionMode,6 Ownership, ChainLimits, CreateItemData,7};8use nft_data_structs::{9 CreateNftData, CreateFungibleData, CreateReFungibleData,10 CollectionId, TokenId, MAX_DECIMAL_POINTS,11};12use frame_support::{assert_noop, assert_ok};13use frame_system::{ RawOrigin };1415fn default_collection_numbers_limit() -> u32 {16 1017}1819fn default_limits() {20 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {21 collection_numbers_limit: default_collection_numbers_limit(),22 account_token_ownership_limit: 10,23 collections_admins_limit: 5,24 custom_data_limit: 2048,25 nft_sponsor_transfer_timeout: 15,26 fungible_sponsor_transfer_timeout: 15,27 refungible_sponsor_transfer_timeout: 15,28 const_on_chain_schema_limit: 1024,29 offchain_schema_limit: 1024,30 variable_on_chain_schema_limit: 1024,31 }));32}3334fn default_nft_data() -> CreateNftData {35 CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }36}3738fn default_fungible_data () -> CreateFungibleData {39 CreateFungibleData { value: 5 }40}4142fn default_re_fungible_data () -> CreateReFungibleData {43 CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1], pieces: 1023 }44}4546fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: CollectionId) -> CollectionId {47 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();48 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();49 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();5051 let origin1 = Origin::signed(owner);52 assert_ok!(TemplateModule::create_collection(53 origin1.clone(),54 col_name1.clone(),55 col_desc1.clone(),56 token_prefix1.clone(),57 mode.clone()58 ));5960 let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();61 let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();62 let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();63 assert_eq!(TemplateModule::collection_id(id).unwrap().owner, owner);64 assert_eq!(TemplateModule::collection_id(id).unwrap().name, saved_col_name);65 assert_eq!(TemplateModule::collection_id(id).unwrap().mode, *mode);66 assert_eq!(TemplateModule::collection_id(id).unwrap().description, saved_description);67 assert_eq!(TemplateModule::collection_id(id).unwrap().token_prefix, saved_prefix);68 id69}7071fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {72 create_test_collection_for_owner(&mode, 1, id)73}7475fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {76 let origin1 = Origin::signed(1);77 assert_ok!(TemplateModule::create_item(78 origin1.clone(),79 collection_id,80 account(1),81 data.clone()82 ));8384}8586fn account(sub: u64) -> TestCrossAccountId {87 TestCrossAccountId::from_sub(sub)88}8990// Use cases tests region91// #region9293#[test]94fn set_version_schema() {95 new_test_ext().execute_with(|| {96 default_limits();97 let origin1 = Origin::signed(1);98 let collection_id = create_test_collection(&CollectionMode::NFT, 1);99 100 assert_ok!(TemplateModule::set_schema_version(origin1, collection_id, SchemaVersion::Unique));101 assert_eq!(TemplateModule::collection_id(collection_id).unwrap().schema_version, SchemaVersion::Unique);102 });103}104105#[test]106fn create_fungible_collection_fails_with_large_decimal_numbers() {107 new_test_ext().execute_with(|| {108 default_limits();109110 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();111 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();112 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();113114 let origin1 = Origin::signed(1);115 assert_noop!(TemplateModule::create_collection(116 origin1,117 col_name1,118 col_desc1,119 token_prefix1,120 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)121 ), Error::<Test>::CollectionDecimalPointLimitExceeded);122 }); 123}124125#[test]126fn create_nft_item() {127 new_test_ext().execute_with(|| {128 default_limits();129 let collection_id = create_test_collection(&CollectionMode::NFT, 1);130 131 let data = default_nft_data();132 create_test_item(collection_id, &data.clone().into());133 let item = TemplateModule::nft_item_id(collection_id, 1).unwrap();134 assert_eq!(item.const_data, data.const_data);135 assert_eq!(item.variable_data, data.variable_data);136 });137}138139// Use cases tests region140// #region141#[test]142fn create_nft_multiple_items() {143 new_test_ext().execute_with(|| {144 default_limits();145 146 create_test_collection(&CollectionMode::NFT, 1);147148 let origin1 = Origin::signed(1);149150 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];151152 assert_ok!(TemplateModule::create_multiple_items(153 origin1.clone(),154 1,155 account(1),156 items_data.clone().into_iter().map(|d| { d.into() }).collect()157 ));158 for (index, data) in items_data.iter().enumerate() {159 let item = TemplateModule::nft_item_id(1, (index + 1) as TokenId).unwrap(); 160 assert_eq!(item.const_data.to_vec(), data.const_data);161 assert_eq!(item.variable_data.to_vec(), data.variable_data);162 }163 });164}165166#[test]167fn create_refungible_item() {168 new_test_ext().execute_with(|| {169 default_limits();170 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);171172 let data = default_re_fungible_data();173 create_test_item(collection_id, &data.clone().into());174 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();175 assert_eq!(176 item.const_data,177 data.const_data178 );179 assert_eq!(180 item.variable_data,181 data.variable_data182 );183 assert_eq!(184 item.owner[0],185 Ownership {186 owner: account(1),187 fraction: 1023188 }189 );190 });191}192193#[test]194fn create_multiple_refungible_items() {195 new_test_ext().execute_with(|| {196 default_limits();197 198 create_test_collection(&CollectionMode::ReFungible, 1);199200 let origin1 = Origin::signed(1);201202 let items_data = vec![default_re_fungible_data(), default_re_fungible_data(), default_re_fungible_data()];203204 assert_ok!(TemplateModule::create_multiple_items(205 origin1.clone(),206 1,207 account(1),208 items_data.clone().into_iter().map(|d| { d.into() }).collect()209 ));210 for (index, data) in items_data.iter().enumerate() {211212 let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId).unwrap();213 assert_eq!(item.const_data.to_vec(), data.const_data);214 assert_eq!(item.variable_data.to_vec(), data.variable_data);215 assert_eq!(216 item.owner[0],217 Ownership {218 owner: account(1),219 fraction: 1023220 }221 );222 }223 });224}225226#[test]227fn create_fungible_item() {228 new_test_ext().execute_with(|| {229 default_limits();230 231 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);232233 let data = default_fungible_data();234 create_test_item(collection_id, &data.into());235236 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).value, 5);237 });238}239240//#[test]241// fn create_multiple_fungible_items() {242// new_test_ext().execute_with(|| {243// default_limits();244245// create_test_collection(&CollectionMode::Fungible(3), 1);246247// let origin1 = Origin::signed(1);248249// let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];250251// assert_ok!(TemplateModule::create_multiple_items(252// origin1.clone(),253// 1,254// 1,255// items_data.clone().into_iter().map(|d| { d.into() }).collect()256// ));257 258// for (index, _) in items_data.iter().enumerate() {259// assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);260// }261// assert_eq!(TemplateModule::balance_count(1, 1), 3000);262// assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);263// });264// }265266#[test]267fn transfer_fungible_item() {268 new_test_ext().execute_with(|| {269 default_limits();270 271 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);272273 let origin1 = Origin::signed(1);274 let origin2 = Origin::signed(2);275276 let data = default_fungible_data();277 create_test_item(collection_id, &data.into());278279 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 5);280 assert_eq!(TemplateModule::balance_count(1, 1), 5);281282 // change owner scenario283 assert_ok!(TemplateModule::transfer(origin1.clone(), account(2), 1, 1, 5));284 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 0);285 assert_eq!(TemplateModule::balance_count(1, 1), 0);286 assert_eq!(TemplateModule::balance_count(1, 2), 5);287288 // split item scenario289 assert_ok!(TemplateModule::transfer(origin2.clone(), account(3), 1, 1, 3));290 assert_eq!(TemplateModule::balance_count(1, 2), 2);291 assert_eq!(TemplateModule::balance_count(1, 3), 3);292293 // split item and new owner has account scenario294 assert_ok!(TemplateModule::transfer(origin2.clone(), account(3), 1, 1, 1));295 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 1);296 assert_eq!(TemplateModule::fungible_item_id(1, 3).value, 4);297 assert_eq!(TemplateModule::balance_count(1, 2), 1);298 assert_eq!(TemplateModule::balance_count(1, 3), 4);299 });300}301302#[test]303fn transfer_refungible_item() {304 new_test_ext().execute_with(|| {305 default_limits();306 307 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);308309 let data = default_re_fungible_data();310 create_test_item(collection_id, &data.clone().into());311312 let origin1 = Origin::signed(1);313 let origin2 = Origin::signed(2);314 {315 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();316 assert_eq!(317 item.const_data,318 data.const_data319 );320 assert_eq!(321 item.variable_data,322 data.variable_data323 );324 assert_eq!(325 item.owner[0],326 Ownership {327 owner: account(1),328 fraction: 1023329 }330 );331 }332 assert_eq!(TemplateModule::balance_count(1, 1), 1023);333 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);334335 // change owner scenario336 assert_ok!(TemplateModule::transfer(origin1.clone(), account(2), 1, 1, 1023));337 assert_eq!(338 TemplateModule::refungible_item_id(1, 1).unwrap().owner[0],339 Ownership {340 owner: account(2),341 fraction: 1023342 }343 );344 assert_eq!(TemplateModule::balance_count(1, 1), 0);345 assert_eq!(TemplateModule::balance_count(1, 2), 1023);346 // assert_eq!(TemplateModule::address_tokens(1, 1), []);347 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);348349 // split item scenario350 assert_ok!(TemplateModule::transfer(origin2.clone(), account(3), 1, 1, 500));351 {352 let item = TemplateModule::refungible_item_id(1, 1).unwrap();353 assert_eq!(354 item.owner[0],355 Ownership {356 owner: account(2),357 fraction: 523358 }359 );360 assert_eq!(361 item.owner[1],362 Ownership {363 owner: account(3),364 fraction: 500365 }366 );367 }368 assert_eq!(TemplateModule::balance_count(1, 2), 523);369 assert_eq!(TemplateModule::balance_count(1, 3), 500);370 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);371 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);372373 // split item and new owner has account scenario374 assert_ok!(TemplateModule::transfer(origin2.clone(), account(3), 1, 1, 200));375 {376 let item = TemplateModule::refungible_item_id(1, 1).unwrap();377 assert_eq!(378 item.owner[0],379 Ownership {380 owner: account(2),381 fraction: 323382 }383 );384 assert_eq!(385 item.owner[1],386 Ownership {387 owner: account(3),388 fraction: 700389 }390 );391 }392 assert_eq!(TemplateModule::balance_count(1, 2), 323);393 assert_eq!(TemplateModule::balance_count(1, 3), 700);394 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);395 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);396 });397}398399#[test]400fn transfer_nft_item() {401 new_test_ext().execute_with(|| {402 default_limits();403 404 let collection_id = create_test_collection(&CollectionMode::NFT, 1);405406 let data = default_nft_data();407 create_test_item(collection_id, &data.into());408 assert_eq!(TemplateModule::balance_count(1, 1), 1);409 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);410411 let origin1 = Origin::signed(1);412 // default scenario413 assert_ok!(TemplateModule::transfer(origin1.clone(), account(2), 1, 1, 1000));414 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));415 assert_eq!(TemplateModule::balance_count(1, 1), 0);416 assert_eq!(TemplateModule::balance_count(1, 2), 1);417 // assert_eq!(TemplateModule::address_tokens(1, 1), []);418 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);419 });420}421422#[test]423fn nft_approve_and_transfer_from() {424 new_test_ext().execute_with(|| {425 default_limits();426 427 let collection_id = create_test_collection(&CollectionMode::NFT, 1);428429 let data = default_nft_data();430 create_test_item(collection_id, &data.into());431432 let origin1 = Origin::signed(1);433 let origin2 = Origin::signed(2);434435 assert_eq!(TemplateModule::balance_count(1, 1), 1);436 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);437438 // neg transfer439 assert_noop!(TemplateModule::transfer_from(440 origin2.clone(),441 account(1),442 account(2),443 1,444 1,445 1), Error::<Test>::NoPermission);446447 // do approve448 assert_ok!(TemplateModule::approve(origin1.clone(), account(2), 1, 1, 5));449 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);450 assert_eq!(451 TemplateModule::approved(1, (1, 1, 2)),452 5453 );454455 assert_ok!(TemplateModule::transfer_from(456 origin2.clone(),457 account(1),458 account(3),459 1,460 1,461 1462 ));463 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);464 });465}466467#[test]468fn nft_approve_and_transfer_from_white_list() {469 new_test_ext().execute_with(|| {470 default_limits();471 472 let collection_id = create_test_collection(&CollectionMode::NFT, 1);473474 let origin1 = Origin::signed(1);475 let origin2 = Origin::signed(2);476477 let data = default_nft_data();478 create_test_item(collection_id, &data.clone().into());479480 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().const_data, data.const_data);481 assert_eq!(TemplateModule::balance_count(1, 1), 1);482 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);483484 assert_ok!(TemplateModule::set_mint_permission(485 origin1.clone(),486 1,487 true488 ));489 assert_ok!(TemplateModule::set_public_access_mode(490 origin1.clone(),491 1,492 AccessMode::WhiteList493 ));494 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(1)));495 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(2)));496 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(3)));497498 // do approve499 assert_ok!(TemplateModule::approve(origin1.clone(), account(2), 1, 1, 5));500 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);501 assert_ok!(TemplateModule::approve(origin1.clone(), account(3), 1, 1, 5));502 assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);503504 assert_ok!(TemplateModule::transfer_from(505 origin2.clone(),506 account(1),507 account(3),508 1,509 1,510 1511 ));512 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);513 });514}515516#[test]517fn refungible_approve_and_transfer_from() {518 new_test_ext().execute_with(|| {519 default_limits();520 521 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);522 523 let origin1 = Origin::signed(1);524 let origin2 = Origin::signed(2);525526 let data = default_re_fungible_data();527 create_test_item(collection_id, &data.into());528529 assert_eq!(TemplateModule::balance_count(1, 1), 1023);530 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);531532 assert_ok!(TemplateModule::set_mint_permission(533 origin1.clone(),534 1,535 true536 ));537 assert_ok!(TemplateModule::set_public_access_mode(538 origin1.clone(),539 1,540 AccessMode::WhiteList541 ));542 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(1)));543 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(2)));544 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(3)));545546 // do approve547 assert_ok!(TemplateModule::approve(origin1.clone(), account(2), 1, 1, 1023));548 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1023);549550 assert_ok!(TemplateModule::transfer_from(551 origin2.clone(),552 account(1),553 account(3),554 1,555 1,556 100557 ));558 assert_eq!(TemplateModule::balance_count(1, 1), 923);559 assert_eq!(TemplateModule::balance_count(1, 3), 100);560 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);561 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);562563 assert_eq!(564 TemplateModule::approved(1, (1, 1, 2)),565 923566 );567 });568}569570#[test]571fn fungible_approve_and_transfer_from() {572 new_test_ext().execute_with(|| {573 default_limits();574 575 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);576 577 let data = default_fungible_data();578 create_test_item(collection_id, &data.into());579580 let origin1 = Origin::signed(1);581 let origin2 = Origin::signed(2);582583 assert_eq!(TemplateModule::balance_count(1, 1), 5);584585 assert_ok!(TemplateModule::set_mint_permission(586 origin1.clone(),587 1,588 true589 ));590 assert_ok!(TemplateModule::set_public_access_mode(591 origin1.clone(),592 1,593 AccessMode::WhiteList594 ));595 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(1)));596 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(2)));597 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(3)));598599 // do approve600 assert_ok!(TemplateModule::approve(origin1.clone(), account(2), 1, 1, 5));601 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);602 assert_ok!(TemplateModule::approve(origin1.clone(), account(3), 1, 1, 5));603 assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);604 assert_eq!(605 TemplateModule::approved(1, (1, 1, 2)),606 5607 );608609 assert_ok!(TemplateModule::transfer_from(610 origin2.clone(),611 account(1),612 account(3),613 1,614 1,615 4616 ));617 assert_eq!(TemplateModule::balance_count(1, 1), 1);618 assert_eq!(TemplateModule::balance_count(1, 3), 4);619620 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);621622 assert_noop!(TemplateModule::transfer_from(623 origin2.clone(),624 account(1),625 account(3),626 1,627 1,628 4629 ), Error::<Test>::NoPermission);630 });631}632633#[test]634fn change_collection_owner() {635 new_test_ext().execute_with(|| {636 default_limits();637 638 let collection_id = create_test_collection(&CollectionMode::NFT, 1);639 640 let origin1 = Origin::signed(1);641 assert_ok!(TemplateModule::change_collection_owner(642 origin1.clone(),643 collection_id,644 2645 ));646 assert_eq!(TemplateModule::collection_id(collection_id).unwrap().owner, 2);647 });648}649650#[test]651fn destroy_collection() {652 new_test_ext().execute_with(|| {653 default_limits();654 655 let collection_id = create_test_collection(&CollectionMode::NFT, 1);656 657 let origin1 = Origin::signed(1);658 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));659 });660}661662#[test]663fn burn_nft_item() {664 new_test_ext().execute_with(|| {665 default_limits();666 667 let collection_id = create_test_collection(&CollectionMode::NFT, 1);668669 let origin1 = Origin::signed(1);670 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, account(2)));671 672 let data = default_nft_data();673 create_test_item(collection_id, &data.into());674675 // check balance (collection with id = 1, user id = 1)676 assert_eq!(TemplateModule::balance_count(1, 1), 1);677678 // burn item679 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));680 assert_noop!(681 TemplateModule::burn_item(origin1.clone(), 1, 1, 5),682 Error::<Test>::TokenNotFound683 );684685 assert_eq!(TemplateModule::balance_count(1, 1), 0);686 });687}688689#[test]690fn burn_fungible_item() {691 new_test_ext().execute_with(|| {692 default_limits();693 694 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);695 696 let origin1 = Origin::signed(1);697 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, account(2)));698 699 let data = default_fungible_data();700 create_test_item(collection_id, &data.into());701702 // check balance (collection with id = 1, user id = 1)703 assert_eq!(TemplateModule::balance_count(1, 1), 5);704705 // burn item706 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));707 assert_noop!(708 TemplateModule::burn_item(origin1.clone(), 1, 1, 5),709 Error::<Test>::TokenValueNotEnough710 );711712 assert_eq!(TemplateModule::balance_count(1, 1), 0);713 });714}715716#[test]717fn burn_refungible_item() {718 new_test_ext().execute_with(|| {719 default_limits();720 721 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);722 let origin1 = Origin::signed(1);723724 assert_ok!(TemplateModule::set_mint_permission(725 origin1.clone(),726 collection_id,727 true728 ));729 assert_ok!(TemplateModule::set_public_access_mode(730 origin1.clone(),731 collection_id,732 AccessMode::WhiteList733 ));734 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(1)));735736 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, account(2)));737 738 let data = default_re_fungible_data();739 create_test_item(collection_id, &data.into());740741 // check balance (collection with id = 1, user id = 2)742 assert_eq!(TemplateModule::balance_count(1, 1), 1023);743744 // burn item745 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 1023));746 assert_noop!(747 TemplateModule::burn_item(origin1.clone(), 1, 1, 1023),748 Error::<Test>::TokenNotFound749 );750751 assert_eq!(TemplateModule::balance_count(1, 1), 0);752 });753}754755#[test]756fn add_collection_admin() {757 new_test_ext().execute_with(|| {758 default_limits();759 760 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);761 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);762 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);763 764 let origin1 = Origin::signed(1);765766 // collection admin767 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, account(2)));768 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, account(3)));769770 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&account(2)), true);771 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&account(3)), true);772 });773}774775#[test]776fn remove_collection_admin() {777 new_test_ext().execute_with(|| {778 default_limits();779 780 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);781 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);782 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);783784 let origin1 = Origin::signed(1);785 let origin2 = Origin::signed(2);786787 // collection admin788 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, account(2)));789 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, account(3)));790791 assert_eq!(TemplateModule::admin_list_collection(1).contains(&account(2)), true);792 assert_eq!(TemplateModule::admin_list_collection(1).contains(&account(3)), true);793794 // remove admin795 assert_ok!(TemplateModule::remove_collection_admin(796 origin2.clone(),797 1,798 account(3)799 ));800 assert_eq!(TemplateModule::admin_list_collection(1).contains(&account(3)), false);801 });802}803804#[test]805fn balance_of() {806 new_test_ext().execute_with(|| {807 default_limits();808 809 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);810 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);811 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, 3);812 813 // check balance before814 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);815 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);816 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);817818 let nft_data = default_nft_data();819 create_test_item(nft_collection_id, &nft_data.into());820 821 let fungible_data = default_fungible_data();822 create_test_item(fungible_collection_id, &fungible_data.into());823 824 let re_fungible_data = default_re_fungible_data();825 create_test_item(re_fungible_collection_id, &re_fungible_data.into());826827 // check balance (collection with id = 1, user id = 1)828 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);829 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 5);830 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1023);831 assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).unwrap().owner, account(1));832 assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).value, 5);833 assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).unwrap().owner[0].owner, account(1));834 });835}836837#[test]838fn approve() {839 new_test_ext().execute_with(|| {840 default_limits();841 842 let collection_id = create_test_collection(&CollectionMode::NFT, 1);843 844 let data = default_nft_data();845 create_test_item(collection_id, &data.into());846847 let origin1 = Origin::signed(1);848 849 // approve850 assert_ok!(TemplateModule::approve(origin1.clone(), account(2), 1, 1, 1));851 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);852 });853}854855#[test]856fn transfer_from() {857 new_test_ext().execute_with(|| {858 default_limits();859 860 let collection_id = create_test_collection(&CollectionMode::NFT, 1);861 let origin1 = Origin::signed(1);862 let origin2 = Origin::signed(2);863864 let data = default_nft_data();865 create_test_item(collection_id, &data.into());866867 // approve868 assert_ok!(TemplateModule::approve(origin1.clone(), account(2), 1, 1, 1));869 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);870871 assert_ok!(TemplateModule::set_mint_permission(872 origin1.clone(),873 1,874 true875 ));876 assert_ok!(TemplateModule::set_public_access_mode(877 origin1.clone(),878 1,879 AccessMode::WhiteList880 ));881 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(1)));882 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(2)));883 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(3)));884885 assert_ok!(TemplateModule::transfer_from(886 origin2.clone(),887 account(1),888 account(2),889 1,890 1,891 1892 ));893894 // after transfer895 assert_eq!(TemplateModule::balance_count(1, 1), 0);896 assert_eq!(TemplateModule::balance_count(1, 2), 1);897 });898}899900// #endregion901902// Coverage tests region903// #region904905#[test]906fn owner_can_add_address_to_white_list() {907 new_test_ext().execute_with(|| {908 default_limits();909 910 let collection_id = create_test_collection(&CollectionMode::NFT, 1);911912 let origin1 = Origin::signed(1);913 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(2)));914 assert_eq!(TemplateModule::white_list(collection_id, 2), true);915 });916}917918#[test]919fn admin_can_add_address_to_white_list() {920 new_test_ext().execute_with(|| {921 default_limits();922 923 let collection_id = create_test_collection(&CollectionMode::NFT, 1);924 let origin1 = Origin::signed(1);925 let origin2 = Origin::signed(2);926927 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, account(2)));928 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, account(3)));929 assert_eq!(TemplateModule::white_list(collection_id, 3), true);930 });931}932933#[test]934fn nonprivileged_user_cannot_add_address_to_white_list() {935 new_test_ext().execute_with(|| {936 default_limits();937 938 let collection_id = create_test_collection(&CollectionMode::NFT, 1);939940 let origin2 = Origin::signed(2);941 assert_noop!(942 TemplateModule::add_to_white_list(origin2.clone(), collection_id, account(3)),943 Error::<Test>::NoPermission944 );945 });946}947948#[test]949fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {950 new_test_ext().execute_with(|| {951 default_limits();952953 let origin1 = Origin::signed(1);954955 assert_noop!(956 TemplateModule::add_to_white_list(origin1.clone(), 1, account(2)),957 Error::<Test>::CollectionNotFound958 );959 });960}961962#[test]963fn nobody_can_add_address_to_white_list_of_deleted_collection() {964 new_test_ext().execute_with(|| {965 default_limits();966 967 let collection_id = create_test_collection(&CollectionMode::NFT, 1);968969 let origin1 = Origin::signed(1);970 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));971 assert_noop!(972 TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(2)),973 Error::<Test>::CollectionNotFound974 );975 });976}977978// If address is already added to white list, nothing happens979#[test]980fn address_is_already_added_to_white_list() {981 new_test_ext().execute_with(|| {982 default_limits();983 984 let collection_id = create_test_collection(&CollectionMode::NFT, 1);985 let origin1 = Origin::signed(1);986 987 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(2)));988 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(2)));989 assert_eq!(TemplateModule::white_list(collection_id, 2), true);990 });991}992993#[test]994fn owner_can_remove_address_from_white_list() {995 new_test_ext().execute_with(|| {996 default_limits();997 998 let collection_id = create_test_collection(&CollectionMode::NFT, 1);9991000 let origin1 = Origin::signed(1);1001 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(2)));1002 assert_ok!(TemplateModule::remove_from_white_list(1003 origin1.clone(),1004 collection_id,1005 account(2)1006 ));1007 assert_eq!(TemplateModule::white_list(collection_id, 2), false);1008 });1009}10101011#[test]1012fn admin_can_remove_address_from_white_list() {1013 new_test_ext().execute_with(|| {1014 default_limits();1015 1016 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1017 let origin1 = Origin::signed(1);1018 let origin2 = Origin::signed(2);10191020 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, account(2)));10211022 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(3)));1023 assert_ok!(TemplateModule::remove_from_white_list(1024 origin2.clone(),1025 collection_id,1026 account(3)1027 ));1028 assert_eq!(TemplateModule::white_list(collection_id, 3), false);1029 });1030}10311032#[test]1033fn nonprivileged_user_cannot_remove_address_from_white_list() {1034 new_test_ext().execute_with(|| {1035 default_limits();1036 1037 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1038 let origin1 = Origin::signed(1);1039 let origin2 = Origin::signed(2);10401041 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(2)));1042 assert_noop!(1043 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, account(2)),1044 Error::<Test>::NoPermission1045 );1046 assert_eq!(TemplateModule::white_list(collection_id, 2), true);1047 });1048}10491050#[test]1051fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1052 new_test_ext().execute_with(|| {1053 default_limits();1054 let origin1 = Origin::signed(1);10551056 assert_noop!(1057 TemplateModule::remove_from_white_list(origin1.clone(), 1, account(2)),1058 Error::<Test>::CollectionNotFound1059 );1060 });1061}10621063#[test]1064fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1065 new_test_ext().execute_with(|| {1066 default_limits();1067 1068 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1069 let origin1 = Origin::signed(1);1070 let origin2 = Origin::signed(2);10711072 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(2)));1073 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1074 assert_noop!(1075 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, account(2)),1076 Error::<Test>::CollectionNotFound1077 );1078 assert_eq!(TemplateModule::white_list(collection_id, 2), false);1079 });1080}10811082// If address is already removed from white list, nothing happens1083#[test]1084fn address_is_already_removed_from_white_list() {1085 new_test_ext().execute_with(|| {1086 default_limits();1087 1088 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1089 let origin1 = Origin::signed(1);10901091 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(2)));1092 assert_ok!(TemplateModule::remove_from_white_list(1093 origin1.clone(),1094 collection_id,1095 account(2)1096 ));1097 assert_ok!(TemplateModule::remove_from_white_list(1098 origin1.clone(),1099 collection_id,1100 account(2)1101 ));1102 assert_eq!(TemplateModule::white_list(collection_id, 2), false);1103 });1104}11051106// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1107#[test]1108fn white_list_test_1() {1109 new_test_ext().execute_with(|| {1110 default_limits();1111 1112 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11131114 let origin1 = Origin::signed(1);1115 1116 let data = default_nft_data();1117 create_test_item(collection_id, &data.into());11181119 assert_ok!(TemplateModule::set_public_access_mode(1120 origin1.clone(),1121 collection_id,1122 AccessMode::WhiteList1123 ));1124 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(2)));11251126 assert_noop!(1127 TemplateModule::transfer(origin1.clone(), account(3), 1, 1, 1),1128 Error::<Test>::AddresNotInWhiteList1129 );1130 });1131}11321133#[test]1134fn white_list_test_2() {1135 new_test_ext().execute_with(|| {1136 default_limits();1137 1138 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1139 let origin1 = Origin::signed(1);1140 1141 let data = default_nft_data();1142 create_test_item(collection_id, &data.into());11431144 assert_ok!(TemplateModule::set_public_access_mode(1145 origin1.clone(),1146 collection_id,1147 AccessMode::WhiteList1148 ));1149 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(1)));1150 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(2)));11511152 // do approve1153 assert_ok!(TemplateModule::approve(origin1.clone(), account(1), 1, 1, 1));1154 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);11551156 assert_ok!(TemplateModule::remove_from_white_list(1157 origin1.clone(),1158 1,1159 account(1)1160 ));11611162 assert_noop!(1163 TemplateModule::transfer_from(origin1.clone(), account(1), account(3), 1, 1, 1),1164 Error::<Test>::AddresNotInWhiteList1165 );1166 });1167}11681169// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1170#[test]1171fn white_list_test_3() {1172 new_test_ext().execute_with(|| {1173 default_limits();1174 1175 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11761177 let origin1 = Origin::signed(1);1178 1179 let data = default_nft_data();1180 create_test_item(collection_id, &data.into());11811182 assert_ok!(TemplateModule::set_public_access_mode(1183 origin1.clone(),1184 collection_id,1185 AccessMode::WhiteList1186 ));1187 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, account(1)));11881189 assert_noop!(1190 TemplateModule::transfer(origin1.clone(), account(3), 1, 1, 1),1191 Error::<Test>::AddresNotInWhiteList1192 );1193 });1194}11951196#[test]1197fn white_list_test_4() {1198 new_test_ext().execute_with(|| {1199 default_limits();1200 1201 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12021203 let origin1 = Origin::signed(1);12041205 let data = default_nft_data();1206 create_test_item(collection_id, &data.into());12071208 assert_ok!(TemplateModule::set_public_access_mode(1209 origin1.clone(),1210 collection_id,1211 AccessMode::WhiteList1212 ));1213 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(1)));1214 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(2)));12151216 // do approve1217 assert_ok!(TemplateModule::approve(origin1.clone(), account(1), 1, 1, 1));1218 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);12191220 assert_ok!(TemplateModule::remove_from_white_list(1221 origin1.clone(),1222 collection_id,1223 account(2)1224 ));12251226 assert_noop!(1227 TemplateModule::transfer_from(origin1.clone(), account(1), account(3), 1, 1, 1),1228 Error::<Test>::AddresNotInWhiteList1229 );1230 });1231}12321233// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1234#[test]1235fn white_list_test_5() {1236 new_test_ext().execute_with(|| {1237 default_limits();1238 1239 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12401241 let origin1 = Origin::signed(1);12421243 let data = default_nft_data();1244 create_test_item(collection_id, &data.into());12451246 assert_ok!(TemplateModule::set_public_access_mode(1247 origin1.clone(),1248 collection_id,1249 AccessMode::WhiteList1250 ));1251 assert_noop!(1252 TemplateModule::burn_item(origin1.clone(), 1, 1, 5),1253 Error::<Test>::AddresNotInWhiteList1254 );1255 });1256}12571258// If Public Access mode is set to WhiteList, token transfers can’t be Approved by a non-whitelisted address (see Approve method).1259#[test]1260fn white_list_test_6() {1261 new_test_ext().execute_with(|| {1262 default_limits();1263 1264 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12651266 let origin1 = Origin::signed(1);12671268 let data = default_nft_data();1269 create_test_item(collection_id, &data.into());12701271 assert_ok!(TemplateModule::set_public_access_mode(1272 origin1.clone(),1273 collection_id,1274 AccessMode::WhiteList1275 ));12761277 // do approve1278 assert_noop!(1279 TemplateModule::approve(origin1.clone(), account(1), 1, 1, 5),1280 Error::<Test>::AddresNotInWhiteList1281 );1282 });1283}12841285// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1286// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1287#[test]1288fn white_list_test_7() {1289 new_test_ext().execute_with(|| {1290 default_limits();1291 1292 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12931294 let data = default_nft_data();1295 create_test_item(collection_id, &data.into());1296 1297 let origin1 = Origin::signed(1);12981299 assert_ok!(TemplateModule::set_public_access_mode(1300 origin1.clone(),1301 collection_id,1302 AccessMode::WhiteList1303 ));1304 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(1)));1305 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(2)));13061307 assert_ok!(TemplateModule::transfer(origin1.clone(), account(2), 1, 1, 1));1308 });1309}13101311#[test]1312fn white_list_test_8() {1313 new_test_ext().execute_with(|| {1314 default_limits();1315 1316 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13171318 let data = default_nft_data();1319 create_test_item(collection_id, &data.into());1320 1321 let origin1 = Origin::signed(1);13221323 assert_ok!(TemplateModule::set_public_access_mode(1324 origin1.clone(),1325 collection_id,1326 AccessMode::WhiteList1327 ));1328 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(1)));1329 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(2)));13301331 // do approve1332 assert_ok!(TemplateModule::approve(origin1.clone(), account(1), 1, 1, 5));1333 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 5);13341335 assert_ok!(TemplateModule::transfer_from(1336 origin1.clone(),1337 account(1),1338 account(2),1339 1,1340 1,1341 11342 ));1343 });1344}13451346// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1347#[test]1348fn white_list_test_9() {1349 new_test_ext().execute_with(|| {1350 default_limits();1351 1352 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1353 let origin1 = Origin::signed(1);13541355 assert_ok!(TemplateModule::set_public_access_mode(1356 origin1.clone(),1357 collection_id,1358 AccessMode::WhiteList1359 ));1360 assert_ok!(TemplateModule::set_mint_permission(1361 origin1.clone(),1362 collection_id,1363 false1364 ));13651366 let data = default_nft_data();1367 create_test_item(collection_id, &data.into());1368 });1369}13701371// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1372#[test]1373fn white_list_test_10() {1374 new_test_ext().execute_with(|| {1375 default_limits();1376 1377 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13781379 let origin1 = Origin::signed(1);1380 let origin2 = Origin::signed(2);13811382 assert_ok!(TemplateModule::set_public_access_mode(1383 origin1.clone(),1384 collection_id,1385 AccessMode::WhiteList1386 ));1387 assert_ok!(TemplateModule::set_mint_permission(1388 origin1.clone(),1389 collection_id,1390 false1391 ));13921393 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, account(2)));13941395 assert_ok!(TemplateModule::create_item(1396 origin2.clone(),1397 collection_id,1398 account(2),1399 default_nft_data().into()1400 ));1401 });1402}14031404// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1405#[test]1406fn white_list_test_11() {1407 new_test_ext().execute_with(|| {1408 default_limits();1409 1410 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14111412 let origin1 = Origin::signed(1);1413 let origin2 = Origin::signed(2);14141415 assert_ok!(TemplateModule::set_public_access_mode(1416 origin1.clone(),1417 collection_id,1418 AccessMode::WhiteList1419 ));1420 assert_ok!(TemplateModule::set_mint_permission(1421 origin1.clone(),1422 collection_id,1423 false1424 ));1425 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(2)));14261427 assert_noop!(1428 TemplateModule::create_item(origin2.clone(), 1, account(2), default_nft_data().into()),1429 Error::<Test>::PublicMintingNotAllowed1430 );1431 });1432}14331434// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1435#[test]1436fn white_list_test_12() {1437 new_test_ext().execute_with(|| {1438 default_limits();1439 1440 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14411442 let origin1 = Origin::signed(1);1443 let origin2 = Origin::signed(2);14441445 assert_ok!(TemplateModule::set_public_access_mode(1446 origin1.clone(),1447 collection_id,1448 AccessMode::WhiteList1449 ));1450 assert_ok!(TemplateModule::set_mint_permission(1451 origin1.clone(),1452 collection_id,1453 false1454 ));14551456 assert_noop!(1457 TemplateModule::create_item(origin2.clone(), 1, account(2), default_nft_data().into()),1458 Error::<Test>::PublicMintingNotAllowed1459 );1460 });1461}14621463// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1464#[test]1465fn white_list_test_13() {1466 new_test_ext().execute_with(|| {1467 default_limits();1468 1469 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14701471 let origin1 = Origin::signed(1);14721473 assert_ok!(TemplateModule::set_public_access_mode(1474 origin1.clone(),1475 collection_id,1476 AccessMode::WhiteList1477 ));1478 assert_ok!(TemplateModule::set_mint_permission(1479 origin1.clone(),1480 collection_id,1481 true1482 ));14831484 let data = default_nft_data();1485 create_test_item(collection_id, &data.into());1486 });1487}14881489// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1490#[test]1491fn white_list_test_14() {1492 new_test_ext().execute_with(|| {1493 default_limits();1494 1495 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14961497 let origin1 = Origin::signed(1);1498 let origin2 = Origin::signed(2);14991500 assert_ok!(TemplateModule::set_public_access_mode(1501 origin1.clone(),1502 collection_id,1503 AccessMode::WhiteList1504 ));1505 assert_ok!(TemplateModule::set_mint_permission(1506 origin1.clone(),1507 collection_id,1508 true1509 ));15101511 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, account(2)));15121513 assert_ok!(TemplateModule::create_item(1514 origin2.clone(),1515 1,1516 account(2),1517 default_nft_data().into()1518 ));1519 });1520}15211522// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1523#[test]1524fn white_list_test_15() {1525 new_test_ext().execute_with(|| {1526 default_limits();1527 1528 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15291530 let origin1 = Origin::signed(1);1531 let origin2 = Origin::signed(2);15321533 assert_ok!(TemplateModule::set_public_access_mode(1534 origin1.clone(),1535 collection_id,1536 AccessMode::WhiteList1537 ));1538 assert_ok!(TemplateModule::set_mint_permission(1539 origin1.clone(),1540 collection_id,1541 true1542 ));15431544 assert_noop!(1545 TemplateModule::create_item(origin2.clone(), 1, account(2), default_nft_data().into()),1546 Error::<Test>::AddresNotInWhiteList1547 );1548 });1549}15501551// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1552#[test]1553fn white_list_test_16() {1554 new_test_ext().execute_with(|| {1555 default_limits();1556 1557 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15581559 let origin1 = Origin::signed(1);1560 let origin2 = Origin::signed(2);15611562 assert_ok!(TemplateModule::set_public_access_mode(1563 origin1.clone(),1564 collection_id,1565 AccessMode::WhiteList1566 ));1567 assert_ok!(TemplateModule::set_mint_permission(1568 origin1.clone(),1569 collection_id,1570 true1571 ));1572 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, account(2)));15731574 assert_ok!(TemplateModule::create_item(1575 origin2.clone(),1576 1,1577 account(2),1578 default_nft_data().into()1579 ));1580 });1581}15821583// Total number of collections. Positive test1584#[test]1585fn total_number_collections_bound() {1586 new_test_ext().execute_with(|| {1587 default_limits();1588 1589 create_test_collection(&CollectionMode::NFT, 1);1590 });1591}15921593// Total number of collections. Negotive test1594#[test]1595fn total_number_collections_bound_neg() {1596 new_test_ext().execute_with(|| {1597 default_limits();15981599 let origin1 = Origin::signed(1);16001601 for i in 0..default_collection_numbers_limit() {1602 create_test_collection(&CollectionMode::NFT, i + 1);1603 }16041605 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1606 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1607 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16081609 // 11-th collection in chain. Expects error1610 assert_noop!(TemplateModule::create_collection(1611 origin1.clone(),1612 col_name1.clone(),1613 col_desc1.clone(),1614 token_prefix1.clone(),1615 CollectionMode::NFT1616 ), Error::<Test>::TotalCollectionsLimitExceeded);1617 });1618}16191620// Owned tokens by a single address. Positive test1621#[test]1622fn owned_tokens_bound() {1623 new_test_ext().execute_with(|| {1624 default_limits();1625 1626 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16271628 let data = default_nft_data();1629 create_test_item(collection_id, &data.clone().into());1630 create_test_item(collection_id, &data.into());1631 });1632}16331634// Owned tokens by a single address. Negotive test1635#[test]1636fn owned_tokens_bound_neg() {1637 new_test_ext().execute_with(|| {1638 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1639 collection_numbers_limit: 10,1640 account_token_ownership_limit: 1,1641 collections_admins_limit: 5,1642 custom_data_limit: 2048,1643 nft_sponsor_transfer_timeout: 15,1644 fungible_sponsor_transfer_timeout: 15,1645 refungible_sponsor_transfer_timeout: 15,1646 const_on_chain_schema_limit: 1024,1647 offchain_schema_limit: 1024,1648 variable_on_chain_schema_limit: 1024,1649 }));1650 1651 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16521653 let origin1 = Origin::signed(1);1654 let data = default_nft_data();1655 create_test_item(collection_id, &data.clone().into());16561657 assert_noop!(TemplateModule::create_item(1658 origin1.clone(),1659 1,1660 account(1),1661 data.into()1662 ), Error::<Test>::AddressOwnershipLimitExceeded);1663 });1664}16651666// Number of collection admins. Positive test1667#[test]1668fn collection_admins_bound() {1669 new_test_ext().execute_with(|| {1670 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1671 collection_numbers_limit: 10,1672 account_token_ownership_limit: 10,1673 collections_admins_limit: 2,1674 custom_data_limit: 2048,1675 nft_sponsor_transfer_timeout: 15,1676 fungible_sponsor_transfer_timeout: 15,1677 refungible_sponsor_transfer_timeout: 15,1678 const_on_chain_schema_limit: 1024,1679 offchain_schema_limit: 1024,1680 variable_on_chain_schema_limit: 1024,1681 }));1682 1683 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16841685 let origin1 = Origin::signed(1);1686 1687 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, account(2)));1688 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, account(3)));1689 });1690}16911692// Number of collection admins. Negotive test1693#[test]1694fn collection_admins_bound_neg() {1695 new_test_ext().execute_with(|| {1696 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1697 collection_numbers_limit: 10,1698 account_token_ownership_limit: 1,1699 collections_admins_limit: 1,1700 custom_data_limit: 2048,1701 nft_sponsor_transfer_timeout: 15,1702 fungible_sponsor_transfer_timeout: 15,1703 refungible_sponsor_transfer_timeout: 15,1704 const_on_chain_schema_limit: 1024,1705 offchain_schema_limit: 1024,1706 variable_on_chain_schema_limit: 1024,1707 }));1708 1709 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17101711 let origin1 = Origin::signed(1);17121713 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, account(2)));1714 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, account(3)), Error::<Test>::CollectionAdminsLimitExceeded);1715 });1716}17171718// NFT custom data size. Negative test const_data.1719#[test]1720fn custom_data_size_nft_const_data_bound_neg() {1721 new_test_ext().execute_with(|| {1722 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1723 collection_numbers_limit: 10,1724 account_token_ownership_limit: 10,1725 collections_admins_limit: 5,1726 custom_data_limit: 2,1727 nft_sponsor_transfer_timeout: 15,1728 fungible_sponsor_transfer_timeout: 15,1729 refungible_sponsor_transfer_timeout: 15,1730 const_on_chain_schema_limit: 1024,1731 offchain_schema_limit: 1024,1732 variable_on_chain_schema_limit: 1024,1733 }));1734 1735 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17361737 let origin1 = Origin::signed(1);1738 let too_big_const_data = CreateItemData::NFT(CreateNftData{1739 const_data: vec![1, 2, 3, 4],1740 variable_data: vec![]1741 });17421743 assert_noop!(TemplateModule::create_item(1744 origin1.clone(),1745 collection_id,1746 account(1),1747 too_big_const_data1748 ), Error::<Test>::TokenConstDataLimitExceeded);1749 });1750}17511752// NFT custom data size. Negative test variable_data.1753#[test]1754fn custom_data_size_nft_variable_data_bound_neg() {1755 new_test_ext().execute_with(|| {1756 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1757 collection_numbers_limit: 10,1758 account_token_ownership_limit: 10,1759 collections_admins_limit: 5,1760 custom_data_limit: 2,1761 nft_sponsor_transfer_timeout: 15,1762 fungible_sponsor_transfer_timeout: 15,1763 refungible_sponsor_transfer_timeout: 15,1764 const_on_chain_schema_limit: 1024,1765 offchain_schema_limit: 1024,1766 variable_on_chain_schema_limit: 1024,1767 }));17681769 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17701771 let origin1 = Origin::signed(1);1772 let too_big_const_data = CreateItemData::NFT(CreateNftData{1773 const_data: vec![],1774 variable_data: vec![1, 2, 3, 4]1775 });17761777 assert_noop!(TemplateModule::create_item(1778 origin1.clone(),1779 collection_id,1780 account(1),1781 too_big_const_data1782 ), Error::<Test>::TokenVariableDataLimitExceeded);1783 });1784}17851786// Re fungible custom data size. Negative test const_data.1787#[test]1788fn custom_data_size_re_fungible_const_data_bound_neg() {1789 new_test_ext().execute_with(|| {1790 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1791 collection_numbers_limit: 10,1792 account_token_ownership_limit: 10,1793 collections_admins_limit: 5,1794 custom_data_limit: 2,1795 nft_sponsor_transfer_timeout: 15,1796 fungible_sponsor_transfer_timeout: 15,1797 refungible_sponsor_transfer_timeout: 15,1798 const_on_chain_schema_limit: 1024,1799 offchain_schema_limit: 1024,1800 variable_on_chain_schema_limit: 1024,1801 }));18021803 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18041805 let origin1 = Origin::signed(1);1806 let too_big_const_data = CreateItemData::NFT(CreateNftData{1807 const_data: vec![1, 2, 3, 4],1808 variable_data: vec![]1809 });18101811 assert_noop!(TemplateModule::create_item(1812 origin1.clone(),1813 collection_id,1814 account(1),1815 too_big_const_data1816 ), Error::<Test>::TokenConstDataLimitExceeded);1817 });1818}18191820// Re fungible custom data size. Negative test variable_data.1821#[test]1822fn custom_data_size_re_fungible_variable_data_bound_neg() {1823 new_test_ext().execute_with(|| {1824 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1825 collection_numbers_limit: 10,1826 account_token_ownership_limit: 10,1827 collections_admins_limit: 5,1828 custom_data_limit: 2,1829 nft_sponsor_transfer_timeout: 15,1830 fungible_sponsor_transfer_timeout: 15,1831 refungible_sponsor_transfer_timeout: 15,1832 const_on_chain_schema_limit: 1024,1833 offchain_schema_limit: 1024,1834 variable_on_chain_schema_limit: 1024,1835 }));18361837 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18381839 let origin1 = Origin::signed(1);1840 let too_big_const_data = CreateItemData::NFT(CreateNftData{1841 const_data: vec![],1842 variable_data: vec![1, 2, 3, 4]1843 });18441845 assert_noop!(TemplateModule::create_item(1846 origin1.clone(),1847 collection_id,1848 account(1),1849 too_big_const_data1850 ), Error::<Test>::TokenVariableDataLimitExceeded);1851 });1852}1853// #endregion18541855#[test]1856fn set_const_on_chain_schema() {1857 new_test_ext().execute_with(|| {1858 default_limits();18591860 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18611862 let origin1 = Origin::signed(1);1863 assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));18641865 assert_eq!(TemplateModule::collection_id(collection_id).unwrap().const_on_chain_schema, b"test const on chain schema".to_vec());1866 assert_eq!(TemplateModule::collection_id(collection_id).unwrap().variable_on_chain_schema, b"".to_vec());1867 });1868}18691870#[test]1871fn set_variable_on_chain_schema() {1872 new_test_ext().execute_with(|| {1873 default_limits();1874 1875 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18761877 let origin1 = Origin::signed(1);1878 assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));18791880 assert_eq!(TemplateModule::collection_id(collection_id).unwrap().const_on_chain_schema, b"".to_vec());1881 assert_eq!(TemplateModule::collection_id(collection_id).unwrap().variable_on_chain_schema, b"test variable on chain schema".to_vec());1882 });1883}18841885#[test]1886fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1887 new_test_ext().execute_with(|| {1888 default_limits();18891890 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18911892 let origin1 = Origin::signed(1);1893 1894 let data = default_nft_data();1895 create_test_item(1, &data.into());1896 1897 let variable_data = b"test set_variable_meta_data method.".to_vec();1898 assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));18991900 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).unwrap().variable_data, variable_data);1901 });1902}19031904#[test]1905fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1906 new_test_ext().execute_with(|| {1907 default_limits();19081909 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);19101911 let origin1 = Origin::signed(1);19121913 let data = default_re_fungible_data();1914 create_test_item(1, &data.into());19151916 let variable_data = b"test set_variable_meta_data method.".to_vec();1917 assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19181919 assert_eq!(TemplateModule::refungible_item_id(collection_id, 1).unwrap().variable_data, variable_data);1920 });1921}192219231924#[test]1925fn set_variable_meta_data_on_fungible_token_fails() {1926 new_test_ext().execute_with(|| {1927 default_limits();19281929 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19301931 let origin1 = Origin::signed(1);19321933 let data = default_fungible_data();1934 create_test_item(1, &data.into());19351936 let variable_data = b"test set_variable_meta_data method.".to_vec();1937 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()), Error::<Test>::CantStoreMetadataInFungibleTokens);1938 });1939}19401941#[test]1942fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1943 new_test_ext().execute_with(|| {1944 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1945 collection_numbers_limit: default_collection_numbers_limit(),1946 account_token_ownership_limit: 10,1947 collections_admins_limit: 5,1948 custom_data_limit: 10,1949 nft_sponsor_transfer_timeout: 15,1950 fungible_sponsor_transfer_timeout: 15,1951 refungible_sponsor_transfer_timeout: 15,1952 const_on_chain_schema_limit: 1024,1953 offchain_schema_limit: 1024,1954 variable_on_chain_schema_limit: 1024,1955 }));19561957 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19581959 let origin1 = Origin::signed(1);19601961 let data = default_nft_data();1962 create_test_item(1, &data.into());19631964 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1965 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1966 });1967}19681969#[test]1970fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1971 new_test_ext().execute_with(|| {1972 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1973 collection_numbers_limit: default_collection_numbers_limit(),1974 account_token_ownership_limit: 10,1975 collections_admins_limit: 5,1976 custom_data_limit: 10,1977 nft_sponsor_transfer_timeout: 15,1978 fungible_sponsor_transfer_timeout: 15,1979 refungible_sponsor_transfer_timeout: 15,1980 const_on_chain_schema_limit: 1024,1981 offchain_schema_limit: 1024,1982 variable_on_chain_schema_limit: 1024,1983 }));198419851986 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);19871988 let origin1 = Origin::signed(1);19891990 let data = default_re_fungible_data();1991 create_test_item(1, &data.into());19921993 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1994 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1995 });1996}pallets/scheduler/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/scheduler/src/benchmarking.rs
+++ b/pallets/scheduler/src/benchmarking.rs
@@ -31,7 +31,7 @@
const BLOCK_NUMBER: u32 = 2;
// Add `n` named items to the schedule
-fn fill_schedule<T: Config> (when: T::BlockNumber, n: u32) -> Result<(), &'static str> {
+fn fill_schedule<T: Config>(when: T::BlockNumber, n: u32) -> Result<(), &'static str> {
// Essentially a no-op call.
let call = frame_system::Call::set_storage(vec![]);
for i in 0..n {
@@ -47,7 +47,10 @@
call.clone().into(),
)?;
}
- ensure!(Agenda::<T>::get(when).len() == n as usize, "didn't fill schedule");
+ ensure!(
+ Agenda::<T>::get(when).len() == n as usize,
+ "didn't fill schedule"
+ );
Ok(())
}
@@ -141,8 +144,4 @@
}
}
-impl_benchmark_test_suite!(
- Scheduler,
- crate::tests::new_test_ext(),
- crate::tests::Test,
-);
+impl_benchmark_test_suite!(Scheduler, crate::tests::new_test_ext(), crate::tests::Test,);
pallets/scheduler/src/lib.rsdiffbeforeafterboth--- a/pallets/scheduler/src/lib.rs
+++ b/pallets/scheduler/src/lib.rs
@@ -50,17 +50,25 @@
// Ensure we're `no_std` when compiling for Wasm.
#![cfg_attr(not(feature = "std"), no_std)]
+#![allow(clippy::type_complexity, clippy::boxed_local, clippy::unused_unit)]
mod benchmarking;
pub mod weights;
use sp_std::{prelude::*, marker::PhantomData, borrow::Borrow};
use codec::{Encode, Decode, Codec};
-use sp_runtime::{RuntimeDebug, traits::{Zero, One, BadOrigin, Saturating}};
+use sp_runtime::{
+ RuntimeDebug,
+ traits::{Zero, One, BadOrigin, Saturating},
+};
use frame_support::{
decl_module, decl_storage, decl_event, decl_error, IterableStorageMap,
dispatch::{Dispatchable, DispatchError, DispatchResult, Parameter},
- traits::{Get, schedule::{self, DispatchTime}, OriginTrait, EnsureOrigin, IsType},
+ traits::{
+ Get,
+ schedule::{self, DispatchTime},
+ OriginTrait, EnsureOrigin, IsType,
+ },
weights::{GetDispatchInfo, Weight},
};
use frame_system::{self as system, ensure_signed};
@@ -72,22 +80,24 @@
/// should be added to our implied traits list.
///
/// `system::Config` should always be included in our implied traits.
-/// //
-pub trait Config: system::Config
-{
-
+/// //
+pub trait Config: system::Config {
/// The overarching event type.
type Event: From<Event<Self>> + Into<<Self as system::Config>::Event>;
/// The aggregated origin which the dispatch will take.
type Origin: OriginTrait<PalletsOrigin = Self::PalletsOrigin>
- + From<Self::PalletsOrigin> + IsType<<Self as system::Config>::Origin>;
+ + From<Self::PalletsOrigin>
+ + IsType<<Self as system::Config>::Origin>;
/// The caller origin, overarching type of all pallets origins.
type PalletsOrigin: From<system::RawOrigin<Self::AccountId>> + Codec + Clone + Eq;
/// The aggregated call type.
- type Call: Parameter + Dispatchable<Origin=<Self as Config>::Origin> + GetDispatchInfo + From<system::Call<Self>>;
+ type Call: Parameter
+ + Dispatchable<Origin = <Self as Config>::Origin>
+ + GetDispatchInfo
+ + From<system::Call<Self>>;
/// The maximum weight that may be scheduled per block for any dispatchables of less priority
/// than `schedule::HARD_DEADLINE`.
@@ -141,7 +151,8 @@
}
/// The current version of Scheduled struct.
-pub type Scheduled<Call, BlockNumber, PalletsOrigin, AccountId> = ScheduledV2<Call, BlockNumber, PalletsOrigin, AccountId>;
+pub type Scheduled<Call, BlockNumber, PalletsOrigin, AccountId> =
+ ScheduledV2<Call, BlockNumber, PalletsOrigin, AccountId>;
// A value placed in storage that represents the current version of the Scheduler storage.
// This value is used by the `on_runtime_upgrade` logic to determine whether we run
@@ -160,7 +171,6 @@
#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)]
pub struct CallSpec {
-
module: u32,
method: u32,
}
@@ -172,7 +182,7 @@
=> Vec<Option<Scheduled<<T as Config>::Call, T::BlockNumber, T::PalletsOrigin, T::AccountId>>>;
pub SpecAgenda: map hasher(twox_64_concat) T::BlockNumber
- => Vec<Option<CallSpec>>;
+ => Vec<Option<CallSpec>>;
/// Lookup from identity to the block number and index of the task.
Lookup: map hasher(twox_64_concat) Vec<u8> => Option<TaskAddress<T::BlockNumber>>;
@@ -210,8 +220,8 @@
decl_module! {
/// Scheduler module declaration.
- pub struct Module<T: Config> for enum Call
- where
+ pub struct Module<T: Config> for enum Call
+ where
origin: <T as system::Config>::Origin
{
type Error = Error<T>;
@@ -234,7 +244,7 @@
maybe_periodic: Option<schedule::Period<T::BlockNumber>>,
priority: schedule::Priority,
call: Box<<T as Config>::Call>,
- )
+ )
{
let origin = <T as Config>::Origin::from(origin);
Self::do_schedule(DispatchTime::At(when), maybe_periodic, priority, origin.caller().clone(), *call)?;
@@ -402,12 +412,12 @@
let origin = <<T as Config>::Origin as From<T::PalletsOrigin>>::from(
s.origin.clone()
).into();
- let sender = ensure_signed(origin).unwrap_or(T::AccountId::default());
+ let sender = ensure_signed(origin).unwrap_or_default();
let who_will_pay = T::SponsorshipHandler::get_sponsor(&sender, &s.call).unwrap_or(sender);
let sponsor = T::PalletsOrigin::from(system::RawOrigin::Signed(who_will_pay));
let r = s.call.clone().dispatch(sponsor.into());
let maybe_id = s.maybe_id.clone();
- if let &Some((period, count)) = &s.maybe_periodic {
+ if let Some((period, count)) = s.maybe_periodic {
if count > 1 {
s.maybe_periodic = Some((period, count - 1));
} else {
@@ -420,11 +430,9 @@
Lookup::<T>::insert(id, (next, next_index as u32));
}
Agenda::<T>::append(next, Some(s));
- } else {
- if let Some(ref id) = s.maybe_id {
- Lookup::<T>::remove(id);
- }
- }
+ } else if let Some(ref id) = s.maybe_id {
+ Lookup::<T>::remove(id);
+ }
Self::deposit_event(RawEvent::Dispatched(
(now, index),
maybe_id,
@@ -454,20 +462,25 @@
StorageVersion::put(Releases::V2);
Agenda::<T>::translate::<
- Vec<Option<ScheduledV1<<T as Config>::Call, T::BlockNumber>>>, _
- >(|_, agenda| Some(
- agenda
- .into_iter()
- .map(|schedule| schedule.map(|schedule| ScheduledV2 {
- maybe_id: schedule.maybe_id,
- priority: schedule.priority,
- call: schedule.call,
- maybe_periodic: schedule.maybe_periodic,
- origin: system::RawOrigin::Root.into(),
- _phantom: Default::default(),
- }))
- .collect::<Vec<_>>()
- ));
+ Vec<Option<ScheduledV1<<T as Config>::Call, T::BlockNumber>>>,
+ _,
+ >(|_, agenda| {
+ Some(
+ agenda
+ .into_iter()
+ .map(|schedule| {
+ schedule.map(|schedule| ScheduledV2 {
+ maybe_id: schedule.maybe_id,
+ priority: schedule.priority,
+ call: schedule.call,
+ maybe_periodic: schedule.maybe_periodic,
+ origin: system::RawOrigin::Root.into(),
+ _phantom: Default::default(),
+ })
+ })
+ .collect::<Vec<_>>(),
+ )
+ });
true
} else {
@@ -478,20 +491,25 @@
/// Helper to migrate scheduler when the pallet origin type has changed.
pub fn migrate_origin<OldOrigin: Into<T::PalletsOrigin> + codec::Decode>() {
Agenda::<T>::translate::<
- Vec<Option<Scheduled<<T as Config>::Call, T::BlockNumber, OldOrigin, T::AccountId>>>, _
- >(|_, agenda| Some(
- agenda
- .into_iter()
- .map(|schedule| schedule.map(|schedule| Scheduled {
- maybe_id: schedule.maybe_id,
- priority: schedule.priority,
- call: schedule.call,
- maybe_periodic: schedule.maybe_periodic,
- origin: schedule.origin.into(),
- _phantom: Default::default(),
- }))
- .collect::<Vec<_>>()
- ));
+ Vec<Option<Scheduled<<T as Config>::Call, T::BlockNumber, OldOrigin, T::AccountId>>>,
+ _,
+ >(|_, agenda| {
+ Some(
+ agenda
+ .into_iter()
+ .map(|schedule| {
+ schedule.map(|schedule| Scheduled {
+ maybe_id: schedule.maybe_id,
+ priority: schedule.priority,
+ call: schedule.call,
+ maybe_periodic: schedule.maybe_periodic,
+ origin: schedule.origin.into(),
+ _phantom: Default::default(),
+ })
+ })
+ .collect::<Vec<_>>(),
+ )
+ });
}
fn resolve_time(when: DispatchTime<T::BlockNumber>) -> Result<T::BlockNumber, DispatchError> {
@@ -501,11 +519,11 @@
DispatchTime::At(x) => x,
// The current block has already completed it's scheduled tasks, so
// Schedule the task at lest one block after this current block.
- DispatchTime::After(x) => now.saturating_add(x).saturating_add(One::one())
+ DispatchTime::After(x) => now.saturating_add(x).saturating_add(One::one()),
};
if when <= now {
- return Err(Error::<T>::TargetBlockNumberInPast.into())
+ return Err(Error::<T>::TargetBlockNumberInPast.into());
}
Ok(when)
@@ -516,7 +534,7 @@
maybe_periodic: Option<schedule::Period<T::BlockNumber>>,
priority: schedule::Priority,
origin: T::PalletsOrigin,
- call: <T as Config>::Call
+ call: <T as Config>::Call,
) -> Result<TaskAddress<T::BlockNumber>, DispatchError> {
let when = Self::resolve_time(when)?;
@@ -526,7 +544,12 @@
// Remove one from the number of repetitions since we will schedule one now.
.map(|(p, c)| (p, c - 1));
let s = Some(Scheduled {
- maybe_id: None, priority, call, maybe_periodic, origin, _phantom: PhantomData::<T::AccountId>::default(),
+ maybe_id: None,
+ priority,
+ call,
+ maybe_periodic,
+ origin,
+ _phantom: PhantomData::<T::AccountId>::default(),
});
Agenda::<T>::append(when, s);
let index = Agenda::<T>::decode_len(when).unwrap_or(1) as u32 - 1;
@@ -544,22 +567,21 @@
fn do_cancel(
origin: Option<T::PalletsOrigin>,
- (when, index): TaskAddress<T::BlockNumber>
+ (when, index): TaskAddress<T::BlockNumber>,
) -> Result<(), DispatchError> {
- let scheduled = Agenda::<T>::try_mutate(
- when,
- |agenda| {
- agenda.get_mut(index as usize)
- .map_or(Ok(None), |s| -> Result<Option<Scheduled<_, _, _, _>>, DispatchError> {
- if let (Some(ref o), Some(ref s)) = (origin, s.borrow()) {
- if *o != s.origin {
- return Err(BadOrigin.into());
- }
- };
- Ok(s.take())
- })
- },
- )?;
+ let scheduled = Agenda::<T>::try_mutate(when, |agenda| {
+ agenda.get_mut(index as usize).map_or(
+ Ok(None),
+ |s| -> Result<Option<Scheduled<_, _, _, _>>, DispatchError> {
+ if let (Some(ref o), Some(ref s)) = (origin, s.borrow()) {
+ if *o != s.origin {
+ return Err(BadOrigin.into());
+ }
+ };
+ Ok(s.take())
+ },
+ )
+ })?;
if let Some(s) = scheduled {
if let Some(id) = s.maybe_id {
Lookup::<T>::remove(id);
@@ -567,7 +589,7 @@
Self::deposit_event(RawEvent::Canceled(when, index));
Ok(())
} else {
- Err(Error::<T>::NotFound)?
+ Err(Error::<T>::NotFound.into())
}
}
@@ -605,7 +627,7 @@
) -> Result<TaskAddress<T::BlockNumber>, DispatchError> {
// ensure id it is unique
if Lookup::<T>::contains_key(&id) {
- return Err(Error::<T>::FailedToSchedule)?
+ return Err(Error::<T>::FailedToSchedule.into());
}
let when = Self::resolve_time(when)?;
@@ -617,7 +639,12 @@
.map(|(p, c)| (p, c - 1));
let s = Scheduled {
- maybe_id: Some(id.clone()), priority, call, maybe_periodic, origin, _phantom: Default::default()
+ maybe_id: Some(id.clone()),
+ priority,
+ call,
+ maybe_periodic,
+ origin,
+ _phantom: Default::default(),
};
Agenda::<T>::append(when, Some(s));
let index = Agenda::<T>::decode_len(when).unwrap_or(1) as u32 - 1;
@@ -653,7 +680,7 @@
Self::deposit_event(RawEvent::Canceled(when, index));
Ok(())
} else {
- Err(Error::<T>::NotFound)?
+ Err(Error::<T>::NotFound.into())
}
})
}
@@ -664,33 +691,38 @@
) -> Result<TaskAddress<T::BlockNumber>, DispatchError> {
let new_time = Self::resolve_time(new_time)?;
- Lookup::<T>::try_mutate_exists(id, |lookup| -> Result<TaskAddress<T::BlockNumber>, DispatchError> {
- let (when, index) = lookup.ok_or(Error::<T>::NotFound)?;
+ Lookup::<T>::try_mutate_exists(
+ id,
+ |lookup| -> Result<TaskAddress<T::BlockNumber>, DispatchError> {
+ let (when, index) = lookup.ok_or(Error::<T>::NotFound)?;
- if new_time == when {
- return Err(Error::<T>::RescheduleNoChange.into());
- }
+ if new_time == when {
+ return Err(Error::<T>::RescheduleNoChange.into());
+ }
- Agenda::<T>::try_mutate(when, |agenda| -> DispatchResult {
- let task = agenda.get_mut(index as usize).ok_or(Error::<T>::NotFound)?;
- let task = task.take().ok_or(Error::<T>::NotFound)?;
- Agenda::<T>::append(new_time, Some(task));
+ Agenda::<T>::try_mutate(when, |agenda| -> DispatchResult {
+ let task = agenda.get_mut(index as usize).ok_or(Error::<T>::NotFound)?;
+ let task = task.take().ok_or(Error::<T>::NotFound)?;
+ Agenda::<T>::append(new_time, Some(task));
- Ok(())
- })?;
+ Ok(())
+ })?;
- let new_index = Agenda::<T>::decode_len(new_time).unwrap_or(1) as u32 - 1;
- Self::deposit_event(RawEvent::Canceled(when, index));
- Self::deposit_event(RawEvent::Scheduled(new_time, new_index));
+ let new_index = Agenda::<T>::decode_len(new_time).unwrap_or(1) as u32 - 1;
+ Self::deposit_event(RawEvent::Canceled(when, index));
+ Self::deposit_event(RawEvent::Scheduled(new_time, new_index));
- *lookup = Some((new_time, new_index));
+ *lookup = Some((new_time, new_index));
- Ok((new_time, new_index))
- })
+ Ok((new_time, new_index))
+ },
+ )
}
}
-impl<T: Config> schedule::Anon<T::BlockNumber, <T as Config>::Call, T::PalletsOrigin> for Module<T> {
+impl<T: Config> schedule::Anon<T::BlockNumber, <T as Config>::Call, T::PalletsOrigin>
+ for Module<T>
+{
type Address = TaskAddress<T::BlockNumber>;
fn schedule(
@@ -698,7 +730,7 @@
maybe_periodic: Option<schedule::Period<T::BlockNumber>>,
priority: schedule::Priority,
origin: T::PalletsOrigin,
- call: <T as Config>::Call
+ call: <T as Config>::Call,
) -> Result<Self::Address, DispatchError> {
Self::do_schedule(when, maybe_periodic, priority, origin, call)
}
@@ -715,11 +747,16 @@
}
fn next_dispatch_time((when, index): Self::Address) -> Result<T::BlockNumber, ()> {
- Agenda::<T>::get(when).get(index as usize).ok_or(()).map(|_| when)
+ Agenda::<T>::get(when)
+ .get(index as usize)
+ .ok_or(())
+ .map(|_| when)
}
}
-impl<T: Config> schedule::Named<T::BlockNumber, <T as Config>::Call, T::PalletsOrigin> for Module<T> {
+impl<T: Config> schedule::Named<T::BlockNumber, <T as Config>::Call, T::PalletsOrigin>
+ for Module<T>
+{
type Address = TaskAddress<T::BlockNumber>;
fn schedule_named(
@@ -745,17 +782,19 @@
}
fn next_dispatch_time(id: Vec<u8>) -> Result<T::BlockNumber, ()> {
- Lookup::<T>::get(id).and_then(|(when, index)| Agenda::<T>::get(when).get(index as usize).map(|_| when)).ok_or(())
+ Lookup::<T>::get(id)
+ .and_then(|(when, index)| Agenda::<T>::get(when).get(index as usize).map(|_| when))
+ .ok_or(())
}
}
#[cfg(test)]
+#[allow(clippy::from_over_into)]
mod tests {
use super::*;
use frame_support::{
- parameter_types, assert_ok, ord_parameter_types,
- assert_noop, assert_err, Hashable,
+ parameter_types, assert_ok, ord_parameter_types, assert_noop, assert_err, Hashable,
traits::{OnInitialize, OnFinalize, Filter},
weights::constants::RocksDbWeight,
};
@@ -887,11 +926,13 @@
type ScheduleOrigin = EnsureOneOf<u64, EnsureRoot<u64>, EnsureSignedBy<One, u64>>;
type MaxScheduledPerBlock = MaxScheduledPerBlock;
type WeightInfo = ();
- type SponsorshipHandler = ();
+ type SponsorshipHandler = ();
}
pub fn new_test_ext() -> sp_io::TestExternalities {
- let t = system::GenesisConfig::default().build_storage::<Test>().unwrap();
+ let t = system::GenesisConfig::default()
+ .build_storage::<Test>()
+ .unwrap();
t.into()
}
@@ -911,8 +952,16 @@
fn basic_scheduling_works() {
new_test_ext().execute_with(|| {
let call = Call::Logger(logger::Call::log(42, 1000));
- assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(&call));
- assert_ok!(Scheduler::do_schedule(DispatchTime::At(4), None, 127, root(), call));
+ assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
+ &call
+ ));
+ assert_ok!(Scheduler::do_schedule(
+ DispatchTime::At(4),
+ None,
+ 127,
+ root(),
+ call
+ ));
run_to_block(3);
assert!(logger::log().is_empty());
run_to_block(4);
@@ -927,9 +976,17 @@
new_test_ext().execute_with(|| {
run_to_block(2);
let call = Call::Logger(logger::Call::log(42, 1000));
- assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(&call));
+ assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
+ &call
+ ));
// This will schedule the call 3 blocks after the next block... so block 3 + 3 = 6
- assert_ok!(Scheduler::do_schedule(DispatchTime::After(3), None, 127, root(), call));
+ assert_ok!(Scheduler::do_schedule(
+ DispatchTime::After(3),
+ None,
+ 127,
+ root(),
+ call
+ ));
run_to_block(5);
assert!(logger::log().is_empty());
run_to_block(6);
@@ -944,8 +1001,16 @@
new_test_ext().execute_with(|| {
run_to_block(2);
let call = Call::Logger(logger::Call::log(42, 1000));
- assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(&call));
- assert_ok!(Scheduler::do_schedule(DispatchTime::After(0), None, 127, root(), call));
+ assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
+ &call
+ ));
+ assert_ok!(Scheduler::do_schedule(
+ DispatchTime::After(0),
+ None,
+ 127,
+ root(),
+ call
+ ));
// Will trigger on the next block.
run_to_block(3);
assert_eq!(logger::log(), vec![(root(), 42u32)]);
@@ -959,7 +1024,11 @@
new_test_ext().execute_with(|| {
// at #4, every 3 blocks, 3 times.
assert_ok!(Scheduler::do_schedule(
- DispatchTime::At(4), Some((3, 3)), 127, root(), Call::Logger(logger::Call::log(42, 1000))
+ DispatchTime::At(4),
+ Some((3, 3)),
+ 127,
+ root(),
+ Call::Logger(logger::Call::log(42, 1000))
));
run_to_block(3);
assert!(logger::log().is_empty());
@@ -972,9 +1041,15 @@
run_to_block(9);
assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]);
run_to_block(10);
- assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]);
+ assert_eq!(
+ logger::log(),
+ vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]
+ );
run_to_block(100);
- assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]);
+ assert_eq!(
+ logger::log(),
+ vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]
+ );
});
}
@@ -982,15 +1057,26 @@
fn reschedule_works() {
new_test_ext().execute_with(|| {
let call = Call::Logger(logger::Call::log(42, 1000));
- assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(&call));
- assert_eq!(Scheduler::do_schedule(DispatchTime::At(4), None, 127, root(), call).unwrap(), (4, 0));
+ assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
+ &call
+ ));
+ assert_eq!(
+ Scheduler::do_schedule(DispatchTime::At(4), None, 127, root(), call).unwrap(),
+ (4, 0)
+ );
run_to_block(3);
assert!(logger::log().is_empty());
- assert_eq!(Scheduler::do_reschedule((4, 0), DispatchTime::At(6)).unwrap(), (6, 0));
+ assert_eq!(
+ Scheduler::do_reschedule((4, 0), DispatchTime::At(6)).unwrap(),
+ (6, 0)
+ );
- assert_noop!(Scheduler::do_reschedule((6, 0), DispatchTime::At(6)), Error::<Test>::RescheduleNoChange);
+ assert_noop!(
+ Scheduler::do_reschedule((6, 0), DispatchTime::At(6)),
+ Error::<Test>::RescheduleNoChange
+ );
run_to_block(4);
assert!(logger::log().is_empty());
@@ -1007,17 +1093,34 @@
fn reschedule_named_works() {
new_test_ext().execute_with(|| {
let call = Call::Logger(logger::Call::log(42, 1000));
- assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(&call));
- assert_eq!(Scheduler::do_schedule_named(
- 1u32.encode(), DispatchTime::At(4), None, 127, root(), call
- ).unwrap(), (4, 0));
+ assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
+ &call
+ ));
+ assert_eq!(
+ Scheduler::do_schedule_named(
+ 1u32.encode(),
+ DispatchTime::At(4),
+ None,
+ 127,
+ root(),
+ call
+ )
+ .unwrap(),
+ (4, 0)
+ );
run_to_block(3);
assert!(logger::log().is_empty());
- assert_eq!(Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(6)).unwrap(), (6, 0));
+ assert_eq!(
+ Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(6)).unwrap(),
+ (6, 0)
+ );
- assert_noop!(Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(6)), Error::<Test>::RescheduleNoChange);
+ assert_noop!(
+ Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(6)),
+ Error::<Test>::RescheduleNoChange
+ );
run_to_block(4);
assert!(logger::log().is_empty());
@@ -1034,16 +1137,33 @@
fn reschedule_named_perodic_works() {
new_test_ext().execute_with(|| {
let call = Call::Logger(logger::Call::log(42, 1000));
- assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(&call));
- assert_eq!(Scheduler::do_schedule_named(
- 1u32.encode(), DispatchTime::At(4), Some((3, 3)), 127, root(), call
- ).unwrap(), (4, 0));
+ assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
+ &call
+ ));
+ assert_eq!(
+ Scheduler::do_schedule_named(
+ 1u32.encode(),
+ DispatchTime::At(4),
+ Some((3, 3)),
+ 127,
+ root(),
+ call
+ )
+ .unwrap(),
+ (4, 0)
+ );
run_to_block(3);
assert!(logger::log().is_empty());
- assert_eq!(Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(5)).unwrap(), (5, 0));
- assert_eq!(Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(6)).unwrap(), (6, 0));
+ assert_eq!(
+ Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(5)).unwrap(),
+ (5, 0)
+ );
+ assert_eq!(
+ Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(6)).unwrap(),
+ (6, 0)
+ );
run_to_block(5);
assert!(logger::log().is_empty());
@@ -1051,7 +1171,10 @@
run_to_block(6);
assert_eq!(logger::log(), vec![(root(), 42u32)]);
- assert_eq!(Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(10)).unwrap(), (10, 0));
+ assert_eq!(
+ Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(10)).unwrap(),
+ (10, 0)
+ );
run_to_block(9);
assert_eq!(logger::log(), vec![(root(), 42u32)]);
@@ -1060,10 +1183,16 @@
assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]);
run_to_block(13);
- assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]);
+ assert_eq!(
+ logger::log(),
+ vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]
+ );
run_to_block(100);
- assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]);
+ assert_eq!(
+ logger::log(),
+ vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]
+ );
});
}
@@ -1072,11 +1201,22 @@
new_test_ext().execute_with(|| {
// at #4.
Scheduler::do_schedule_named(
- 1u32.encode(), DispatchTime::At(4), None, 127, root(), Call::Logger(logger::Call::log(69, 1000))
- ).unwrap();
+ 1u32.encode(),
+ DispatchTime::At(4),
+ None,
+ 127,
+ root(),
+ Call::Logger(logger::Call::log(69, 1000)),
+ )
+ .unwrap();
let i = Scheduler::do_schedule(
- DispatchTime::At(4), None, 127, root(), Call::Logger(logger::Call::log(42, 1000))
- ).unwrap();
+ DispatchTime::At(4),
+ None,
+ 127,
+ root(),
+ Call::Logger(logger::Call::log(42, 1000)),
+ )
+ .unwrap();
run_to_block(3);
assert!(logger::log().is_empty());
assert_ok!(Scheduler::do_cancel_named(None, 1u32.encode()));
@@ -1096,8 +1236,9 @@
Some((3, 3)),
127,
root(),
- Call::Logger(logger::Call::log(42, 1000))
- ).unwrap();
+ Call::Logger(logger::Call::log(42, 1000)),
+ )
+ .unwrap();
// same id results in error.
assert!(Scheduler::do_schedule_named(
1u32.encode(),
@@ -1106,11 +1247,18 @@
127,
root(),
Call::Logger(logger::Call::log(69, 1000))
- ).is_err());
+ )
+ .is_err());
// different id is ok.
Scheduler::do_schedule_named(
- 2u32.encode(), DispatchTime::At(8), None, 127, root(), Call::Logger(logger::Call::log(69, 1000))
- ).unwrap();
+ 2u32.encode(),
+ DispatchTime::At(8),
+ None,
+ 127,
+ root(),
+ Call::Logger(logger::Call::log(69, 1000)),
+ )
+ .unwrap();
run_to_block(3);
assert!(logger::log().is_empty());
run_to_block(4);
@@ -1136,7 +1284,8 @@
DispatchTime::At(4),
None,
127,
- root(), Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
+ root(),
+ Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
));
// 69 and 42 do not fit together
run_to_block(4);
@@ -1198,19 +1347,22 @@
DispatchTime::At(4),
None,
255,
- root(), Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 3))
+ root(),
+ Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 3))
));
assert_ok!(Scheduler::do_schedule(
DispatchTime::At(4),
None,
127,
- root(), Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
+ root(),
+ Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
));
assert_ok!(Scheduler::do_schedule(
DispatchTime::At(4),
None,
126,
- root(), Call::Logger(logger::Call::log(2600, MaximumSchedulerWeight::get() / 2))
+ root(),
+ Call::Logger(logger::Call::log(2600, MaximumSchedulerWeight::get() / 2))
));
// 2600 does not fit with 69 or 42, but has higher priority, so will go through
@@ -1218,25 +1370,32 @@
assert_eq!(logger::log(), vec![(root(), 2600u32)]);
// 69 and 42 fit together
run_to_block(5);
- assert_eq!(logger::log(), vec![(root(), 2600u32), (root(), 69u32), (root(), 42u32)]);
+ assert_eq!(
+ logger::log(),
+ vec![(root(), 2600u32), (root(), 69u32), (root(), 42u32)]
+ );
});
}
#[test]
fn on_initialize_weight_is_correct() {
new_test_ext().execute_with(|| {
- let base_weight: Weight = <Test as frame_system::Config>::DbWeight::get().reads_writes(1, 2);
+ let base_weight: Weight =
+ <Test as frame_system::Config>::DbWeight::get().reads_writes(1, 2);
let base_multiplier = 0;
let named_multiplier = <Test as frame_system::Config>::DbWeight::get().writes(1);
- let periodic_multiplier = <Test as frame_system::Config>::DbWeight::get().reads_writes(1, 1);
+ let periodic_multiplier =
+ <Test as frame_system::Config>::DbWeight::get().reads_writes(1, 1);
// Named
- assert_ok!(
- Scheduler::do_schedule_named(
- 1u32.encode(), DispatchTime::At(1), None, 255, root(),
- Call::Logger(logger::Call::log(3, MaximumSchedulerWeight::get() / 3))
- )
- );
+ assert_ok!(Scheduler::do_schedule_named(
+ 1u32.encode(),
+ DispatchTime::At(1),
+ None,
+ 255,
+ root(),
+ Call::Logger(logger::Call::log(3, MaximumSchedulerWeight::get() / 3))
+ ));
// Anon Periodic
assert_ok!(Scheduler::do_schedule(
DispatchTime::At(1),
@@ -1255,29 +1414,53 @@
));
// Named Periodic
assert_ok!(Scheduler::do_schedule_named(
- 2u32.encode(), DispatchTime::At(1), Some((1000, 3)), 126, root(),
- Call::Logger(logger::Call::log(2600, MaximumSchedulerWeight::get() / 2)))
- );
+ 2u32.encode(),
+ DispatchTime::At(1),
+ Some((1000, 3)),
+ 126,
+ root(),
+ Call::Logger(logger::Call::log(2600, MaximumSchedulerWeight::get() / 2))
+ ));
// Will include the named periodic only
let actual_weight = Scheduler::on_initialize(1);
let call_weight = MaximumSchedulerWeight::get() / 2;
assert_eq!(
- actual_weight, call_weight + base_weight + base_multiplier + named_multiplier + periodic_multiplier
+ actual_weight,
+ call_weight
+ + base_weight + base_multiplier
+ + named_multiplier + periodic_multiplier
);
assert_eq!(logger::log(), vec![(root(), 2600u32)]);
// Will include anon and anon periodic
let actual_weight = Scheduler::on_initialize(2);
let call_weight = MaximumSchedulerWeight::get() / 2 + MaximumSchedulerWeight::get() / 3;
- assert_eq!(actual_weight, call_weight + base_weight + base_multiplier * 2 + periodic_multiplier);
- assert_eq!(logger::log(), vec![(root(), 2600u32), (root(), 69u32), (root(), 42u32)]);
+ assert_eq!(
+ actual_weight,
+ call_weight + base_weight + base_multiplier * 2 + periodic_multiplier
+ );
+ assert_eq!(
+ logger::log(),
+ vec![(root(), 2600u32), (root(), 69u32), (root(), 42u32)]
+ );
// Will include named only
let actual_weight = Scheduler::on_initialize(3);
let call_weight = MaximumSchedulerWeight::get() / 3;
- assert_eq!(actual_weight, call_weight + base_weight + base_multiplier + named_multiplier);
- assert_eq!(logger::log(), vec![(root(), 2600u32), (root(), 69u32), (root(), 42u32), (root(), 3u32)]);
+ assert_eq!(
+ actual_weight,
+ call_weight + base_weight + base_multiplier + named_multiplier
+ );
+ assert_eq!(
+ logger::log(),
+ vec![
+ (root(), 2600u32),
+ (root(), 69u32),
+ (root(), 42u32),
+ (root(), 3u32)
+ ]
+ );
// Will contain none
let actual_weight = Scheduler::on_initialize(4);
@@ -1290,7 +1473,14 @@
new_test_ext().execute_with(|| {
let call = Box::new(Call::Logger(logger::Call::log(69, 1000)));
let call2 = Box::new(Call::Logger(logger::Call::log(42, 1000)));
- assert_ok!(Scheduler::schedule_named(Origin::root(), 1u32.encode(), 4, None, 127, call));
+ assert_ok!(Scheduler::schedule_named(
+ Origin::root(),
+ 1u32.encode(),
+ 4,
+ None,
+ 127,
+ call
+ ));
assert_ok!(Scheduler::schedule(Origin::root(), 4, None, 127, call2));
run_to_block(3);
// Scheduled calls are in the agenda.
@@ -1334,15 +1524,29 @@
new_test_ext().execute_with(|| {
let call = Box::new(Call::Logger(logger::Call::log(69, 1000)));
let call2 = Box::new(Call::Logger(logger::Call::log(42, 1000)));
- assert_ok!(
- Scheduler::schedule_named(system::RawOrigin::Signed(1).into(), 1u32.encode(), 4, None, 127, call)
- );
- assert_ok!(Scheduler::schedule(system::RawOrigin::Signed(1).into(), 4, None, 127, call2));
+ assert_ok!(Scheduler::schedule_named(
+ system::RawOrigin::Signed(1).into(),
+ 1u32.encode(),
+ 4,
+ None,
+ 127,
+ call
+ ));
+ assert_ok!(Scheduler::schedule(
+ system::RawOrigin::Signed(1).into(),
+ 4,
+ None,
+ 127,
+ call2
+ ));
run_to_block(3);
// Scheduled calls are in the agenda.
assert_eq!(Agenda::<Test>::get(4).len(), 2);
assert!(logger::log().is_empty());
- assert_ok!(Scheduler::cancel_named(system::RawOrigin::Signed(1).into(), 1u32.encode()));
+ assert_ok!(Scheduler::cancel_named(
+ system::RawOrigin::Signed(1).into(),
+ 1u32.encode()
+ ));
assert_ok!(Scheduler::cancel(system::RawOrigin::Signed(1).into(), 4, 1));
// Scheduled calls are made NONE, so should not effect state
run_to_block(100);
@@ -1356,10 +1560,20 @@
let call = Box::new(Call::Logger(logger::Call::log(69, 1000)));
let call2 = Box::new(Call::Logger(logger::Call::log(42, 1000)));
assert_noop!(
- Scheduler::schedule_named(system::RawOrigin::Signed(2).into(), 1u32.encode(), 4, None, 127, call),
+ Scheduler::schedule_named(
+ system::RawOrigin::Signed(2).into(),
+ 1u32.encode(),
+ 4,
+ None,
+ 127,
+ call
+ ),
BadOrigin
);
- assert_noop!(Scheduler::schedule(system::RawOrigin::Signed(2).into(), 4, None, 127, call2), BadOrigin);
+ assert_noop!(
+ Scheduler::schedule(system::RawOrigin::Signed(2).into(), 4, None, 127, call2),
+ BadOrigin
+ );
});
}
@@ -1368,22 +1582,48 @@
new_test_ext().execute_with(|| {
let call = Box::new(Call::Logger(logger::Call::log_without_filter(69, 1000)));
let call2 = Box::new(Call::Logger(logger::Call::log_without_filter(42, 1000)));
- assert_ok!(
- Scheduler::schedule_named(system::RawOrigin::Signed(1).into(), 1u32.encode(), 4, None, 127, call)
- );
- assert_ok!(Scheduler::schedule(system::RawOrigin::Signed(1).into(), 4, None, 127, call2));
+ assert_ok!(Scheduler::schedule_named(
+ system::RawOrigin::Signed(1).into(),
+ 1u32.encode(),
+ 4,
+ None,
+ 127,
+ call
+ ));
+ assert_ok!(Scheduler::schedule(
+ system::RawOrigin::Signed(1).into(),
+ 4,
+ None,
+ 127,
+ call2
+ ));
run_to_block(3);
// Scheduled calls are in the agenda.
assert_eq!(Agenda::<Test>::get(4).len(), 2);
assert!(logger::log().is_empty());
- assert_noop!(Scheduler::cancel_named(system::RawOrigin::Signed(2).into(), 1u32.encode()), BadOrigin);
- assert_noop!(Scheduler::cancel(system::RawOrigin::Signed(2).into(), 4, 1), BadOrigin);
- assert_noop!(Scheduler::cancel_named(system::RawOrigin::Root.into(), 1u32.encode()), BadOrigin);
- assert_noop!(Scheduler::cancel(system::RawOrigin::Root.into(), 4, 1), BadOrigin);
+ assert_noop!(
+ Scheduler::cancel_named(system::RawOrigin::Signed(2).into(), 1u32.encode()),
+ BadOrigin
+ );
+ assert_noop!(
+ Scheduler::cancel(system::RawOrigin::Signed(2).into(), 4, 1),
+ BadOrigin
+ );
+ assert_noop!(
+ Scheduler::cancel_named(system::RawOrigin::Root.into(), 1u32.encode()),
+ BadOrigin
+ );
+ assert_noop!(
+ Scheduler::cancel(system::RawOrigin::Root.into(), 4, 1),
+ BadOrigin
+ );
run_to_block(5);
assert_eq!(
logger::log(),
- vec![(system::RawOrigin::Signed(1).into(), 69u32), (system::RawOrigin::Signed(1).into(), 42u32)]
+ vec![
+ (system::RawOrigin::Signed(1).into(), 69u32),
+ (system::RawOrigin::Signed(1).into(), 42u32)
+ ]
);
});
}
@@ -1408,85 +1648,84 @@
maybe_periodic: Some((456u64, 10)),
}),
];
- frame_support::migration::put_storage_value(
- b"Scheduler",
- b"Agenda",
- &k,
- old,
- );
+ frame_support::migration::put_storage_value(b"Scheduler", b"Agenda", &k, old);
}
assert_eq!(StorageVersion::get(), Releases::V1);
assert!(Scheduler::migrate_v1_to_t2());
- assert_eq_uvec!(Agenda::<Test>::iter().collect::<Vec<_>>(), vec![
- (
- 0,
- vec![
- Some(ScheduledV2 {
- maybe_id: None,
- priority: 10,
- call: Call::Logger(logger::Call::log(96, 100)),
- maybe_periodic: None,
- origin: root(),
- _phantom: PhantomData::<u64>::default(),
- }),
- None,
- Some(ScheduledV2 {
- maybe_id: Some(b"test".to_vec()),
- priority: 123,
- call: Call::Logger(logger::Call::log(69, 1000)),
- maybe_periodic: Some((456u64, 10)),
- origin: root(),
- _phantom: PhantomData::<u64>::default(),
- }),
- ]),
- (
- 1,
- vec![
- Some(ScheduledV2 {
- maybe_id: None,
- priority: 11,
- call: Call::Logger(logger::Call::log(96, 100)),
- maybe_periodic: None,
- origin: root(),
- _phantom: PhantomData::<u64>::default(),
- }),
- None,
- Some(ScheduledV2 {
- maybe_id: Some(b"test".to_vec()),
- priority: 123,
- call: Call::Logger(logger::Call::log(69, 1000)),
- maybe_periodic: Some((456u64, 10)),
- origin: root(),
- _phantom: PhantomData::<u64>::default(),
- }),
- ]
- ),
- (
- 2,
- vec![
- Some(ScheduledV2 {
- maybe_id: None,
- priority: 12,
- call: Call::Logger(logger::Call::log(96, 100)),
- maybe_periodic: None,
- origin: root(),
- _phantom: PhantomData::<u64>::default(),
- }),
- None,
- Some(ScheduledV2 {
- maybe_id: Some(b"test".to_vec()),
- priority: 123,
- call: Call::Logger(logger::Call::log(69, 1000)),
- maybe_periodic: Some((456u64, 10)),
- origin: root(),
- _phantom: PhantomData::<u64>::default(),
- }),
- ]
- )
- ]);
+ assert_eq_uvec!(
+ Agenda::<Test>::iter().collect::<Vec<_>>(),
+ vec![
+ (
+ 0,
+ vec![
+ Some(ScheduledV2 {
+ maybe_id: None,
+ priority: 10,
+ call: Call::Logger(logger::Call::log(96, 100)),
+ maybe_periodic: None,
+ origin: root(),
+ _phantom: PhantomData::<u64>::default(),
+ }),
+ None,
+ Some(ScheduledV2 {
+ maybe_id: Some(b"test".to_vec()),
+ priority: 123,
+ call: Call::Logger(logger::Call::log(69, 1000)),
+ maybe_periodic: Some((456u64, 10)),
+ origin: root(),
+ _phantom: PhantomData::<u64>::default(),
+ }),
+ ]
+ ),
+ (
+ 1,
+ vec![
+ Some(ScheduledV2 {
+ maybe_id: None,
+ priority: 11,
+ call: Call::Logger(logger::Call::log(96, 100)),
+ maybe_periodic: None,
+ origin: root(),
+ _phantom: PhantomData::<u64>::default(),
+ }),
+ None,
+ Some(ScheduledV2 {
+ maybe_id: Some(b"test".to_vec()),
+ priority: 123,
+ call: Call::Logger(logger::Call::log(69, 1000)),
+ maybe_periodic: Some((456u64, 10)),
+ origin: root(),
+ _phantom: PhantomData::<u64>::default(),
+ }),
+ ]
+ ),
+ (
+ 2,
+ vec![
+ Some(ScheduledV2 {
+ maybe_id: None,
+ priority: 12,
+ call: Call::Logger(logger::Call::log(96, 100)),
+ maybe_periodic: None,
+ origin: root(),
+ _phantom: PhantomData::<u64>::default(),
+ }),
+ None,
+ Some(ScheduledV2 {
+ maybe_id: Some(b"test".to_vec()),
+ priority: 123,
+ call: Call::Logger(logger::Call::log(69, 1000)),
+ maybe_periodic: Some((456u64, 10)),
+ origin: root(),
+ _phantom: PhantomData::<u64>::default(),
+ }),
+ ]
+ )
+ ]
+ );
assert_eq!(StorageVersion::get(), Releases::V2);
});
@@ -1516,93 +1755,92 @@
_phantom: Default::default(),
}),
];
- frame_support::migration::put_storage_value(
- b"Scheduler",
- b"Agenda",
- &k,
- old,
- );
+ frame_support::migration::put_storage_value(b"Scheduler", b"Agenda", &k, old);
}
- impl Into<OriginCaller> for u32 {
- fn into(self) -> OriginCaller {
- match self {
- 3u32 => system::RawOrigin::Root.into(),
- 2u32 => system::RawOrigin::None.into(),
- _ => unreachable!("test make no use of it"),
+ impl From<u32> for OriginCaller {
+ fn from(value: u32) -> Self {
+ match value {
+ 3 => system::RawOrigin::Root.into(),
+ 2 => system::RawOrigin::None.into(),
+ _ => unimplemented!(),
}
}
}
Scheduler::migrate_origin::<u32>();
- assert_eq_uvec!(Agenda::<Test>::iter().collect::<Vec<_>>(), vec![
- (
- 0,
- vec![
- Some(ScheduledV2::<_, _, OriginCaller, u64> {
- maybe_id: None,
- priority: 10,
- call: Call::Logger(logger::Call::log(96, 100)),
- maybe_periodic: None,
- origin: system::RawOrigin::Root.into(),
- _phantom: PhantomData::<u64>::default(),
- }),
- None,
- Some(ScheduledV2 {
- maybe_id: Some(b"test".to_vec()),
- priority: 123,
- call: Call::Logger(logger::Call::log(69, 1000)),
- maybe_periodic: Some((456u64, 10)),
- origin: system::RawOrigin::None.into(),
- _phantom: PhantomData::<u64>::default(),
- }),
- ]),
- (
- 1,
- vec![
- Some(ScheduledV2 {
- maybe_id: None,
- priority: 11,
- call: Call::Logger(logger::Call::log(96, 100)),
- maybe_periodic: None,
- origin: system::RawOrigin::Root.into(),
- _phantom: PhantomData::<u64>::default(),
- }),
- None,
- Some(ScheduledV2 {
- maybe_id: Some(b"test".to_vec()),
- priority: 123,
- call: Call::Logger(logger::Call::log(69, 1000)),
- maybe_periodic: Some((456u64, 10)),
- origin: system::RawOrigin::None.into(),
- _phantom: PhantomData::<u64>::default(),
- }),
- ]
- ),
- (
- 2,
- vec![
- Some(ScheduledV2 {
- maybe_id: None,
- priority: 12,
- call: Call::Logger(logger::Call::log(96, 100)),
- maybe_periodic: None,
- origin: system::RawOrigin::Root.into(),
- _phantom: PhantomData::<u64>::default(),
- }),
- None,
- Some(ScheduledV2 {
- maybe_id: Some(b"test".to_vec()),
- priority: 123,
- call: Call::Logger(logger::Call::log(69, 1000)),
- maybe_periodic: Some((456u64, 10)),
- origin: system::RawOrigin::None.into(),
- _phantom: PhantomData::<u64>::default(),
- }),
- ]
- )
- ]);
+ assert_eq_uvec!(
+ Agenda::<Test>::iter().collect::<Vec<_>>(),
+ vec![
+ (
+ 0,
+ vec![
+ Some(ScheduledV2::<_, _, OriginCaller, u64> {
+ maybe_id: None,
+ priority: 10,
+ call: Call::Logger(logger::Call::log(96, 100)),
+ maybe_periodic: None,
+ origin: system::RawOrigin::Root.into(),
+ _phantom: PhantomData::<u64>::default(),
+ }),
+ None,
+ Some(ScheduledV2 {
+ maybe_id: Some(b"test".to_vec()),
+ priority: 123,
+ call: Call::Logger(logger::Call::log(69, 1000)),
+ maybe_periodic: Some((456u64, 10)),
+ origin: system::RawOrigin::None.into(),
+ _phantom: PhantomData::<u64>::default(),
+ }),
+ ]
+ ),
+ (
+ 1,
+ vec![
+ Some(ScheduledV2 {
+ maybe_id: None,
+ priority: 11,
+ call: Call::Logger(logger::Call::log(96, 100)),
+ maybe_periodic: None,
+ origin: system::RawOrigin::Root.into(),
+ _phantom: PhantomData::<u64>::default(),
+ }),
+ None,
+ Some(ScheduledV2 {
+ maybe_id: Some(b"test".to_vec()),
+ priority: 123,
+ call: Call::Logger(logger::Call::log(69, 1000)),
+ maybe_periodic: Some((456u64, 10)),
+ origin: system::RawOrigin::None.into(),
+ _phantom: PhantomData::<u64>::default(),
+ }),
+ ]
+ ),
+ (
+ 2,
+ vec![
+ Some(ScheduledV2 {
+ maybe_id: None,
+ priority: 12,
+ call: Call::Logger(logger::Call::log(96, 100)),
+ maybe_periodic: None,
+ origin: system::RawOrigin::Root.into(),
+ _phantom: PhantomData::<u64>::default(),
+ }),
+ None,
+ Some(ScheduledV2 {
+ maybe_id: Some(b"test".to_vec()),
+ priority: 123,
+ call: Call::Logger(logger::Call::log(69, 1000)),
+ maybe_periodic: Some((456u64, 10)),
+ origin: system::RawOrigin::None.into(),
+ _phantom: PhantomData::<u64>::default(),
+ }),
+ ]
+ )
+ ]
+ );
});
}
}
pallets/scheduler/src/weights.rsdiffbeforeafterboth--- a/pallets/scheduler/src/weights.rs
+++ b/pallets/scheduler/src/weights.rs
@@ -34,85 +34,76 @@
// --output=./frame/scheduler/src/weights.rs
// --template=./.maintain/frame-weight-template.hbs
-
#![allow(unused_parens)]
#![allow(unused_imports)]
-use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}};
+use frame_support::{
+ traits::Get,
+ weights::{Weight, constants::RocksDbWeight},
+};
use sp_std::marker::PhantomData;
/// Weight functions needed for pallet_scheduler.
pub trait WeightInfo {
- fn schedule(s: u32, ) -> Weight;
- fn cancel(s: u32, ) -> Weight;
- fn schedule_named(s: u32, ) -> Weight;
- fn cancel_named(s: u32, ) -> Weight;
-
+ fn schedule(s: u32) -> Weight;
+ fn cancel(s: u32) -> Weight;
+ fn schedule_named(s: u32) -> Weight;
+ fn cancel_named(s: u32) -> Weight;
}
/// Weights for pallet_scheduler using the Substrate node and recommended hardware.
pub struct SubstrateWeight<T>(PhantomData<T>);
impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
- fn schedule(s: u32, ) -> Weight {
- (35_029_000 as Weight)
- .saturating_add((77_000 as Weight).saturating_mul(s as Weight))
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
-
+ fn schedule(s: u32) -> Weight {
+ 35_029_000_u64
+ .saturating_add(77_000_u64.saturating_mul(s as Weight))
+ .saturating_add(T::DbWeight::get().reads(1_u64))
+ .saturating_add(T::DbWeight::get().writes(1_u64))
}
- fn cancel(s: u32, ) -> Weight {
- (31_419_000 as Weight)
- .saturating_add((4_015_000 as Weight).saturating_mul(s as Weight))
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(2 as Weight))
-
+ fn cancel(s: u32) -> Weight {
+ 31_419_000_u64
+ .saturating_add(4_015_000_u64.saturating_mul(s as Weight))
+ .saturating_add(T::DbWeight::get().reads(1_u64))
+ .saturating_add(T::DbWeight::get().writes(2_u64))
}
- fn schedule_named(s: u32, ) -> Weight {
- (44_752_000 as Weight)
- .saturating_add((123_000 as Weight).saturating_mul(s as Weight))
- .saturating_add(T::DbWeight::get().reads(2 as Weight))
- .saturating_add(T::DbWeight::get().writes(2 as Weight))
-
+ fn schedule_named(s: u32) -> Weight {
+ 44_752_000_u64
+ .saturating_add(123_000_u64.saturating_mul(s as Weight))
+ .saturating_add(T::DbWeight::get().reads(2_u64))
+ .saturating_add(T::DbWeight::get().writes(2_u64))
}
- fn cancel_named(s: u32, ) -> Weight {
- (35_712_000 as Weight)
- .saturating_add((4_008_000 as Weight).saturating_mul(s as Weight))
- .saturating_add(T::DbWeight::get().reads(2 as Weight))
- .saturating_add(T::DbWeight::get().writes(2 as Weight))
-
+ fn cancel_named(s: u32) -> Weight {
+ 35_712_000_u64
+ .saturating_add(4_008_000_u64.saturating_mul(s as Weight))
+ .saturating_add(T::DbWeight::get().reads(2_u64))
+ .saturating_add(T::DbWeight::get().writes(2_u64))
}
-
}
// For backwards compatibility and tests
impl WeightInfo for () {
- fn schedule(s: u32, ) -> Weight {
- (35_029_000 as Weight)
- .saturating_add((77_000 as Weight).saturating_mul(s as Weight))
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
-
+ fn schedule(s: u32) -> Weight {
+ 35_029_000_u64
+ .saturating_add(77_000_u64.saturating_mul(s as Weight))
+ .saturating_add(RocksDbWeight::get().reads(1_u64))
+ .saturating_add(RocksDbWeight::get().writes(1_u64))
}
- fn cancel(s: u32, ) -> Weight {
- (31_419_000 as Weight)
- .saturating_add((4_015_000 as Weight).saturating_mul(s as Weight))
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(2 as Weight))
-
+ fn cancel(s: u32) -> Weight {
+ 31_419_000_u64
+ .saturating_add(4_015_000_u64.saturating_mul(s as Weight))
+ .saturating_add(RocksDbWeight::get().reads(1_u64))
+ .saturating_add(RocksDbWeight::get().writes(2_u64))
}
- fn schedule_named(s: u32, ) -> Weight {
- (44_752_000 as Weight)
- .saturating_add((123_000 as Weight).saturating_mul(s as Weight))
- .saturating_add(RocksDbWeight::get().reads(2 as Weight))
- .saturating_add(RocksDbWeight::get().writes(2 as Weight))
-
+ fn schedule_named(s: u32) -> Weight {
+ 44_752_000_u64
+ .saturating_add(123_000_u64.saturating_mul(s as Weight))
+ .saturating_add(RocksDbWeight::get().reads(2_u64))
+ .saturating_add(RocksDbWeight::get().writes(2_u64))
}
- fn cancel_named(s: u32, ) -> Weight {
- (35_712_000 as Weight)
- .saturating_add((4_008_000 as Weight).saturating_mul(s as Weight))
- .saturating_add(RocksDbWeight::get().reads(2 as Weight))
- .saturating_add(RocksDbWeight::get().writes(2 as Weight))
-
+ fn cancel_named(s: u32) -> Weight {
+ 35_712_000_u64
+ .saturating_add(4_008_000_u64.saturating_mul(s as Weight))
+ .saturating_add(RocksDbWeight::get().reads(2_u64))
+ .saturating_add(RocksDbWeight::get().writes(2_u64))
}
-
}
primitives/nft/src/lib.rsdiffbeforeafterboth--- a/primitives/nft/src/lib.rs
+++ b/primitives/nft/src/lib.rs
@@ -1,26 +1,23 @@
-
#![cfg_attr(not(feature = "std"), no_std)]
pub use serde::{Serialize, Deserialize};
-use frame_system;
use sp_runtime::sp_std::prelude::Vec;
use codec::{Decode, Encode};
pub use frame_support::{
- construct_runtime, decl_event, decl_module, decl_storage, decl_error,
- dispatch::DispatchResult,
- ensure, fail, parameter_types,
- traits::{
- Currency, ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced,
- Randomness, IsSubType, WithdrawReasons,
- },
- weights::{
- constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},
- DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,
- WeightToFeePolynomial, DispatchClass,
- },
- StorageValue,
- transactional,
+ construct_runtime, decl_event, decl_module, decl_storage, decl_error,
+ dispatch::DispatchResult,
+ ensure, fail, parameter_types,
+ traits::{
+ Currency, ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced,
+ Randomness, IsSubType, WithdrawReasons,
+ },
+ weights::{
+ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},
+ DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,
+ WeightToFeePolynomial, DispatchClass,
+ },
+ StorageValue, transactional,
};
pub const MAX_DECIMAL_POINTS: DecimalPoints = 30;
@@ -35,251 +32,245 @@
#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub enum CollectionMode {
- Invalid,
- NFT,
- // decimal points
- Fungible(DecimalPoints),
- ReFungible,
+ Invalid,
+ NFT,
+ // decimal points
+ Fungible(DecimalPoints),
+ ReFungible,
}
impl Default for CollectionMode {
- fn default() -> Self {
- Self::Invalid
- }
+ fn default() -> Self {
+ Self::Invalid
+ }
}
-impl Into<u8> for CollectionMode {
- fn into(self) -> u8 {
- match self {
- CollectionMode::Invalid => 0,
- CollectionMode::NFT => 1,
- CollectionMode::Fungible(_) => 2,
- CollectionMode::ReFungible => 3,
- }
- }
+impl CollectionMode {
+ pub fn id(&self) -> u8 {
+ match self {
+ CollectionMode::Invalid => 0,
+ CollectionMode::NFT => 1,
+ CollectionMode::Fungible(_) => 2,
+ CollectionMode::ReFungible => 3,
+ }
+ }
}
pub trait SponsoringResolve<AccountId, Call> {
- fn resolve(
- who: &AccountId,
- call: &Call) -> Option<AccountId>;
+ fn resolve(who: &AccountId, call: &Call) -> Option<AccountId>;
}
#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub enum AccessMode {
- Normal,
- WhiteList,
+ Normal,
+ WhiteList,
}
impl Default for AccessMode {
- fn default() -> Self {
- Self::Normal
- }
+ fn default() -> Self {
+ Self::Normal
+ }
}
#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub enum SchemaVersion {
- ImageURL,
- Unique,
+ ImageURL,
+ Unique,
}
impl Default for SchemaVersion {
- fn default() -> Self {
- Self::ImageURL
- }
+ fn default() -> Self {
+ Self::ImageURL
+ }
}
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct Ownership<AccountId> {
- pub owner: AccountId,
- pub fraction: u128,
+ pub owner: AccountId,
+ pub fraction: u128,
}
#[derive(Encode, Decode, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub enum SponsorshipState<AccountId> {
- /// The fees are applied to the transaction sender
- Disabled,
- Unconfirmed(AccountId),
- /// Transactions are sponsored by specified account
- Confirmed(AccountId),
+ /// The fees are applied to the transaction sender
+ Disabled,
+ Unconfirmed(AccountId),
+ /// Transactions are sponsored by specified account
+ Confirmed(AccountId),
}
impl<AccountId> SponsorshipState<AccountId> {
- pub fn sponsor(&self) -> Option<&AccountId> {
- match self {
- Self::Confirmed(sponsor) => Some(sponsor),
- _ => None,
- }
- }
+ pub fn sponsor(&self) -> Option<&AccountId> {
+ match self {
+ Self::Confirmed(sponsor) => Some(sponsor),
+ _ => None,
+ }
+ }
- pub fn pending_sponsor(&self) -> Option<&AccountId> {
- match self {
- Self::Unconfirmed(sponsor) | Self::Confirmed(sponsor) => Some(sponsor),
- _ => None,
- }
- }
+ pub fn pending_sponsor(&self) -> Option<&AccountId> {
+ match self {
+ Self::Unconfirmed(sponsor) | Self::Confirmed(sponsor) => Some(sponsor),
+ _ => None,
+ }
+ }
- pub fn confirmed(&self) -> bool {
- matches!(self, Self::Confirmed(_))
- }
+ pub fn confirmed(&self) -> bool {
+ matches!(self, Self::Confirmed(_))
+ }
}
impl<T> Default for SponsorshipState<T> {
- fn default() -> Self {
- Self::Disabled
- }
+ fn default() -> Self {
+ Self::Disabled
+ }
}
#[derive(Encode, Decode, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct Collection<T: frame_system::Config> {
- pub owner: T::AccountId,
- pub mode: CollectionMode,
- pub access: AccessMode,
- pub decimal_points: DecimalPoints,
- pub name: Vec<u16>, // 64 include null escape char
- pub description: Vec<u16>, // 256 include null escape char
- pub token_prefix: Vec<u8>, // 16 include null escape char
- pub mint_mode: bool,
- pub offchain_schema: Vec<u8>,
- pub schema_version: SchemaVersion,
- pub sponsorship: SponsorshipState<T::AccountId>,
- pub limits: CollectionLimits<T::BlockNumber>, // Collection private restrictions
- pub variable_on_chain_schema: Vec<u8>, //
- pub const_on_chain_schema: Vec<u8>, //
+ pub owner: T::AccountId,
+ pub mode: CollectionMode,
+ pub access: AccessMode,
+ pub decimal_points: DecimalPoints,
+ pub name: Vec<u16>, // 64 include null escape char
+ pub description: Vec<u16>, // 256 include null escape char
+ pub token_prefix: Vec<u8>, // 16 include null escape char
+ pub mint_mode: bool,
+ pub offchain_schema: Vec<u8>,
+ pub schema_version: SchemaVersion,
+ pub sponsorship: SponsorshipState<T::AccountId>,
+ pub limits: CollectionLimits<T::BlockNumber>, // Collection private restrictions
+ pub variable_on_chain_schema: Vec<u8>, //
+ pub const_on_chain_schema: Vec<u8>, //
}
#[derive(Encode, Decode, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct NftItemType<AccountId> {
- pub owner: AccountId,
- pub const_data: Vec<u8>,
- pub variable_data: Vec<u8>,
+ pub owner: AccountId,
+ pub const_data: Vec<u8>,
+ pub variable_data: Vec<u8>,
}
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct FungibleItemType {
- pub value: u128,
+ pub value: u128,
}
#[derive(Encode, Decode, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct ReFungibleItemType<AccountId> {
- pub owner: Vec<Ownership<AccountId>>,
- pub const_data: Vec<u8>,
- pub variable_data: Vec<u8>,
+ pub owner: Vec<Ownership<AccountId>>,
+ pub const_data: Vec<u8>,
+ pub variable_data: Vec<u8>,
}
-
#[derive(Encode, Decode, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct CollectionLimits<BlockNumber: Encode + Decode> {
- pub account_token_ownership_limit: u32,
- pub sponsored_data_size: u32,
- /// None - setVariableMetadata is not sponsored
- /// Some(v) - setVariableMetadata is sponsored
- /// if there is v block between txs
- pub sponsored_data_rate_limit: Option<BlockNumber>,
- pub token_limit: u32,
+ pub account_token_ownership_limit: u32,
+ pub sponsored_data_size: u32,
+ /// None - setVariableMetadata is not sponsored
+ /// Some(v) - setVariableMetadata is sponsored
+ /// if there is v block between txs
+ pub sponsored_data_rate_limit: Option<BlockNumber>,
+ pub token_limit: u32,
- // Timeouts for item types in passed blocks
- pub sponsor_transfer_timeout: u32,
- pub owner_can_transfer: bool,
- pub owner_can_destroy: bool,
+ // Timeouts for item types in passed blocks
+ pub sponsor_transfer_timeout: u32,
+ pub owner_can_transfer: bool,
+ pub owner_can_destroy: bool,
}
impl<BlockNumber: Encode + Decode> Default for CollectionLimits<BlockNumber> {
- fn default() -> Self {
- Self {
- account_token_ownership_limit: 10_000_000,
- token_limit: u32::max_value(),
- sponsored_data_size: u32::MAX,
- sponsored_data_rate_limit: None,
- sponsor_transfer_timeout: 14400,
- owner_can_transfer: true,
- owner_can_destroy: true
- }
- }
+ fn default() -> Self {
+ Self {
+ account_token_ownership_limit: 10_000_000,
+ token_limit: u32::max_value(),
+ sponsored_data_size: u32::MAX,
+ sponsored_data_rate_limit: None,
+ sponsor_transfer_timeout: 14400,
+ owner_can_transfer: true,
+ owner_can_destroy: true,
+ }
+ }
}
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct ChainLimits {
- pub collection_numbers_limit: u32,
- pub account_token_ownership_limit: u32,
- pub collections_admins_limit: u64,
- pub custom_data_limit: u32,
+ pub collection_numbers_limit: u32,
+ pub account_token_ownership_limit: u32,
+ pub collections_admins_limit: u64,
+ pub custom_data_limit: u32,
- // Timeouts for item types in passed blocks
- pub nft_sponsor_transfer_timeout: u32,
- pub fungible_sponsor_transfer_timeout: u32,
- pub refungible_sponsor_transfer_timeout: u32,
+ // Timeouts for item types in passed blocks
+ pub nft_sponsor_transfer_timeout: u32,
+ pub fungible_sponsor_transfer_timeout: u32,
+ pub refungible_sponsor_transfer_timeout: u32,
- // Schema limits
- pub offchain_schema_limit: u32,
- pub variable_on_chain_schema_limit: u32,
- pub const_on_chain_schema_limit: u32,
+ // Schema limits
+ pub offchain_schema_limit: u32,
+ pub variable_on_chain_schema_limit: u32,
+ pub const_on_chain_schema_limit: u32,
}
-
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct CreateNftData {
- pub const_data: Vec<u8>,
- pub variable_data: Vec<u8>,
+ pub const_data: Vec<u8>,
+ pub variable_data: Vec<u8>,
}
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct CreateFungibleData {
- pub value: u128,
+ pub value: u128,
}
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct CreateReFungibleData {
- pub const_data: Vec<u8>,
- pub variable_data: Vec<u8>,
- pub pieces: u128,
+ pub const_data: Vec<u8>,
+ pub variable_data: Vec<u8>,
+ pub pieces: u128,
}
#[derive(Encode, Decode, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub enum CreateItemData {
- NFT(CreateNftData),
- Fungible(CreateFungibleData),
- ReFungible(CreateReFungibleData),
+ NFT(CreateNftData),
+ Fungible(CreateFungibleData),
+ ReFungible(CreateReFungibleData),
}
impl CreateItemData {
- pub fn len(&self) -> usize {
- let len = match self {
- CreateItemData::NFT(data) => data.variable_data.len() + data.const_data.len(),
- CreateItemData::ReFungible(data) => data.variable_data.len() + data.const_data.len(),
- _ => 0
- };
-
- return len;
- }
+ pub fn data_size(&self) -> usize {
+ match self {
+ CreateItemData::NFT(data) => data.variable_data.len() + data.const_data.len(),
+ CreateItemData::ReFungible(data) => data.variable_data.len() + data.const_data.len(),
+ _ => 0,
+ }
+ }
}
impl From<CreateNftData> for CreateItemData {
- fn from(item: CreateNftData) -> Self {
- CreateItemData::NFT(item)
- }
+ fn from(item: CreateNftData) -> Self {
+ CreateItemData::NFT(item)
+ }
}
impl From<CreateReFungibleData> for CreateItemData {
- fn from(item: CreateReFungibleData) -> Self {
- CreateItemData::ReFungible(item)
- }
+ fn from(item: CreateReFungibleData) -> Self {
+ CreateItemData::ReFungible(item)
+ }
}
impl From<CreateFungibleData> for CreateItemData {
- fn from(item: CreateFungibleData) -> Self {
- CreateItemData::Fungible(item)
- }
+ fn from(item: CreateFungibleData) -> Self {
+ CreateItemData::Fungible(item)
+ }
}
runtime/build.rsdiffbeforeafterboth--- a/runtime/build.rs
+++ b/runtime/build.rs
@@ -1,9 +1,9 @@
use substrate_wasm_builder::WasmBuilder;
fn main() {
- WasmBuilder::new()
- .with_current_project()
- .import_memory()
- .export_heap_base()
- .build()
-}
\ No newline at end of file
+ WasmBuilder::new()
+ .with_current_project()
+ .import_memory()
+ .export_heap_base()
+ .build()
+}
runtime/src/chain_extension.rsdiffbeforeafterboth--- a/runtime/src/chain_extension.rs
+++ b/runtime/src/chain_extension.rs
@@ -9,7 +9,7 @@
pub use pallet_contracts::chain_extension::RetVal;
use pallet_contracts::chain_extension::{
- ChainExtension, Environment, Ext, InitState, SysConfig, UncheckedFrom,
+ ChainExtension, Environment, Ext, InitState, SysConfig, UncheckedFrom,
};
pub use frame_support::debug;
@@ -25,56 +25,56 @@
/// Create item parameters
#[derive(Debug, PartialEq, Encode, Decode)]
pub struct NFTExtCreateItem<E: Ext> {
- pub owner: <E::T as SysConfig>::AccountId,
- pub collection_id: u32,
- pub data: CreateItemData,
+ pub owner: <E::T as SysConfig>::AccountId,
+ pub collection_id: u32,
+ pub data: CreateItemData,
}
/// Transfer parameters
#[derive(Debug, PartialEq, Encode, Decode)]
pub struct NFTExtTransfer<E: Ext> {
- pub recipient: <E::T as SysConfig>::AccountId,
- pub collection_id: u32,
- pub token_id: u32,
- pub amount: u128,
+ pub recipient: <E::T as SysConfig>::AccountId,
+ pub collection_id: u32,
+ pub token_id: u32,
+ pub amount: u128,
}
#[derive(Debug, PartialEq, Encode, Decode)]
pub struct NFTExtCreateMultipleItems<E: Ext> {
- pub owner: <E::T as SysConfig>::AccountId,
- pub collection_id: u32,
- pub data: Vec<CreateItemData>,
+ pub owner: <E::T as SysConfig>::AccountId,
+ pub collection_id: u32,
+ pub data: Vec<CreateItemData>,
}
#[derive(Debug, PartialEq, Encode, Decode)]
pub struct NFTExtApprove<E: Ext> {
- pub spender: <E::T as SysConfig>::AccountId,
- pub collection_id: u32,
- pub item_id: u32,
- pub amount: u128,
+ pub spender: <E::T as SysConfig>::AccountId,
+ pub collection_id: u32,
+ pub item_id: u32,
+ pub amount: u128,
}
#[derive(Debug, PartialEq, Encode, Decode)]
pub struct NFTExtTransferFrom<E: Ext> {
- pub owner: <E::T as SysConfig>::AccountId,
- pub recipient: <E::T as SysConfig>::AccountId,
- pub collection_id: u32,
- pub item_id: u32,
- pub amount: u128,
+ pub owner: <E::T as SysConfig>::AccountId,
+ pub recipient: <E::T as SysConfig>::AccountId,
+ pub collection_id: u32,
+ pub item_id: u32,
+ pub amount: u128,
}
#[derive(Debug, PartialEq, Encode, Decode)]
pub struct NFTExtSetVariableMetaData {
- pub collection_id: u32,
- pub item_id: u32,
- pub data: Vec<u8>,
+ pub collection_id: u32,
+ pub item_id: u32,
+ pub data: Vec<u8>,
}
#[derive(Debug, PartialEq, Encode, Decode)]
pub struct NFTExtToggleWhiteList<E: Ext> {
- pub collection_id: u32,
- pub address: <E::T as SysConfig>::AccountId,
- pub whitelisted: bool,
+ pub collection_id: u32,
+ pub address: <E::T as SysConfig>::AccountId,
+ pub whitelisted: bool,
}
/// The chain Extension of NFT pallet
@@ -83,150 +83,146 @@
pub type NftWeightInfoOf<C> = <C as pallet_nft::Config>::WeightInfo;
impl<C: Config + pallet_contracts::Config> ChainExtension<C> for NFTExtension {
- fn call<E: Ext>(func_id: u32, env: Environment<E, InitState>) -> Result<RetVal, DispatchError>
- where
- E: Ext<T = C>,
- C: pallet_nft::Config,
- <E::T as SysConfig>::AccountId: UncheckedFrom<<E::T as SysConfig>::Hash> + AsRef<[u8]>,
- {
- // The memory of the vm stores buf in scale-codec
- match func_id {
- 0 => {
- let mut env = env.buf_in_buf_out();
- let input: NFTExtTransfer<E> = env.read_as()?;
- env.charge_weight(NftWeightInfoOf::<C>::transfer())?;
+ fn call<E: Ext>(func_id: u32, env: Environment<E, InitState>) -> Result<RetVal, DispatchError>
+ where
+ E: Ext<T = C>,
+ C: pallet_nft::Config,
+ <E::T as SysConfig>::AccountId: UncheckedFrom<<E::T as SysConfig>::Hash> + AsRef<[u8]>,
+ {
+ // The memory of the vm stores buf in scale-codec
+ match func_id {
+ 0 => {
+ let mut env = env.buf_in_buf_out();
+ let input: NFTExtTransfer<E> = env.read_as()?;
+ env.charge_weight(NftWeightInfoOf::<C>::transfer())?;
- let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
+ let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
- pallet_nft::Module::<C>::transfer_internal(
- &C::CrossAccountId::from_sub(env.ext().address().clone()),
- &C::CrossAccountId::from_sub(input.recipient),
- &collection,
- input.token_id,
- input.amount,
- )?;
+ pallet_nft::Module::<C>::transfer_internal(
+ &C::CrossAccountId::from_sub(env.ext().address().clone()),
+ &C::CrossAccountId::from_sub(input.recipient),
+ &collection,
+ input.token_id,
+ input.amount,
+ )?;
- pallet_nft::Module::<C>::submit_logs(collection)?;
- Ok(RetVal::Converging(0))
- },
- 1 => {
- // Create Item
- let mut env = env.buf_in_buf_out();
- let input: NFTExtCreateItem<E> = env.read_as()?;
- env.charge_weight(NftWeightInfoOf::<C>::create_item(input.data.len()))?;
+ pallet_nft::Module::<C>::submit_logs(collection)?;
+ Ok(RetVal::Converging(0))
+ }
+ 1 => {
+ // Create Item
+ let mut env = env.buf_in_buf_out();
+ let input: NFTExtCreateItem<E> = env.read_as()?;
+ env.charge_weight(NftWeightInfoOf::<C>::create_item(input.data.data_size()))?;
- let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
+ let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
- pallet_nft::Module::<C>::create_item_internal(
- &C::CrossAccountId::from_sub(env.ext().address().clone()),
- &collection,
- &C::CrossAccountId::from_sub(input.owner),
- input.data,
- )?;
+ pallet_nft::Module::<C>::create_item_internal(
+ &C::CrossAccountId::from_sub(env.ext().address().clone()),
+ &collection,
+ &C::CrossAccountId::from_sub(input.owner),
+ input.data,
+ )?;
- pallet_nft::Module::<C>::submit_logs(collection)?;
- Ok(RetVal::Converging(0))
- },
- 2 => {
- // Create multiple items
- let mut env = env.buf_in_buf_out();
- let input: NFTExtCreateMultipleItems<E> = env.read_as()?;
- env.charge_weight(NftWeightInfoOf::<C>::create_item(
- input.data.iter()
- .map(|i| i.len())
- .sum()
- ))?;
+ pallet_nft::Module::<C>::submit_logs(collection)?;
+ Ok(RetVal::Converging(0))
+ }
+ 2 => {
+ // Create multiple items
+ let mut env = env.buf_in_buf_out();
+ let input: NFTExtCreateMultipleItems<E> = env.read_as()?;
+ env.charge_weight(NftWeightInfoOf::<C>::create_item(
+ input.data.iter().map(|i| i.data_size()).sum(),
+ ))?;
- let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
+ let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
- pallet_nft::Module::<C>::create_multiple_items_internal(
- &C::CrossAccountId::from_sub(env.ext().address().clone()),
- &collection,
- &C::CrossAccountId::from_sub(input.owner),
- input.data,
- )?;
+ pallet_nft::Module::<C>::create_multiple_items_internal(
+ &C::CrossAccountId::from_sub(env.ext().address().clone()),
+ &collection,
+ &C::CrossAccountId::from_sub(input.owner),
+ input.data,
+ )?;
- pallet_nft::Module::<C>::submit_logs(collection)?;
- Ok(RetVal::Converging(0))
- },
- 3 => {
- // Approve
- let mut env = env.buf_in_buf_out();
- let input: NFTExtApprove<E> = env.read_as()?;
- env.charge_weight(NftWeightInfoOf::<C>::approve())?;
+ pallet_nft::Module::<C>::submit_logs(collection)?;
+ Ok(RetVal::Converging(0))
+ }
+ 3 => {
+ // Approve
+ let mut env = env.buf_in_buf_out();
+ let input: NFTExtApprove<E> = env.read_as()?;
+ env.charge_weight(NftWeightInfoOf::<C>::approve())?;
- let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
+ let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
- pallet_nft::Module::<C>::approve_internal(
- &C::CrossAccountId::from_sub(env.ext().address().clone()),
- &C::CrossAccountId::from_sub(input.spender),
- &collection,
- input.item_id,
- input.amount,
- )?;
+ pallet_nft::Module::<C>::approve_internal(
+ &C::CrossAccountId::from_sub(env.ext().address().clone()),
+ &C::CrossAccountId::from_sub(input.spender),
+ &collection,
+ input.item_id,
+ input.amount,
+ )?;
- pallet_nft::Module::<C>::submit_logs(collection)?;
- Ok(RetVal::Converging(0))
- },
- 4 => {
- // Transfer from
- let mut env = env.buf_in_buf_out();
- let input: NFTExtTransferFrom<E> = env.read_as()?;
- env.charge_weight(NftWeightInfoOf::<C>::transfer_from())?;
+ pallet_nft::Module::<C>::submit_logs(collection)?;
+ Ok(RetVal::Converging(0))
+ }
+ 4 => {
+ // Transfer from
+ let mut env = env.buf_in_buf_out();
+ let input: NFTExtTransferFrom<E> = env.read_as()?;
+ env.charge_weight(NftWeightInfoOf::<C>::transfer_from())?;
- let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
+ let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
- pallet_nft::Module::<C>::transfer_from_internal(
- &C::CrossAccountId::from_sub(env.ext().address().clone()),
- &C::CrossAccountId::from_sub(input.owner),
- &C::CrossAccountId::from_sub(input.recipient),
- &collection,
- input.item_id,
- input.amount
- )?;
+ pallet_nft::Module::<C>::transfer_from_internal(
+ &C::CrossAccountId::from_sub(env.ext().address().clone()),
+ &C::CrossAccountId::from_sub(input.owner),
+ &C::CrossAccountId::from_sub(input.recipient),
+ &collection,
+ input.item_id,
+ input.amount,
+ )?;
- pallet_nft::Module::<C>::submit_logs(collection)?;
- Ok(RetVal::Converging(0))
- },
- 5 => {
- // Set variable metadata
- let mut env = env.buf_in_buf_out();
- let input: NFTExtSetVariableMetaData = env.read_as()?;
- env.charge_weight(NftWeightInfoOf::<C>::set_variable_meta_data())?;
+ pallet_nft::Module::<C>::submit_logs(collection)?;
+ Ok(RetVal::Converging(0))
+ }
+ 5 => {
+ // Set variable metadata
+ let mut env = env.buf_in_buf_out();
+ let input: NFTExtSetVariableMetaData = env.read_as()?;
+ env.charge_weight(NftWeightInfoOf::<C>::set_variable_meta_data())?;
- let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
+ let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
- pallet_nft::Module::<C>::set_variable_meta_data_internal(
- &C::CrossAccountId::from_sub(env.ext().address().clone()),
- &collection,
- input.item_id,
- input.data,
- )?;
+ pallet_nft::Module::<C>::set_variable_meta_data_internal(
+ &C::CrossAccountId::from_sub(env.ext().address().clone()),
+ &collection,
+ input.item_id,
+ input.data,
+ )?;
- pallet_nft::Module::<C>::submit_logs(collection)?;
- Ok(RetVal::Converging(0))
- },
- 6 => {
- // Toggle whitelist
- let mut env = env.buf_in_buf_out();
- let input: NFTExtToggleWhiteList<E> = env.read_as()?;
- env.charge_weight(NftWeightInfoOf::<C>::add_to_white_list())?;
+ pallet_nft::Module::<C>::submit_logs(collection)?;
+ Ok(RetVal::Converging(0))
+ }
+ 6 => {
+ // Toggle whitelist
+ let mut env = env.buf_in_buf_out();
+ let input: NFTExtToggleWhiteList<E> = env.read_as()?;
+ env.charge_weight(NftWeightInfoOf::<C>::add_to_white_list())?;
- let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
+ let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
- pallet_nft::Module::<C>::toggle_white_list_internal(
- &C::CrossAccountId::from_sub(env.ext().address().clone()),
- &collection,
- &C::CrossAccountId::from_sub(input.address),
- input.whitelisted,
- )?;
+ pallet_nft::Module::<C>::toggle_white_list_internal(
+ &C::CrossAccountId::from_sub(env.ext().address().clone()),
+ &collection,
+ &C::CrossAccountId::from_sub(input.address),
+ input.whitelisted,
+ )?;
- pallet_nft::Module::<C>::submit_logs(collection)?;
- Ok(RetVal::Converging(0))
- }
- _ => {
- Err(DispatchError::Other("unknown chain_extension func_id"))
- }
- }
- }
+ pallet_nft::Module::<C>::submit_logs(collection)?;
+ Ok(RetVal::Converging(0))
+ }
+ _ => Err(DispatchError::Other("unknown chain_extension func_id")),
+ }
+ }
}
runtime/src/lib.rsdiffbeforeafterboth--- a/runtime/src/lib.rs
+++ b/runtime/src/lib.rs
@@ -8,25 +8,25 @@
#![cfg_attr(not(feature = "std"), no_std)]
// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256.
#![recursion_limit = "1024"]
-
+#![allow(clippy::from_over_into, clippy::identity_op)]
+#![allow(clippy::fn_to_numeric_cast_with_truncation)]
// Make the WASM binary available.
#[cfg(feature = "std")]
include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
use sp_api::impl_runtime_apis;
-use sp_core::{ crypto::KeyTypeId, OpaqueMetadata, H256, U256, H160 };
+use sp_core::{crypto::KeyTypeId, OpaqueMetadata, H256, U256, H160};
// #[cfg(any(feature = "std", test))]
// pub use sp_runtime::BuildStorage;
use sp_runtime::{
- Permill, Perbill, Percent,
- create_runtime_str, generic, impl_opaque_keys,
- traits::{
- AccountIdLookup, ConvertInto, BlakeTwo256, Block as BlockT, IdentifyAccount,
- Verify, AccountIdConversion,
- },
- transaction_validity::{TransactionSource, TransactionValidity},
- ApplyExtrinsicResult, MultiSignature,
+ Permill, Perbill, Percent, create_runtime_str, generic, impl_opaque_keys,
+ traits::{
+ AccountIdLookup, ConvertInto, BlakeTwo256, Block as BlockT, IdentifyAccount, Verify,
+ AccountIdConversion,
+ },
+ transaction_validity::{TransactionSource, TransactionValidity},
+ ApplyExtrinsicResult, MultiSignature,
};
use sp_std::prelude::*;
@@ -34,48 +34,45 @@
#[cfg(feature = "std")]
use sp_version::NativeVersion;
use sp_version::RuntimeVersion;
-pub use pallet_transaction_payment::{Multiplier, TargetedFeeAdjustment, FeeDetails, RuntimeDispatchInfo};
+pub use pallet_transaction_payment::{
+ Multiplier, TargetedFeeAdjustment, FeeDetails, RuntimeDispatchInfo,
+};
// A few exports that help ease life for downstream crates.
pub use pallet_balances::Call as BalancesCall;
pub use pallet_evm::{EnsureAddressTruncated, HashedAddressMapping, Runner};
pub use frame_support::{
- construct_runtime,
- match_type,
- dispatch::DispatchResult,
- PalletId,
- parameter_types,
- StorageValue,
- ConsensusEngineId,
- traits::{
- All, Currency, ExistenceRequirement, Get, IsInVec, KeyOwnerProofSystem, LockIdentifier, OnUnbalanced, Randomness, FindAuthor
- },
- weights::{
- constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},
- DispatchClass, DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,
- WeightToFeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients
- },
+ construct_runtime, match_type,
+ dispatch::DispatchResult,
+ PalletId, parameter_types, StorageValue, ConsensusEngineId,
+ traits::{
+ All, Currency, ExistenceRequirement, Get, IsInVec, KeyOwnerProofSystem, LockIdentifier,
+ OnUnbalanced, Randomness, FindAuthor,
+ },
+ weights::{
+ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},
+ DispatchClass, DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,
+ WeightToFeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients,
+ },
};
use nft_data_structs::*;
use pallet_contracts::weights::WeightInfo;
// #[cfg(any(feature = "std", test))]
use frame_system::{
- self as system,
- EnsureRoot, EnsureSigned,
+ self as system, EnsureRoot, EnsureSigned,
limits::{BlockWeights, BlockLength},
};
-use sp_arithmetic::{traits::{BaseArithmetic, Unsigned}};
+use sp_arithmetic::{
+ traits::{BaseArithmetic, Unsigned},
+};
use smallvec::smallvec;
use codec::{Encode, Decode};
use pallet_evm::{Account as EVMAccount, FeeCalculator, OnMethodCall};
use fp_rpc::TransactionStatus;
use sp_core::crypto::Public;
use sp_runtime::{
- traits::{
- Dispatchable,
- },
+ traits::{Dispatchable},
};
use pallet_contracts::chain_extension::UncheckedFrom;
-
pub use pallet_timestamp::Call as TimestampCall;
pub use sp_consensus_aura::sr25519::AuthorityId as AuraId;
@@ -93,10 +90,9 @@
SovereignSignedViaLocation, TakeWeightCredit, UsingComponents,
};
use xcm_executor::{Config, XcmExecutor};
-
mod chain_extension;
-use crate::chain_extension::{ NFTExtension, Imbalance };
+use crate::chain_extension::{NFTExtension, Imbalance};
/// Re-export a nft pallet
/// TODO: Check this re-export. Is this safe and good style?
@@ -144,16 +140,16 @@
pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic;
- /// Opaque block type.
- pub type Block = generic::Block<Header, UncheckedExtrinsic>;
+ /// Opaque block type.
+ pub type Block = generic::Block<Header, UncheckedExtrinsic>;
- pub type SessionHandlers = ();
+ pub type SessionHandlers = ();
impl_opaque_keys! {
- pub struct SessionKeys {
+ pub struct SessionKeys {
pub aura: Aura,
}
- }
+ }
}
/// This runtime version.
@@ -178,8 +174,8 @@
#[derive(codec::Encode, codec::Decode)]
pub enum XCMPMessage<XAccountId, XBalance> {
- /// Transfer tokens to the given account from the Parachain account.
- TransferToken(XAccountId, XBalance),
+ /// Transfer tokens to the given account from the Parachain account.
+ TransferToken(XAccountId, XBalance),
}
/// The version information used to identify this runtime when compiled natively.
@@ -195,7 +191,7 @@
pub struct DealWithFees;
impl OnUnbalanced<NegativeImbalance> for DealWithFees {
- fn on_unbalanceds<B>(mut fees_then_tips: impl Iterator<Item=NegativeImbalance>) {
+ fn on_unbalanceds<B>(mut fees_then_tips: impl Iterator<Item = NegativeImbalance>) {
if let Some(fees) = fees_then_tips.next() {
// for fees, 100% to treasury
let mut split = fees.ration(100, 0);
@@ -246,7 +242,6 @@
pub const SS58Prefix: u8 = 42;
}
-
parameter_types! {
pub const ChainId: u64 = 8888;
}
@@ -268,10 +263,10 @@
}
pub struct EthereumFindAuthor<F>(core::marker::PhantomData<F>);
-impl<F: FindAuthor<u32>> FindAuthor<H160> for EthereumFindAuthor<F>
-{
- fn find_author<'a, I>(digests: I) -> Option<H160> where
- I: 'a + IntoIterator<Item=(ConsensusEngineId, &'a [u8])>
+impl<F: FindAuthor<u32>> FindAuthor<H160> for EthereumFindAuthor<F> {
+ fn find_author<'a, I>(digests: I) -> Option<H160>
+ where
+ I: 'a + IntoIterator<Item = (ConsensusEngineId, &'a [u8])>,
{
if let Some(author_index) = F::find_author(digests) {
let authority_id = Aura::authorities()[author_index as usize].clone();
@@ -293,51 +288,51 @@
}
impl system::Config for Runtime {
- /// The data to be stored in an account.
- type AccountData = pallet_balances::AccountData<Balance>;
- /// The identifier used to distinguish between accounts.
- type AccountId = AccountId;
- /// The basic call filter to use in dispatchable.
- type BaseCallFilter = ();
- /// Maximum number of block number to block hash mappings to keep (oldest pruned first).
- type BlockHashCount = BlockHashCount;
- /// The maximum length of a block (in bytes).
+ /// The data to be stored in an account.
+ type AccountData = pallet_balances::AccountData<Balance>;
+ /// The identifier used to distinguish between accounts.
+ type AccountId = AccountId;
+ /// The basic call filter to use in dispatchable.
+ type BaseCallFilter = ();
+ /// Maximum number of block number to block hash mappings to keep (oldest pruned first).
+ type BlockHashCount = BlockHashCount;
+ /// The maximum length of a block (in bytes).
type BlockLength = RuntimeBlockLength;
- /// The index type for blocks.
- type BlockNumber = BlockNumber;
- /// The weight of the overhead invoked on the block import process, independent of the extrinsics included in that block.
+ /// The index type for blocks.
+ type BlockNumber = BlockNumber;
+ /// The weight of the overhead invoked on the block import process, independent of the extrinsics included in that block.
type BlockWeights = RuntimeBlockWeights;
- /// The aggregated dispatch type that is available for extrinsics.
- type Call = Call;
- /// The weight of database operations that the runtime can invoke.
- type DbWeight = RocksDbWeight;
- /// The ubiquitous event type.
- type Event = Event;
- /// The type for hashing blocks and tries.
- type Hash = Hash;
+ /// The aggregated dispatch type that is available for extrinsics.
+ type Call = Call;
+ /// The weight of database operations that the runtime can invoke.
+ type DbWeight = RocksDbWeight;
+ /// The ubiquitous event type.
+ type Event = Event;
+ /// The type for hashing blocks and tries.
+ type Hash = Hash;
/// The hashing algorithm used.
- type Hashing = BlakeTwo256;
- /// The header type.
- type Header = generic::Header<BlockNumber, BlakeTwo256>;
- /// The index type for storing how many extrinsics an account has signed.
- type Index = Index;
- /// The lookup mechanism to get account ID from whatever is passed in dispatchers.
- type Lookup = AccountIdLookup<AccountId, ()>;
- /// What to do if an account is fully reaped from the system.
- type OnKilledAccount = ();
- /// What to do if a new account is created.
- type OnNewAccount = ();
- type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode<Self>;
- /// The ubiquitous origin type.
- type Origin = Origin;
- /// This type is being generated by `construct_runtime!`.
- type PalletInfo = PalletInfo;
- /// This is used as an identifier of the chain. 42 is the generic substrate prefix.
+ type Hashing = BlakeTwo256;
+ /// The header type.
+ type Header = generic::Header<BlockNumber, BlakeTwo256>;
+ /// The index type for storing how many extrinsics an account has signed.
+ type Index = Index;
+ /// The lookup mechanism to get account ID from whatever is passed in dispatchers.
+ type Lookup = AccountIdLookup<AccountId, ()>;
+ /// What to do if an account is fully reaped from the system.
+ type OnKilledAccount = ();
+ /// What to do if a new account is created.
+ type OnNewAccount = ();
+ type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode<Self>;
+ /// The ubiquitous origin type.
+ type Origin = Origin;
+ /// This type is being generated by `construct_runtime!`.
+ type PalletInfo = PalletInfo;
+ /// This is used as an identifier of the chain. 42 is the generic substrate prefix.
type SS58Prefix = SS58Prefix;
/// Weight information for the extrinsics of this pallet.
- type SystemWeightInfo = system::weights::SubstrateWeight<Runtime>;
- /// Version of the runtime.
- type Version = Version;
+ type SystemWeightInfo = system::weights::SubstrateWeight<Runtime>;
+ /// Version of the runtime.
+ type Version = Version;
}
parameter_types! {
@@ -373,7 +368,7 @@
pub const MICROUNIQUE: Balance = 1_000_000_000;
pub const MILLIUNIQUE: Balance = 1_000 * MICROUNIQUE;
pub const CENTIUNIQUE: Balance = 10 * MILLIUNIQUE;
-pub const UNIQUE: Balance = 100 * CENTIUNIQUE;
+pub const UNIQUE: Balance = 100 * CENTIUNIQUE;
pub const fn deposit(items: u32, bytes: u32) -> Balance {
items as Balance * 15 * CENTIUNIQUE + (bytes as Balance) * 6 * CENTIUNIQUE
@@ -437,8 +432,9 @@
/// Linear implementor of `WeightToFeePolynomial`
pub struct LinearFee<T>(sp_std::marker::PhantomData<T>);
-impl<T> WeightToFeePolynomial for LinearFee<T> where
- T: BaseArithmetic + From<u32> + Copy + Unsigned
+impl<T> WeightToFeePolynomial for LinearFee<T>
+where
+ T: BaseArithmetic + From<u32> + Copy + Unsigned,
{
type Balance = T;
@@ -622,12 +618,12 @@
type AssetTransactor = LocalAssetTransactor;
type OriginConverter = XcmOriginToTransactDispatchOrigin;
type IsReserve = NativeAsset;
- type IsTeleporter = NativeAsset; // <- should be enough to allow teleportation of ROC
+ type IsTeleporter = NativeAsset; // <- should be enough to allow teleportation of ROC
type LocationInverter = LocationInverter<Ancestry>;
type Barrier = Barrier;
type Weigher = FixedWeightBounds<UnitWeightCost, Call>;
type Trader = UsingComponents<IdentityFee<Balance>, RelayLocation, AccountId, Balances, ()>;
- type ResponseHandler = (); // Don't handle responses for now.
+ type ResponseHandler = (); // Don't handle responses for now.
}
// parameter_types! {
@@ -720,14 +716,13 @@
pub struct Sponsoring;
impl SponsoringResolve<AccountId, Call> for Sponsoring {
-
- fn resolve(who: &AccountId, call: &Call) -> Option<AccountId>
- where
- Call: Dispatchable<Info=DispatchInfo>,
- Call: IsSubType<pallet_nft::Call<Runtime>>,
+ fn resolve(who: &AccountId, call: &Call) -> Option<AccountId>
+ where
+ Call: Dispatchable<Info = DispatchInfo>,
+ Call: IsSubType<pallet_nft::Call<Runtime>>,
Call: IsSubType<pallet_contracts::Call<Runtime>>,
AccountId: AsRef<[u8]>,
- AccountId: UncheckedFrom<Hash>
+ AccountId: UncheckedFrom<Hash>,
{
pallet_nft_transaction_payment::Module::<Runtime>::withdraw_type(who, call)
}
@@ -735,7 +730,7 @@
type SponsorshipHandler = (
pallet_nft::NftSponsorshipHandler<Runtime>,
- pallet_contract_helpers::ContractSponsorshipHandler<Runtime>,
+ pallet_contract_helpers::ContractSponsorshipHandler<Runtime>,
);
impl pallet_scheduler::Config for Runtime {
@@ -759,20 +754,20 @@
impl pallet_contract_helpers::Config for Runtime {}
construct_runtime!(
- pub enum Runtime where
- Block = Block,
- NodeBlock = opaque::Block,
- UncheckedExtrinsic = UncheckedExtrinsic
- {
+ pub enum Runtime where
+ Block = Block,
+ NodeBlock = opaque::Block,
+ UncheckedExtrinsic = UncheckedExtrinsic
+ {
Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>} = 30,
Contracts: pallet_contracts::{Pallet, Call, Storage, Event<T>},
RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Pallet, Call, Storage},
Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent},
TransactionPayment: pallet_transaction_payment::{Pallet, Storage},
- Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event<T>},
+ Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event<T>},
Sudo: pallet_sudo::{Pallet, Call, Storage, Config<T>, Event<T>},
System: system::{Pallet, Call, Storage, Config, Event<T>},
- Vesting: pallet_vesting::{Pallet, Call, Config<T>, Storage, Event<T>},
+ Vesting: pallet_vesting::{Pallet, Call, Config<T>, Storage, Event<T>},
ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Storage, Inherent, Event<T>, ValidateUnsigned} = 20,
ParachainInfo: parachain_info::{Pallet, Storage, Config} = 21,
@@ -792,28 +787,36 @@
// Unique Pallets
- Inflation: pallet_inflation::{Pallet, Call, Storage},
+ Inflation: pallet_inflation::{Pallet, Call, Storage},
Nft: pallet_nft::{Pallet, Call, Config<T>, Storage, Event<T>},
Scheduler: pallet_scheduler::{Pallet, Call, Storage, Event<T>},
NftPayment: pallet_nft_transaction_payment::{Pallet, Call, Storage},
Charging: pallet_nft_charge_transaction::{Pallet, Call, Storage },
ContractHelpers: pallet_contract_helpers::{Pallet, Call, Storage},
- }
+ }
);
pub struct TransactionConverter;
impl fp_rpc::ConvertTransaction<UncheckedExtrinsic> for TransactionConverter {
fn convert_transaction(&self, transaction: pallet_ethereum::Transaction) -> UncheckedExtrinsic {
- UncheckedExtrinsic::new_unsigned(pallet_ethereum::Call::<Runtime>::transact(transaction).into())
+ UncheckedExtrinsic::new_unsigned(
+ pallet_ethereum::Call::<Runtime>::transact(transaction).into(),
+ )
}
}
impl fp_rpc::ConvertTransaction<opaque::UncheckedExtrinsic> for TransactionConverter {
- fn convert_transaction(&self, transaction: pallet_ethereum::Transaction) -> opaque::UncheckedExtrinsic {
- let extrinsic = UncheckedExtrinsic::new_unsigned(pallet_ethereum::Call::<Runtime>::transact(transaction).into());
+ fn convert_transaction(
+ &self,
+ transaction: pallet_ethereum::Transaction,
+ ) -> opaque::UncheckedExtrinsic {
+ let extrinsic = UncheckedExtrinsic::new_unsigned(
+ pallet_ethereum::Call::<Runtime>::transact(transaction).into(),
+ );
let encoded = extrinsic.encode();
- opaque::UncheckedExtrinsic::decode(&mut &encoded[..]).expect("Encoded extrinsic is always valid")
+ opaque::UncheckedExtrinsic::decode(&mut &encoded[..])
+ .expect("Encoded extrinsic is always valid")
}
}
@@ -829,13 +832,13 @@
pub type BlockId = generic::BlockId<Block>;
/// The SignedExtension to the basic transaction logic.
pub type SignedExtra = (
- system::CheckSpecVersion<Runtime>,
- // system::CheckTxVersion<Runtime>,
- system::CheckGenesis<Runtime>,
- system::CheckEra<Runtime>,
- system::CheckNonce<Runtime>,
- system::CheckWeight<Runtime>,
- pallet_nft_charge_transaction::ChargeTransactionPayment<Runtime>,
+ system::CheckSpecVersion<Runtime>,
+ // system::CheckTxVersion<Runtime>,
+ system::CheckGenesis<Runtime>,
+ system::CheckEra<Runtime>,
+ system::CheckNonce<Runtime>,
+ system::CheckWeight<Runtime>,
+ pallet_nft_charge_transaction::ChargeTransactionPayment<Runtime>,
pallet_contract_helpers::ContractHelpersExtension<Runtime>,
);
/// Unchecked extrinsic type as expected by this runtime.
@@ -844,11 +847,11 @@
pub type CheckedExtrinsic = generic::CheckedExtrinsic<AccountId, Call, SignedExtra>;
/// Executive: handles dispatch to the various modules.
pub type Executive = frame_executive::Executive<
- Runtime,
- Block,
- frame_system::ChainContext<Runtime>,
- Runtime,
- AllPallets,
+ Runtime,
+ Block,
+ frame_system::ChainContext<Runtime>,
+ Runtime,
+ AllPallets,
>;
impl_opaque_keys! {
@@ -866,59 +869,59 @@
}
}
- impl sp_api::Core<Block> for Runtime {
- fn version() -> RuntimeVersion {
- VERSION
- }
+ impl sp_api::Core<Block> for Runtime {
+ fn version() -> RuntimeVersion {
+ VERSION
+ }
- fn execute_block(block: Block) {
- Executive::execute_block(block)
- }
+ fn execute_block(block: Block) {
+ Executive::execute_block(block)
+ }
- fn initialize_block(header: &<Block as BlockT>::Header) {
- Executive::initialize_block(header)
- }
- }
+ fn initialize_block(header: &<Block as BlockT>::Header) {
+ Executive::initialize_block(header)
+ }
+ }
- impl sp_api::Metadata<Block> for Runtime {
- fn metadata() -> OpaqueMetadata {
- Runtime::metadata().into()
- }
- }
+ impl sp_api::Metadata<Block> for Runtime {
+ fn metadata() -> OpaqueMetadata {
+ Runtime::metadata().into()
+ }
+ }
- impl sp_block_builder::BlockBuilder<Block> for Runtime {
- fn apply_extrinsic(extrinsic: <Block as BlockT>::Extrinsic) -> ApplyExtrinsicResult {
- Executive::apply_extrinsic(extrinsic)
- }
+ impl sp_block_builder::BlockBuilder<Block> for Runtime {
+ fn apply_extrinsic(extrinsic: <Block as BlockT>::Extrinsic) -> ApplyExtrinsicResult {
+ Executive::apply_extrinsic(extrinsic)
+ }
- fn finalize_block() -> <Block as BlockT>::Header {
- Executive::finalize_block()
- }
+ fn finalize_block() -> <Block as BlockT>::Header {
+ Executive::finalize_block()
+ }
- fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<<Block as BlockT>::Extrinsic> {
- data.create_extrinsics()
- }
+ fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<<Block as BlockT>::Extrinsic> {
+ data.create_extrinsics()
+ }
- fn check_inherents(
- block: Block,
- data: sp_inherents::InherentData,
- ) -> sp_inherents::CheckInherentsResult {
- data.check_extrinsics(&block)
- }
+ fn check_inherents(
+ block: Block,
+ data: sp_inherents::InherentData,
+ ) -> sp_inherents::CheckInherentsResult {
+ data.check_extrinsics(&block)
+ }
- // fn random_seed() -> <Block as BlockT>::Hash {
- // RandomnessCollectiveFlip::random_seed().0
- // }
- }
+ // fn random_seed() -> <Block as BlockT>::Hash {
+ // RandomnessCollectiveFlip::random_seed().0
+ // }
+ }
- impl sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block> for Runtime {
- fn validate_transaction(
- source: TransactionSource,
- tx: <Block as BlockT>::Extrinsic,
- ) -> TransactionValidity {
- Executive::validate_transaction(source, tx)
- }
- }
+ impl sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block> for Runtime {
+ fn validate_transaction(
+ source: TransactionSource,
+ tx: <Block as BlockT>::Extrinsic,
+ ) -> TransactionValidity {
+ Executive::validate_transaction(source, tx)
+ }
+ }
impl sp_offchain::OffchainWorkerApi<Block> for Runtime {
fn offchain_worker(header: &<Block as BlockT>::Header) {
@@ -979,7 +982,7 @@
gas_limit.low_u64(),
gas_price,
nonce,
- config.as_ref().unwrap_or(<Runtime as pallet_evm::Config>::config()),
+ config.as_ref().unwrap_or_else(|| <Runtime as pallet_evm::Config>::config()),
).map_err(|err| err.into())
}
@@ -1007,7 +1010,7 @@
gas_limit.low_u64(),
gas_price,
nonce,
- config.as_ref().unwrap_or(<Runtime as pallet_evm::Config>::config()),
+ config.as_ref().unwrap_or_else(|| <Runtime as pallet_evm::Config>::config()),
).map_err(|err| err.into())
}
@@ -1118,7 +1121,7 @@
}
}
- #[cfg(feature = "runtime-benchmarks")]
+ #[cfg(feature = "runtime-benchmarks")]
impl frame_benchmarking::Benchmark<Block> for Runtime {
fn dispatch_benchmark(
config: frame_benchmarking::BenchmarkConfig
runtime/src/nft_weights.rsdiffbeforeafterboth--- a/runtime/src/nft_weights.rs
+++ b/runtime/src/nft_weights.rs
@@ -8,154 +8,154 @@
pub struct WeightInfo;
impl pallet_nft::WeightInfo for WeightInfo {
fn create_collection() -> Weight {
- (70_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(7 as Weight))
- .saturating_add(DbWeight::get().writes(5 as Weight))
+ 70_000_000_u64
+ .saturating_add(DbWeight::get().reads(7_u64))
+ .saturating_add(DbWeight::get().writes(5_u64))
}
fn destroy_collection() -> Weight {
- (90_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(5 as Weight))
+ 90_000_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(5_u64))
}
fn add_to_white_list() -> Weight {
- (30_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(3 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn remove_from_white_list() -> Weight {
- (35_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(3 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
+ 30_000_000_u64
+ .saturating_add(DbWeight::get().reads(3_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn remove_from_white_list() -> Weight {
+ 35_000_000_u64
+ .saturating_add(DbWeight::get().reads(3_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
}
fn set_public_access_mode() -> Weight {
- (27_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(1 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
+ 27_000_000_u64
+ .saturating_add(DbWeight::get().reads(1_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
}
fn set_mint_permission() -> Weight {
- (27_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(1 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
+ 27_000_000_u64
+ .saturating_add(DbWeight::get().reads(1_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
}
fn change_collection_owner() -> Weight {
- (27_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(1 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
+ 27_000_000_u64
+ .saturating_add(DbWeight::get().reads(1_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
}
fn add_collection_admin() -> Weight {
- (32_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(3 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
+ 32_000_000_u64
+ .saturating_add(DbWeight::get().reads(3_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
}
fn remove_collection_admin() -> Weight {
- (50_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn set_collection_sponsor() -> Weight {
- (32_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn confirm_sponsorship() -> Weight {
- (22_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(1 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn remove_collection_sponsor() -> Weight {
- (24_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(1 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn create_item(s: usize, ) -> Weight {
- (130_000_000 as Weight)
- .saturating_add((2135 as Weight).saturating_mul(s as Weight).saturating_mul(500 as Weight)) // 500 is temparary multiplier, fee for storage
- .saturating_add(DbWeight::get().reads(10 as Weight))
- .saturating_add(DbWeight::get().writes(8 as Weight))
- }
- fn burn_item() -> Weight {
- (170_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(9 as Weight))
- .saturating_add(DbWeight::get().writes(7 as Weight))
- }
- fn transfer() -> Weight {
- (125_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(7 as Weight))
- .saturating_add(DbWeight::get().writes(7 as Weight))
- }
- fn approve() -> Weight {
- (45_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(3 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn transfer_from() -> Weight {
- (150_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(9 as Weight))
- .saturating_add(DbWeight::get().writes(8 as Weight))
- }
- fn set_offchain_schema() -> Weight {
- (33_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn set_const_on_chain_schema() -> Weight {
- (11_100_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn set_variable_on_chain_schema() -> Weight {
- (11_100_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn set_variable_meta_data() -> Weight {
- (17_500_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn enable_contract_sponsoring() -> Weight {
- (13_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(1 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn set_schema_version() -> Weight {
- (8_500_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn set_chain_limits() -> Weight {
- (1_300_000 as Weight)
- .saturating_add(DbWeight::get().reads(0 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
- fn set_contract_sponsoring_rate_limit() -> Weight {
- (3_500_000 as Weight)
- .saturating_add(DbWeight::get().reads(0 as Weight))
- .saturating_add(DbWeight::get().writes(2 as Weight))
- }
- fn set_variable_meta_data_sponsoring_rate_limit() -> Weight {
- (3_500_000 as Weight)
- .saturating_add(DbWeight::get().reads(1 as Weight))
- .saturating_add(DbWeight::get().writes(2 as Weight))
- }
- fn toggle_contract_white_list() -> Weight {
- (3_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(0 as Weight))
- .saturating_add(DbWeight::get().writes(2 as Weight))
- }
- fn add_to_contract_white_list() -> Weight {
- (3_000_000 as Weight)
- .saturating_add(DbWeight::get().reads(0 as Weight))
- .saturating_add(DbWeight::get().writes(2 as Weight))
- }
- fn remove_from_contract_white_list() -> Weight {
- (3_200_000 as Weight)
- .saturating_add(DbWeight::get().reads(0 as Weight))
- .saturating_add(DbWeight::get().writes(2 as Weight))
- }
- fn set_collection_limits() -> Weight {
- (8_900_000 as Weight)
- .saturating_add(DbWeight::get().reads(2 as Weight))
- .saturating_add(DbWeight::get().writes(1 as Weight))
- }
+ 50_000_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn set_collection_sponsor() -> Weight {
+ 32_000_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn confirm_sponsorship() -> Weight {
+ 22_000_000_u64
+ .saturating_add(DbWeight::get().reads(1_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn remove_collection_sponsor() -> Weight {
+ 24_000_000_u64
+ .saturating_add(DbWeight::get().reads(1_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn create_item(s: usize) -> Weight {
+ 130_000_000_u64
+ .saturating_add(2135_u64.saturating_mul(s as Weight).saturating_mul(500_u64)) // 500 is temparary multiplier, fee for storage
+ .saturating_add(DbWeight::get().reads(10_u64))
+ .saturating_add(DbWeight::get().writes(8_u64))
+ }
+ fn burn_item() -> Weight {
+ 170_000_000_u64
+ .saturating_add(DbWeight::get().reads(9_u64))
+ .saturating_add(DbWeight::get().writes(7_u64))
+ }
+ fn transfer() -> Weight {
+ 125_000_000_u64
+ .saturating_add(DbWeight::get().reads(7_u64))
+ .saturating_add(DbWeight::get().writes(7_u64))
+ }
+ fn approve() -> Weight {
+ 45_000_000_u64
+ .saturating_add(DbWeight::get().reads(3_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn transfer_from() -> Weight {
+ 150_000_000_u64
+ .saturating_add(DbWeight::get().reads(9_u64))
+ .saturating_add(DbWeight::get().writes(8_u64))
+ }
+ fn set_offchain_schema() -> Weight {
+ 33_000_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn set_const_on_chain_schema() -> Weight {
+ 11_100_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn set_variable_on_chain_schema() -> Weight {
+ 11_100_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn set_variable_meta_data() -> Weight {
+ 17_500_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn enable_contract_sponsoring() -> Weight {
+ 13_000_000_u64
+ .saturating_add(DbWeight::get().reads(1_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn set_schema_version() -> Weight {
+ 8_500_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn set_chain_limits() -> Weight {
+ 1_300_000_u64
+ .saturating_add(DbWeight::get().reads(0_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
+ fn set_contract_sponsoring_rate_limit() -> Weight {
+ 3_500_000_u64
+ .saturating_add(DbWeight::get().reads(0_u64))
+ .saturating_add(DbWeight::get().writes(2_u64))
+ }
+ fn set_variable_meta_data_sponsoring_rate_limit() -> Weight {
+ 3_500_000_u64
+ .saturating_add(DbWeight::get().reads(1_u64))
+ .saturating_add(DbWeight::get().writes(2_u64))
+ }
+ fn toggle_contract_white_list() -> Weight {
+ 3_000_000_u64
+ .saturating_add(DbWeight::get().reads(0_u64))
+ .saturating_add(DbWeight::get().writes(2_u64))
+ }
+ fn add_to_contract_white_list() -> Weight {
+ 3_000_000_u64
+ .saturating_add(DbWeight::get().reads(0_u64))
+ .saturating_add(DbWeight::get().writes(2_u64))
+ }
+ fn remove_from_contract_white_list() -> Weight {
+ 3_200_000_u64
+ .saturating_add(DbWeight::get().reads(0_u64))
+ .saturating_add(DbWeight::get().writes(2_u64))
+ }
+ fn set_collection_limits() -> Weight {
+ 8_900_000_u64
+ .saturating_add(DbWeight::get().reads(2_u64))
+ .saturating_add(DbWeight::get().writes(1_u64))
+ }
}