difftreelog
Merge pull request #202 from UniqueNetwork/fix/invalid-mode-evm-sponsoring
in: master
Remove "invalid" collection mode, update frontier for sponsoring fixes, readme update, setVariableMetadata usage due CORE-37
13 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2342,7 +2342,7 @@
[[package]]
name = "fc-consensus"
version = "2.0.0-dev"
-source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#264af3adc427aefba9ce8a1c5d1c11a6d98d009c"
+source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#9e8630ae4e420f764dad25eec1e0ef41cf6a2694"
dependencies = [
"async-trait",
"derive_more",
@@ -2369,7 +2369,7 @@
[[package]]
name = "fc-db"
version = "2.0.0-dev"
-source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#264af3adc427aefba9ce8a1c5d1c11a6d98d009c"
+source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#9e8630ae4e420f764dad25eec1e0ef41cf6a2694"
dependencies = [
"fp-storage",
"kvdb",
@@ -2385,7 +2385,7 @@
[[package]]
name = "fc-mapping-sync"
version = "2.0.0-dev"
-source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#264af3adc427aefba9ce8a1c5d1c11a6d98d009c"
+source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#9e8630ae4e420f764dad25eec1e0ef41cf6a2694"
dependencies = [
"fc-consensus",
"fc-db",
@@ -2403,7 +2403,7 @@
[[package]]
name = "fc-rpc"
version = "2.0.0-dev"
-source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#264af3adc427aefba9ce8a1c5d1c11a6d98d009c"
+source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#9e8630ae4e420f764dad25eec1e0ef41cf6a2694"
dependencies = [
"ethereum",
"ethereum-types",
@@ -2444,7 +2444,7 @@
[[package]]
name = "fc-rpc-core"
version = "1.1.0-dev"
-source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#264af3adc427aefba9ce8a1c5d1c11a6d98d009c"
+source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#9e8630ae4e420f764dad25eec1e0ef41cf6a2694"
dependencies = [
"ethereum-types",
"jsonrpc-core 15.1.0",
@@ -2564,7 +2564,7 @@
[[package]]
name = "fp-consensus"
version = "2.0.0-dev"
-source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#264af3adc427aefba9ce8a1c5d1c11a6d98d009c"
+source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#9e8630ae4e420f764dad25eec1e0ef41cf6a2694"
dependencies = [
"ethereum",
"parity-scale-codec",
@@ -2578,7 +2578,7 @@
[[package]]
name = "fp-evm"
version = "3.0.0-dev"
-source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#264af3adc427aefba9ce8a1c5d1c11a6d98d009c"
+source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#9e8630ae4e420f764dad25eec1e0ef41cf6a2694"
dependencies = [
"evm",
"impl-trait-for-tuples 0.1.3",
@@ -2591,7 +2591,7 @@
[[package]]
name = "fp-rpc"
version = "3.0.0-dev"
-source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#264af3adc427aefba9ce8a1c5d1c11a6d98d009c"
+source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#9e8630ae4e420f764dad25eec1e0ef41cf6a2694"
dependencies = [
"ethereum",
"ethereum-types",
@@ -2607,7 +2607,7 @@
[[package]]
name = "fp-storage"
version = "2.0.0"
-source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#264af3adc427aefba9ce8a1c5d1c11a6d98d009c"
+source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#9e8630ae4e420f764dad25eec1e0ef41cf6a2694"
[[package]]
name = "frame-benchmarking"
@@ -3239,9 +3239,9 @@
[[package]]
name = "hex-literal"
-version = "0.3.1"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5af1f635ef1bc545d78392b136bfe1c9809e029023c84a3638a864a10b8819c8"
+checksum = "21e4590e13640f19f249fe3e4eca5113bc4289f2497710378190e7f4bd96f45b"
[[package]]
name = "hex_fmt"
@@ -5841,7 +5841,7 @@
[[package]]
name = "pallet-ethereum"
version = "4.0.0-dev"
-source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#264af3adc427aefba9ce8a1c5d1c11a6d98d009c"
+source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#9e8630ae4e420f764dad25eec1e0ef41cf6a2694"
dependencies = [
"ethereum",
"ethereum-types",
@@ -5869,7 +5869,7 @@
[[package]]
name = "pallet-evm"
version = "6.0.0-dev"
-source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#264af3adc427aefba9ce8a1c5d1c11a6d98d009c"
+source = "git+https://github.com/uniquenetwork/frontier.git?branch=injected-transactions-parachain#9e8630ae4e420f764dad25eec1e0ef41cf6a2694"
dependencies = [
"evm",
"evm-gasometer",
README.mddiffbeforeafterboth123# NFT Parachain45## Project Description67The NFT Pallet is the core of NFT functionality. Like ERC-721 standard in Ethereum ecosystem, this pallet provides the8basement for creating collections of unique non-divisible things, also called Non Fungible Tokens (NFTs), minting NFT of9a given Collection, and managing their ownership.1011The pallet also enables storing NFT properties. Though (according to ERC-721) NFT properties belong to logic of a12concrete application that operates a Collection, so purposefully the NFT Tracking Module does not have any knowledge13about properties except their byte size leaving application logic out to be controlled by Smart Contracts.1415The NFT Chain also provides:1617- Smart Contracts Pallet and example smart contract that interacts with NFT Runtime18- ERC-1155 Functionality (currently PoC as Re-Fungible tokens, i.e. items that are still unique, but that can be split19 between multiple users)20- Variety of economic options for dapp producers to choose from to create freemium games and other ways to attract21 users. As a step one, we implemented an economic model when a collection sponsor can be set to pay for collection22 Transfer transactions.2324Wider NFT Ecosystem (most of it was developed during Hackusama):2526- [SubstraPunks Game hosted on IPFS](https://github.com/usetech-llc/substrapunks)27- [NFT Wallet and UI](https://uniqueapps.usetech.com/#/nft)28- [NFT Asset for Unity Framework](https://github.com/usetech-llc/nft_unity)2930Please see our [walk-thorugh instructions](doc/hackusama_walk_through.md) to try everything out!3132## Hackusama Update3334During the Kusama Hackaphon the following changes were made:3536- Enabled Smart Contracts Pallet37- Enabled integration between Smart Contracts and NFT Pallet (required special edition of RC4 Substrate version)38- Fixed misc. bugs in NFT Pallet39- Deployed NFT TestNet. Public node available at wss://unique.usetech.com, custom UI types - see below in this README.40- New Features:41 - Re-Fungible Token Mode42 - Off-Chain Schema to store token image URLs43 - Alternative economic model44 - White Lists and Public Mint Permission45- Use example: [SubstraPunks Game](https://github.com/usetech-llc/substrapunks), fully hosted on IPFS and NFT Testnet46 Blockchain.4748## Application Development4950If you are building an application that operates NFT tokens, use [this document](doc/application_development.md).5152## Building5354Building NFT chain requires special versions of Rust and toolchain. We don't use the most recent versions of everything55so that we can keep the builds stable.56571. Install Rust:5859```bash60curl https://sh.rustup.rs -sSf | sh61sudo apt-get install libssl-dev pkg-config libclang-dev clang62```63642. Remove all installed toolchains with `rustup toolchain list` and `rustup toolchain uninstall <toolchain>`.65663. Install install nightly 2021-03-01 and make it default:6768```bash69rustup toolchain install nightly-2021-03-0170rustup default nightly-2021-03-0171```72734. Add wasm target for nightly toolchain:7475```bash76rustup target add wasm32-unknown-unknown --toolchain nightly-2021-03-0177```78795. Build:80```bash81cargo build82```8384optionally, build in release:85```bash86cargo build --release87```8889## Run9091You can start a development chain with:9293```bash94cargo run -- --dev95```9697Detailed logs may be shown by running the node with the following environment variables set:98`RUST_LOG=debug RUST_BACKTRACE=1 cargo run -- --dev`.99100If you want to see the multi-node consensus algorithm in action locally, then you can create a local testnet with two101validator nodes for Alice and Bob, who are the initial authorities of the genesis chain that have been endowed with102testnet units. Give each node a name and expose them so they are listed on the Polkadot103[telemetry site](https://telemetry.polkadot.io/#/Local%20Testnet). You'll need two terminal windows open.104105We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at106`/tmp/alice`. The bootnode ID of her node is `QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN`, which is generated from107the `--node-key` value that we specify below:108109```bash110cargo run -- \111 --base-path /tmp/alice \112 --chain=local \113 --alice \114 --node-key 0000000000000000000000000000000000000000000000000000000000000001 \115 --telemetry-url ws://telemetry.polkadot.io:1024 \116 --validator117```118119In the second terminal, we'll start Bob's substrate node on a different TCP port of 30334, and with his chain database120stored locally at `/tmp/bob`. We'll specify a value for the `--bootnodes` option that will connect his node to Alice's121bootnode ID on TCP port 30333:122123```bash124cargo run -- \125 --base-path /tmp/bob \126 --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN \127 --chain=local \128 --bob \129 --port 30334 \130 --telemetry-url ws://telemetry.polkadot.io:1024 \131 --validator132```133134Additional CLI usage options are available and may be shown by running `cargo run -- --help`.135136## Building and Running as Parachain locally137138Rust toolchain: nightly-2021-04-23139Note: checkout this project and polkadot project (see below) in the sibling folders (both under the same folder)140141### Build relay142143```144git clone https://github.com/paritytech/polkadot.git145cd polkadot146git checkout aa386760147cargo build --release148```149150### Build parachain151152Run in the root of this project:153```154cargo --build155```156157### Run 4-node Relay1581591. Download `rococo-custom-4.json` chain spec here: https://substrate.dev/cumulus-workshop/shared/chainspecs/rococo-custom-4.json1602. Use these instructions to launch 4 nodes: https://substrate.dev/cumulus-workshop/#/en/2-relay-chain/1-launch161162Example (Run in polkadot folder. Replace `12D3KooWNLAmKcyee3oqSgTMthaQVXaAcXeo8RrGCzMfMVA3B5on` with output from Alice node):163```164./target/release/polkadot --alice --validator --base-path ./cumulus_relay0 --chain rococo-custom-4.json --port 50555 --ws-port 9944165./target/release/polkadot --bob --validator --base-path ./cumulus_relay1 --chain rococo-custom-4.json --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWNLAmKcyee3oqSgTMthaQVXaAcXeo8RrGCzMfMVA3B5on --port 50556 --ws-port 9945166./target/release/polkadot --charlie --validator --base-path ./cumulus_relay1 --chain rococo-custom-4.json --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWNLAmKcyee3oqSgTMthaQVXaAcXeo8RrGCzMfMVA3B5on --port 50557 --ws-port 9946167./target/release/polkadot --dave --validator --base-path ./cumulus_relay1 --chain rococo-custom-4.json --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWNLAmKcyee3oqSgTMthaQVXaAcXeo8RrGCzMfMVA3B5on --port 50558 --ws-port 9947168169```1701713. Export genesis state and runtime wasm from NFT parachain:172173Run from this project root:174```175./target/release/nft export-genesis-state --parachain-id 2000 > ./resources/para-2000-genesis176./target/release/nft export-genesis-wasm > ./resources/para-2000-wasm177```1781794. Run two parachain nodes:180181Replace `12D3KooWN1ah2bFQSysEFnwZqcmcVpDDR8UedXyo6xfzV1zDNMNg` with Alice or Bob relay ID182183Run from this project root:184```185./target/release/nft --alice --collator --force-authoring --base-path ./tmp/parachain-alice --parachain-id 2000 --port 40333 --ws-port 9844 -- --execution wasm --chain ../polkadot/rococo-custom-4.json --port 30343 --ws-port 9977186./target/release/nft --bob --collator --force-authoring --parachain-id 2000 --base-path ./tmp/parachain/bob --port 40334 --ws-port 9845 -- --execution wasm --chain ../polkadot/rococo-custom-4.json --port 30344 --ws-port 9978 --bootnodes /ip4/127.0.0.1/tcp/50556/p2p/12D3KooWN1ah2bFQSysEFnwZqcmcVpDDR8UedXyo6xfzV1zDNMNg187```1881894. Reserve parachain ID as described here: https://substrate.dev/cumulus-workshop/#/en/2-relay-chain/2-reserve1901915. Register parachain in relay as described here: https://substrate.dev/cumulus-workshop/#/en/3-parachains/2-register192193194## Run Integration Tests1951961. Install all needed dependecies197```198cd tests199yarn install200```2012022. Run tests203```204yarn test205```206207## Benchmarks208209First of all, add rust toolchain and make it default.210```bash211rustup target add wasm32-unknown-unknown --toolchain nightly-2020-10-01212```213214Then in "/node/src" run build command below215```bash216cargo +nightly-2020-10-01 build --release --features runtime-benchmarks217```218219Run benchmark220```bash221target/release/nft benchmark --chain dev --pallet "pallet_nft" --extrinsic "*" --repeat 1222```223224## UI custom types225226Moved to [runtime_types.json](./runtime_types.json).227228## Running Integration Tests229230See [tests/README.md](./tests/README.md).231232## Code Formatting233234### Get formatter and linter settings into your branch (if you forked before they were introduced)235```bash236git cherry-pick -n 8ff77c21b0d30b2a4648fa35dbf61dfa9d3948a7237```238239### Apply formatting and clippy fixes240```bash241cargo clippy242cargo fmt243```244245### Format tests246```bash247pushd tests && yarn fix ; popd248```249250### Check code style in tests251```bash252cd tests && yarn eslint --ext .ts,.js src/253```254255## Re-Enabling Ink! Contracts256257Uncomment following lies:2581. In node/rpc/Cargo.toml259```260# pallet-contracts-rpc = { version = "3.0", git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.9' }261```2622632. In node/rpc/src/lib.rs264```265// C::Api: pallet_contracts_rpc::ContractsRuntimeApi<Block, AccountId, Balance, BlockNumber, Hash>,266...267// use pallet_contracts_rpc::{Contracts, ContractsApi};268...269// io.extend_with(ContractsApi::to_delegate(Contracts::new(client.clone())));270271```2722733. In runtime/Cargo.toml274```275 # 'pallet-contracts/std',276 # 'pallet-contracts-primitives/std',277 # 'pallet-contracts-rpc-runtime-api/std',278 # 'pallet-contract-helpers/std',279...280 # [dependencies.pallet-contracts]281 # git = 'https://github.com/paritytech/substrate.git'282 # default-features = false283 # branch = 'polkadot-v0.9.9'284 # version = '3.0.0'285286 # [dependencies.pallet-contracts-primitives]287 # git = 'https://github.com/paritytech/substrate.git'288 # default-features = false289 # branch = 'polkadot-v0.9.9'290 # version = '3.0.0'291292 # [dependencies.pallet-contracts-rpc-runtime-api]293 # git = 'https://github.com/paritytech/substrate.git'294 # default-features = false295 # branch = 'polkadot-v0.9.9'296 # version = '3.0.0'297...298 # pallet-contract-helpers = { path = '../pallets/contract-helpers', default-features = false, version = '0.1.0' }299```3003014. runtime/src/lib.rs302```303// use pallet_contracts::weights::WeightInfo;304...305// use pallet_contracts::chain_extension::UncheckedFrom;306...307// pub use pallet_timestamp::Call as TimestampCall;308...309// mod chain_extension;310// use crate::chain_extension::{NFTExtension, Imbalance};311...312/*313parameter_types! {314 pub TombstoneDeposit: Balance = deposit(315 ...316}317*/318...319//pallet_contract_helpers::ContractSponsorshipHandler<Runtime>,320...321// impl pallet_contract_helpers::Config for Runtime {}322...323// Contracts: pallet_contracts::{Pallet, Call, Storage, Event<T>},324...325// ContractHelpers: pallet_contract_helpers::{Pallet, Call, Storage},326...327//pallet_contract_helpers::ContractHelpersExtension<Runtime>,328...329/*330 impl pallet_contracts_rpc_runtime_api::ContractsApi<Block, AccountId, Balance, BlockNumber, Hash>331 for Runtime332 {333 ...334 }335*/336337```123# NFT Parachain45## Project Description67The NFT Pallet is the core of NFT functionality. Like ERC-721 standard in Ethereum ecosystem, this pallet provides the8basement for creating collections of unique non-divisible things, also called Non Fungible Tokens (NFTs), minting NFT of9a given Collection, and managing their ownership.1011The pallet also enables storing NFT properties. Though (according to ERC-721) NFT properties belong to logic of a12concrete application that operates a Collection, so purposefully the NFT Tracking Module does not have any knowledge13about properties except their byte size leaving application logic out to be controlled by Smart Contracts.1415The NFT Chain also provides:1617- Smart Contracts Pallet and example smart contract that interacts with NFT Runtime18- ERC-1155 Functionality (currently PoC as Re-Fungible tokens, i.e. items that are still unique, but that can be split19 between multiple users)20- Variety of economic options for dapp producers to choose from to create freemium games and other ways to attract21 users. As a step one, we implemented an economic model when a collection sponsor can be set to pay for collection22 Transfer transactions.2324Wider NFT Ecosystem (most of it was developed during Hackusama):2526- [SubstraPunks Game hosted on IPFS](https://github.com/usetech-llc/substrapunks)27- [NFT Wallet and UI](https://uniqueapps.usetech.com/#/nft)28- [NFT Asset for Unity Framework](https://github.com/usetech-llc/nft_unity)2930Please see our [walk-thorugh instructions](doc/hackusama_walk_through.md) to try everything out!3132## Hackusama Update3334During the Kusama Hackaphon the following changes were made:3536- Enabled Smart Contracts Pallet37- Enabled integration between Smart Contracts and NFT Pallet (required special edition of RC4 Substrate version)38- Fixed misc. bugs in NFT Pallet39- Deployed NFT TestNet. Public node available at wss://unique.usetech.com, custom UI types - see below in this README.40- New Features:41 - Re-Fungible Token Mode42 - Off-Chain Schema to store token image URLs43 - Alternative economic model44 - White Lists and Public Mint Permission45- Use example: [SubstraPunks Game](https://github.com/usetech-llc/substrapunks), fully hosted on IPFS and NFT Testnet46 Blockchain.4748## Application Development4950If you are building an application that operates NFT tokens, use [this document](doc/application_development.md).5152## Building5354Building NFT chain requires special versions of Rust and toolchain. We don't use the most recent versions of everything55so that we can keep the builds stable.56571. Install Rust:5859```bash60curl https://sh.rustup.rs -sSf | sh61sudo apt-get install libssl-dev pkg-config libclang-dev clang62```63642. Remove all installed toolchains with `rustup toolchain list` and `rustup toolchain uninstall <toolchain>`.65663. Install install nightly 2021-06-28 and make it default:6768```bash69rustup toolchain install nightly-2021-06-2870rustup default nightly-2021-06-2871```72734. Add wasm target for nightly toolchain:7475```bash76rustup target add wasm32-unknown-unknown --toolchain nightly-2021-06-2877```78795. Build:80```bash81cargo build82```8384optionally, build in release:85```bash86cargo build --release87```8889## Run9091You can start a development chain with:9293```bash94cargo run -- --dev95```9697Detailed logs may be shown by running the node with the following environment variables set:98`RUST_LOG=debug RUST_BACKTRACE=1 cargo run -- --dev`.99100If you want to see the multi-node consensus algorithm in action locally, then you can create a local testnet with two101validator nodes for Alice and Bob, who are the initial authorities of the genesis chain that have been endowed with102testnet units. Give each node a name and expose them so they are listed on the Polkadot103[telemetry site](https://telemetry.polkadot.io/#/Local%20Testnet). You'll need two terminal windows open.104105We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at106`/tmp/alice`. The bootnode ID of her node is `QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN`, which is generated from107the `--node-key` value that we specify below:108109```bash110cargo run -- \111 --base-path /tmp/alice \112 --chain=local \113 --alice \114 --node-key 0000000000000000000000000000000000000000000000000000000000000001 \115 --telemetry-url ws://telemetry.polkadot.io:1024 \116 --validator117```118119In the second terminal, we'll start Bob's substrate node on a different TCP port of 30334, and with his chain database120stored locally at `/tmp/bob`. We'll specify a value for the `--bootnodes` option that will connect his node to Alice's121bootnode ID on TCP port 30333:122123```bash124cargo run -- \125 --base-path /tmp/bob \126 --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN \127 --chain=local \128 --bob \129 --port 30334 \130 --telemetry-url ws://telemetry.polkadot.io:1024 \131 --validator132```133134Additional CLI usage options are available and may be shown by running `cargo run -- --help`.135136## Building and Running as Parachain locally137138Rust toolchain: nightly-2021-06-28139Note: checkout this project and polkadot project (see below) in the sibling folders (both under the same folder)140141### Build relay142143```144git clone https://github.com/paritytech/polkadot.git145cd polkadot146git checkout release-v0.9.9147cargo build --release148```149150### Build parachain151152Run in the root of this project:153```154cargo --build155```156157### Run 4-node Relay1581591. Download `rococo-custom-4.json` chain spec here: https://substrate.dev/cumulus-workshop/shared/chainspecs/rococo-custom-4.json1602. Use these instructions to launch 4 nodes: https://substrate.dev/cumulus-workshop/#/en/2-relay-chain/1-launch161162Example (Run in polkadot folder. Replace `12D3KooWNLAmKcyee3oqSgTMthaQVXaAcXeo8RrGCzMfMVA3B5on` with output from Alice node):163```164./target/release/polkadot --alice --validator --base-path ./cumulus_relay0 --chain rococo-custom-4.json --port 50555 --ws-port 9944165./target/release/polkadot --bob --validator --base-path ./cumulus_relay1 --chain rococo-custom-4.json --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWNLAmKcyee3oqSgTMthaQVXaAcXeo8RrGCzMfMVA3B5on --port 50556 --ws-port 9945166./target/release/polkadot --charlie --validator --base-path ./cumulus_relay1 --chain rococo-custom-4.json --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWNLAmKcyee3oqSgTMthaQVXaAcXeo8RrGCzMfMVA3B5on --port 50557 --ws-port 9946167./target/release/polkadot --dave --validator --base-path ./cumulus_relay1 --chain rococo-custom-4.json --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWNLAmKcyee3oqSgTMthaQVXaAcXeo8RrGCzMfMVA3B5on --port 50558 --ws-port 9947168169```1701713. Export genesis state and runtime wasm from NFT parachain:172173Run from this project root:174```175./target/release/nft export-genesis-state --parachain-id 2000 > ./resources/para-2000-genesis176./target/release/nft export-genesis-wasm > ./resources/para-2000-wasm177```1781794. Run two parachain nodes:180181Replace `12D3KooWN1ah2bFQSysEFnwZqcmcVpDDR8UedXyo6xfzV1zDNMNg` with Alice or Bob relay ID182183Run from this project root:184```185./target/release/nft --alice --collator --force-authoring --base-path ./tmp/parachain-alice --parachain-id 2000 --port 40333 --ws-port 9844 -- --execution wasm --chain ../polkadot/rococo-custom-4.json --port 30343 --ws-port 9977186./target/release/nft --bob --collator --force-authoring --parachain-id 2000 --base-path ./tmp/parachain/bob --port 40334 --ws-port 9845 -- --execution wasm --chain ../polkadot/rococo-custom-4.json --port 30344 --ws-port 9978 --bootnodes /ip4/127.0.0.1/tcp/50556/p2p/12D3KooWN1ah2bFQSysEFnwZqcmcVpDDR8UedXyo6xfzV1zDNMNg187```1881894. Reserve parachain ID as described here: https://substrate.dev/cumulus-workshop/#/en/2-relay-chain/2-reserve1901915. Register parachain in relay as described here: https://substrate.dev/cumulus-workshop/#/en/3-parachains/2-register192193194## Run Integration Tests1951961. Install all needed dependecies197```198cd tests199yarn install200```2012022. Run tests203```204yarn test205```206207## Benchmarks208209First of all, add rust toolchain and make it default.210```bash211rustup target add wasm32-unknown-unknown --toolchain nightly-2021-06-28212```213214Then in "/node/src" run build command below215```bash216cargo +nightly-2021-06-28 build --release --features runtime-benchmarks217```218219Run benchmark220```bash221target/release/nft benchmark --chain dev --pallet "pallet_nft" --extrinsic "*" --repeat 1222```223224## UI custom types225226Moved to [runtime_types.json](./runtime_types.json).227228## Running Integration Tests229230See [tests/README.md](./tests/README.md).231232## Code Formatting233234### Get formatter and linter settings into your branch (if you forked before they were introduced)235```bash236git cherry-pick -n 8ff77c21b0d30b2a4648fa35dbf61dfa9d3948a7237```238239### Apply formatting and clippy fixes240```bash241cargo clippy242cargo fmt243```244245### Format tests246```bash247pushd tests && yarn fix ; popd248```249250### Check code style in tests251```bash252cd tests && yarn eslint --ext .ts,.js src/253```254255## Re-Enabling Ink! Contracts256257Uncomment following lies:2581. In node/rpc/Cargo.toml259```260# pallet-contracts-rpc = { version = "3.0", git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.9' }261```2622632. In node/rpc/src/lib.rs264```265// C::Api: pallet_contracts_rpc::ContractsRuntimeApi<Block, AccountId, Balance, BlockNumber, Hash>,266...267// use pallet_contracts_rpc::{Contracts, ContractsApi};268...269// io.extend_with(ContractsApi::to_delegate(Contracts::new(client.clone())));270271```2722733. In runtime/Cargo.toml274```275 # 'pallet-contracts/std',276 # 'pallet-contracts-primitives/std',277 # 'pallet-contracts-rpc-runtime-api/std',278 # 'pallet-contract-helpers/std',279...280 # [dependencies.pallet-contracts]281 # git = 'https://github.com/paritytech/substrate.git'282 # default-features = false283 # branch = 'polkadot-v0.9.9'284 # version = '3.0.0'285286 # [dependencies.pallet-contracts-primitives]287 # git = 'https://github.com/paritytech/substrate.git'288 # default-features = false289 # branch = 'polkadot-v0.9.9'290 # version = '3.0.0'291292 # [dependencies.pallet-contracts-rpc-runtime-api]293 # git = 'https://github.com/paritytech/substrate.git'294 # default-features = false295 # branch = 'polkadot-v0.9.9'296 # version = '3.0.0'297...298 # pallet-contract-helpers = { path = '../pallets/contract-helpers', default-features = false, version = '0.1.0' }299```3003014. runtime/src/lib.rs302```303// use pallet_contracts::weights::WeightInfo;304...305// use pallet_contracts::chain_extension::UncheckedFrom;306...307// pub use pallet_timestamp::Call as TimestampCall;308...309// mod chain_extension;310// use crate::chain_extension::{NFTExtension, Imbalance};311...312/*313parameter_types! {314 pub TombstoneDeposit: Balance = deposit(315 ...316}317*/318...319//pallet_contract_helpers::ContractSponsorshipHandler<Runtime>,320...321// impl pallet_contract_helpers::Config for Runtime {}322...323// Contracts: pallet_contracts::{Pallet, Call, Storage, Event<T>},324...325// ContractHelpers: pallet_contract_helpers::{Pallet, Call, Storage},326...327//pallet_contract_helpers::ContractHelpersExtension<Runtime>,328...329/*330 impl pallet_contracts_rpc_runtime_api::ContractsApi<Block, AccountId, Balance, BlockNumber, Hash>331 for Runtime332 {333 ...334 }335*/336337```pallets/nft/src/eth/mod.rsdiffbeforeafterboth--- a/pallets/nft/src/eth/mod.rs
+++ b/pallets/nft/src/eth/mod.rs
@@ -103,7 +103,6 @@
CollectionMode::ReFungible => {
include_bytes!("stubs/UniqueRefungible.raw") as &[u8]
}
- CollectionMode::Invalid => include_bytes!("stubs/UniqueInvalid.raw") as &[u8],
}
.to_owned()
})
pallets/nft/src/eth/stubs/UniqueInvalid.rawdiffbeforeafterboth--- a/pallets/nft/src/eth/stubs/UniqueInvalid.raw
+++ /dev/null
@@ -1 +0,0 @@
-TODO
\ No newline at end of file
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -1347,7 +1347,6 @@
sender.clone(),
recipient.clone(),
)?,
- _ => (),
};
Self::deposit_event(RawEvent::Transfer(
@@ -1493,7 +1492,6 @@
from.clone(),
recipient.clone(),
)?,
- _ => (),
};
if matches!(collection.mode, CollectionMode::Fungible(_)) {
@@ -1534,7 +1532,6 @@
Self::set_re_fungible_variable_data(collection, item_id, data)?
}
CollectionMode::Fungible(_) => fail!(Error::<T>::CantStoreMetadataInFungibleTokens),
- _ => fail!(Error::<T>::UnexpectedCollectionType),
};
Ok(())
@@ -1618,7 +1615,6 @@
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(())
@@ -1723,9 +1719,6 @@
fail!(Error::<T>::NotReFungibleDataUsedToMintReFungibleCollectionToken);
}
}
- _ => {
- fail!(Error::<T>::UnexpectedCollectionType);
- }
};
Ok(())
@@ -2034,7 +2027,6 @@
.iter()
.find(|i| i.owner == *subject)
.map(|i| i.fraction),
- CollectionMode::Invalid => None,
}
}
@@ -2071,7 +2063,6 @@
CollectionMode::ReFungible => {
<ReFungibleItemList<T>>::contains_key(collection_id, item_id)
}
- _ => false,
};
ensure!(exists, Error::<T>::TokenNotFound);
pallets/nft/src/sponsorship.rsdiffbeforeafterboth--- a/pallets/nft/src/sponsorship.rs
+++ b/pallets/nft/src/sponsorship.rs
@@ -127,7 +127,6 @@
sponsored
}
- _ => false,
};
}
primitives/nft/src/lib.rsdiffbeforeafterboth--- a/primitives/nft/src/lib.rs
+++ b/primitives/nft/src/lib.rs
@@ -73,23 +73,15 @@
#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
pub enum CollectionMode {
- Invalid,
NFT,
// decimal points
Fungible(DecimalPoints),
ReFungible,
-}
-
-impl Default for CollectionMode {
- fn default() -> Self {
- Self::Invalid
- }
}
impl CollectionMode {
pub fn id(&self) -> u8 {
match self {
- CollectionMode::Invalid => 0,
CollectionMode::NFT => 1,
CollectionMode::Fungible(_) => 2,
CollectionMode::ReFungible => 3,
runtime_types.jsondiffbeforeafterboth--- a/runtime_types.json
+++ b/runtime_types.json
@@ -18,7 +18,6 @@
"DecimalPoints": "u8",
"CollectionMode": {
"_enum": {
- "Invalid": null,
"NFT": null,
"Fungible": "DecimalPoints",
"ReFungible": null
tests/README.mddiffbeforeafterboth--- a/tests/README.md
+++ b/tests/README.md
@@ -5,10 +5,10 @@
1. Checkout polkadot in sibling folder with this project
```bash
git clone https://github.com/paritytech/polkadot.git && cd polkadot
-git checkout aa3867609
+git checkout release-v0.9.9
```
-2. Build with nightly-2021-04-23
+2. Build with nightly-2021-06-28
```bash
cargo build --release
```
tests/src/createCollection.test.tsdiffbeforeafterboth--- a/tests/src/createCollection.test.ts
+++ b/tests/src/createCollection.test.ts
@@ -33,19 +33,6 @@
});
describe('(!negative test!) integration test: ext. createCollection():', () => {
- it('(!negative test!) create new NFT collection whith incorrect data (mode)', async () => {
- await usingApi(async (api) => {
- const AcollectionCount = parseInt((await api.query.nft.createdCollectionCount()).toString(), 10);
-
- const badTransaction = async () => {
- await createCollectionExpectSuccess({mode: {type: 'Invalid'}});
- };
- await expect(badTransaction()).to.be.rejected;
-
- const BcollectionCount = parseInt((await api.query.nft.createdCollectionCount()).toString(), 10);
- expect(BcollectionCount).to.be.equal(AcollectionCount, 'Error: Incorrect collection created.');
- });
- });
it('(!negative test!) create new NFT collection whith incorrect data (collection_name)', async () => {
await createCollectionExpectFailure({ name: 'A'.repeat(65), mode: {type: 'NFT'}});
});
tests/src/scheduler.test.tsdiffbeforeafterboth--- a/tests/src/scheduler.test.ts
+++ b/tests/src/scheduler.test.ts
@@ -28,7 +28,7 @@
await setCollectionSponsorExpectSuccess(nftCollectionId, Alice.address);
await confirmSponsorshipExpectSuccess(nftCollectionId);
- await scheduleTransferExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 1, 6000, 4);
+ await scheduleTransferExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 1, 12000, 4);
});
});
});
tests/src/setVariableMetaData.test.tsdiffbeforeafterboth--- a/tests/src/setVariableMetaData.test.ts
+++ b/tests/src/setVariableMetaData.test.ts
@@ -17,6 +17,7 @@
setVariableMetaDataExpectFailure,
setVariableMetaDataExpectSuccess,
addCollectionAdminExpectSuccess,
+ setMetadataUpdatePermissionFlagExpectSuccess,
} from './util/helpers';
chai.use(chaiAsPromised);
@@ -62,6 +63,7 @@
bob = privateKey('//Bob');
collectionId = await createCollectionExpectSuccess({ mode: { type: 'NFT' } });
tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT');
+ await setMetadataUpdatePermissionFlagExpectSuccess(alice, collectionId, 'Admin');
await addCollectionAdminExpectSuccess(alice, collectionId, bob);
});
});
tests/src/util/helpers.tsdiffbeforeafterboth--- a/tests/src/util/helpers.ts
+++ b/tests/src/util/helpers.ts
@@ -224,10 +224,6 @@
return result;
}
-interface Invalid {
- type: 'Invalid';
-}
-
interface Nft {
type: 'NFT';
}
@@ -241,7 +237,7 @@
type: 'ReFungible';
}
-type CollectionMode = Nft | Fungible | ReFungible | Invalid;
+type CollectionMode = Nft | Fungible | ReFungible;
export type CreateCollectionParams = {
mode: CollectionMode,
@@ -275,8 +271,6 @@
modeprm = { fungible: mode.decimalPoints };
} else if (mode.type === 'ReFungible') {
modeprm = { refungible: null };
- } else if (mode.type === 'Invalid') {
- modeprm = { invalid: null };
}
const tx = api.tx.nft.createCollection(strToUTF16(name), strToUTF16(description), strToUTF16(tokenPrefix), modeprm);
@@ -317,8 +311,6 @@
modeprm = { fungible: mode.decimalPoints };
} else if (mode.type === 'ReFungible') {
modeprm = { refungible: null };
- } else if (mode.type === 'Invalid') {
- modeprm = { invalid: null };
}
await usingApi(async (api) => {
@@ -528,23 +520,23 @@
export async function setMetadataUpdatePermissionFlagExpectSuccess(sender: IKeyringPair, collectionId: number, flag: string) {
await usingApi(async (api) => {
- const tx = api.tx.nft.setMetaUpdatePermissionFlag(collectionId, flag);
+ const tx = api.tx.nft.setMetaUpdatePermissionFlag(collectionId, flag);
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
expect(result.success).to.be.true;
- });
+ });
}
export async function setMetadataUpdatePermissionFlagExpectFailure(sender: IKeyringPair, collectionId: number, flag: string) {
await usingApi(async (api) => {
- const tx = api.tx.nft.setMetaUpdatePermissionFlag(collectionId, flag);
+ const tx = api.tx.nft.setMetaUpdatePermissionFlag(collectionId, flag);
const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
const result = getGenericResult(events);
expect(result.success).to.be.false;
- });
+ });
}
export async function enableContractSponsoringExpectSuccess(sender: IKeyringPair, contractAddress: AccountId | string, enable: boolean) {
@@ -576,7 +568,7 @@
const result = getGenericResult(events);
expect(result.success).to.be.true;
- });
+ });
}
export async function setTransferFlagExpectFailure(sender: IKeyringPair, collectionId: number, enabled: boolean) {
@@ -588,7 +580,7 @@
const result = getGenericResult(events);
expect(result.success).to.be.false;
- });
+ });
}
export async function setContractSponsoringRateLimitExpectSuccess(sender: IKeyringPair, contractAddress: AccountId | string, rateLimit: number) {
@@ -833,7 +825,7 @@
const expectedBlockNumber = blockNumber + blockSchedule;
expect(blockNumber).to.be.greaterThan(0);
- const transferTx = await api.tx.nft.transfer(normalizeAccountId(recipient.address), collectionId, tokenId, value);
+ const transferTx = await api.tx.nft.transfer(normalizeAccountId(recipient.address), collectionId, tokenId, value);
const scheduleTx = await api.tx.scheduler.schedule(expectedBlockNumber, null, 0, transferTx);
await submitTransactionAsync(sender, scheduleTx);
@@ -1004,7 +996,7 @@
export async function createItemExpectFailure(sender: IKeyringPair, collectionId: number, createMode: string, owner: string = sender.address) {
await usingApi(async (api) => {
const tx = api.tx.nft.createItem(collectionId, normalizeAccountId(owner), createMode);
-
+
const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
const result = getCreateItemResult(events);