git.delta.rocks / unique-network / refs/commits / 890b4afabe76

difftreelog

Merge branch 'develop' into feature/CORE-324

Yaroslav Bolyukin2022-04-01parents: #4b84a72 #a961c1a.patch.diff
in: master

17 files changed

modified.envdiffbeforeafterboth
--- a/.env
+++ b/.env
@@ -1,6 +1,6 @@
 RUST_TOOLCHAIN=nightly-2021-11-11
 RUST_C=1.58.0-nightly
-POLKA_VERSION=release-v0.9.17
+POLKA_VERSION=release-v0.9.18
 UNIQUE_BRANCH=develop
 USER=***
 PASS=***
modifiedCargo.lockdiffbeforeafterboth
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5575,7 +5575,7 @@
 
 [[package]]
 name = "opal-runtime"
-version = "0.1.0"
+version = "0.9.18"
 dependencies = [
  "cumulus-pallet-aura-ext",
  "cumulus-pallet-dmp-queue",
@@ -8709,7 +8709,7 @@
 
 [[package]]
 name = "quartz-runtime"
-version = "0.1.0"
+version = "0.9.18"
 dependencies = [
  "cumulus-pallet-aura-ext",
  "cumulus-pallet-dmp-queue",
@@ -8723,13 +8723,10 @@
  "fp-evm-mapping",
  "fp-rpc",
  "fp-self-contained",
- "frame-benchmarking",
  "frame-executive",
  "frame-support",
  "frame-system",
- "frame-system-benchmarking",
  "frame-system-rpc-runtime-api",
- "hex-literal",
  "orml-vesting",
  "pallet-aura",
  "pallet-balances",
@@ -12551,7 +12548,7 @@
 
 [[package]]
 name = "unique-runtime"
-version = "0.9.17"
+version = "0.9.18"
 dependencies = [
  "cumulus-pallet-aura-ext",
  "cumulus-pallet-dmp-queue",
@@ -12627,7 +12624,7 @@
 
 [[package]]
 name = "unique-runtime-common"
-version = "0.1.0"
+version = "0.9.18"
 dependencies = [
  "fp-rpc",
  "frame-support",
modifiedCargo.tomldiffbeforeafterboth
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,8 +5,11 @@
     'pallets/*',
     'client/*',
     'primitives/*',
-    'runtime/*',
     'crates/*',
 ]
+exclude = [
+    "runtime/unique",
+    "runtime/quartz"
+]
 [profile.release]
 panic = 'unwind'
modifiedDockerfile-parachaindiffbeforeafterboth
--- a/Dockerfile-parachain
+++ b/Dockerfile-parachain
@@ -1,5 +1,5 @@
 # ===== Rust builder =====
-FROM phusion/baseimage:focal-1.0.0 as rust-builder
+FROM phusion/baseimage:focal-1.1.0 as rust-builder
 LABEL maintainer="Unique.Network"
 
 ARG RUST_TOOLCHAIN=nightly-2021-11-11
@@ -77,7 +77,7 @@
 
 # ===== RUN ======
 
-FROM phusion/baseimage:focal-1.0.0
+FROM phusion/baseimage:focal-1.1.0
 
 ARG PROFILE=release
 
modifiedREADME.mddiffbeforeafterboth
--- a/README.md
+++ b/README.md
@@ -63,12 +63,7 @@
 
 5. Build:
 ```bash
-cargo build
-```
-
-optionally, build in release:
-```bash
-cargo build --release
+cargo build --features=unique-runtime,quartz-runtime --release
 ```
 
 ## Building as Parachain locally
modifiednode/cli/Cargo.tomldiffbeforeafterboth
--- a/node/cli/Cargo.toml
+++ b/node/cli/Cargo.toml
@@ -312,7 +312,7 @@
 unique-rpc = { default-features = false, path = "../rpc" }
 
 [features]
-default = ["unique-runtime", "quartz-runtime"]
+default = []
 runtime-benchmarks = [
     'unique-runtime/runtime-benchmarks',
     'polkadot-service/runtime-benchmarks',
modifiednode/cli/src/chain_spec.rsdiffbeforeafterboth
before · node/cli/src/chain_spec.rs
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617use cumulus_primitives_core::ParaId;18use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup};19use sc_service::ChainType;20use sp_core::{sr25519, Pair, Public};21use sp_runtime::traits::{IdentifyAccount, Verify};22use std::collections::BTreeMap;2324use serde::{Deserialize, Serialize};25use serde_json::map::Map;2627use unique_runtime_common::types::*;2829/// The `ChainSpec` parameterized for the unique runtime.30#[cfg(feature = "unique-runtime")]31pub type UniqueChainSpec = sc_service::GenericChainSpec<unique_runtime::GenesisConfig, Extensions>;3233/// The `ChainSpec` parameterized for the quartz runtime.34#[cfg(feature = "quartz-runtime")]35pub type QuartzChainSpec = sc_service::GenericChainSpec<quartz_runtime::GenesisConfig, Extensions>;3637/// The `ChainSpec` parameterized for the opal runtime.38pub type OpalChainSpec = sc_service::GenericChainSpec<opal_runtime::GenesisConfig, Extensions>;3940pub enum RuntimeId {41	Unique,42	Quartz,43	Opal,44	Unknown(String),45}4647pub trait RuntimeIdentification {48	fn runtime_id(&self) -> RuntimeId;49}5051impl RuntimeIdentification for Box<dyn sc_service::ChainSpec> {52	fn runtime_id(&self) -> RuntimeId {53		#[cfg(feature = "unique-runtime")]54		if self.id().starts_with("unique") {55			return RuntimeId::Unique;56		}5758		#[cfg(feature = "quartz-runtime")]59		if self.id().starts_with("quartz") {60			return RuntimeId::Quartz;61		}6263		if self.id().starts_with("opal") || self.id() == "dev" || self.id() == "local_testnet" {64			return RuntimeId::Opal;65		}6667		RuntimeId::Unknown(self.id().into())68	}69}7071pub enum ServiceId {72	Prod,73	Dev,74}7576pub trait ServiceIdentification {77	fn service_id(&self) -> ServiceId;78}7980impl ServiceIdentification for Box<dyn sc_service::ChainSpec> {81	fn service_id(&self) -> ServiceId {82		if self.id().ends_with("dev") {83			ServiceId::Dev84		} else {85			ServiceId::Prod86		}87	}88}8990/// Helper function to generate a crypto pair from seed91pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {92	TPublic::Pair::from_string(&format!("//{}", seed), None)93		.expect("static values are valid; qed")94		.public()95}9697/// The extensions for the [`ChainSpec`].98#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)]99#[serde(deny_unknown_fields)]100pub struct Extensions {101	/// The relay chain of the Parachain.102	pub relay_chain: String,103	/// The id of the Parachain.104	pub para_id: u32,105}106107impl Extensions {108	/// Try to get the extension from the given `ChainSpec`.109	pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> {110		sc_chain_spec::get_extension(chain_spec.extensions())111	}112}113114type AccountPublic = <Signature as Verify>::Signer;115116/// Helper function to generate an account ID from seed117pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId118where119	AccountPublic: From<<TPublic::Pair as Pair>::Public>,120{121	AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()122}123124pub fn development_config() -> OpalChainSpec {125	let mut properties = Map::new();126	properties.insert("tokenSymbol".into(), "OPL".into());127	properties.insert("tokenDecimals".into(), 15.into());128	properties.insert("ss58Format".into(), 42.into());129130	OpalChainSpec::from_genesis(131		// Name132		"Development",133		// ID134		"dev",135		ChainType::Local,136		move || {137			testnet_genesis(138				// Sudo account139				get_account_id_from_seed::<sr25519::Public>("Alice"),140				vec![141					get_from_seed::<AuraId>("Alice"),142					get_from_seed::<AuraId>("Bob"),143				],144				// Pre-funded accounts145				vec![146					get_account_id_from_seed::<sr25519::Public>("Alice"),147					get_account_id_from_seed::<sr25519::Public>("Bob"),148				],149				1000.into(),150			)151		},152		// Bootnodes153		vec![],154		// Telemetry155		None,156		// Protocol ID157		None,158		None,159		// Properties160		Some(properties),161		// Extensions162		Extensions {163			relay_chain: "rococo-dev".into(),164			para_id: 1000,165		},166	)167}168169pub fn local_testnet_rococo_config() -> OpalChainSpec {170	OpalChainSpec::from_genesis(171		// Name172		"Local Testnet",173		// ID174		"local_testnet",175		ChainType::Local,176		move || {177			testnet_genesis(178				// Sudo account179				get_account_id_from_seed::<sr25519::Public>("Alice"),180				vec![181					get_from_seed::<AuraId>("Alice"),182					get_from_seed::<AuraId>("Bob"),183				],184				// Pre-funded accounts185				vec![186					get_account_id_from_seed::<sr25519::Public>("Alice"),187					get_account_id_from_seed::<sr25519::Public>("Bob"),188					get_account_id_from_seed::<sr25519::Public>("Charlie"),189					get_account_id_from_seed::<sr25519::Public>("Dave"),190					get_account_id_from_seed::<sr25519::Public>("Eve"),191					get_account_id_from_seed::<sr25519::Public>("Ferdie"),192					get_account_id_from_seed::<sr25519::Public>("Alice//stash"),193					get_account_id_from_seed::<sr25519::Public>("Bob//stash"),194					get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),195					get_account_id_from_seed::<sr25519::Public>("Dave//stash"),196					get_account_id_from_seed::<sr25519::Public>("Eve//stash"),197					get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),198				],199				1000.into(),200			)201		},202		// Bootnodes203		vec![],204		// Telemetry205		None,206		// Protocol ID207		None,208		None,209		// Properties210		None,211		// Extensions212		Extensions {213			relay_chain: "rococo-local".into(),214			para_id: 1000,215		},216	)217}218219fn testnet_genesis(220	root_key: AccountId,221	initial_authorities: Vec<AuraId>,222	endowed_accounts: Vec<AccountId>,223	id: ParaId,224) -> opal_runtime::GenesisConfig {225	use opal_runtime::*;226227	GenesisConfig {228		system: SystemConfig {229			code: WASM_BINARY230				.expect("WASM binary was not build, please build it!")231				.to_vec(),232		},233		balances: BalancesConfig {234			balances: endowed_accounts235				.iter()236				.cloned()237				// 1e13 UNQ238				.map(|k| (k, 1 << 100))239				.collect(),240		},241		treasury: Default::default(),242		sudo: SudoConfig {243			key: Some(root_key),244		},245		vesting: VestingConfig { vesting: vec![] },246		parachain_info: ParachainInfoConfig { parachain_id: id },247		parachain_system: Default::default(),248		aura: AuraConfig {249			authorities: initial_authorities,250		},251		aura_ext: Default::default(),252		evm: EVMConfig {253			accounts: BTreeMap::new(),254		},255		ethereum: EthereumConfig {},256	}257}
after · node/cli/src/chain_spec.rs
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup};18use sc_service::ChainType;19use sp_core::{sr25519, Pair, Public};20use sp_runtime::traits::{IdentifyAccount, Verify};21use std::collections::BTreeMap;2223use serde::{Deserialize, Serialize};24use serde_json::map::Map;2526use unique_runtime_common::types::*;2728#[cfg(feature = "unique-runtime")]29use unique_runtime as default_runtime;3031#[cfg(all(not(feature = "unique-runtime"), feature = "quartz-runtime"))]32use quartz_runtime as default_runtime;3334#[cfg(all(not(feature = "unique-runtime"), not(feature = "quartz-runtime")))]35use opal_runtime as default_runtime;3637/// The `ChainSpec` parameterized for the unique runtime.38#[cfg(feature = "unique-runtime")]39pub type UniqueChainSpec = sc_service::GenericChainSpec<unique_runtime::GenesisConfig, Extensions>;4041/// The `ChainSpec` parameterized for the quartz runtime.42#[cfg(feature = "quartz-runtime")]43pub type QuartzChainSpec = sc_service::GenericChainSpec<quartz_runtime::GenesisConfig, Extensions>;4445/// The `ChainSpec` parameterized for the opal runtime.46pub type OpalChainSpec = sc_service::GenericChainSpec<opal_runtime::GenesisConfig, Extensions>;4748#[cfg(feature = "unique-runtime")]49pub type DefaultChainSpec = UniqueChainSpec;5051#[cfg(all(not(feature = "unique-runtime"), feature = "quartz-runtime"))]52pub type DefaultChainSpec = QuartzChainSpec;5354#[cfg(all(not(feature = "unique-runtime"), not(feature = "quartz-runtime")))]55pub type DefaultChainSpec = OpalChainSpec;5657pub enum RuntimeId {58	#[cfg(feature = "unique-runtime")]59	Unique,6061	#[cfg(feature = "quartz-runtime")]62	Quartz,6364	Opal,65	Unknown(String),66}6768pub trait RuntimeIdentification {69	fn runtime_id(&self) -> RuntimeId;70}7172impl RuntimeIdentification for Box<dyn sc_service::ChainSpec> {73	fn runtime_id(&self) -> RuntimeId {74		#[cfg(feature = "unique-runtime")]75		if self.id().starts_with("unique") || self.id().starts_with("unq") {76			return RuntimeId::Unique;77		}7879		#[cfg(feature = "quartz-runtime")]80		if self.id().starts_with("quartz") || self.id().starts_with("qtz") {81			return RuntimeId::Quartz;82		}8384		if self.id().starts_with("opal") || self.id() == "dev" || self.id() == "local_testnet" {85			return RuntimeId::Opal;86		}8788		RuntimeId::Unknown(self.id().into())89	}90}9192pub enum ServiceId {93	Prod,94	Dev,95}9697pub trait ServiceIdentification {98	fn service_id(&self) -> ServiceId;99}100101impl ServiceIdentification for Box<dyn sc_service::ChainSpec> {102	fn service_id(&self) -> ServiceId {103		if self.id().ends_with("dev") {104			ServiceId::Dev105		} else {106			ServiceId::Prod107		}108	}109}110111/// Helper function to generate a crypto pair from seed112pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {113	TPublic::Pair::from_string(&format!("//{}", seed), None)114		.expect("static values are valid; qed")115		.public()116}117118/// The extensions for the [`ChainSpec`].119#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)]120#[serde(deny_unknown_fields)]121pub struct Extensions {122	/// The relay chain of the Parachain.123	pub relay_chain: String,124	/// The id of the Parachain.125	pub para_id: u32,126}127128impl Extensions {129	/// Try to get the extension from the given `ChainSpec`.130	pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> {131		sc_chain_spec::get_extension(chain_spec.extensions())132	}133}134135type AccountPublic = <Signature as Verify>::Signer;136137/// Helper function to generate an account ID from seed138pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId139where140	AccountPublic: From<<TPublic::Pair as Pair>::Public>,141{142	AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()143}144145macro_rules! testnet_genesis {146	(147		$runtime:path,148		$root_key:expr,149		$initial_authorities:expr,150		$endowed_accounts:expr,151		$id:expr152	) => {{153		use $runtime::*;154155		GenesisConfig {156			system: SystemConfig {157				code: WASM_BINARY158					.expect("WASM binary was not build, please build it!")159					.to_vec(),160			},161			balances: BalancesConfig {162				balances: $endowed_accounts163					.iter()164					.cloned()165					// 1e13 UNQ166					.map(|k| (k, 1 << 100))167					.collect(),168			},169			treasury: Default::default(),170			sudo: SudoConfig {171				key: Some($root_key),172			},173			vesting: VestingConfig { vesting: vec![] },174			parachain_info: ParachainInfoConfig {175				parachain_id: $id.into(),176			},177			parachain_system: Default::default(),178			aura: AuraConfig {179				authorities: $initial_authorities,180			},181			aura_ext: Default::default(),182			evm: EVMConfig {183				accounts: BTreeMap::new(),184			},185			ethereum: EthereumConfig {},186		}187	}};188}189190pub fn development_config() -> OpalChainSpec {191	let mut properties = Map::new();192	properties.insert("tokenSymbol".into(), opal_runtime::TOKEN_SYMBOL.into());193	properties.insert("tokenDecimals".into(), 18.into());194	properties.insert("ss58Format".into(), opal_runtime::SS58Prefix::get().into());195196	OpalChainSpec::from_genesis(197		// Name198		"OPAL by UNIQUE",199		// ID200		"opal_dev",201		ChainType::Local,202		move || {203			testnet_genesis!(204				opal_runtime,205				// Sudo account206				get_account_id_from_seed::<sr25519::Public>("Alice"),207				vec![208					get_from_seed::<AuraId>("Alice"),209					get_from_seed::<AuraId>("Bob"),210				],211				// Pre-funded accounts212				vec![213					get_account_id_from_seed::<sr25519::Public>("Alice"),214					get_account_id_from_seed::<sr25519::Public>("Bob"),215				],216				1000217			)218		},219		// Bootnodes220		vec![],221		// Telemetry222		None,223		// Protocol ID224		None,225		None,226		// Properties227		Some(properties),228		// Extensions229		Extensions {230			relay_chain: "rococo-dev".into(),231			para_id: 1000,232		},233	)234}235236pub fn local_testnet_rococo_config() -> DefaultChainSpec {237	let mut properties = Map::new();238	properties.insert("tokenSymbol".into(), default_runtime::TOKEN_SYMBOL.into());239	properties.insert("tokenDecimals".into(), 18.into());240	properties.insert(241		"ss58Format".into(),242		default_runtime::SS58Prefix::get().into(),243	);244245	DefaultChainSpec::from_genesis(246		// Name247		format!(248			"{}{}",249			default_runtime::RUNTIME_NAME.to_uppercase(),250			if cfg!(feature = "unique-runtime") {251				""252			} else {253				" by UNIQUE"254			}255		)256		.as_str(),257		// ID258		format!("{}_local", default_runtime::RUNTIME_NAME).as_str(),259		ChainType::Local,260		move || {261			testnet_genesis!(262				default_runtime,263				// Sudo account264				get_account_id_from_seed::<sr25519::Public>("Alice"),265				vec![266					get_from_seed::<AuraId>("Alice"),267					get_from_seed::<AuraId>("Bob"),268				],269				// Pre-funded accounts270				vec![271					get_account_id_from_seed::<sr25519::Public>("Alice"),272					get_account_id_from_seed::<sr25519::Public>("Bob"),273					get_account_id_from_seed::<sr25519::Public>("Charlie"),274					get_account_id_from_seed::<sr25519::Public>("Dave"),275					get_account_id_from_seed::<sr25519::Public>("Eve"),276					get_account_id_from_seed::<sr25519::Public>("Ferdie"),277					get_account_id_from_seed::<sr25519::Public>("Alice//stash"),278					get_account_id_from_seed::<sr25519::Public>("Bob//stash"),279					get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),280					get_account_id_from_seed::<sr25519::Public>("Dave//stash"),281					get_account_id_from_seed::<sr25519::Public>("Eve//stash"),282					get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),283				],284				1000285			)286		},287		// Bootnodes288		vec![],289		// Telemetry290		None,291		// Protocol ID292		None,293		None,294		// Properties295		Some(properties),296		// Extensions297		Extensions {298			relay_chain: "rococo-local".into(),299			para_id: 1000,300		},301	)302}
modifiednode/cli/src/service.rsdiffbeforeafterboth
--- a/node/cli/src/service.rs
+++ b/node/cli/src/service.rs
@@ -61,9 +61,16 @@
 
 use unique_runtime_common::types::{AuraId, RuntimeInstance, AccountId, Balance, Index, Hash, Block};
 
-/// Native executor instance.
+/// Unique native executor instance.
+#[cfg(feature = "unique-runtime")]
 pub struct UniqueRuntimeExecutor;
+
+#[cfg(feature = "quartz-runtime")]
+/// Quartz native executor instance.
+
 pub struct QuartzRuntimeExecutor;
+
+/// Opal native executor instance.
 pub struct OpalRuntimeExecutor;
 
 #[cfg(feature = "unique-runtime")]
modifiedpallets/unique/src/eth/sponsoring.rsdiffbeforeafterboth
--- a/pallets/unique/src/eth/sponsoring.rs
+++ b/pallets/unique/src/eth/sponsoring.rs
@@ -24,12 +24,13 @@
 use up_sponsorship::SponsorshipHandler;
 use core::marker::PhantomData;
 use core::convert::TryInto;
-use up_data_structs::TokenId;
 use pallet_evm::account::CrossAccountId;
 
-use pallet_nonfungible::erc::{UniqueNFTCall, ERC721UniqueExtensionsCall, ERC721Call};
+use pallet_nonfungible::erc::{
+	UniqueNFTCall, ERC721UniqueExtensionsCall, ERC721MintableCall, ERC721Call,
+};
 use pallet_fungible::erc::{UniqueFungibleCall, ERC20Call};
-use up_data_structs::{CreateItemData, CreateNftData};
+use up_data_structs::{TokenId, CreateItemData, CreateNftData};
 
 pub struct UniqueEthSponsorshipHandler<T: Config>(PhantomData<*const T>);
 impl<T: Config> SponsorshipHandler<T::CrossAccountId, (H160, Vec<u8>)>
@@ -50,6 +51,18 @@
 						let token_id: TokenId = token_id.try_into().ok()?;
 						withdraw_transfer::<T>(&collection, &who, &token_id).map(|()| sponsor)
 					}
+					UniqueNFTCall::ERC721Mintable(
+						ERC721MintableCall::Mint { token_id, .. }
+						| ERC721MintableCall::MintWithTokenUri { token_id, .. },
+					) => {
+						let _token_id: TokenId = token_id.try_into().ok()?;
+						withdraw_create_item::<T>(
+							&collection,
+							&who,
+							&CreateItemData::NFT(CreateNftData::default()),
+						)
+						.map(|()| sponsor)
+					}
 					UniqueNFTCall::ERC721(ERC721Call::TransferFrom { token_id, from, .. }) => {
 						let token_id: TokenId = token_id.try_into().ok()?;
 						let from = T::CrossAccountId::from_eth(from);
@@ -60,18 +73,6 @@
 						withdraw_approve::<T>(&collection, who.as_sub(), &token_id)
 							.map(|()| sponsor)
 					}
-					UniqueNFTCall::ERC721Mintable(call) => match call {
-						pallet_nonfungible::erc::ERC721MintableCall::Mint { .. }
-						| pallet_nonfungible::erc::ERC721MintableCall::MintWithTokenUri {
-							..
-						} => withdraw_create_item(
-							&collection,
-							who.as_sub(),
-							&CreateItemData::NFT(CreateNftData::default()),
-						)
-						.map(|()| sponsor),
-						_ => None,
-					},
 					_ => None,
 				}
 			}
modifiedpallets/unique/src/sponsorship.rsdiffbeforeafterboth
--- a/pallets/unique/src/sponsorship.rs
+++ b/pallets/unique/src/sponsorship.rs
@@ -103,7 +103,7 @@
 
 pub fn withdraw_create_item<T: Config>(
 	collection: &CollectionHandle<T>,
-	who: &T::AccountId,
+	who: &T::CrossAccountId,
 	_properties: &CreateItemData,
 ) -> Option<()> {
 	if _properties.data_size() as u32 > collection.limits.sponsored_data_size() {
@@ -120,14 +120,14 @@
 			CreateItemData::ReFungible(_) => REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
 		});
 
-	if let Some(last_tx_block) = <CreateItemBasket<T>>::get((collection.id, &who)) {
+	if let Some(last_tx_block) = <CreateItemBasket<T>>::get((collection.id, who.as_sub())) {
 		let timeout = last_tx_block + limit.into();
 		if block_number < timeout {
 			return None;
 		}
 	}
 
-	CreateItemBasket::<T>::insert((collection.id, who.clone()), block_number);
+	CreateItemBasket::<T>::insert((collection.id, who.as_sub()), block_number);
 
 	Some(())
 }
@@ -246,7 +246,12 @@
 				..
 			} => {
 				let (sponsor, collection) = load(*collection_id)?;
-				withdraw_create_item::<T>(&collection, who, data).map(|()| sponsor)
+				withdraw_create_item::<T>(
+					&collection,
+					&T::CrossAccountId::from_sub(who.clone()),
+					data,
+				)
+				.map(|()| sponsor)
 			}
 			Call::transfer {
 				collection_id,
modifiedruntime/common/Cargo.tomldiffbeforeafterboth
--- a/runtime/common/Cargo.toml
+++ b/runtime/common/Cargo.toml
@@ -6,7 +6,7 @@
 license = 'All Rights Reserved'
 name = 'unique-runtime-common'
 repository = 'https://github.com/UniqueNetwork/unique-chain'
-version = '0.1.0'
+version = '0.9.18'
 
 [features]
 default = ['std']
modifiedruntime/opal/Cargo.tomldiffbeforeafterboth
--- a/runtime/opal/Cargo.toml
+++ b/runtime/opal/Cargo.toml
@@ -10,7 +10,7 @@
 license = 'GPLv3'
 name = 'opal-runtime'
 repository = 'https://github.com/UniqueNetwork/unique-chain'
-version = '0.1.0'
+version = '0.9.18'
 
 [package.metadata.docs.rs]
 targets = ['x86_64-unknown-linux-gnu']
modifiedruntime/opal/src/lib.rsdiffbeforeafterboth
--- a/runtime/opal/src/lib.rs
+++ b/runtime/opal/src/lib.rs
@@ -116,7 +116,8 @@
 
 use unique_runtime_common::{impl_common_runtime_apis, types::*, constants::*};
 
-pub const RUNTIME_NAME: &str = "Opal";
+pub const RUNTIME_NAME: &str = "opal";
+pub const TOKEN_SYMBOL: &str = "OPL";
 
 type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Runtime>;
 
@@ -168,7 +169,7 @@
 	spec_name: create_runtime_str!(RUNTIME_NAME),
 	impl_name: create_runtime_str!(RUNTIME_NAME),
 	authoring_version: 1,
-	spec_version: 917004,
+	spec_version: 918001,
 	impl_version: 0,
 	apis: RUNTIME_API_VERSIONS,
 	transaction_version: 1,
modifiedruntime/quartz/Cargo.tomldiffbeforeafterboth
--- a/runtime/quartz/Cargo.toml
+++ b/runtime/quartz/Cargo.toml
@@ -10,7 +10,7 @@
 license = 'GPLv3'
 name = 'quartz-runtime'
 repository = 'https://github.com/UniqueNetwork/unique-chain'
-version = '0.1.0'
+version = '0.9.18'
 
 [package.metadata.docs.rs]
 targets = ['x86_64-unknown-linux-gnu']
modifiedruntime/quartz/src/lib.rsdiffbeforeafterboth
--- a/runtime/quartz/src/lib.rs
+++ b/runtime/quartz/src/lib.rs
@@ -116,7 +116,8 @@
 
 use unique_runtime_common::{impl_common_runtime_apis, types::*, constants::*};
 
-pub const RUNTIME_NAME: &str = "Quartz";
+pub const RUNTIME_NAME: &str = "quartz";
+pub const TOKEN_SYMBOL: &str = "QTZ";
 
 type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Runtime>;
 
@@ -153,7 +154,7 @@
 	spec_name: create_runtime_str!(RUNTIME_NAME),
 	impl_name: create_runtime_str!(RUNTIME_NAME),
 	authoring_version: 1,
-	spec_version: 917004,
+	spec_version: 918001,
 	impl_version: 0,
 	apis: RUNTIME_API_VERSIONS,
 	transaction_version: 1,
modifiedruntime/unique/Cargo.tomldiffbeforeafterboth
--- a/runtime/unique/Cargo.toml
+++ b/runtime/unique/Cargo.toml
@@ -10,7 +10,7 @@
 license = 'GPLv3'
 name = 'unique-runtime'
 repository = 'https://github.com/UniqueNetwork/unique-chain'
-version = '0.9.17'
+version = '0.9.18'
 
 [package.metadata.docs.rs]
 targets = ['x86_64-unknown-linux-gnu']
modifiedruntime/unique/src/lib.rsdiffbeforeafterboth
--- a/runtime/unique/src/lib.rs
+++ b/runtime/unique/src/lib.rs
@@ -115,7 +115,8 @@
 
 use unique_runtime_common::{impl_common_runtime_apis, types::*, constants::*};
 
-pub const RUNTIME_NAME: &str = "Unique";
+pub const RUNTIME_NAME: &str = "unique";
+pub const TOKEN_SYMBOL: &str = "UNQ";
 
 type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Runtime>;
 
@@ -152,7 +153,7 @@
 	spec_name: create_runtime_str!(RUNTIME_NAME),
 	impl_name: create_runtime_str!(RUNTIME_NAME),
 	authoring_version: 1,
-	spec_version: 917004,
+	spec_version: 918001,
 	impl_version: 0,
 	apis: RUNTIME_API_VERSIONS,
 	transaction_version: 1,