From 890b4afabe7698d10570da64674b82c5c31c3644 Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Fri, 01 Apr 2022 16:13:27 +0000 Subject: [PATCH] Merge branch 'develop' into feature/CORE-324 --- --- 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=*** --- 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", --- a/Cargo.toml +++ b/Cargo.toml @@ -5,8 +5,11 @@ 'pallets/*', 'client/*', 'primitives/*', - 'runtime/*', 'crates/*', ] +exclude = [ + "runtime/unique", + "runtime/quartz" +] [profile.release] panic = 'unwind' --- 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 --- 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 --- 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', --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -14,7 +14,6 @@ // You should have received a copy of the GNU General Public License // along with Unique Network. If not, see . -use cumulus_primitives_core::ParaId; use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup}; use sc_service::ChainType; use sp_core::{sr25519, Pair, Public}; @@ -26,6 +25,15 @@ use unique_runtime_common::types::*; +#[cfg(feature = "unique-runtime")] +use unique_runtime as default_runtime; + +#[cfg(all(not(feature = "unique-runtime"), feature = "quartz-runtime"))] +use quartz_runtime as default_runtime; + +#[cfg(all(not(feature = "unique-runtime"), not(feature = "quartz-runtime")))] +use opal_runtime as default_runtime; + /// The `ChainSpec` parameterized for the unique runtime. #[cfg(feature = "unique-runtime")] pub type UniqueChainSpec = sc_service::GenericChainSpec; @@ -37,9 +45,22 @@ /// The `ChainSpec` parameterized for the opal runtime. pub type OpalChainSpec = sc_service::GenericChainSpec; +#[cfg(feature = "unique-runtime")] +pub type DefaultChainSpec = UniqueChainSpec; + +#[cfg(all(not(feature = "unique-runtime"), feature = "quartz-runtime"))] +pub type DefaultChainSpec = QuartzChainSpec; + +#[cfg(all(not(feature = "unique-runtime"), not(feature = "quartz-runtime")))] +pub type DefaultChainSpec = OpalChainSpec; + pub enum RuntimeId { + #[cfg(feature = "unique-runtime")] Unique, + + #[cfg(feature = "quartz-runtime")] Quartz, + Opal, Unknown(String), } @@ -51,12 +72,12 @@ impl RuntimeIdentification for Box { fn runtime_id(&self) -> RuntimeId { #[cfg(feature = "unique-runtime")] - if self.id().starts_with("unique") { + if self.id().starts_with("unique") || self.id().starts_with("unq") { return RuntimeId::Unique; } #[cfg(feature = "quartz-runtime")] - if self.id().starts_with("quartz") { + if self.id().starts_with("quartz") || self.id().starts_with("qtz") { return RuntimeId::Quartz; } @@ -121,20 +142,66 @@ AccountPublic::from(get_from_seed::(seed)).into_account() } +macro_rules! testnet_genesis { + ( + $runtime:path, + $root_key:expr, + $initial_authorities:expr, + $endowed_accounts:expr, + $id:expr + ) => {{ + use $runtime::*; + + GenesisConfig { + system: SystemConfig { + code: WASM_BINARY + .expect("WASM binary was not build, please build it!") + .to_vec(), + }, + balances: BalancesConfig { + balances: $endowed_accounts + .iter() + .cloned() + // 1e13 UNQ + .map(|k| (k, 1 << 100)) + .collect(), + }, + treasury: Default::default(), + sudo: SudoConfig { + key: Some($root_key), + }, + vesting: VestingConfig { vesting: vec![] }, + parachain_info: ParachainInfoConfig { + parachain_id: $id.into(), + }, + parachain_system: Default::default(), + aura: AuraConfig { + authorities: $initial_authorities, + }, + aura_ext: Default::default(), + evm: EVMConfig { + accounts: BTreeMap::new(), + }, + ethereum: EthereumConfig {}, + } + }}; +} + pub fn development_config() -> OpalChainSpec { let mut properties = Map::new(); - properties.insert("tokenSymbol".into(), "OPL".into()); - properties.insert("tokenDecimals".into(), 15.into()); - properties.insert("ss58Format".into(), 42.into()); + properties.insert("tokenSymbol".into(), opal_runtime::TOKEN_SYMBOL.into()); + properties.insert("tokenDecimals".into(), 18.into()); + properties.insert("ss58Format".into(), opal_runtime::SS58Prefix::get().into()); OpalChainSpec::from_genesis( // Name - "Development", + "OPAL by UNIQUE", // ID - "dev", + "opal_dev", ChainType::Local, move || { - testnet_genesis( + testnet_genesis!( + opal_runtime, // Sudo account get_account_id_from_seed::("Alice"), vec![ @@ -146,7 +213,7 @@ get_account_id_from_seed::("Alice"), get_account_id_from_seed::("Bob"), ], - 1000.into(), + 1000 ) }, // Bootnodes @@ -166,15 +233,33 @@ ) } -pub fn local_testnet_rococo_config() -> OpalChainSpec { - OpalChainSpec::from_genesis( +pub fn local_testnet_rococo_config() -> DefaultChainSpec { + let mut properties = Map::new(); + properties.insert("tokenSymbol".into(), default_runtime::TOKEN_SYMBOL.into()); + properties.insert("tokenDecimals".into(), 18.into()); + properties.insert( + "ss58Format".into(), + default_runtime::SS58Prefix::get().into(), + ); + + DefaultChainSpec::from_genesis( // Name - "Local Testnet", + format!( + "{}{}", + default_runtime::RUNTIME_NAME.to_uppercase(), + if cfg!(feature = "unique-runtime") { + "" + } else { + " by UNIQUE" + } + ) + .as_str(), // ID - "local_testnet", + format!("{}_local", default_runtime::RUNTIME_NAME).as_str(), ChainType::Local, move || { - testnet_genesis( + testnet_genesis!( + default_runtime, // Sudo account get_account_id_from_seed::("Alice"), vec![ @@ -196,7 +281,7 @@ get_account_id_from_seed::("Eve//stash"), get_account_id_from_seed::("Ferdie//stash"), ], - 1000.into(), + 1000 ) }, // Bootnodes @@ -207,51 +292,11 @@ None, None, // Properties - None, + Some(properties), // Extensions Extensions { relay_chain: "rococo-local".into(), para_id: 1000, }, ) -} - -fn testnet_genesis( - root_key: AccountId, - initial_authorities: Vec, - endowed_accounts: Vec, - id: ParaId, -) -> opal_runtime::GenesisConfig { - use opal_runtime::*; - - GenesisConfig { - system: SystemConfig { - code: WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - }, - balances: BalancesConfig { - balances: endowed_accounts - .iter() - .cloned() - // 1e13 UNQ - .map(|k| (k, 1 << 100)) - .collect(), - }, - treasury: Default::default(), - sudo: SudoConfig { - key: Some(root_key), - }, - vesting: VestingConfig { vesting: vec![] }, - parachain_info: ParachainInfoConfig { parachain_id: id }, - parachain_system: Default::default(), - aura: AuraConfig { - authorities: initial_authorities, - }, - aura_ext: Default::default(), - evm: EVMConfig { - accounts: BTreeMap::new(), - }, - ethereum: EthereumConfig {}, - } } --- 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")] --- 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(PhantomData<*const T>); impl SponsorshipHandler)> @@ -50,6 +51,18 @@ let token_id: TokenId = token_id.try_into().ok()?; withdraw_transfer::(&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::( + &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::(&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, } } --- a/pallets/unique/src/sponsorship.rs +++ b/pallets/unique/src/sponsorship.rs @@ -103,7 +103,7 @@ pub fn withdraw_create_item( collection: &CollectionHandle, - 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) = >::get((collection.id, &who)) { + if let Some(last_tx_block) = >::get((collection.id, who.as_sub())) { let timeout = last_tx_block + limit.into(); if block_number < timeout { return None; } } - CreateItemBasket::::insert((collection.id, who.clone()), block_number); + CreateItemBasket::::insert((collection.id, who.as_sub()), block_number); Some(()) } @@ -246,7 +246,12 @@ .. } => { let (sponsor, collection) = load(*collection_id)?; - withdraw_create_item::(&collection, who, data).map(|()| sponsor) + withdraw_create_item::( + &collection, + &T::CrossAccountId::from_sub(who.clone()), + data, + ) + .map(|()| sponsor) } Call::transfer { collection_id, --- 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'] --- 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'] --- 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; @@ -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, --- 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'] --- 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; @@ -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, --- 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'] --- 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; @@ -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, -- gitstuff