Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NFT Lock Mechanism #76

Merged
merged 21 commits into from
May 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
935ba04
Add the Uniques pallet temporarily for dev purposes
HashWarlock Mar 1, 2022
644475b
Create the dependency injection trait Locker and default check_should…
HashWarlock Mar 10, 2022
8a2cb9c
Implement Locker trait in RMRK core pallet and add lock logic to down…
HashWarlock Mar 11, 2022
cc03548
Merge branch 'main' into feat/nft-lock-logic
HashWarlock Mar 11, 2022
ba1f9dd
Fix merge errors and update cargo.toml file dependencies
HashWarlock Mar 11, 2022
6fc947a
Add check_should_lock function to do_equip and check for both collect…
HashWarlock Mar 11, 2022
f208429
Add Locker trait to mock for equip pallet
HashWarlock Mar 11, 2022
bf8279f
Add a test to directly call Uniques do_transfer function
HashWarlock Mar 11, 2022
28f7890
Temporarily use substrate branch with Uniques locker trait implementa…
HashWarlock Mar 13, 2022
dfe3ca1
Updates to change impl function of Locker to is_locked and correct so…
HashWarlock Mar 14, 2022
ad3f45f
Updated functions to use Locker trait from frame_support::traits
HashWarlock Mar 16, 2022
59e4e0c
Merge branch 'main' into feat/nft-lock-logic
HashWarlock Mar 17, 2022
d312c69
Update files using wrong Locker trait
HashWarlock Mar 17, 2022
62a5e94
Update Cargo file
HashWarlock Mar 17, 2022
3d0aac2
Merge branch 'main' into feat/nft-lock-logic
HashWarlock Mar 18, 2022
2238e68
Update to functions and run cargo fmt for formatting
HashWarlock Mar 18, 2022
01de754
Moved Locker trait to tokens trait folder
HashWarlock Mar 23, 2022
fc73928
Update Cargo with latest
HashWarlock Mar 23, 2022
668b178
Update base before updating cargo
HashWarlock May 5, 2022
053d87b
Merge to update branch
HashWarlock May 5, 2022
f5155fc
Update to polkadot-v0.9.22 along with code dependencies and tests fro…
HashWarlock May 18, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2,760 changes: 1,553 additions & 1,207 deletions Cargo.lock

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions docs/pallets/rmrk-market.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ Buy a listed NFT. Ensure that the NFT is available for purchase and has not rece
```rust
collection_id: CollectionId,
nft_id: NftId
amount: Option<BalanceOf<T>>
```

### **list**
Expand Down
70 changes: 40 additions & 30 deletions node/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,47 +19,57 @@ targets = ["x86_64-unknown-linux-gnu"]
[dependencies]
clap = { version = "3.0", features = ["derive"] }

sc-cli = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18", features = ["wasmtime"] }
sp-core = { version = "6.0.0", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sc-executor = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18", features = ["wasmtime"] }
sc-service = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18", features = ["wasmtime"] }
sc-telemetry = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sc-keystore = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sc-transaction-pool = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sc-transaction-pool-api = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sc-consensus-aura = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sp-consensus-aura = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sp-consensus = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sc-consensus = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sc-finality-grandpa = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sp-finality-grandpa = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sc-client-api = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sp-runtime = { version = "6.0.0", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sp-timestamp = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sc-cli = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22", features = ["wasmtime"] }
sp-core = { version = "6.0.0", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sc-executor = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22", features = ["wasmtime"] }
sc-service = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22", features = ["wasmtime"] }
sc-telemetry = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sc-keystore = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sc-transaction-pool = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sc-transaction-pool-api = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sc-consensus-aura = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sp-consensus-aura = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sp-consensus = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sc-consensus = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sc-finality-grandpa = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sp-finality-grandpa = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sc-client-api = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sp-runtime = { version = "6.0.0", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sp-timestamp = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sp-inherents = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sp-keyring = { version = "6.0.0", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
frame-system = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
pallet-transaction-payment = { version = "4.0.0-dev", default-features = false, git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }

# These dependencies are used for the node template"s RPCs
jsonrpc-core = "18.0.0"
sc-rpc = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sp-api = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sc-rpc-api = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sp-blockchain = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sp-block-builder = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
sc-basic-authorship = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
substrate-frame-rpc-system = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
pallet-transaction-payment-rpc = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
jsonrpsee = { version = "0.13.0", features = ["server"] }
sc-rpc = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sp-api = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sc-rpc-api = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sp-blockchain = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sp-block-builder = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
sc-basic-authorship = { version = "0.10.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
substrate-frame-rpc-system = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
pallet-transaction-payment-rpc = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }

# These dependencies are used for runtime benchmarking
frame-benchmarking = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
frame-benchmarking-cli = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
frame-benchmarking = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }
frame-benchmarking-cli = { version = "4.0.0-dev", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }

# Local Dependencies
rmrk-substrate-runtime = { version = "4.0.0-dev", path = "../runtime" }

# CLI-specific dependencies
try-runtime-cli = { version = "0.10.0-dev", optional = true, git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }

[build-dependencies]
substrate-build-script-utils = { version = "3.0.0", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.18" }
substrate-build-script-utils = { version = "3.0.0", git = "https:/paritytech/substrate.git", branch = "polkadot-v0.9.22" }

[features]
default = []
runtime-benchmarks = [
"rmrk-substrate-runtime/runtime-benchmarks",
]
]
# Enable features that allow the runtime to be tried and debugged. Name might be subject to change
# in the near future.
try-runtime = ["try-runtime-cli"]
1 change: 0 additions & 1 deletion node/src/chain_spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ pub fn development_config() -> Result<ChainSpec, String> {
))
}


pub fn local_testnet_config() -> Result<ChainSpec, String> {
let wasm_binary = WASM_BINARY.ok_or_else(|| "Development wasm not available".to_string())?;

Expand Down
15 changes: 13 additions & 2 deletions node/src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,17 @@ pub enum Subcommand {
Revert(sc_cli::RevertCmd),

/// The custom benchmark subcommand benchmarking runtime pallets.
#[clap(name = "benchmark", about = "Benchmark runtime pallets.")]
#[clap(subcommand)]
Benchmark(frame_benchmarking_cli::BenchmarkCmd),
}

/// Try some command against runtime state.
#[cfg(feature = "try-runtime")]
TryRuntime(try_runtime_cli::TryRuntimeCmd),

/// Try some command against runtime state. Note: `try-runtime` feature must be enabled.
#[cfg(not(feature = "try-runtime"))]
TryRuntime,

/// Db meta columns information.
ChainInfo(sc_cli::ChainInfoCmd),
}
79 changes: 69 additions & 10 deletions node/src/command.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
use crate::{
chain_spec,
cli::{Cli, Subcommand},
command_helper::{inherent_benchmark_data, BenchmarkExtrinsicBuilder},
service,
};
use frame_benchmarking_cli::{BenchmarkCmd, SUBSTRATE_REFERENCE_HARDWARE};
use rmrk_substrate_runtime::Block;
use sc_cli::{ChainSpec, RuntimeVersion, SubstrateCli};
use sc_service::PartialComponents;
use std::sync::Arc;

impl SubstrateCli for Cli {
fn impl_name() -> String {
Expand Down Expand Up @@ -95,19 +98,75 @@ pub fn run() -> sc_cli::Result<()> {
runner.async_run(|config| {
let PartialComponents { client, task_manager, backend, .. } =
service::new_partial(&config)?;
Ok((cmd.run(client, backend), task_manager))
let aux_revert = Box::new(|client, _, blocks| {
sc_finality_grandpa::revert(client, blocks)?;
Ok(())
});
Ok((cmd.run(client, backend, Some(aux_revert)), task_manager))
})
},
Some(Subcommand::Benchmark(cmd)) =>
if cfg!(feature = "runtime-benchmarks") {
let runner = cli.create_runner(cmd)?;
Some(Subcommand::Benchmark(cmd)) => {
let runner = cli.create_runner(cmd)?;

runner.sync_run(|config| {
// This switch needs to be in the client, since the client decides
// which sub-commands it wants to support.
match cmd {
BenchmarkCmd::Pallet(cmd) => {
if !cfg!(feature = "runtime-benchmarks") {
return Err(
"Runtime benchmarking wasn't enabled when building the node. \
You can enable it with `--features runtime-benchmarks`."
.into(),
)
}

cmd.run::<Block, service::ExecutorDispatch>(config)
},
BenchmarkCmd::Block(cmd) => {
let PartialComponents { client, .. } = service::new_partial(&config)?;
cmd.run(client)
},
BenchmarkCmd::Storage(cmd) => {
let PartialComponents { client, backend, .. } =
service::new_partial(&config)?;
let db = backend.expose_db();
let storage = backend.expose_storage();

runner.sync_run(|config| cmd.run::<Block, service::ExecutorDispatch>(config))
} else {
Err("Benchmarking wasn't enabled when building the node. You can enable it with \
`--features runtime-benchmarks`."
.into())
},
cmd.run(config, client, db, storage)
},
BenchmarkCmd::Overhead(cmd) => {
let PartialComponents { client, .. } = service::new_partial(&config)?;
let ext_builder = BenchmarkExtrinsicBuilder::new(client.clone());

cmd.run(config, client, inherent_benchmark_data()?, Arc::new(ext_builder))
},
BenchmarkCmd::Machine(cmd) =>
cmd.run(&config, SUBSTRATE_REFERENCE_HARDWARE.clone()),
}
})
},
#[cfg(feature = "try-runtime")]
Some(Subcommand::TryRuntime(cmd)) => {
let runner = cli.create_runner(cmd)?;
runner.async_run(|config| {
// we don't need any of the components of new_partial, just a runtime, or a task
// manager to do `async_run`.
let registry = config.prometheus_config.as_ref().map(|cfg| &cfg.registry);
let task_manager =
sc_service::TaskManager::new(config.tokio_handle.clone(), registry)
.map_err(|e| sc_cli::Error::Service(sc_service::Error::Prometheus(e)))?;
Ok((cmd.run::<Block, service::ExecutorDispatch>(config), task_manager))
})
},
#[cfg(not(feature = "try-runtime"))]
Some(Subcommand::TryRuntime) => Err("TryRuntime wasn't enabled when building the node. \
You can enable it with `--features try-runtime`."
.into()),
Some(Subcommand::ChainInfo(cmd)) => {
let runner = cli.create_runner(cmd)?;
runner.sync_run(|config| cmd.run::<Block>(&config))
},
None => {
let runner = cli.create_runner(&cli.run)?;
runner.run_node_until_exit(|config| async move {
Expand Down
129 changes: 129 additions & 0 deletions node/src/command_helper.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
// This file is part of Substrate.

// Copyright (C) 2022 Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.

//! Contains code to setup the command invocations in [`super::command`] which would
//! otherwise bloat that module.

use crate::service::FullClient;

use rmrk_substrate_runtime as runtime;
use runtime::SystemCall;
use sc_cli::Result;
use sc_client_api::BlockBackend;
use sp_core::{Encode, Pair};
use sp_inherents::{InherentData, InherentDataProvider};
use sp_keyring::Sr25519Keyring;
use sp_runtime::{OpaqueExtrinsic, SaturatedConversion};

use std::{sync::Arc, time::Duration};

/// Generates extrinsics for the `benchmark overhead` command.
///
/// Note: Should only be used for benchmarking.
pub struct BenchmarkExtrinsicBuilder {
client: Arc<FullClient>,
}

impl BenchmarkExtrinsicBuilder {
/// Creates a new [`Self`] from the given client.
pub fn new(client: Arc<FullClient>) -> Self {
Self { client }
}
}

impl frame_benchmarking_cli::ExtrinsicBuilder for BenchmarkExtrinsicBuilder {
fn remark(&self, nonce: u32) -> std::result::Result<OpaqueExtrinsic, &'static str> {
let acc = Sr25519Keyring::Bob.pair();
let extrinsic: OpaqueExtrinsic = create_benchmark_extrinsic(
self.client.as_ref(),
acc,
SystemCall::remark { remark: vec![] }.into(),
nonce,
)
.into();

Ok(extrinsic)
}
}

/// Create a transaction using the given `call`.
///
/// Note: Should only be used for benchmarking.
pub fn create_benchmark_extrinsic(
client: &FullClient,
sender: sp_core::sr25519::Pair,
call: runtime::Call,
nonce: u32,
) -> runtime::UncheckedExtrinsic {
let genesis_hash = client.block_hash(0).ok().flatten().expect("Genesis block exists; qed");
let best_hash = client.chain_info().best_hash;
let best_block = client.chain_info().best_number;

let period = runtime::BlockHashCount::get()
.checked_next_power_of_two()
.map(|c| c / 2)
.unwrap_or(2) as u64;
let extra: runtime::SignedExtra = (
frame_system::CheckSpecVersion::<runtime::Runtime>::new(),
frame_system::CheckTxVersion::<runtime::Runtime>::new(),
frame_system::CheckGenesis::<runtime::Runtime>::new(),
frame_system::CheckEra::<runtime::Runtime>::from(sp_runtime::generic::Era::mortal(
period,
best_block.saturated_into(),
)),
frame_system::CheckNonce::<runtime::Runtime>::from(nonce),
frame_system::CheckWeight::<runtime::Runtime>::new(),
pallet_transaction_payment::ChargeTransactionPayment::<runtime::Runtime>::from(0),
);

let raw_payload = runtime::SignedPayload::from_raw(
call.clone(),
extra.clone(),
(
runtime::VERSION.spec_version,
runtime::VERSION.transaction_version,
genesis_hash,
best_hash,
(),
(),
(),
),
);
let signature = raw_payload.using_encoded(|e| sender.sign(e));

runtime::UncheckedExtrinsic::new_signed(
call.clone(),
sp_runtime::AccountId32::from(sender.public()).into(),
runtime::Signature::Sr25519(signature.clone()),
extra.clone(),
)
}

/// Generates inherent data for the `benchmark overhead` command.
///
/// Note: Should only be used for benchmarking.
pub fn inherent_benchmark_data() -> Result<InherentData> {
let mut inherent_data = InherentData::new();
let d = Duration::from_millis(0);
let timestamp = sp_timestamp::InherentDataProvider::new(d.into());

timestamp
.provide_inherent_data(&mut inherent_data)
.map_err(|e| format!("creating inherent data: {:?}", e))?;
Ok(inherent_data)
}
1 change: 1 addition & 0 deletions node/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ mod chain_spec;
mod service;
mod cli;
mod command;
mod command_helper;
mod rpc;

fn main() -> sc_cli::Result<()> {
Expand Down
Loading