difftreelog
Merge pull request #330 from UniqueNetwork/release-v918001
in: master
Release v918001
9 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -8706,13 +8706,10 @@
"derivative",
"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",
Cargo.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'
Dockerfile-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
node/cli/src/chain_spec.rsdiffbeforeafterboth--- a/node/cli/src/chain_spec.rs
+++ b/node/cli/src/chain_spec.rs
@@ -72,12 +72,12 @@
impl RuntimeIdentification for Box<dyn sc_service::ChainSpec> {
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;
}
pallets/unique/src/eth/sponsoring.rsdiffbeforeafterboth--- a/pallets/unique/src/eth/sponsoring.rs
+++ b/pallets/unique/src/eth/sponsoring.rs
@@ -24,11 +24,13 @@
use up_sponsorship::SponsorshipHandler;
use core::marker::PhantomData;
use core::convert::TryInto;
-use up_data_structs::TokenId;
+use up_data_structs::{TokenId, CreateItemData, CreateNftData};
use up_evm_mapping::EvmBackwardsAddressMapping;
use pallet_common::account::CrossAccountId;
-use pallet_nonfungible::erc::{UniqueNFTCall, ERC721UniqueExtensionsCall, ERC721Call};
+use pallet_nonfungible::erc::{
+ UniqueNFTCall, ERC721UniqueExtensionsCall, ERC721MintableCall, ERC721Call,
+};
use pallet_fungible::erc::{UniqueFungibleCall, ERC20Call};
pub struct UniqueEthSponsorshipHandler<T: Config>(PhantomData<*const T>);
@@ -51,6 +53,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);
pallets/unique/src/sponsorship.rsdiffbeforeafterboth1// 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 crate::{18 Config, Call, CreateItemBasket, VariableMetaDataBasket, ReFungibleTransferBasket,19 FungibleTransferBasket, NftTransferBasket, CreateItemData, CollectionMode, NftApproveBasket,20 FungibleApproveBasket, RefungibleApproveBasket,21};22use core::marker::PhantomData;23use up_sponsorship::SponsorshipHandler;24use frame_support::{25 traits::{IsSubType},26 storage::{StorageMap, StorageDoubleMap, StorageNMap},27};28use up_data_structs::{29 CollectionId, FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT, MetaUpdatePermission,30 NFT_SPONSOR_TRANSFER_TIMEOUT, REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT, TokenId,31};32use pallet_common::{CollectionHandle};33use pallet_common::account::CrossAccountId;3435pub fn withdraw_transfer<T: Config>(36 collection: &CollectionHandle<T>,37 who: &T::CrossAccountId,38 item_id: &TokenId,39) -> Option<()> {40 // preliminary sponsoring correctness check41 match collection.mode {42 CollectionMode::NFT => {43 let owner = pallet_nonfungible::TokenData::<T>::get((collection.id, item_id))?.owner;44 if !owner.conv_eq(who) {45 return None;46 }47 }48 CollectionMode::Fungible(_) => {49 if item_id != &TokenId::default() {50 return None;51 }52 if <pallet_fungible::Balance<T>>::get((collection.id, who)) == 0 {53 return None;54 }55 }56 CollectionMode::ReFungible => {57 if !<pallet_refungible::Owned<T>>::get((collection.id, who, item_id)) {58 return None;59 }60 }61 }6263 // sponsor timeout64 let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;65 let limit = collection66 .limits67 .sponsor_transfer_timeout(match collection.mode {68 CollectionMode::NFT => NFT_SPONSOR_TRANSFER_TIMEOUT,69 CollectionMode::Fungible(_) => FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,70 CollectionMode::ReFungible => REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,71 });7273 let last_tx_block = match collection.mode {74 CollectionMode::NFT => <NftTransferBasket<T>>::get(collection.id, item_id),75 CollectionMode::Fungible(_) => {76 <FungibleTransferBasket<T>>::get(collection.id, who.as_sub())77 }78 CollectionMode::ReFungible => {79 <ReFungibleTransferBasket<T>>::get((collection.id, item_id, who.as_sub()))80 }81 };8283 if let Some(last_tx_block) = last_tx_block {84 let timeout = last_tx_block + limit.into();85 if block_number < timeout {86 return None;87 }88 }8990 match collection.mode {91 CollectionMode::NFT => <NftTransferBasket<T>>::insert(collection.id, item_id, block_number),92 CollectionMode::Fungible(_) => {93 <FungibleTransferBasket<T>>::insert(collection.id, who.as_sub(), block_number)94 }95 CollectionMode::ReFungible => <ReFungibleTransferBasket<T>>::insert(96 (collection.id, item_id, who.as_sub()),97 block_number,98 ),99 };100101 Some(())102}103104pub fn withdraw_create_item<T: Config>(105 collection: &CollectionHandle<T>,106 who: &T::AccountId,107 _properties: &CreateItemData,108) -> Option<()> {109 if _properties.data_size() as u32 > collection.limits.sponsored_data_size() {110 return None;111 }112113 // sponsor timeout114 let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;115 let limit = collection116 .limits117 .sponsor_transfer_timeout(match _properties {118 CreateItemData::NFT(_) => NFT_SPONSOR_TRANSFER_TIMEOUT,119 CreateItemData::Fungible(_) => FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,120 CreateItemData::ReFungible(_) => REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,121 });122123 if let Some(last_tx_block) = <CreateItemBasket<T>>::get((collection.id, &who)) {124 let timeout = last_tx_block + limit.into();125 if block_number < timeout {126 return None;127 }128 }129130 CreateItemBasket::<T>::insert((collection.id, who.clone()), block_number);131132 Some(())133}134135pub fn withdraw_set_variable_meta_data<T: Config>(136 who: &T::CrossAccountId,137 collection: &CollectionHandle<T>,138 item_id: &TokenId,139 data: &[u8],140) -> Option<()> {141 // TODO: make it work for admins142 if collection.meta_update_permission != MetaUpdatePermission::ItemOwner {143 return None;144 }145 // preliminary sponsoring correctness check146 match collection.mode {147 CollectionMode::NFT => {148 let owner = pallet_nonfungible::TokenData::<T>::get((collection.id, item_id))?.owner;149 if !owner.conv_eq(who) {150 return None;151 }152 }153 CollectionMode::Fungible(_) => {154 if item_id != &TokenId::default() {155 return None;156 }157 if <pallet_fungible::Balance<T>>::get((collection.id, who)) == 0 {158 return None;159 }160 }161 CollectionMode::ReFungible => {162 if !<pallet_refungible::Owned<T>>::get((collection.id, who, item_id)) {163 return None;164 }165 }166 }167168 // Can't sponsor fungible collection, this tx will be rejected169 // as invalid170 if matches!(collection.mode, CollectionMode::Fungible(_)) {171 return None;172 }173 if data.len() > collection.limits.sponsored_data_size() as usize {174 return None;175 }176177 let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;178 let limit = collection.limits.sponsored_data_rate_limit()?;179180 if let Some(last_tx_block) = VariableMetaDataBasket::<T>::get(collection.id, item_id) {181 let timeout = last_tx_block + limit.into();182 if block_number < timeout {183 return None;184 }185 }186187 <VariableMetaDataBasket<T>>::insert(collection.id, item_id, block_number);188189 Some(())190}191192pub fn withdraw_approve<T: Config>(193 collection: &CollectionHandle<T>,194 who: &T::AccountId,195 item_id: &TokenId,196) -> Option<()> {197 // sponsor timeout198 let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;199 let limit = collection.limits.sponsor_approve_timeout();200201 let last_tx_block = match collection.mode {202 CollectionMode::NFT => <NftApproveBasket<T>>::get(collection.id, item_id),203 CollectionMode::Fungible(_) => <FungibleApproveBasket<T>>::get(collection.id, who),204 CollectionMode::ReFungible => {205 <RefungibleApproveBasket<T>>::get((collection.id, item_id, who))206 }207 };208209 if let Some(last_tx_block) = last_tx_block {210 let timeout = last_tx_block + limit.into();211 if block_number < timeout {212 return None;213 }214 }215216 match collection.mode {217 CollectionMode::NFT => <NftApproveBasket<T>>::insert(collection.id, item_id, block_number),218 CollectionMode::Fungible(_) => {219 <FungibleApproveBasket<T>>::insert(collection.id, who, block_number)220 }221 CollectionMode::ReFungible => {222 <RefungibleApproveBasket<T>>::insert((collection.id, item_id, who), block_number)223 }224 };225226 Some(())227}228229fn load<T: Config>(id: CollectionId) -> Option<(T::AccountId, CollectionHandle<T>)> {230 let collection = CollectionHandle::new(id)?;231 let sponsor = collection.sponsorship.sponsor().cloned()?;232 Some((sponsor, collection))233}234235pub struct UniqueSponsorshipHandler<T>(PhantomData<T>);236impl<T, C> SponsorshipHandler<T::AccountId, C> for UniqueSponsorshipHandler<T>237where238 T: Config,239 C: IsSubType<Call<T>>,240{241 fn get_sponsor(who: &T::AccountId, call: &C) -> Option<T::AccountId> {242 match IsSubType::<Call<T>>::is_sub_type(call)? {243 Call::create_item {244 collection_id,245 data,246 ..247 } => {248 let (sponsor, collection) = load(*collection_id)?;249 withdraw_create_item::<T>(&collection, who, data).map(|()| sponsor)250 }251 Call::transfer {252 collection_id,253 item_id,254 ..255 } => {256 let (sponsor, collection) = load(*collection_id)?;257 withdraw_transfer::<T>(258 &collection,259 &T::CrossAccountId::from_sub(who.clone()),260 item_id,261 )262 .map(|()| sponsor)263 }264 Call::transfer_from {265 collection_id,266 item_id,267 from,268 ..269 } => {270 let (sponsor, collection) = load(*collection_id)?;271 withdraw_transfer::<T>(&collection, from, item_id).map(|()| sponsor)272 }273 Call::approve {274 collection_id,275 item_id,276 ..277 } => {278 let (sponsor, collection) = load(*collection_id)?;279 withdraw_approve::<T>(&collection, who, item_id).map(|()| sponsor)280 }281 Call::set_variable_meta_data {282 collection_id,283 item_id,284 data,285 } => {286 let (sponsor, collection) = load(*collection_id)?;287 withdraw_set_variable_meta_data::<T>(288 &T::CrossAccountId::from_sub(who.clone()),289 &collection,290 item_id,291 data,292 )293 .map(|()| sponsor)294 }295 _ => None,296 }297 }298}runtime/opal/src/lib.rsdiffbeforeafterboth--- a/runtime/opal/src/lib.rs
+++ b/runtime/opal/src/lib.rs
@@ -152,7 +152,7 @@
spec_name: create_runtime_str!(RUNTIME_NAME),
impl_name: create_runtime_str!(RUNTIME_NAME),
authoring_version: 1,
- spec_version: 918000,
+ spec_version: 918001,
impl_version: 0,
apis: RUNTIME_API_VERSIONS,
transaction_version: 1,
runtime/quartz/src/lib.rsdiffbeforeafterboth--- a/runtime/quartz/src/lib.rs
+++ b/runtime/quartz/src/lib.rs
@@ -152,7 +152,7 @@
spec_name: create_runtime_str!(RUNTIME_NAME),
impl_name: create_runtime_str!(RUNTIME_NAME),
authoring_version: 1,
- spec_version: 918000,
+ spec_version: 918001,
impl_version: 0,
apis: RUNTIME_API_VERSIONS,
transaction_version: 1,
runtime/unique/src/lib.rsdiffbeforeafterboth--- a/runtime/unique/src/lib.rs
+++ b/runtime/unique/src/lib.rs
@@ -151,7 +151,7 @@
spec_name: create_runtime_str!(RUNTIME_NAME),
impl_name: create_runtime_str!(RUNTIME_NAME),
authoring_version: 1,
- spec_version: 918000,
+ spec_version: 918001,
impl_version: 0,
apis: RUNTIME_API_VERSIONS,
transaction_version: 1,