difftreelog
Merge commit '30c3834e43186270fad5abf1ab4654465073a23f' into feature/evm-coder-weights
in: master
135 files changed
.envdiffbeforeafterboth--- a/.env
+++ b/.env
@@ -1,6 +1,6 @@
RUST_TOOLCHAIN=nightly-2021-11-11
RUST_C=1.55.0-nightly
POLKA_VERSION=v0.9.12
-NFT_BRANCH=develop
+UNIQUE_BRANCH=develop
USER=***
PASS=***
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4939,216 +4939,6 @@
]
[[package]]
-name = "nft"
-version = "0.9.12"
-dependencies = [
- "cumulus-client-cli",
- "cumulus-client-collator",
- "cumulus-client-consensus-aura",
- "cumulus-client-consensus-common",
- "cumulus-client-network",
- "cumulus-client-service",
- "cumulus-primitives-core",
- "cumulus-primitives-parachain-inherent",
- "fc-consensus",
- "fc-db",
- "fc-mapping-sync",
- "fc-rpc",
- "fc-rpc-core",
- "flexi_logger",
- "fp-rpc",
- "frame-benchmarking",
- "frame-benchmarking-cli",
- "futures 0.3.17",
- "jsonrpc-core",
- "jsonrpc-pubsub",
- "log",
- "nft-data-structs",
- "nft-rpc",
- "nft-runtime",
- "pallet-ethereum",
- "pallet-transaction-payment-rpc",
- "parity-scale-codec",
- "parking_lot 0.11.2",
- "polkadot-cli",
- "polkadot-parachain",
- "polkadot-primitives",
- "polkadot-service",
- "polkadot-test-service",
- "sc-basic-authorship",
- "sc-chain-spec",
- "sc-cli",
- "sc-client-api",
- "sc-consensus",
- "sc-consensus-aura",
- "sc-executor",
- "sc-finality-grandpa",
- "sc-keystore",
- "sc-network",
- "sc-rpc",
- "sc-rpc-api",
- "sc-service",
- "sc-telemetry",
- "sc-tracing",
- "sc-transaction-pool",
- "serde",
- "serde_json",
- "sp-api",
- "sp-block-builder",
- "sp-blockchain",
- "sp-consensus",
- "sp-consensus-aura",
- "sp-core",
- "sp-finality-grandpa",
- "sp-inherents",
- "sp-keystore",
- "sp-offchain",
- "sp-runtime",
- "sp-session",
- "sp-timestamp",
- "sp-transaction-pool",
- "sp-trie",
- "structopt",
- "substrate-build-script-utils",
- "substrate-frame-rpc-system",
- "substrate-prometheus-endpoint",
-]
-
-[[package]]
-name = "nft-data-structs"
-version = "0.9.0"
-dependencies = [
- "derivative",
- "frame-support",
- "frame-system",
- "parity-scale-codec",
- "scale-info",
- "serde",
- "sp-core",
- "sp-runtime",
- "sp-std",
-]
-
-[[package]]
-name = "nft-rpc"
-version = "3.3.1"
-dependencies = [
- "fc-db",
- "fc-mapping-sync",
- "fc-rpc",
- "fc-rpc-core",
- "fp-rpc",
- "futures 0.3.17",
- "jsonrpc-core",
- "jsonrpc-pubsub",
- "nft-runtime",
- "pallet-ethereum",
- "pallet-nft",
- "pallet-transaction-payment-rpc",
- "pallet-transaction-payment-rpc-runtime-api",
- "sc-client-api",
- "sc-consensus-aura",
- "sc-consensus-epochs",
- "sc-finality-grandpa",
- "sc-finality-grandpa-rpc",
- "sc-keystore",
- "sc-network",
- "sc-rpc",
- "sc-rpc-api",
- "sc-service",
- "sc-transaction-pool",
- "sp-api",
- "sp-block-builder",
- "sp-blockchain",
- "sp-consensus",
- "sp-consensus-aura",
- "sp-core",
- "sp-offchain",
- "sp-runtime",
- "sp-session",
- "sp-storage",
- "sp-transaction-pool",
- "substrate-frame-rpc-system",
- "tokio 0.2.25",
- "uc-rpc",
- "up-rpc",
-]
-
-[[package]]
-name = "nft-runtime"
-version = "0.9.12"
-dependencies = [
- "cumulus-pallet-aura-ext",
- "cumulus-pallet-dmp-queue",
- "cumulus-pallet-parachain-system",
- "cumulus-pallet-xcm",
- "cumulus-pallet-xcmp-queue",
- "cumulus-primitives-core",
- "cumulus-primitives-timestamp",
- "cumulus-primitives-utility",
- "derivative",
- "fp-rpc",
- "fp-self-contained",
- "frame-benchmarking",
- "frame-executive",
- "frame-support",
- "frame-system",
- "frame-system-benchmarking",
- "frame-system-rpc-runtime-api",
- "hex-literal",
- "nft-data-structs",
- "orml-vesting",
- "pallet-aura",
- "pallet-balances",
- "pallet-common",
- "pallet-ethereum",
- "pallet-evm",
- "pallet-evm-coder-substrate",
- "pallet-evm-contract-helpers",
- "pallet-evm-migration",
- "pallet-evm-transaction-payment",
- "pallet-fungible",
- "pallet-inflation",
- "pallet-nft",
- "pallet-nonfungible",
- "pallet-randomness-collective-flip",
- "pallet-refungible",
- "pallet-sudo",
- "pallet-template-transaction-payment",
- "pallet-timestamp",
- "pallet-transaction-payment",
- "pallet-transaction-payment-rpc-runtime-api",
- "pallet-treasury",
- "pallet-unq-scheduler",
- "pallet-xcm",
- "parachain-info",
- "parity-scale-codec",
- "polkadot-parachain",
- "scale-info",
- "serde",
- "smallvec",
- "sp-api",
- "sp-arithmetic",
- "sp-block-builder",
- "sp-consensus-aura",
- "sp-core",
- "sp-inherents",
- "sp-io",
- "sp-offchain",
- "sp-runtime",
- "sp-session",
- "sp-std",
- "sp-transaction-pool",
- "sp-version",
- "substrate-wasm-builder",
- "up-evm-mapping",
- "up-rpc",
- "xcm",
- "xcm-builder",
- "xcm-executor",
-]
-
-[[package]]
name = "nodrop"
version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -5581,7 +5371,6 @@
"evm-coder",
"frame-support",
"frame-system",
- "nft-data-structs",
"pallet-evm",
"pallet-evm-coder-substrate",
"parity-scale-codec",
@@ -5590,6 +5379,7 @@
"sp-core",
"sp-runtime",
"sp-std",
+ "up-data-structs",
"up-evm-mapping",
]
@@ -5854,7 +5644,6 @@
"frame-benchmarking",
"frame-support",
"frame-system",
- "nft-data-structs",
"pallet-common",
"pallet-evm-coder-substrate",
"parity-scale-codec",
@@ -5862,6 +5651,7 @@
"sp-core",
"sp-runtime",
"sp-std",
+ "up-data-structs",
]
[[package]]
@@ -5957,7 +5747,7 @@
[[package]]
name = "pallet-inflation"
-version = "3.0.0"
+version = "0.1.0"
dependencies = [
"frame-benchmarking",
"frame-support",
@@ -6058,43 +5848,6 @@
]
[[package]]
-name = "pallet-nft"
-version = "3.0.0"
-dependencies = [
- "ethereum 0.9.0 (git+https://github.com/purestake/ethereum?branch=joshy-scale-info)",
- "evm-coder",
- "fp-evm",
- "frame-benchmarking",
- "frame-support",
- "frame-system",
- "hex-literal",
- "nft-data-structs",
- "pallet-balances",
- "pallet-common",
- "pallet-ethereum",
- "pallet-evm",
- "pallet-evm-coder-substrate",
- "pallet-fungible",
- "pallet-nonfungible",
- "pallet-randomness-collective-flip",
- "pallet-refungible",
- "pallet-timestamp",
- "pallet-transaction-payment",
- "parity-scale-codec",
- "primitive-types 0.10.1",
- "rlp",
- "scale-info",
- "serde",
- "sp-api",
- "sp-core",
- "sp-io",
- "sp-runtime",
- "sp-std",
- "up-evm-mapping",
- "up-sponsorship",
-]
-
-[[package]]
name = "pallet-nicks"
version = "4.0.0-dev"
source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.12#d76f39995315ec36980908e4b99709bd14927044"
@@ -6117,7 +5870,6 @@
"frame-benchmarking",
"frame-support",
"frame-system",
- "nft-data-structs",
"pallet-common",
"pallet-evm-coder-substrate",
"parity-scale-codec",
@@ -6125,6 +5877,7 @@
"sp-core",
"sp-runtime",
"sp-std",
+ "up-data-structs",
]
[[package]]
@@ -6217,13 +5970,13 @@
"frame-benchmarking",
"frame-support",
"frame-system",
- "nft-data-structs",
"pallet-common",
"parity-scale-codec",
"scale-info",
"sp-core",
"sp-runtime",
"sp-std",
+ "up-data-structs",
]
[[package]]
@@ -6470,8 +6223,45 @@
]
[[package]]
+name = "pallet-unique"
+version = "0.1.0"
+dependencies = [
+ "ethereum 0.9.0 (git+https://github.com/purestake/ethereum?branch=joshy-scale-info)",
+ "evm-coder",
+ "fp-evm",
+ "frame-benchmarking",
+ "frame-support",
+ "frame-system",
+ "hex-literal",
+ "pallet-balances",
+ "pallet-common",
+ "pallet-ethereum",
+ "pallet-evm",
+ "pallet-evm-coder-substrate",
+ "pallet-fungible",
+ "pallet-nonfungible",
+ "pallet-randomness-collective-flip",
+ "pallet-refungible",
+ "pallet-timestamp",
+ "pallet-transaction-payment",
+ "parity-scale-codec",
+ "primitive-types 0.10.1",
+ "rlp",
+ "scale-info",
+ "serde",
+ "sp-api",
+ "sp-core",
+ "sp-io",
+ "sp-runtime",
+ "sp-std",
+ "up-data-structs",
+ "up-evm-mapping",
+ "up-sponsorship",
+]
+
+[[package]]
name = "pallet-unq-scheduler"
-version = "3.0.0"
+version = "0.1.0"
dependencies = [
"frame-benchmarking",
"frame-support",
@@ -11715,7 +11505,6 @@
"jsonrpc-core",
"jsonrpc-core-client",
"jsonrpc-derive",
- "nft-data-structs",
"pallet-common",
"parity-scale-codec",
"sp-api",
@@ -11723,6 +11512,7 @@
"sp-core",
"sp-rpc",
"sp-runtime",
+ "up-data-structs",
"up-rpc",
]
@@ -11787,6 +11577,201 @@
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
[[package]]
+name = "unique-node"
+version = "0.9.12"
+dependencies = [
+ "cumulus-client-cli",
+ "cumulus-client-collator",
+ "cumulus-client-consensus-aura",
+ "cumulus-client-consensus-common",
+ "cumulus-client-network",
+ "cumulus-client-service",
+ "cumulus-primitives-core",
+ "cumulus-primitives-parachain-inherent",
+ "fc-consensus",
+ "fc-db",
+ "fc-mapping-sync",
+ "fc-rpc",
+ "fc-rpc-core",
+ "flexi_logger",
+ "fp-rpc",
+ "frame-benchmarking",
+ "frame-benchmarking-cli",
+ "futures 0.3.17",
+ "jsonrpc-core",
+ "jsonrpc-pubsub",
+ "log",
+ "pallet-ethereum",
+ "pallet-transaction-payment-rpc",
+ "parity-scale-codec",
+ "parking_lot 0.11.2",
+ "polkadot-cli",
+ "polkadot-parachain",
+ "polkadot-primitives",
+ "polkadot-service",
+ "polkadot-test-service",
+ "sc-basic-authorship",
+ "sc-chain-spec",
+ "sc-cli",
+ "sc-client-api",
+ "sc-consensus",
+ "sc-consensus-aura",
+ "sc-executor",
+ "sc-finality-grandpa",
+ "sc-keystore",
+ "sc-network",
+ "sc-rpc",
+ "sc-rpc-api",
+ "sc-service",
+ "sc-telemetry",
+ "sc-tracing",
+ "sc-transaction-pool",
+ "serde",
+ "serde_json",
+ "sp-api",
+ "sp-block-builder",
+ "sp-blockchain",
+ "sp-consensus",
+ "sp-consensus-aura",
+ "sp-core",
+ "sp-finality-grandpa",
+ "sp-inherents",
+ "sp-keystore",
+ "sp-offchain",
+ "sp-runtime",
+ "sp-session",
+ "sp-timestamp",
+ "sp-transaction-pool",
+ "sp-trie",
+ "structopt",
+ "substrate-build-script-utils",
+ "substrate-frame-rpc-system",
+ "substrate-prometheus-endpoint",
+ "unique-rpc",
+ "unique-runtime",
+ "up-data-structs",
+]
+
+[[package]]
+name = "unique-rpc"
+version = "0.1.0"
+dependencies = [
+ "fc-db",
+ "fc-mapping-sync",
+ "fc-rpc",
+ "fc-rpc-core",
+ "fp-rpc",
+ "futures 0.3.17",
+ "jsonrpc-core",
+ "jsonrpc-pubsub",
+ "pallet-ethereum",
+ "pallet-transaction-payment-rpc",
+ "pallet-transaction-payment-rpc-runtime-api",
+ "pallet-unique",
+ "sc-client-api",
+ "sc-consensus-aura",
+ "sc-consensus-epochs",
+ "sc-finality-grandpa",
+ "sc-finality-grandpa-rpc",
+ "sc-keystore",
+ "sc-network",
+ "sc-rpc",
+ "sc-rpc-api",
+ "sc-service",
+ "sc-transaction-pool",
+ "sp-api",
+ "sp-block-builder",
+ "sp-blockchain",
+ "sp-consensus",
+ "sp-consensus-aura",
+ "sp-core",
+ "sp-offchain",
+ "sp-runtime",
+ "sp-session",
+ "sp-storage",
+ "sp-transaction-pool",
+ "substrate-frame-rpc-system",
+ "tokio 0.2.25",
+ "uc-rpc",
+ "unique-runtime",
+ "up-rpc",
+]
+
+[[package]]
+name = "unique-runtime"
+version = "0.9.12"
+dependencies = [
+ "cumulus-pallet-aura-ext",
+ "cumulus-pallet-dmp-queue",
+ "cumulus-pallet-parachain-system",
+ "cumulus-pallet-xcm",
+ "cumulus-pallet-xcmp-queue",
+ "cumulus-primitives-core",
+ "cumulus-primitives-timestamp",
+ "cumulus-primitives-utility",
+ "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",
+ "pallet-common",
+ "pallet-ethereum",
+ "pallet-evm",
+ "pallet-evm-coder-substrate",
+ "pallet-evm-contract-helpers",
+ "pallet-evm-migration",
+ "pallet-evm-transaction-payment",
+ "pallet-fungible",
+ "pallet-inflation",
+ "pallet-nonfungible",
+ "pallet-randomness-collective-flip",
+ "pallet-refungible",
+ "pallet-sudo",
+ "pallet-template-transaction-payment",
+ "pallet-timestamp",
+ "pallet-transaction-payment",
+ "pallet-transaction-payment-rpc-runtime-api",
+ "pallet-treasury",
+ "pallet-unique",
+ "pallet-unq-scheduler",
+ "pallet-xcm",
+ "parachain-info",
+ "parity-scale-codec",
+ "polkadot-parachain",
+ "scale-info",
+ "serde",
+ "smallvec",
+ "sp-api",
+ "sp-arithmetic",
+ "sp-block-builder",
+ "sp-consensus-aura",
+ "sp-core",
+ "sp-inherents",
+ "sp-io",
+ "sp-offchain",
+ "sp-runtime",
+ "sp-session",
+ "sp-std",
+ "sp-transaction-pool",
+ "sp-version",
+ "substrate-wasm-builder",
+ "up-data-structs",
+ "up-evm-mapping",
+ "up-rpc",
+ "xcm",
+ "xcm-builder",
+ "xcm-executor",
+]
+
+[[package]]
name = "universal-hash"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -11833,6 +11818,21 @@
checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
[[package]]
+name = "up-data-structs"
+version = "0.1.0"
+dependencies = [
+ "derivative",
+ "frame-support",
+ "frame-system",
+ "parity-scale-codec",
+ "scale-info",
+ "serde",
+ "sp-core",
+ "sp-runtime",
+ "sp-std",
+]
+
+[[package]]
name = "up-evm-mapping"
version = "0.1.0"
dependencies = [
@@ -11844,13 +11844,13 @@
name = "up-rpc"
version = "0.1.0"
dependencies = [
- "nft-data-structs",
"pallet-common",
"parity-scale-codec",
"sp-api",
"sp-core",
"sp-runtime",
"sp-std",
+ "up-data-structs",
]
[[package]]
Dockerfile-parachaindiffbeforeafterboth--- a/Dockerfile-parachain
+++ b/Dockerfile-parachain
@@ -5,7 +5,7 @@
ARG RUST_TOOLCHAIN=nightly-2021-11-11
#ARG RUST_C=1.55.0-nightly
ARG POLKA_VERSION=v0.9.12
-ARG NFT_BRANCH=develop
+ARG UNIQUE_BRANCH=develop
#ARG USER=***
#ARG PASS=***
@@ -14,13 +14,13 @@
ENV RUST_TOOLCHAIN $RUST_TOOLCHAIN
#ENV RUST_C $RUST_C
ENV POLKA_VERSION $POLKA_VERSION
-ENV NFT_BRANCH $NFT_BRANCH
+ENV UNIQUE_BRANCH $UNIQUE_BRANCH
#RUN echo $RUST_TOOLCHAIN
#RUN echo $RUST_C
#RUN echo $POLKA_VERSION
-#RUN echo $NFT_BRANCH
+#RUN echo $UNIQUE_BRANCH
ENV CARGO_HOME="/cargo-home"
ENV PATH="/cargo-home/bin:$PATH"
@@ -40,8 +40,8 @@
RUN cargo install cargo-chef
-RUN mkdir nft_parachain
-WORKDIR /nft_parachain
+RUN mkdir unique_parachain
+WORKDIR /unique_parachain
# ===== Chef =====
FROM rust-builder as chef
@@ -52,10 +52,10 @@
# ===== BUILD ======
FROM rust-builder as builder
-RUN mkdir nft_parachain
-WORKDIR /nft_parachain
+RUN mkdir unique_parachain
+WORKDIR /unique_parachain
-COPY --from=chef /nft_parachain/recipe.json recipe.json
+COPY --from=chef /unique_parachain/recipe.json recipe.json
ARG PROFILE=release
RUN cargo chef cook "--$PROFILE" --recipe-path recipe.json
@@ -67,8 +67,8 @@
# ===== BUILD POLKADOT =====
FROM rust-builder as builder-polkadot
-RUN mkdir nft_parachain
-WORKDIR /nft_parachain
+RUN mkdir unique_parachain
+WORKDIR /unique_parachain
RUN git clone -b $POLKA_VERSION --depth 1 https://github.com/paritytech/polkadot.git && \
cd polkadot && \
@@ -98,8 +98,8 @@
npm install --global yarn && \
yarn
-COPY --from=builder /nft_parachain/target/$PROFILE/nft /unique-chain/target/$PROFILE/
-COPY --from=builder-polkadot /nft_parachain/polkadot/target/$PROFILE/polkadot /polkadot/target/$PROFILE/
+COPY --from=builder /unique_parachain/target/$PROFILE/unique-collator /unique-chain/target/$PROFILE/
+COPY --from=builder-polkadot /unique_parachain/polkadot/target/$PROFILE/polkadot /polkadot/target/$PROFILE/
CMD export NVM_DIR="$HOME/.nvm" && \
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && \
Makefilediffbeforeafterboth--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@
@echo "evm_stubs - recompile contract stubs"
@echo "bench - run frame-benchmarking"
@echo " bench-evm-migration"
- @echo " bench-nft"
+ @echo " bench-unique"
.PHONY: regenerate_solidity
regenerate_solidity:
@@ -41,9 +41,9 @@
bench-evm-migration:
make _bench PALLET=evm-migration
-.PHONY: bench-nft
-bench-nft:
- make _bench PALLET=nft
+.PHONY: bench-unique
+bench-unique:
+ make _bench PALLET=unique
.PHONY: bench-fungible
bench-fungible:
@@ -58,4 +58,4 @@
make _bench PALLET=nonfungible
.PHONY: bench
-bench: bench-evm-migration bench-nft bench-fungible bench-refungible bench-nonfungible
+bench: bench-evm-migration bench-unique bench-fungible bench-refungible bench-nonfungible
README.mddiffbeforeafterboth--- a/README.md
+++ b/README.md
@@ -1,10 +1,10 @@

-# NFT Parachain
+# Unique Parachain
## Project Description
-The NFT Pallet is the core of NFT functionality. Like ERC-721 standard in Ethereum ecosystem, this pallet provides the
+The Unique Pallet is the core of NFT functionality. Like ERC-721 standard in Ethereum ecosystem, this pallet provides the
basement for creating collections of unique non-divisible things, also called Non Fungible Tokens (NFTs), minting NFT of
a given Collection, and managing their ownership.
@@ -12,19 +12,19 @@
concrete application that operates a Collection, so purposefully the NFT Tracking Module does not have any knowledge
about properties except their byte size leaving application logic out to be controlled by Smart Contracts.
-The NFT Chain also provides:
+The Unique Chain also provides:
-- Smart Contracts Pallet and example smart contract that interacts with NFT Runtime
+- Smart Contracts Pallet and example smart contract that interacts with Unique Runtime
- ERC-1155 Functionality (currently PoC as Re-Fungible tokens, i.e. items that are still unique, but that can be split
between multiple users)
- Variety of economic options for dapp producers to choose from to create freemium games and other ways to attract
users. As a step one, we implemented an economic model when a collection sponsor can be set to pay for collection
Transfer transactions.
-Wider NFT Ecosystem (most of it was developed during Hackusama):
+Wider Unique Ecosystem (most of it was developed during Hackusama):
- [SubstraPunks Game hosted on IPFS](https://github.com/usetech-llc/substrapunks)
-- [NFT Wallet and UI](https://uniqueapps.usetech.com/#/nft)
+- [Unique Wallet and UI](https://uniqueapps.usetech.com/#/nft)
- [NFT Asset for Unity Framework](https://github.com/usetech-llc/nft_unity)
Please see our [walk-thorugh instructions](doc/hackusama_walk_through.md) to try everything out!
@@ -34,15 +34,15 @@
During the Kusama Hackaphon the following changes were made:
- Enabled Smart Contracts Pallet
-- Enabled integration between Smart Contracts and NFT Pallet (required special edition of RC4 Substrate version)
-- Fixed misc. bugs in NFT Pallet
-- Deployed NFT TestNet. Public node available at wss://unique.usetech.com, custom UI types - see below in this README.
+- Enabled integration between Smart Contracts and Unique Pallet (required special edition of RC4 Substrate version)
+- Fixed misc. bugs in Unique Pallet
+- Deployed Unique TestNet. Public node available at wss://unique.usetech.com, custom UI types - see below in this README.
- New Features:
- Re-Fungible Token Mode
- Off-Chain Schema to store token image URLs
- Alternative economic model
- Allow Lists and Public Mint Permission
-- Use example: [SubstraPunks Game](https://github.com/usetech-llc/substrapunks), fully hosted on IPFS and NFT Testnet
+- Use example: [SubstraPunks Game](https://github.com/usetech-llc/substrapunks), fully hosted on IPFS and Unique Testnet
Blockchain.
## Application Development
@@ -51,7 +51,7 @@
## Building
-Building NFT chain requires special versions of Rust and toolchain. We don't use the most recent versions of everything
+Building Unique chain requires special versions of Rust and toolchain. We don't use the most recent versions of everything
so that we can keep the builds stable.
1. Install Rust:
@@ -168,12 +168,12 @@
```
-3. Export genesis state and runtime wasm from NFT parachain:
+3. Export genesis state and runtime wasm from Unique parachain:
Run from this project root:
```
-./target/release/nft export-genesis-state --parachain-id 2000 > ./resources/para-2000-genesis
-./target/release/nft export-genesis-wasm > ./resources/para-2000-wasm
+./target/release/unique-collator export-genesis-state --parachain-id 2000 > ./resources/para-2000-genesis
+./target/release/unique-collator export-genesis-wasm > ./resources/para-2000-wasm
```
4. Run two parachain nodes:
@@ -182,8 +182,8 @@
Run from this project root:
```
-./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 9977
-./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/12D3KooWN1ah2bFQSysEFnwZqcmcVpDDR8UedXyo6xfzV1zDNMNg
+./target/release/unique-collator --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 9977
+./target/release/unique-collator --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/12D3KooWN1ah2bFQSysEFnwZqcmcVpDDR8UedXyo6xfzV1zDNMNg
```
4. Reserve parachain ID as described here: https://substrate.dev/cumulus-workshop/#/en/2-relay-chain/2-reserve
@@ -218,7 +218,7 @@
Run benchmark
```bash
-target/release/nft benchmark --chain dev --pallet "pallet_nft" --extrinsic "*" --repeat 1
+target/release/unique-collator benchmark --chain dev --pallet "pallet_unique" --extrinsic "*" --repeat 1
```
## UI custom types
client/rpc/Cargo.tomldiffbeforeafterboth--- a/client/rpc/Cargo.toml
+++ b/client/rpc/Cargo.toml
@@ -5,7 +5,7 @@
[dependencies]
pallet-common = { default-features = false, path = '../../pallets/common' }
-nft-data-structs = { default-features = false, path = '../../primitives/nft' }
+up-data-structs = { default-features = false, path = '../../primitives/data-structs' }
up-rpc = { path = "../../primitives/rpc" }
codec = { package = "parity-scale-codec", version = "2.0.0" }
jsonrpc-core = "18.0.0"
client/rpc/src/lib.rsdiffbeforeafterboth--- a/client/rpc/src/lib.rs
+++ b/client/rpc/src/lib.rs
@@ -3,21 +3,21 @@
use codec::Decode;
use jsonrpc_core::{Error as RpcError, ErrorCode, Result};
use jsonrpc_derive::rpc;
-use nft_data_structs::{Collection, CollectionId, CollectionStats, TokenId};
+use up_data_structs::{Collection, CollectionId, CollectionStats, TokenId};
use sp_api::{BlockId, BlockT, ProvideRuntimeApi};
use sp_blockchain::HeaderBackend;
-use up_rpc::NftApi as NftRuntimeApi;
+use up_rpc::UniqueApi as UniqueRuntimeApi;
#[rpc]
-pub trait NftApi<BlockHash, CrossAccountId, AccountId> {
- #[rpc(name = "nft_accountTokens")]
+pub trait UniqueApi<BlockHash, CrossAccountId, AccountId> {
+ #[rpc(name = "unique_accountTokens")]
fn account_tokens(
&self,
collection: CollectionId,
account: CrossAccountId,
at: Option<BlockHash>,
) -> Result<Vec<TokenId>>;
- #[rpc(name = "nft_tokenExists")]
+ #[rpc(name = "unique_tokenExists")]
fn token_exists(
&self,
collection: CollectionId,
@@ -25,21 +25,21 @@
at: Option<BlockHash>,
) -> Result<bool>;
- #[rpc(name = "nft_tokenOwner")]
+ #[rpc(name = "unique_tokenOwner")]
fn token_owner(
&self,
collection: CollectionId,
token: TokenId,
at: Option<BlockHash>,
) -> Result<CrossAccountId>;
- #[rpc(name = "nft_constMetadata")]
+ #[rpc(name = "unique_constMetadata")]
fn const_metadata(
&self,
collection: CollectionId,
token: TokenId,
at: Option<BlockHash>,
) -> Result<Vec<u8>>;
- #[rpc(name = "nft_variableMetadata")]
+ #[rpc(name = "unique_variableMetadata")]
fn variable_metadata(
&self,
collection: CollectionId,
@@ -47,16 +47,16 @@
at: Option<BlockHash>,
) -> Result<Vec<u8>>;
- #[rpc(name = "nft_collectionTokens")]
+ #[rpc(name = "unique_collectionTokens")]
fn collection_tokens(&self, collection: CollectionId, at: Option<BlockHash>) -> Result<u32>;
- #[rpc(name = "nft_accountBalance")]
+ #[rpc(name = "unique_accountBalance")]
fn account_balance(
&self,
collection: CollectionId,
account: CrossAccountId,
at: Option<BlockHash>,
) -> Result<u32>;
- #[rpc(name = "nft_balance")]
+ #[rpc(name = "unique_balance")]
fn balance(
&self,
collection: CollectionId,
@@ -64,7 +64,7 @@
token: TokenId,
at: Option<BlockHash>,
) -> Result<String>;
- #[rpc(name = "nft_allowance")]
+ #[rpc(name = "unique_allowance")]
fn allowance(
&self,
collection: CollectionId,
@@ -74,43 +74,43 @@
at: Option<BlockHash>,
) -> Result<String>;
- #[rpc(name = "nft_adminlist")]
+ #[rpc(name = "unique_adminlist")]
fn adminlist(
&self,
collection: CollectionId,
at: Option<BlockHash>,
) -> Result<Vec<CrossAccountId>>;
- #[rpc(name = "nft_allowlist")]
+ #[rpc(name = "unique_allowlist")]
fn allowlist(
&self,
collection: CollectionId,
at: Option<BlockHash>,
) -> Result<Vec<CrossAccountId>>;
- #[rpc(name = "nft_allowed")]
+ #[rpc(name = "unique_allowed")]
fn allowed(
&self,
collection: CollectionId,
user: CrossAccountId,
at: Option<BlockHash>,
) -> Result<bool>;
- #[rpc(name = "nft_lastTokenId")]
+ #[rpc(name = "unique_lastTokenId")]
fn last_token_id(&self, collection: CollectionId, at: Option<BlockHash>) -> Result<TokenId>;
- #[rpc(name = "nft_collectionById")]
+ #[rpc(name = "unique_collectionById")]
fn collection_by_id(
&self,
collection: CollectionId,
at: Option<BlockHash>,
) -> Result<Option<Collection<AccountId>>>;
- #[rpc(name = "nft_collectionStats")]
+ #[rpc(name = "unique_collectionStats")]
fn collection_stats(&self, at: Option<BlockHash>) -> Result<CollectionStats>;
}
-pub struct Nft<C, P> {
+pub struct Unique<C, P> {
client: Arc<C>,
_marker: std::marker::PhantomData<P>,
}
-impl<C, P> Nft<C, P> {
+impl<C, P> Unique<C, P> {
pub fn new(client: Arc<C>) -> Self {
Self {
client,
@@ -154,13 +154,13 @@
};
}
-impl<C, Block, CrossAccountId, AccountId> NftApi<<Block as BlockT>::Hash, CrossAccountId, AccountId>
- for Nft<C, Block>
+impl<C, Block, CrossAccountId, AccountId>
+ UniqueApi<<Block as BlockT>::Hash, CrossAccountId, AccountId> for Unique<C, Block>
where
Block: BlockT,
AccountId: Decode,
C: 'static + ProvideRuntimeApi<Block> + HeaderBackend<Block>,
- C::Api: NftRuntimeApi<Block, CrossAccountId, AccountId>,
+ C::Api: UniqueRuntimeApi<Block, CrossAccountId, AccountId>,
CrossAccountId: pallet_common::account::CrossAccountId<AccountId>,
{
pass_method!(account_tokens(collection: CollectionId, account: CrossAccountId) -> Vec<TokenId>);
docker-compose-tests-parachain.ymldiffbeforeafterboth--- a/docker-compose-tests-parachain.yml
+++ b/docker-compose-tests-parachain.yml
@@ -9,7 +9,7 @@
- RUST_TOOLCHAIN=${RUST_TOOLCHAIN:?err}
- RUST_C=${RUST_C:?err}
- POLKA_VERSION=${POLKA_VERSION:?err}
- - NFT_BRANCH=${NFT_BRANCH:?err}
+ - UNIQUE_BRANCH=${UNIQUE_BRANCH:?err}
volumes:
- ./launch-config.json:/polkadot-launch/launch-config.json
env_file:
@@ -22,7 +22,7 @@
environment:
RPC_URL: http://blockchain_nodes:9933/
volumes:
- - ./tests/src/config_docker.ts:/nft_parachain/src/config.ts
- - /home/ubuntu/mochawesome-report:/nft_parachain/mochawesome-report
+ - ./tests/src/config_docker.ts:/unique_parachain/src/config.ts
+ - /home/ubuntu/mochawesome-report:/unique_parachain/mochawesome-report
depends_on:
- blockchain_nodes
launch-config.jsondiffbeforeafterboth--- a/launch-config.json
+++ b/launch-config.json
@@ -55,7 +55,7 @@
},
"parachains": [
{
- "bin": "../unique-chain/target/release/nft",
+ "bin": "../unique-chain/target/release/unique-collator",
"id": "2000",
"balance": "1000000000000000000000",
"nodes": [
node/cli/Cargo.tomldiffbeforeafterboth--- a/node/cli/Cargo.toml
+++ b/node/cli/Cargo.toml
@@ -231,12 +231,11 @@
################################################################################
# Local dependencies
-[dependencies.nft-runtime]
+[dependencies.unique-runtime]
path = '../../runtime'
-version = '0.9.12'
-[dependencies.nft-data-structs]
-path = "../../primitives/nft"
+[dependencies.up-data-structs]
+path = "../../primitives/data-structs"
default-features = false
################################################################################
@@ -245,16 +244,17 @@
[package]
authors = ['Unique Network <support@uniquenetwork.io>']
build = 'build.rs'
-description = 'Substrate node nft'
+description = 'Unique Node'
edition = '2018'
homepage = 'https://unique.network'
license = 'All Rights Reserved'
-name = 'nft'
-repository = 'https://github.com/usetech-llc/nft_private/'
+name = 'unique-node'
+repository = 'https://github.com/UniqueNetwork/unique-chain'
version = '0.9.12'
[[bin]]
-name = 'nft'
+name = 'unique-collator'
+path = "src/main.rs"
[package.metadata.docs.rs]
targets = ['x86_64-unknown-linux-gnu']
@@ -276,11 +276,11 @@
fp-rpc = { git = "https://github.com/uniquenetwork/frontier.git", branch = "unique-polkadot-v0.9.12-weights" }
pallet-ethereum = { git = "https://github.com/uniquenetwork/frontier.git", branch = "unique-polkadot-v0.9.12-weights" }
-nft-rpc = { path = "../rpc" }
+unique-rpc = { path = "../rpc" }
[features]
default = []
runtime-benchmarks = [
- 'nft-runtime/runtime-benchmarks',
+ 'unique-runtime/runtime-benchmarks',
'polkadot-service/runtime-benchmarks',
]
node/cli/src/chain_spec.rsdiffbeforeafterboth--- a/node/cli/src/chain_spec.rs
+++ b/node/cli/src/chain_spec.rs
@@ -4,7 +4,7 @@
//
use cumulus_primitives_core::ParaId;
-use nft_runtime::*;
+use unique_runtime::*;
use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup};
use sc_service::ChainType;
use sp_core::{sr25519, Pair, Public};
@@ -15,7 +15,7 @@
use serde_json::map::Map;
/// Specialized `ChainSpec`. This is a specialization of the general Substrate ChainSpec type.
-pub type ChainSpec = sc_service::GenericChainSpec<nft_runtime::GenesisConfig, Extensions>;
+pub type ChainSpec = sc_service::GenericChainSpec<unique_runtime::GenesisConfig, Extensions>;
/// Helper function to generate a crypto pair from seed
pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {
@@ -203,8 +203,8 @@
id: ParaId,
) -> GenesisConfig {
GenesisConfig {
- system: nft_runtime::SystemConfig {
- code: nft_runtime::WASM_BINARY
+ system: unique_runtime::SystemConfig {
+ code: unique_runtime::WASM_BINARY
.expect("WASM binary was not build, please build it!")
.to_vec(),
changes_trie_config: Default::default(),
@@ -220,8 +220,8 @@
treasury: Default::default(),
sudo: SudoConfig { key: root_key },
vesting: VestingConfig { vesting: vec![] },
- parachain_info: nft_runtime::ParachainInfoConfig { parachain_id: id },
- aura: nft_runtime::AuraConfig {
+ parachain_info: unique_runtime::ParachainInfoConfig { parachain_id: id },
+ aura: unique_runtime::AuraConfig {
authorities: initial_authorities,
},
aura_ext: Default::default(),
node/cli/src/command.rsdiffbeforeafterboth--- a/node/cli/src/command.rs
+++ b/node/cli/src/command.rs
@@ -24,7 +24,7 @@
use cumulus_primitives_core::ParaId;
use cumulus_client_service::genesis::generate_genesis_block;
use log::info;
-use nft_runtime::Block;
+use unique_runtime::Block;
use polkadot_parachain::primitives::AccountIdConversion;
use sc_cli::{
ChainSpec, CliConfiguration, DefaultConfigurationValues, ImportParams, KeystoreParams,
@@ -89,7 +89,7 @@
}
fn native_runtime_version(_: &Box<dyn ChainSpec>) -> &'static RuntimeVersion {
- &nft_runtime::VERSION
+ &unique_runtime::VERSION
}
}
node/cli/src/service.rsdiffbeforeafterboth--- a/node/cli/src/service.rs
+++ b/node/cli/src/service.rs
@@ -13,7 +13,7 @@
use futures::StreamExt;
// Local Runtime Types
-use nft_runtime::RuntimeApi;
+use unique_runtime::RuntimeApi;
// Cumulus Imports
use cumulus_client_consensus_aura::{build_aura_consensus, BuildAuraConsensusParams, SlotProportion};
@@ -54,11 +54,11 @@
type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions;
fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
- nft_runtime::api::dispatch(method, data)
+ unique_runtime::api::dispatch(method, data)
}
fn native_version() -> sc_executor::NativeVersion {
- nft_runtime::native_version()
+ unique_runtime::native_version()
}
}
@@ -68,7 +68,7 @@
.as_ref()
.map(|base_path| base_path.config_dir(config.chain_spec.id()))
.unwrap_or_else(|| {
- BasePath::from_project("", "", "nft").config_dir(config.chain_spec.id())
+ BasePath::from_project("", "", "unique").config_dir(config.chain_spec.id())
});
let database_dir = config_dir.join("frontier").join("db");
@@ -291,7 +291,7 @@
let rpc_frontier_backend = frontier_backend.clone();
let rpc_extensions_builder = Box::new(move |deny_unsafe, _| {
- let full_deps = nft_rpc::FullDeps {
+ let full_deps = unique_rpc::FullDeps {
backend: rpc_frontier_backend.clone(),
deny_unsafe,
client: rpc_client.clone(),
@@ -307,7 +307,7 @@
max_past_logs: 10000,
};
- Ok(nft_rpc::create_full::<_, _, _, _, RuntimeApi, _>(
+ Ok(unique_rpc::create_full::<_, _, _, _, RuntimeApi, _>(
full_deps,
subscription_executor.clone(),
))
node/rpc/Cargo.tomldiffbeforeafterboth--- a/node/rpc/Cargo.toml
+++ b/node/rpc/Cargo.toml
@@ -1,6 +1,6 @@
[package]
-name = "nft-rpc"
-version = "3.3.1"
+name = "unique-rpc"
+version = "0.1.0"
authors = ['Unique Network <support@uniquenetwork.io>']
license = 'All Rights Reserved'
edition = "2021"
@@ -48,10 +48,10 @@
fc-db = { default-features = false, git = "https://github.com/uniquenetwork/frontier.git", branch = "unique-polkadot-v0.9.12-weights" }
fc-mapping-sync = { default-features = false, git = "https://github.com/uniquenetwork/frontier.git", branch = "unique-polkadot-v0.9.12-weights" }
-pallet-nft = { path = "../../pallets/nft" }
+pallet-unique = { path = "../../pallets/unique" }
uc-rpc = { path = "../../client/rpc" }
up-rpc = { path = "../../primitives/rpc" }
-nft-runtime = { path = "../../runtime" }
+unique-runtime = { path = "../../runtime" }
[features]
std = []
node/rpc/src/lib.rsdiffbeforeafterboth--- a/node/rpc/src/lib.rs
+++ b/node/rpc/src/lib.rs
@@ -1,4 +1,4 @@
-use nft_runtime::{Hash, AccountId, CrossAccountId, Index, opaque::Block, BlockNumber, Balance};
+use unique_runtime::{Hash, AccountId, CrossAccountId, Index, opaque::Block, BlockNumber, Balance};
use fc_rpc::{
EthBlockDataCache, OverrideHandle, RuntimeApiStorageOverride, SchemaV1Override, StorageOverride,
};
@@ -100,10 +100,10 @@
where
Block: sp_api::BlockT,
C: ProvideRuntimeApi<Block>,
- C::Api: up_rpc::NftApi<Block, CrossAccountId, AccountId>,
+ C::Api: up_rpc::UniqueApi<Block, CrossAccountId, AccountId>,
{
fn code(&self, block: &sp_api::BlockId<Block>, account: sp_core::H160) -> Option<Vec<u8>> {
- use up_rpc::NftApi;
+ use up_rpc::UniqueApi;
self.client
.runtime_api()
.eth_contract_code(block, account)
@@ -127,7 +127,7 @@
// C::Api: pallet_contracts_rpc::ContractsRuntimeApi<Block, AccountId, Balance, BlockNumber, Hash>,
C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi<Block, Balance>,
C::Api: fp_rpc::EthereumRuntimeRPCApi<Block>,
- C::Api: up_rpc::NftApi<Block, CrossAccountId, AccountId>,
+ C::Api: up_rpc::UniqueApi<Block, CrossAccountId, AccountId>,
B: sc_client_api::Backend<Block> + Send + Sync + 'static,
B::State: sc_client_api::backend::StateBackend<sp_runtime::traits::HashFor<Block>>,
SC: SelectChain<Block> + 'static,
@@ -139,7 +139,7 @@
EthPubSubApiServer, EthSigner, HexEncodedIdProvider, NetApi, NetApiServer, Web3Api,
Web3ApiServer,
};
- use uc_rpc::{NftApi, Nft};
+ use uc_rpc::{UniqueApi, Unique};
// use pallet_contracts_rpc::{Contracts, ContractsApi};
use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApi};
use substrate_frame_rpc_system::{FullSystem, SystemApi};
@@ -195,7 +195,7 @@
client.clone(),
pool.clone(),
graph,
- nft_runtime::TransactionConverter,
+ unique_runtime::TransactionConverter,
network.clone(),
signers,
overrides.clone(),
@@ -204,7 +204,7 @@
max_past_logs,
block_data_cache.clone(),
)));
- io.extend_with(NftApi::to_delegate(Nft::new(client.clone())));
+ io.extend_with(UniqueApi::to_delegate(Unique::new(client.clone())));
if let Some(filter_pool) = filter_pool {
io.extend_with(EthFilterApiServer::to_delegate(EthFilterApi::new(
pallets/common/Cargo.tomldiffbeforeafterboth--- a/pallets/common/Cargo.toml
+++ b/pallets/common/Cargo.toml
@@ -16,7 +16,7 @@
sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
sp-core = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
up-evm-mapping = { default-features = false, path = '../../primitives/evm-mapping' }
-nft-data-structs = { default-features = false, path = '../../primitives/nft' }
+up-data-structs = { default-features = false, path = '../../primitives/data-structs' }
pallet-evm-coder-substrate = { default-features = false, path = '../../pallets/evm-coder-substrate' }
evm-coder = { default-features = false, path = '../../crates/evm-coder' }
pallet-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier.git", branch = "unique-polkadot-v0.9.12-weights" }
@@ -33,7 +33,7 @@
"sp-runtime/std",
"sp-std/std",
"up-evm-mapping/std",
- "nft-data-structs/std",
+ "up-data-structs/std",
"pallet-evm/std",
]
runtime-benchmarks = []
pallets/common/src/account.rsdiffbeforeafterboth--- a/pallets/common/src/account.rs
+++ b/pallets/common/src/account.rs
@@ -7,7 +7,7 @@
use pallet_evm::AddressMapping;
use sp_std::vec::Vec;
use sp_std::clone::Clone;
-use up_evm_mapping::EvmBackwardsAddressMapping;
+pub use up_evm_mapping::EvmBackwardsAddressMapping;
pub trait CrossAccountId<AccountId>:
Encode + EncodeLike + Decode + TypeInfo + Clone + PartialEq + Ord + core::fmt::Debug + Default
pallets/common/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/common/src/benchmarking.rs
+++ b/pallets/common/src/benchmarking.rs
@@ -1,6 +1,6 @@
use sp_std::vec::Vec;
use crate::{Config, CollectionHandle};
-use nft_data_structs::{
+use up_data_structs::{
CollectionMode, Collection, CollectionId, MAX_COLLECTION_NAME_LENGTH,
MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_TOKEN_PREFIX_LENGTH, OFFCHAIN_SCHEMA_LIMIT,
VARIABLE_ON_CHAIN_SCHEMA_LIMIT, CONST_ON_CHAIN_SCHEMA_LIMIT,
pallets/common/src/eth.rsdiffbeforeafterboth--- a/pallets/common/src/eth.rs
+++ b/pallets/common/src/eth.rs
@@ -1,4 +1,4 @@
-use nft_data_structs::{CollectionId, TokenId};
+use up_data_structs::{CollectionId, TokenId};
use sp_core::H160;
// 0x17c4e6453Cc49AAAaEACA894e6D9683e00000001 - collection 1
pallets/common/src/lib.rsdiffbeforeafterboth--- a/pallets/common/src/lib.rs
+++ b/pallets/common/src/lib.rs
@@ -10,7 +10,7 @@
traits::{Imbalance, Get, Currency},
};
use pallet_evm::GasWeightMapping;
-use nft_data_structs::{
+use up_data_structs::{
COLLECTION_NUMBER_LIMIT, Collection, CollectionId, CreateItemData, ExistenceRequirement,
MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_COLLECTION_NAME_LENGTH, MAX_TOKEN_PREFIX_LENGTH,
COLLECTION_ADMINS_LIMIT, MetaUpdatePermission, Pays, PostDispatchInfo, TokenId, Weight,
@@ -143,7 +143,7 @@
use frame_support::{Blake2_128Concat, pallet_prelude::*, storage::Key};
use account::CrossAccountId;
use frame_support::traits::Currency;
- use nft_data_structs::TokenId;
+ use up_data_structs::TokenId;
use scale_info::TypeInfo;
#[pallet::config]
@@ -273,8 +273,8 @@
TotalCollectionsLimitExceeded,
/// variable_data exceeded data limit.
TokenVariableDataLimitExceeded,
- /// Exceeded max admin amount
- CollectionAdminAmountExceeded,
+ /// Exceeded max admin count
+ CollectionAdminCountExceeded,
/// Collection settings not allowing items transferring
TransferNotAllowed,
@@ -506,10 +506,10 @@
if admin {
let amount = amount
.checked_add(1)
- .ok_or(<Error<T>>::CollectionAdminAmountExceeded)?;
+ .ok_or(<Error<T>>::CollectionAdminCountExceeded)?;
ensure!(
amount <= Self::collection_admins_limit(),
- <Error<T>>::CollectionAdminAmountExceeded,
+ <Error<T>>::CollectionAdminCountExceeded,
);
// =========
pallets/evm-migration/src/weights.rsdiffbeforeafterboth--- a/pallets/evm-migration/src/weights.rs
+++ b/pallets/evm-migration/src/weights.rs
@@ -7,7 +7,7 @@
//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 128
// Executed Command:
-// target/release/nft
+// target/release/unique-collator
// benchmark
// --pallet
// pallet-evm-migration
pallets/fungible/Cargo.tomldiffbeforeafterboth--- a/pallets/fungible/Cargo.toml
+++ b/pallets/fungible/Cargo.toml
@@ -16,7 +16,7 @@
sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
sp-core = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
pallet-common = { default-features = false, path = '../common' }
-nft-data-structs = { default-features = false, path = '../../primitives/nft' }
+up-data-structs = { default-features = false, path = '../../primitives/data-structs' }
evm-coder = { default-features = false, path = '../../crates/evm-coder' }
pallet-evm-coder-substrate = { default-features = false, path = '../evm-coder-substrate' }
ethereum = { version = "0.10.0", default-features = false }
@@ -32,7 +32,7 @@
"frame-system/std",
"sp-runtime/std",
"sp-std/std",
- "nft-data-structs/std",
+ "up-data-structs/std",
"pallet-common/std",
"evm-coder/std",
"ethereum/std",
pallets/fungible/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/fungible/src/benchmarking.rs
+++ b/pallets/fungible/src/benchmarking.rs
@@ -4,7 +4,7 @@
use sp_std::prelude::*;
use pallet_common::benchmarking::create_collection_raw;
use frame_benchmarking::{benchmarks, account};
-use nft_data_structs::{CollectionMode};
+use up_data_structs::{CollectionMode};
use pallet_common::bench_init;
const SEED: u32 = 1;
pallets/fungible/src/common.rsdiffbeforeafterboth--- a/pallets/fungible/src/common.rs
+++ b/pallets/fungible/src/common.rs
@@ -1,7 +1,7 @@
use core::marker::PhantomData;
use frame_support::{dispatch::DispatchResultWithPostInfo, ensure, fail, weights::Weight};
-use nft_data_structs::TokenId;
+use up_data_structs::TokenId;
use pallet_common::{CommonCollectionOperations, CommonWeightInfo, with_weight};
use sp_runtime::ArithmeticError;
use sp_std::{vec::Vec, vec};
@@ -51,10 +51,10 @@
&self,
sender: T::CrossAccountId,
to: T::CrossAccountId,
- data: nft_data_structs::CreateItemData,
+ data: up_data_structs::CreateItemData,
) -> DispatchResultWithPostInfo {
match data {
- nft_data_structs::CreateItemData::Fungible(data) => with_weight(
+ up_data_structs::CreateItemData::Fungible(data) => with_weight(
<Pallet<T>>::create_item(self, &sender, (to, data.value)),
<CommonWeights<T>>::create_item(),
),
@@ -66,12 +66,12 @@
&self,
sender: T::CrossAccountId,
to: T::CrossAccountId,
- data: Vec<nft_data_structs::CreateItemData>,
+ data: Vec<up_data_structs::CreateItemData>,
) -> DispatchResultWithPostInfo {
let mut sum: u128 = 0;
for data in data {
match data {
- nft_data_structs::CreateItemData::Fungible(data) => {
+ up_data_structs::CreateItemData::Fungible(data) => {
sum = sum
.checked_add(data.value)
.ok_or(ArithmeticError::Overflow)?;
@@ -182,7 +182,7 @@
_token: TokenId,
_data: Vec<u8>,
) -> DispatchResultWithPostInfo {
- fail!(<Error<T>>::FungibleItemsHaveData)
+ fail!(<Error<T>>::FungibleItemsDontHaveData)
}
fn account_tokens(&self, account: T::CrossAccountId) -> Vec<TokenId> {
pallets/fungible/src/erc.rsdiffbeforeafterboth--- a/pallets/fungible/src/erc.rs
+++ b/pallets/fungible/src/erc.rs
@@ -1,7 +1,7 @@
use core::char::{REPLACEMENT_CHARACTER, decode_utf16};
use core::convert::TryInto;
use evm_coder::{ToLog, execution::*, generate_stubgen, solidity_interface, types::*, weight};
-use nft_data_structs::CollectionMode;
+use up_data_structs::CollectionMode;
use pallet_common::erc::{CommonEvmHandler, PrecompileResult};
use sp_core::{H160, U256};
use sp_std::vec::Vec;
pallets/fungible/src/lib.rsdiffbeforeafterboth--- a/pallets/fungible/src/lib.rs
+++ b/pallets/fungible/src/lib.rs
@@ -2,7 +2,7 @@
use core::ops::Deref;
use frame_support::{ensure};
-use nft_data_structs::{AccessMode, Collection, CollectionId, TokenId};
+use up_data_structs::{AccessMode, Collection, CollectionId, TokenId};
use pallet_common::{
Error as CommonError, Event as CommonEvent, Pallet as PalletCommon, account::CrossAccountId,
};
@@ -26,7 +26,7 @@
#[frame_support::pallet]
pub mod pallet {
use frame_support::{Blake2_128, Blake2_128Concat, Twox64Concat, pallet_prelude::*, storage::Key};
- use nft_data_structs::CollectionId;
+ use up_data_structs::CollectionId;
use super::weights::WeightInfo;
#[pallet::error]
@@ -36,7 +36,7 @@
/// Not default id passed as TokenId argument
FungibleItemsHaveNoId,
/// Tried to set data for fungible item
- FungibleItemsHaveData,
+ FungibleItemsDontHaveData,
}
#[pallet::config]
@@ -49,7 +49,7 @@
pub struct Pallet<T>(_);
#[pallet::storage]
- pub(super) type TotalSupply<T: Config> =
+ pub type TotalSupply<T: Config> =
StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u128, QueryKind = ValueQuery>;
#[pallet::storage]
@@ -63,7 +63,7 @@
>;
#[pallet::storage]
- pub(super) type Allowance<T: Config> = StorageNMap<
+ pub type Allowance<T: Config> = StorageNMap<
Key = (
Key<Twox64Concat, CollectionId>,
Key<Blake2_128, T::CrossAccountId>,
@@ -280,7 +280,11 @@
spender: &T::CrossAccountId,
amount: u128,
) {
- <Allowance<T>>::insert((collection.id, owner, spender), amount);
+ if amount == 0 {
+ <Allowance<T>>::remove((collection.id, owner, spender));
+ } else {
+ <Allowance<T>>::insert((collection.id, owner, spender), amount);
+ }
collection.log(ERC20Events::Approval {
owner: *owner.as_eth(),
pallets/fungible/src/weights.rsdiffbeforeafterboth--- a/pallets/fungible/src/weights.rs
+++ b/pallets/fungible/src/weights.rs
@@ -7,7 +7,7 @@
//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 128
// Executed Command:
-// target/release/nft
+// target/release/unique-collator
// benchmark
// --pallet
// pallet-fungible
pallets/inflation/Cargo.tomldiffbeforeafterboth--- a/pallets/inflation/Cargo.toml
+++ b/pallets/inflation/Cargo.toml
@@ -3,13 +3,13 @@
[package]
authors = ['Unique Network <support@uniquenetwork.io>']
-description = 'Substrate node nft'
+description = 'Unique Inflation Pallet'
edition = '2018'
homepage = 'https://unique.network'
license = 'All Rights Reserved'
name = 'pallet-inflation'
-repository = 'https://github.com/usetech-llc/nft_private/'
-version = '3.0.0'
+repository = 'https://github.com/UniqueNetwork/unique-chain'
+version = '0.1.0'
[package.metadata.docs.rs]
targets = ['x86_64-unknown-linux-gnu']
pallets/inflation/src/lib.rsdiffbeforeafterboth--- a/pallets/inflation/src/lib.rs
+++ b/pallets/inflation/src/lib.rs
@@ -46,7 +46,8 @@
pub type BalanceOf<T> =
<<T as Config>::Currency as Currency<<T as frame_system::Config>::AccountId>>::Balance;
-pub const YEAR: u32 = 5_259_600;
+// pub const YEAR: u32 = 5_259_600; // 6-second block
+pub const YEAR: u32 = 2_629_800; // 12-second block
pub const TOTAL_YEARS_UNTIL_FLAT: u32 = 9;
pub const START_INFLATION_PERCENT: u32 = 10;
pub const END_INFLATION_PERCENT: u32 = 4;
pallets/inflation/src/tests.rsdiffbeforeafterboth--- a/pallets/inflation/src/tests.rs
+++ b/pallets/inflation/src/tests.rs
@@ -18,7 +18,7 @@
type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;
type Block = frame_system::mocking::MockBlock<Test>;
-const YEAR: u64 = 5_259_600;
+const YEAR: u64 = 2_629_800;
parameter_types! {
pub const ExistentialDeposit: u64 = 1;
@@ -112,8 +112,8 @@
// first inflation deposit should be equal to BlockInflation
Inflation::on_initialize(1);
- // SBP M2 review: Verify expected block inflation for year 1
- assert_eq!(Inflation::block_inflation(), 1901);
+ // Expected 100-block inflation for year 1 is 100 * 100_000_000 / YEAR = 3803
+ assert_eq!(Inflation::block_inflation(), 3803);
assert_eq!(
Balances::free_balance(1234) - initial_issuance,
Inflation::block_inflation()
@@ -158,26 +158,21 @@
let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);
assert_eq!(Balances::free_balance(1234), initial_issuance);
Inflation::on_initialize(1);
- let block_inflation_year_0 = Inflation::block_inflation();
- // SBP M2 review: go through all the block inflations for year 1,
+ // Go through all the block inflations for year 1,
// total issuance will be updated accordingly
for block in (100..YEAR).step_by(100) {
Inflation::on_initialize(block);
}
assert_eq!(
- initial_issuance + (1901 * (YEAR / 100)),
+ initial_issuance + (3803 * (YEAR / 100)),
<Balances as Currency<_>>::total_issuance()
);
Inflation::on_initialize(YEAR);
let block_inflation_year_1 = Inflation::block_inflation();
- // SBP M2 review: Verify expected block inflation for year 2
- assert_eq!(block_inflation_year_1, 1952);
-
- // SBP M2 review: this is actually not true
- // Assert that year 1 inflation is less than year 0
- // assert!(block_inflation_year_0 > block_inflation_year_1);
+ // Expected 100-block inflation for year 2: 100 * 9.33% * initial issuance * 110% / YEAR = 3904
+ assert_eq!(block_inflation_year_1, 3904);
});
}
pallets/nft/Cargo.tomldiffbeforeafterboth--- a/pallets/nft/Cargo.toml
+++ /dev/null
@@ -1,154 +0,0 @@
-################################################################################
-# Package
-
-[package]
-authors = ['Unique Network <support@uniquenetwork.io>']
-description = 'Substrate node nft'
-edition = '2018'
-homepage = 'https://unique.network'
-license = 'All Rights Reserved'
-name = 'pallet-nft'
-repository = 'https://github.com/usetech-llc/nft_private/'
-version = '3.0.0'
-
-[package.metadata.docs.rs]
-targets = ['x86_64-unknown-linux-gnu']
-
-[features]
-default = ['std']
-runtime-benchmarks = ['frame-benchmarking', 'pallet-common/runtime-benchmarks']
-std = [
- 'codec/std',
- 'serde/std',
- 'frame-support/std',
- 'frame-system/std',
- 'pallet-balances/std',
- 'pallet-evm/std',
- 'pallet-timestamp/std',
- 'pallet-randomness-collective-flip/std',
- 'pallet-transaction-payment/std',
- 'pallet-common/std',
- 'pallet-fungible/std',
- 'pallet-nonfungible/std',
- 'pallet-refungible/std',
- 'fp-evm/std',
- 'nft-data-structs/std',
- 'up-sponsorship/std',
- 'up-evm-mapping/std',
- 'sp-std/std',
- 'sp-api/std',
- 'sp-runtime/std',
- 'frame-benchmarking/std',
- 'ethereum/std',
- 'rlp/std',
-
- 'primitive-types/std',
- 'evm-coder/std',
- 'pallet-evm-coder-substrate/std',
-]
-limit-testing = ["nft-data-structs/limit-testing"]
-
-################################################################################
-# Substrate Dependencies
-
-[dependencies.codec]
-default-features = false
-features = ['derive']
-package = 'parity-scale-codec'
-version = '2.3.0'
-
-[dependencies.frame-benchmarking]
-default-features = false
-optional = true
-git = 'https://github.com/paritytech/substrate.git'
-branch = 'polkadot-v0.9.12'
-
-[dependencies.frame-support]
-default-features = false
-git = 'https://github.com/paritytech/substrate.git'
-branch = 'polkadot-v0.9.12'
-
-[dependencies.frame-system]
-default-features = false
-git = 'https://github.com/paritytech/substrate.git'
-branch = 'polkadot-v0.9.12'
-
-[dependencies.pallet-balances]
-default-features = false
-git = 'https://github.com/paritytech/substrate.git'
-branch = 'polkadot-v0.9.12'
-
-[dependencies.pallet-timestamp]
-default-features = false
-git = 'https://github.com/paritytech/substrate.git'
-branch = 'polkadot-v0.9.12'
-
-[dependencies.pallet-randomness-collective-flip]
-default-features = false
-git = 'https://github.com/paritytech/substrate.git'
-branch = 'polkadot-v0.9.12'
-
-[dependencies.sp-std]
-default-features = false
-git = 'https://github.com/paritytech/substrate.git'
-branch = 'polkadot-v0.9.12'
-
-[dependencies.pallet-transaction-payment]
-default-features = false
-git = 'https://github.com/paritytech/substrate.git'
-branch = 'polkadot-v0.9.12'
-
-[dependencies.serde]
-default-features = false
-features = ['derive']
-version = '1.0.130'
-
-[dependencies.sp-runtime]
-default-features = false
-git = 'https://github.com/paritytech/substrate.git'
-branch = 'polkadot-v0.9.12'
-
-[dependencies.sp-core]
-default-features = false
-git = 'https://github.com/paritytech/substrate.git'
-branch = 'polkadot-v0.9.12'
-
-[dependencies.sp-io]
-default-features = false
-git = 'https://github.com/paritytech/substrate.git'
-branch = 'polkadot-v0.9.12'
-
-
-################################################################################
-# Local Dependencies
-
-[dependencies.nft-data-structs]
-default-features = false
-path = '../../primitives/nft'
-version = '0.9.0'
-
-[dependencies]
-scale-info = { version = "1.0.0", default-features = false, features = [
- "derive",
-] }
-ethereum = { version = "0.10.0", default-features = false }
-rlp = { default-features = false, version = "0.5.0" }
-sp-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.12" }
-
-up-sponsorship = { version = "0.1.0", default-features = false, git = "https://github.com/UniqueNetwork/pallet-sponsoring" }
-up-evm-mapping = { default-features = false, path = "../../primitives/evm-mapping" }
-evm-coder = { default-features = false, path = "../../crates/evm-coder" }
-pallet-evm-coder-substrate = { default-features = false, path = "../../pallets/evm-coder-substrate" }
-primitive-types = { version = "0.10.1", default-features = false, features = [
- "serde_no_std",
-] }
-
-pallet-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier.git", branch = "unique-polkadot-v0.9.12-weights" }
-pallet-ethereum = { default-features = false, git = "https://github.com/uniquenetwork/frontier.git", branch = "unique-polkadot-v0.9.12-weights" }
-fp-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier.git", branch = "unique-polkadot-v0.9.12-weights" }
-hex-literal = "0.3.3"
-
-pallet-common = { default-features = false, path = "../common" }
-pallet-fungible = { default-features = false, path = "../fungible" }
-pallet-nonfungible = { default-features = false, path = "../nonfungible" }
-pallet-refungible = { default-features = false, path = "../refungible" }
pallets/nft/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/nft/src/benchmarking.rs
+++ /dev/null
@@ -1,173 +0,0 @@
-#![cfg(feature = "runtime-benchmarks")]
-
-use super::*;
-use crate::Pallet;
-use frame_system::RawOrigin;
-use frame_benchmarking::{benchmarks, account};
-use nft_data_structs::*;
-use core::convert::TryInto;
-use sp_runtime::DispatchError;
-use pallet_common::benchmarking::{create_data, create_u16_data};
-
-const SEED: u32 = 1;
-
-fn create_collection_helper<T: Config>(
- owner: T::AccountId,
- mode: CollectionMode,
-) -> Result<CollectionId, DispatchError> {
- T::Currency::deposit_creating(&owner, T::CollectionCreationPrice::get());
- let col_name = create_u16_data(MAX_COLLECTION_NAME_LENGTH)
- .try_into()
- .unwrap();
- let col_desc = create_u16_data(MAX_COLLECTION_DESCRIPTION_LENGTH)
- .try_into()
- .unwrap();
- let token_prefix = create_data(MAX_TOKEN_PREFIX_LENGTH).try_into().unwrap();
- <Pallet<T>>::create_collection(
- RawOrigin::Signed(owner).into(),
- col_name,
- col_desc,
- token_prefix,
- mode,
- )?;
- Ok(<pallet_common::CreatedCollectionCount<T>>::get())
-}
-fn create_nft_collection<T: Config>(owner: T::AccountId) -> Result<CollectionId, DispatchError> {
- create_collection_helper::<T>(owner, CollectionMode::NFT)
-}
-
-benchmarks! {
-
- create_collection {
- let col_name: Vec<u16> = create_u16_data(MAX_COLLECTION_NAME_LENGTH);
- let col_desc: Vec<u16> = create_u16_data(MAX_COLLECTION_DESCRIPTION_LENGTH);
- let token_prefix: Vec<u8> = create_data(MAX_TOKEN_PREFIX_LENGTH);
- let mode: CollectionMode = CollectionMode::NFT;
- let caller: T::AccountId = account("caller", 0, SEED);
- T::Currency::deposit_creating(&caller, T::CollectionCreationPrice::get());
- }: _(RawOrigin::Signed(caller.clone()), col_name.clone(), col_desc.clone(), token_prefix.clone(), mode)
- verify {
- assert_eq!(<pallet_common::CollectionById<T>>::get(CollectionId(1)).unwrap().owner, caller);
- }
-
- destroy_collection {
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- }: _(RawOrigin::Signed(caller.clone()), collection)
-
- add_to_allow_list {
- let caller: T::AccountId = account("caller", 0, SEED);
- let allowlist_account: T::AccountId = account("admin", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- }: _(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(allowlist_account))
-
- remove_from_allow_list {
- let caller: T::AccountId = account("caller", 0, SEED);
- let allowlist_account: T::AccountId = account("admin", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- <Pallet<T>>::add_to_allow_list(RawOrigin::Signed(caller.clone()).into(), collection, T::CrossAccountId::from_sub(allowlist_account.clone()))?;
- }: _(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(allowlist_account))
-
- set_public_access_mode {
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- }: _(RawOrigin::Signed(caller.clone()), collection, AccessMode::AllowList)
-
- set_mint_permission {
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- }: _(RawOrigin::Signed(caller.clone()), collection, true)
-
- change_collection_owner {
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- let new_owner: T::AccountId = account("admin", 0, SEED);
- }: _(RawOrigin::Signed(caller.clone()), collection, new_owner)
-
- add_collection_admin {
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- let new_admin: T::AccountId = account("admin", 0, SEED);
- }: _(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(new_admin))
-
- remove_collection_admin {
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- let new_admin: T::AccountId = account("admin", 0, SEED);
- <Pallet<T>>::add_collection_admin(RawOrigin::Signed(caller.clone()).into(), collection, T::CrossAccountId::from_sub(new_admin.clone()))?;
- }: _(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(new_admin))
-
- set_collection_sponsor {
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- }: _(RawOrigin::Signed(caller.clone()), collection, caller.clone())
-
- confirm_sponsorship {
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- <Pallet<T>>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), collection, caller.clone())?;
- }: _(RawOrigin::Signed(caller.clone()), collection)
-
- remove_collection_sponsor {
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- <Pallet<T>>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), collection, caller.clone())?;
- <Pallet<T>>::confirm_sponsorship(RawOrigin::Signed(caller.clone()).into(), collection)?;
- }: _(RawOrigin::Signed(caller.clone()), collection)
-
- set_transfers_enabled_flag {
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- }: _(RawOrigin::Signed(caller.clone()), collection, false)
-
- set_offchain_schema {
- let b in 0..OFFCHAIN_SCHEMA_LIMIT;
-
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- let data = create_data(b as usize);
- }: set_offchain_schema(RawOrigin::Signed(caller.clone()), collection, data)
-
- set_const_on_chain_schema {
- let b in 0..CONST_ON_CHAIN_SCHEMA_LIMIT;
-
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- let data = create_data(b as usize);
- }: set_const_on_chain_schema(RawOrigin::Signed(caller.clone()), collection, data)
-
- set_variable_on_chain_schema {
- let b in 0..VARIABLE_ON_CHAIN_SCHEMA_LIMIT;
-
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- let data = create_data(b as usize);
- }: set_variable_on_chain_schema(RawOrigin::Signed(caller.clone()), collection, data)
-
- set_schema_version {
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- }: set_schema_version(RawOrigin::Signed(caller.clone()), collection, SchemaVersion::Unique)
-
- set_collection_limits{
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
-
- let cl = CollectionLimits {
- account_token_ownership_limit: Some(0),
- sponsored_data_size: Some(0),
- token_limit: Some(1),
- sponsor_transfer_timeout: Some(0),
- sponsor_approve_timeout: None,
- owner_can_destroy: Some(true),
- owner_can_transfer: Some(true),
- sponsored_data_rate_limit: None,
- transfers_enabled: Some(true),
- };
- }: set_collection_limits(RawOrigin::Signed(caller.clone()), collection, cl)
-
- set_meta_update_permission_flag {
- let caller: T::AccountId = account("caller", 0, SEED);
- let collection = create_nft_collection::<T>(caller.clone())?;
- }: _(RawOrigin::Signed(caller.clone()), collection, MetaUpdatePermission::Admin)
-}
pallets/nft/src/common.rsdiffbeforeafterboth--- a/pallets/nft/src/common.rs
+++ /dev/null
@@ -1,52 +0,0 @@
-use core::marker::PhantomData;
-use frame_support::{weights::Weight};
-use pallet_common::{CommonWeightInfo};
-
-use pallet_fungible::{common::CommonWeights as FungibleWeights};
-use pallet_nonfungible::{common::CommonWeights as NonfungibleWeights};
-use pallet_refungible::{common::CommonWeights as RefungibleWeights};
-
-use crate::{Config, dispatch::dispatch_weight};
-
-macro_rules! max_weight_of {
- ($method:ident ( $($args:tt)* )) => {
- <FungibleWeights<T>>::$method($($args)*)
- .max(<NonfungibleWeights<T>>::$method($($args)*))
- .max(<RefungibleWeights<T>>::$method($($args)*))
- };
-}
-
-pub struct CommonWeights<T: Config>(PhantomData<T>);
-impl<T: Config> CommonWeightInfo for CommonWeights<T> {
- fn create_item() -> nft_data_structs::Weight {
- dispatch_weight::<T>() + max_weight_of!(create_item())
- }
-
- fn create_multiple_items(amount: u32) -> Weight {
- dispatch_weight::<T>() + max_weight_of!(create_multiple_items(amount))
- }
-
- fn burn_item() -> Weight {
- dispatch_weight::<T>() + max_weight_of!(burn_item())
- }
-
- fn transfer() -> nft_data_structs::Weight {
- dispatch_weight::<T>() + max_weight_of!(transfer())
- }
-
- fn approve() -> nft_data_structs::Weight {
- dispatch_weight::<T>() + max_weight_of!(approve())
- }
-
- fn transfer_from() -> nft_data_structs::Weight {
- dispatch_weight::<T>() + max_weight_of!(transfer_from())
- }
-
- fn set_variable_metadata(bytes: u32) -> nft_data_structs::Weight {
- dispatch_weight::<T>() + max_weight_of!(set_variable_metadata(bytes))
- }
-
- fn burn_from() -> Weight {
- dispatch_weight::<T>() + max_weight_of!(burn_from())
- }
-}
pallets/nft/src/dispatch.rsdiffbeforeafterboth--- a/pallets/nft/src/dispatch.rs
+++ /dev/null
@@ -1,88 +0,0 @@
-use frame_support::{
- dispatch::{DispatchErrorWithPostInfo, DispatchResultWithPostInfo},
- traits::Get,
- weights::Weight,
-};
-use nft_data_structs::{CollectionId, CollectionMode, Pays, PostDispatchInfo};
-use pallet_common::{CollectionHandle, CommonCollectionOperations};
-use pallet_fungible::FungibleHandle;
-use pallet_nonfungible::NonfungibleHandle;
-use pallet_refungible::RefungibleHandle;
-
-use crate::Config;
-
-// TODO: move to benchmarking
-/// Price of [`dispatch_call`] call with noop `call` argument
-pub fn dispatch_weight<T: Config>() -> Weight {
- // Read collection
- <T as frame_system::Config>::DbWeight::get().reads(1)
- // Dynamic dispatch?
- + 6_000_000
- // submit_logs is measured as part of collection pallets
-}
-
-pub enum Dispatched<T: Config> {
- Fungible(FungibleHandle<T>),
- Nonfungible(NonfungibleHandle<T>),
- Refungible(RefungibleHandle<T>),
-}
-impl<T: Config> Dispatched<T> {
- pub fn dispatch(handle: CollectionHandle<T>) -> Self {
- match handle.mode {
- CollectionMode::Fungible(_) => Self::Fungible(FungibleHandle::cast(handle)),
- CollectionMode::NFT => Self::Nonfungible(NonfungibleHandle::cast(handle)),
- CollectionMode::ReFungible => Self::Refungible(RefungibleHandle::cast(handle)),
- }
- }
- fn into_inner(self) -> CollectionHandle<T> {
- match self {
- Dispatched::Fungible(f) => f.into_inner(),
- Dispatched::Nonfungible(f) => f.into_inner(),
- Dispatched::Refungible(f) => f.into_inner(),
- }
- }
- pub fn as_dyn(&self) -> &dyn CommonCollectionOperations<T> {
- match self {
- Dispatched::Fungible(h) => h,
- Dispatched::Nonfungible(h) => h,
- Dispatched::Refungible(h) => h,
- }
- }
-}
-
-/// Helper function to implement substrate calls for common collection methods
-pub fn dispatch_call<
- T: Config,
- C: FnOnce(&dyn pallet_common::CommonCollectionOperations<T>) -> DispatchResultWithPostInfo,
->(
- collection: CollectionId,
- call: C,
-) -> DispatchResultWithPostInfo {
- let handle =
- CollectionHandle::try_get(collection).map_err(|error| DispatchErrorWithPostInfo {
- post_info: PostDispatchInfo {
- actual_weight: Some(dispatch_weight::<T>()),
- pays_fee: Pays::Yes,
- },
- error,
- })?;
- let dispatched = Dispatched::dispatch(handle);
- let mut result = call(dispatched.as_dyn());
- match &mut result {
- Ok(PostDispatchInfo {
- actual_weight: Some(weight),
- ..
- })
- | Err(DispatchErrorWithPostInfo {
- post_info: PostDispatchInfo {
- actual_weight: Some(weight),
- ..
- },
- ..
- }) => *weight += dispatch_weight::<T>(),
- _ => {}
- }
-
- dispatched.into_inner().submit_logs();
- result
-}
pallets/nft/src/eth/mod.rsdiffbeforeafterboth--- a/pallets/nft/src/eth/mod.rs
+++ /dev/null
@@ -1,80 +0,0 @@
-pub mod sponsoring;
-
-use fp_evm::PrecompileResult;
-use pallet_common::{
- CollectionById,
- erc::CommonEvmHandler,
- eth::{map_eth_to_id, map_eth_to_token_id},
-};
-use pallet_fungible::FungibleHandle;
-use pallet_nonfungible::NonfungibleHandle;
-use pallet_refungible::{RefungibleHandle, erc::RefungibleTokenHandle};
-use sp_std::borrow::ToOwned;
-use sp_std::vec::Vec;
-use sp_core::{H160, U256};
-use crate::{CollectionMode, Config, dispatch::Dispatched};
-use pallet_common::CollectionHandle;
-
-pub struct NftErcSupport<T: Config>(core::marker::PhantomData<T>);
-
-impl<T: Config> pallet_evm::OnMethodCall<T> for NftErcSupport<T> {
- fn is_reserved(target: &H160) -> bool {
- map_eth_to_id(target).is_some()
- }
- fn is_used(target: &H160) -> bool {
- map_eth_to_id(target)
- .map(<CollectionById<T>>::contains_key)
- .unwrap_or(false)
- }
- fn get_code(target: &H160) -> Option<Vec<u8>> {
- if let Some(collection_id) = map_eth_to_id(target) {
- let collection = <CollectionById<T>>::get(collection_id)?;
- Some(
- match collection.mode {
- CollectionMode::NFT => <NonfungibleHandle<T>>::CODE,
- CollectionMode::Fungible(_) => <FungibleHandle<T>>::CODE,
- CollectionMode::ReFungible => <RefungibleHandle<T>>::CODE,
- }
- .to_owned(),
- )
- } else if let Some((collection_id, _token_id)) = map_eth_to_token_id(target) {
- let collection = <CollectionById<T>>::get(collection_id)?;
- if collection.mode != CollectionMode::ReFungible {
- return None;
- }
- // TODO: check token existence
- Some(<RefungibleTokenHandle<T>>::CODE.to_owned())
- } else {
- None
- }
- }
- fn call(
- source: &H160,
- target: &H160,
- gas_limit: u64,
- input: &[u8],
- value: U256,
- ) -> Option<PrecompileResult> {
- if let Some(collection_id) = map_eth_to_id(target) {
- let collection = <CollectionHandle<T>>::new_with_gas_limit(collection_id, gas_limit)?;
- let dispatched = Dispatched::dispatch(collection);
-
- match dispatched {
- Dispatched::Fungible(h) => h.call(source, input, value),
- Dispatched::Nonfungible(h) => h.call(source, input, value),
- Dispatched::Refungible(h) => h.call(source, input, value),
- }
- } else if let Some((collection_id, token_id)) = map_eth_to_token_id(target) {
- let collection = <CollectionHandle<T>>::new_with_gas_limit(collection_id, gas_limit)?;
- if collection.mode != CollectionMode::ReFungible {
- return None;
- }
-
- let handle = RefungibleHandle::cast(collection);
- // TODO: check token existence
- RefungibleTokenHandle(handle, token_id).call(source, input, value)
- } else {
- None
- }
- }
-}
pallets/nft/src/eth/sponsoring.rsdiffbeforeafterboth--- a/pallets/nft/src/eth/sponsoring.rs
+++ /dev/null
@@ -1,74 +0,0 @@
-//! Implements EVM sponsoring logic via OnChargeEVMTransaction
-
-use crate::{Config, sponsorship::*};
-use evm_coder::{Call, abi::AbiReader};
-use pallet_common::{CollectionHandle, eth::map_eth_to_id};
-use sp_core::H160;
-use sp_std::prelude::*;
-use up_sponsorship::SponsorshipHandler;
-use core::marker::PhantomData;
-use core::convert::TryInto;
-use nft_data_structs::TokenId;
-use up_evm_mapping::EvmBackwardsAddressMapping;
-use pallet_common::account::CrossAccountId;
-
-use pallet_nonfungible::erc::{UniqueNFTCall, ERC721UniqueExtensionsCall, ERC721Call};
-use pallet_fungible::erc::{UniqueFungibleCall, ERC20Call};
-
-pub struct NftEthSponsorshipHandler<T: Config>(PhantomData<*const T>);
-impl<T: Config> SponsorshipHandler<H160, (H160, Vec<u8>)> for NftEthSponsorshipHandler<T> {
- fn get_sponsor(who: &H160, call: &(H160, Vec<u8>)) -> Option<H160> {
- let collection_id = map_eth_to_id(&call.0)?;
- let collection = <CollectionHandle<T>>::new(collection_id)?;
- let sponsor = collection.sponsorship.sponsor()?.clone();
- let sponsor =
- <T as pallet_common::Config>::EvmBackwardsAddressMapping::from_account_id(sponsor);
- let who = T::CrossAccountId::from_eth(*who);
- let (method_id, mut reader) = AbiReader::new_call(&call.1).ok()?;
- match &collection.mode {
- crate::CollectionMode::NFT => {
- let call = <UniqueNFTCall<T>>::parse(method_id, &mut reader).ok()??;
- match call {
- UniqueNFTCall::ERC721UniqueExtensions(
- ERC721UniqueExtensionsCall::Transfer { token_id, .. },
- ) => {
- let token_id: TokenId = token_id.try_into().ok()?;
- withdraw_transfer::<T>(&collection, &who, &token_id).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);
- withdraw_transfer::<T>(&collection, &from, &token_id).map(|()| sponsor)
- }
- UniqueNFTCall::ERC721(ERC721Call::Approve { token_id, .. }) => {
- let token_id: TokenId = token_id.try_into().ok()?;
- withdraw_approve::<T>(&collection, who.as_sub(), &token_id)
- .map(|()| sponsor)
- }
- _ => None,
- }
- }
- crate::CollectionMode::Fungible(_) => {
- let call = <UniqueFungibleCall<T>>::parse(method_id, &mut reader).ok()??;
- #[allow(clippy::single_match)]
- match call {
- UniqueFungibleCall::ERC20(ERC20Call::Transfer { .. }) => {
- withdraw_transfer::<T>(&collection, &who, &TokenId::default())
- .map(|()| sponsor)
- }
- UniqueFungibleCall::ERC20(ERC20Call::TransferFrom { from, .. }) => {
- let from = T::CrossAccountId::from_eth(from);
- withdraw_transfer::<T>(&collection, &from, &TokenId::default())
- .map(|()| sponsor)
- }
- UniqueFungibleCall::ERC20(ERC20Call::Approve { .. }) => {
- withdraw_approve::<T>(&collection, who.as_sub(), &TokenId::default())
- .map(|()| sponsor)
- }
- _ => None,
- }
- }
- _ => None,
- }
- }
-}
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ /dev/null
@@ -1,955 +0,0 @@
-//
-// This file is subject to the terms and conditions defined in
-// file 'LICENSE', which is part of this source code package.
-//
-
-#![recursion_limit = "1024"]
-#![cfg_attr(not(feature = "std"), no_std)]
-#![allow(
- clippy::too_many_arguments,
- clippy::unnecessary_mut_passed,
- clippy::unused_unit
-)]
-
-extern crate alloc;
-
-pub use serde::{Serialize, Deserialize};
-
-pub use frame_support::{
- construct_runtime, decl_module, decl_storage, decl_error,
- dispatch::DispatchResult,
- ensure, fail, parameter_types,
- traits::{
- ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced, Randomness,
- IsSubType, WithdrawReasons,
- },
- weights::{
- constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},
- DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,
- WeightToFeePolynomial, DispatchClass,
- },
- StorageValue, transactional,
- pallet_prelude::DispatchResultWithPostInfo,
-};
-use scale_info::TypeInfo;
-use frame_system::{self as system, ensure_signed};
-use sp_runtime::{sp_std::prelude::Vec};
-use nft_data_structs::{
- MAX_DECIMAL_POINTS, MAX_SPONSOR_TIMEOUT, MAX_TOKEN_OWNERSHIP, CUSTOM_DATA_LIMIT,
- VARIABLE_ON_CHAIN_SCHEMA_LIMIT, CONST_ON_CHAIN_SCHEMA_LIMIT, OFFCHAIN_SCHEMA_LIMIT,
- FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT, REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
- NFT_SPONSOR_TRANSFER_TIMEOUT, AccessMode, Collection, CreateItemData, CollectionLimits,
- CollectionId, CollectionMode, TokenId, SchemaVersion, SponsorshipState, MetaUpdatePermission,
-};
-use pallet_common::{
- account::CrossAccountId, CollectionHandle, Pallet as PalletCommon, Error as CommonError,
- CommonWeightInfo,
-};
-use pallet_refungible::{Pallet as PalletRefungible, RefungibleHandle};
-use pallet_fungible::{Pallet as PalletFungible, FungibleHandle};
-use pallet_nonfungible::{Pallet as PalletNonfungible, NonfungibleHandle};
-
-#[cfg(test)]
-mod mock;
-
-#[cfg(test)]
-mod tests;
-
-mod eth;
-mod sponsorship;
-pub use sponsorship::NftSponsorshipHandler;
-pub use eth::sponsoring::NftEthSponsorshipHandler;
-
-pub use eth::NftErcSupport;
-
-pub mod common;
-use common::CommonWeights;
-pub mod dispatch;
-use dispatch::dispatch_call;
-
-#[cfg(feature = "runtime-benchmarks")]
-mod benchmarking;
-pub mod weights;
-use weights::WeightInfo;
-
-decl_error! {
- /// Error for non-fungible-token module.
- pub enum Error for Module<T: Config> {
- /// Decimal_points parameter must be lower than MAX_DECIMAL_POINTS constant, currently it is 30.
- CollectionDecimalPointLimitExceeded,
- /// This address is not set as sponsor, use setCollectionSponsor first.
- ConfirmUnsetSponsorFail,
- /// Length of items properties must be greater than 0.
- EmptyArgument,
- /// Collection limit bounds per collection exceeded
- CollectionLimitBoundsExceeded,
- /// Tried to enable permissions which are only permitted to be disabled
- OwnerPermissionsCantBeReverted,
- }
-}
-pub trait Config:
- system::Config
- + pallet_evm_coder_substrate::Config
- + pallet_common::Config
- + pallet_nonfungible::Config
- + pallet_refungible::Config
- + pallet_fungible::Config
- + Sized
- + TypeInfo
-{
- /// Weight information for extrinsics in this pallet.
- type WeightInfo: WeightInfo;
-}
-
-type SelfWeightOf<T> = <T as Config>::WeightInfo;
-
-// # Used definitions
-//
-// ## User control levels
-//
-// chain-controlled - key is uncontrolled by user
-// i.e autoincrementing index
-// can use non-cryptographic hash
-// real - key is controlled by user
-// but it is hard to generate enough colliding values, i.e owner of signed txs
-// can use non-cryptographic hash
-// controlled - key is completly controlled by users
-// i.e maps with mutable keys
-// should use cryptographic hash
-//
-// ## User control level downgrade reasons
-//
-// ?1 - chain-controlled -> controlled
-// collections/tokens can be destroyed, resulting in massive holes
-// ?2 - chain-controlled -> controlled
-// same as ?1, but can be only added, resulting in easier exploitation
-// ?3 - real -> controlled
-// no confirmation required, so addresses can be easily generated
-decl_storage! {
- trait Store for Module<T: Config> as Nft {
-
- //#region Private members
- /// Used for migrations
- ChainVersion: u64;
- //#endregion
-
- //#region Tokens transfer rate limit baskets
- /// (Collection id (controlled?2), who created (real))
- /// TODO: Off chain worker should remove from this map when collection gets removed
- pub CreateItemBasket get(fn create_item_basket): map hasher(blake2_128_concat) (CollectionId, T::AccountId) => Option<T::BlockNumber>;
- /// Collection id (controlled?2), token id (controlled?2)
- pub NftTransferBasket get(fn nft_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;
- /// Collection id (controlled?2), owning user (real)
- pub FungibleTransferBasket get(fn fungible_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;
- /// Collection id (controlled?2), token id (controlled?2)
- pub ReFungibleTransferBasket get(fn refungible_transfer_basket): nmap hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;
- //#endregion
-
- /// Variable metadata sponsoring
- /// Collection id (controlled?2), token id (controlled?2)
- pub VariableMetaDataBasket get(fn variable_meta_data_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;
- /// Approval sponsoring
- pub NftApproveBasket get(fn nft_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;
- pub FungibleApproveBasket get(fn fungible_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;
- pub RefungibleApproveBasket get(fn refungible_approve_basket): nmap hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;
- }
-}
-
-decl_module! {
- pub struct Module<T: Config> for enum Call
- where
- origin: T::Origin
- {
- type Error = Error<T>;
-
- fn on_initialize(_now: T::BlockNumber) -> Weight {
- 0
- }
-
- /// This method creates a Collection of NFTs. Each Token may have multiple properties encoded as an array of bytes of certain length. The initial owner of the collection is set to the address that signed the transaction and can be changed later.
- ///
- /// # Permissions
- ///
- /// * Anyone.
- ///
- /// # Arguments
- ///
- /// * collection_name: UTF-16 string with collection name (limit 64 characters), will be stored as zero-terminated.
- ///
- /// * collection_description: UTF-16 string with collection description (limit 256 characters), will be stored as zero-terminated.
- ///
- /// * token_prefix: UTF-8 string with token prefix.
- ///
- /// * mode: [CollectionMode] collection type and type dependent data.
- // returns collection ID
- #[weight = <SelfWeightOf<T>>::create_collection()]
- #[transactional]
- pub fn create_collection(origin,
- collection_name: Vec<u16>,
- collection_description: Vec<u16>,
- token_prefix: Vec<u8>,
- mode: CollectionMode) -> DispatchResult {
-
- // Anyone can create a collection
- let who = ensure_signed(origin)?;
-
- // Create new collection
- let new_collection = Collection {
- owner: who,
- name: collection_name,
- mode: mode.clone(),
- mint_mode: false,
- access: AccessMode::Normal,
- description: collection_description,
- token_prefix,
- offchain_schema: Vec::new(),
- schema_version: SchemaVersion::ImageURL,
- sponsorship: SponsorshipState::Disabled,
- variable_on_chain_schema: Vec::new(),
- const_on_chain_schema: Vec::new(),
- limits: Default::default(),
- meta_update_permission: Default::default(),
- };
-
- let _id = match mode {
- CollectionMode::NFT => {<PalletNonfungible<T>>::init_collection(new_collection)?},
- CollectionMode::Fungible(decimal_points) => {
- // check params
- ensure!(decimal_points <= MAX_DECIMAL_POINTS, Error::<T>::CollectionDecimalPointLimitExceeded);
- <PalletFungible<T>>::init_collection(new_collection)?
- }
- CollectionMode::ReFungible => {
- <PalletRefungible<T>>::init_collection(new_collection)?
- }
- };
-
- Ok(())
- }
-
- /// **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- ///
- /// # Arguments
- ///
- /// * collection_id: collection to destroy.
- #[weight = <SelfWeightOf<T>>::destroy_collection()]
- #[transactional]
- pub fn destroy_collection(origin, collection_id: CollectionId) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- let collection = <CollectionHandle<T>>::try_get(collection_id)?;
- collection.check_is_owner(&sender)?;
-
- // =========
-
- match collection.mode {
- CollectionMode::ReFungible => PalletRefungible::destroy_collection(RefungibleHandle::cast(collection), &sender)?,
- CollectionMode::Fungible(_) => PalletFungible::destroy_collection(FungibleHandle::cast(collection), &sender)?,
- CollectionMode::NFT => PalletNonfungible::destroy_collection(NonfungibleHandle::cast(collection), &sender)?,
- }
-
- <NftTransferBasket<T>>::remove_prefix(collection_id, None);
- <FungibleTransferBasket<T>>::remove_prefix(collection_id, None);
- <ReFungibleTransferBasket<T>>::remove_prefix((collection_id,), None);
-
- <VariableMetaDataBasket<T>>::remove_prefix(collection_id, None);
- <NftApproveBasket<T>>::remove_prefix(collection_id, None);
- <FungibleApproveBasket<T>>::remove_prefix(collection_id, None);
- <RefungibleApproveBasket<T>>::remove_prefix((collection_id,), None);
-
- Ok(())
- }
-
- /// Add an address to allow list.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * address.
- #[weight = <SelfWeightOf<T>>::add_to_allow_list()]
- #[transactional]
- pub fn add_to_allow_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{
-
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let collection = <CollectionHandle<T>>::try_get(collection_id)?;
-
- <PalletCommon<T>>::toggle_allowlist(
- &collection,
- &sender,
- &address,
- true,
- )?;
-
- Ok(())
- }
-
- /// Remove an address from allow list.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * address.
- #[weight = <SelfWeightOf<T>>::remove_from_allow_list()]
- #[transactional]
- pub fn remove_from_allow_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{
-
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let collection = <CollectionHandle<T>>::try_get(collection_id)?;
-
- <PalletCommon<T>>::toggle_allowlist(
- &collection,
- &sender,
- &address,
- false,
- )?;
-
- Ok(())
- }
-
- /// Toggle between normal and allow list access for the methods with access for `Anyone`.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * mode: [AccessMode]
- #[weight = <SelfWeightOf<T>>::set_public_access_mode()]
- #[transactional]
- pub fn set_public_access_mode(origin, collection_id: CollectionId, mode: AccessMode) -> DispatchResult
- {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
- target_collection.check_is_owner(&sender)?;
-
- target_collection.access = mode;
- target_collection.save()
- }
-
- /// Allows Anyone to create tokens if:
- /// * Allow List is enabled, and
- /// * Address is added to allow list, and
- /// * This method was called with True parameter
- ///
- /// # Permissions
- /// * Collection Owner
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * mint_permission: Boolean parameter. If True, allows minting to Anyone with conditions above.
- #[weight = <SelfWeightOf<T>>::set_mint_permission()]
- #[transactional]
- pub fn set_mint_permission(origin, collection_id: CollectionId, mint_permission: bool) -> DispatchResult
- {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
- target_collection.check_is_owner(&sender)?;
-
- target_collection.mint_mode = mint_permission;
- target_collection.save()
- }
-
- /// Change the owner of the collection.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * new_owner.
- #[weight = <SelfWeightOf<T>>::change_collection_owner()]
- #[transactional]
- pub fn change_collection_owner(origin, collection_id: CollectionId, new_owner: T::AccountId) -> DispatchResult {
-
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
- target_collection.check_is_owner(&sender)?;
-
- target_collection.owner = new_owner;
- target_collection.save()
- }
-
- /// Adds an admin of the Collection.
- /// NFT Collection can be controlled by multiple admin addresses (some which can also be servers, for example). Admins can issue and burn NFTs, as well as add and remove other admins, but cannot change NFT or Collection ownership.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- /// * Collection Admin.
- ///
- /// # Arguments
- ///
- /// * collection_id: ID of the Collection to add admin for.
- ///
- /// * new_admin_id: Address of new admin to add.
- #[weight = <SelfWeightOf<T>>::add_collection_admin()]
- #[transactional]
- pub fn add_collection_admin(origin, collection_id: CollectionId, new_admin_id: T::CrossAccountId) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let collection = <CollectionHandle<T>>::try_get(collection_id)?;
-
- <PalletCommon<T>>::toggle_admin(&collection, &sender, &new_admin_id, true)
- }
-
- /// Remove admin address of the Collection. An admin address can remove itself. List of admins may become empty, in which case only Collection Owner will be able to add an Admin.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- /// * Collection Admin.
- ///
- /// # Arguments
- ///
- /// * collection_id: ID of the Collection to remove admin for.
- ///
- /// * account_id: Address of admin to remove.
- #[weight = <SelfWeightOf<T>>::remove_collection_admin()]
- #[transactional]
- pub fn remove_collection_admin(origin, collection_id: CollectionId, account_id: T::CrossAccountId) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let collection = <CollectionHandle<T>>::try_get(collection_id)?;
-
- <PalletCommon<T>>::toggle_admin(&collection, &sender, &account_id, false)
- }
-
- /// # Permissions
- ///
- /// * Collection Owner
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * new_sponsor.
- #[weight = <SelfWeightOf<T>>::set_collection_sponsor()]
- #[transactional]
- pub fn set_collection_sponsor(origin, collection_id: CollectionId, new_sponsor: T::AccountId) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
- target_collection.check_is_owner(&sender)?;
-
- target_collection.sponsorship = SponsorshipState::Unconfirmed(new_sponsor);
- target_collection.save()
- }
-
- /// # Permissions
- ///
- /// * Sponsor.
- ///
- /// # Arguments
- ///
- /// * collection_id.
- #[weight = <SelfWeightOf<T>>::confirm_sponsorship()]
- #[transactional]
- pub fn confirm_sponsorship(origin, collection_id: CollectionId) -> DispatchResult {
- let sender = ensure_signed(origin)?;
-
- let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
- ensure!(
- target_collection.sponsorship.pending_sponsor() == Some(&sender),
- Error::<T>::ConfirmUnsetSponsorFail
- );
-
- target_collection.sponsorship = SponsorshipState::Confirmed(sender);
- target_collection.save()
- }
-
- /// Switch back to pay-per-own-transaction model.
- ///
- /// # Permissions
- ///
- /// * Collection owner.
- ///
- /// # Arguments
- ///
- /// * collection_id.
- #[weight = <SelfWeightOf<T>>::remove_collection_sponsor()]
- #[transactional]
- pub fn remove_collection_sponsor(origin, collection_id: CollectionId) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
- target_collection.check_is_owner(&sender)?;
-
- target_collection.sponsorship = SponsorshipState::Disabled;
- target_collection.save()
- }
-
- /// This method creates a concrete instance of NFT Collection created with CreateCollection method.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- /// * Collection Admin.
- /// * Anyone if
- /// * Allow List is enabled, and
- /// * Address is added to allow list, and
- /// * MintPermission is enabled (see SetMintPermission method)
- ///
- /// # Arguments
- ///
- /// * collection_id: ID of the collection.
- ///
- /// * owner: Address, initial owner of the NFT.
- ///
- /// * data: Token data to store on chain.
- #[weight = <CommonWeights<T>>::create_item()]
- #[transactional]
- pub fn create_item(origin, collection_id: CollectionId, owner: T::CrossAccountId, data: CreateItemData) -> DispatchResultWithPostInfo {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- dispatch_call::<T, _>(collection_id, |d| d.create_item(sender, owner, data))
- }
-
- /// This method creates multiple items in a collection created with CreateCollection method.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- /// * Collection Admin.
- /// * Anyone if
- /// * Allow List is enabled, and
- /// * Address is added to allow list, and
- /// * MintPermission is enabled (see SetMintPermission method)
- ///
- /// # Arguments
- ///
- /// * collection_id: ID of the collection.
- ///
- /// * itemsData: Array items properties. Each property is an array of bytes itself, see [create_item].
- ///
- /// * owner: Address, initial owner of the NFT.
- #[weight = <CommonWeights<T>>::create_multiple_items(items_data.len() as u32)]
- #[transactional]
- pub fn create_multiple_items(origin, collection_id: CollectionId, owner: T::CrossAccountId, items_data: Vec<CreateItemData>) -> DispatchResultWithPostInfo {
- ensure!(!items_data.is_empty(), Error::<T>::EmptyArgument);
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- dispatch_call::<T, _>(collection_id, |d| d.create_multiple_items(sender, owner, items_data))
- }
-
- // TODO! transaction weight
-
- /// Set transfers_enabled value for particular collection
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- ///
- /// # Arguments
- ///
- /// * collection_id: ID of the collection.
- ///
- /// * value: New flag value.
- #[weight = <SelfWeightOf<T>>::set_transfers_enabled_flag()]
- #[transactional]
- pub fn set_transfers_enabled_flag(origin, collection_id: CollectionId, value: bool) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
- target_collection.check_is_owner(&sender)?;
-
- // =========
-
- target_collection.limits.transfers_enabled = Some(value);
- target_collection.save()
- }
-
- /// Destroys a concrete instance of NFT.
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- /// * Collection Admin.
- /// * Current NFT Owner.
- ///
- /// # Arguments
- ///
- /// * collection_id: ID of the collection.
- ///
- /// * item_id: ID of NFT to burn.
- #[weight = <CommonWeights<T>>::burn_item()]
- #[transactional]
- pub fn burn_item(origin, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- let post_info = dispatch_call::<T, _>(collection_id, |d| d.burn_item(sender, item_id, value))?;
- if value == 1 {
- <NftTransferBasket<T>>::remove(collection_id, item_id);
- <NftApproveBasket<T>>::remove(collection_id, item_id);
- }
- // Those maps should be cleared only if token disappears completly, need to move this part of logic to pallets?
- // <FungibleApproveBasket<T>>::remove(collection_id, sender.as_sub());
- // <RefungibleApproveBasket<T>>::remove((collection_id, item_id, sender.as_sub()));
- Ok(post_info)
- }
-
- /// Destroys a concrete instance of NFT on behalf of the owner
- /// See also: [`approve`]
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- /// * Collection Admin.
- /// * Current NFT Owner.
- ///
- /// # Arguments
- ///
- /// * collection_id: ID of the collection.
- ///
- /// * item_id: ID of NFT to burn.
- ///
- /// * from: owner of item
- #[weight = <CommonWeights<T>>::burn_from()]
- #[transactional]
- pub fn burn_from(origin, collection_id: CollectionId, from: T::CrossAccountId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- dispatch_call::<T, _>(collection_id, |d| d.burn_from(sender, from, item_id, value))
- }
-
- /// Change ownership of the token.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- /// * Current NFT owner
- ///
- /// # Arguments
- ///
- /// * recipient: Address of token recipient.
- ///
- /// * collection_id.
- ///
- /// * item_id: ID of the item
- /// * Non-Fungible Mode: Required.
- /// * Fungible Mode: Ignored.
- /// * Re-Fungible Mode: Required.
- ///
- /// * value: Amount to transfer.
- /// * Non-Fungible Mode: Ignored
- /// * Fungible Mode: Must specify transferred amount
- /// * Re-Fungible Mode: Must specify transferred portion (between 0 and 1)
- #[weight = <CommonWeights<T>>::transfer()]
- #[transactional]
- pub fn transfer(origin, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- dispatch_call::<T, _>(collection_id, |d| d.transfer(sender, recipient, item_id, value))
- }
-
- /// Set, change, or remove approved address to transfer the ownership of the NFT.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- /// * Current NFT owner
- ///
- /// # Arguments
- ///
- /// * approved: Address that is approved to transfer this NFT or zero (if needed to remove approval).
- ///
- /// * collection_id.
- ///
- /// * item_id: ID of the item.
- #[weight = <CommonWeights<T>>::approve()]
- #[transactional]
- pub fn approve(origin, spender: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, amount: u128) -> DispatchResultWithPostInfo {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- dispatch_call::<T, _>(collection_id, |d| d.approve(sender, spender, item_id, amount))
- }
-
- /// Change ownership of a NFT on behalf of the owner. See Approve method for additional information. After this method executes, the approval is removed so that the approved address will not be able to transfer this NFT again from this owner.
- ///
- /// # Permissions
- /// * Collection Owner
- /// * Collection Admin
- /// * Current NFT owner
- /// * Address approved by current NFT owner
- ///
- /// # Arguments
- ///
- /// * from: Address that owns token.
- ///
- /// * recipient: Address of token recipient.
- ///
- /// * collection_id.
- ///
- /// * item_id: ID of the item.
- ///
- /// * value: Amount to transfer.
- #[weight = <CommonWeights<T>>::transfer_from()]
- #[transactional]
- pub fn transfer_from(origin, from: T::CrossAccountId, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128 ) -> DispatchResultWithPostInfo {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- dispatch_call::<T, _>(collection_id, |d| d.transfer_from(sender, from, recipient, item_id, value))
- }
-
- /// Set off-chain data schema.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * schema: String representing the offchain data schema.
- #[weight = <CommonWeights<T>>::set_variable_metadata(data.len() as u32)]
- #[transactional]
- pub fn set_variable_meta_data (
- origin,
- collection_id: CollectionId,
- item_id: TokenId,
- data: Vec<u8>
- ) -> DispatchResultWithPostInfo {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- dispatch_call::<T, _>(collection_id, |d| d.set_variable_metadata(sender, item_id, data))
- }
-
- /// Set meta_update_permission value for particular collection
- ///
- /// # Permissions
- ///
- /// * Collection Owner.
- ///
- /// # Arguments
- ///
- /// * collection_id: ID of the collection.
- ///
- /// * value: New flag value.
- #[weight = <SelfWeightOf<T>>::set_meta_update_permission_flag()]
- #[transactional]
- pub fn set_meta_update_permission_flag(origin, collection_id: CollectionId, value: MetaUpdatePermission) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
-
- ensure!(
- target_collection.meta_update_permission != MetaUpdatePermission::None,
- <CommonError<T>>::MetadataFlagFrozen,
- );
- target_collection.check_is_owner(&sender)?;
-
- target_collection.meta_update_permission = value;
-
- target_collection.save()
- }
-
- /// Set schema standard
- /// ImageURL
- /// Unique
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * schema: SchemaVersion: enum
- #[weight = <SelfWeightOf<T>>::set_schema_version()]
- #[transactional]
- pub fn set_schema_version(
- origin,
- collection_id: CollectionId,
- version: SchemaVersion
- ) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
- target_collection.check_is_owner_or_admin(&sender)?;
- target_collection.schema_version = version;
- target_collection.save()
- }
-
- /// Set off-chain data schema.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * schema: String representing the offchain data schema.
- #[weight = <SelfWeightOf<T>>::set_offchain_schema(schema.len() as u32)]
- #[transactional]
- pub fn set_offchain_schema(
- origin,
- collection_id: CollectionId,
- schema: Vec<u8>
- ) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
- target_collection.check_is_owner_or_admin(&sender)?;
-
- // check schema limit
- ensure!(schema.len() as u32 <= OFFCHAIN_SCHEMA_LIMIT, "");
-
- target_collection.offchain_schema = schema;
- target_collection.save()
- }
-
- /// Set const on-chain data schema.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * schema: String representing the const on-chain data schema.
- #[weight = <SelfWeightOf<T>>::set_const_on_chain_schema(schema.len() as u32)]
- #[transactional]
- pub fn set_const_on_chain_schema (
- origin,
- collection_id: CollectionId,
- schema: Vec<u8>
- ) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
- target_collection.check_is_owner_or_admin(&sender)?;
-
- // check schema limit
- ensure!(schema.len() as u32 <= CONST_ON_CHAIN_SCHEMA_LIMIT, "");
-
- target_collection.const_on_chain_schema = schema;
- target_collection.save()
- }
-
- /// Set variable on-chain data schema.
- ///
- /// # Permissions
- ///
- /// * Collection Owner
- /// * Collection Admin
- ///
- /// # Arguments
- ///
- /// * collection_id.
- ///
- /// * schema: String representing the variable on-chain data schema.
- #[weight = <SelfWeightOf<T>>::set_const_on_chain_schema(schema.len() as u32)]
- #[transactional]
- pub fn set_variable_on_chain_schema (
- origin,
- collection_id: CollectionId,
- schema: Vec<u8>
- ) -> DispatchResult {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
- target_collection.check_is_owner_or_admin(&sender)?;
-
- // check schema limit
- ensure!(schema.len() as u32 <= VARIABLE_ON_CHAIN_SCHEMA_LIMIT, "");
-
- target_collection.variable_on_chain_schema = schema;
- target_collection.save()
- }
-
- #[weight = <SelfWeightOf<T>>::set_collection_limits()]
- #[transactional]
- pub fn set_collection_limits(
- origin,
- collection_id: CollectionId,
- new_limit: CollectionLimits,
- ) -> DispatchResult {
- let mut new_limit = new_limit;
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
- let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
- target_collection.check_is_owner(&sender)?;
- let old_limit = &target_collection.limits;
-
- macro_rules! limit_default {
- ($old:ident, $new:ident, $($field:ident $(($arg:expr))? => $check:expr),* $(,)?) => {{
- $(
- if let Some($new) = $new.$field {
- let $old = $old.$field($($arg)?);
- let _ = $new;
- let _ = $old;
- $check
- } else {
- $new.$field = $old.$field
- }
- )*
- }};
- }
-
- limit_default!(old_limit, new_limit,
- account_token_ownership_limit => ensure!(
- new_limit <= MAX_TOKEN_OWNERSHIP,
- <Error<T>>::CollectionLimitBoundsExceeded,
- ),
- sponsor_transfer_timeout(match target_collection.mode {
- CollectionMode::NFT => NFT_SPONSOR_TRANSFER_TIMEOUT,
- CollectionMode::Fungible(_) => FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
- CollectionMode::ReFungible => REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
- }) => ensure!(
- new_limit <= MAX_SPONSOR_TIMEOUT,
- <Error<T>>::CollectionLimitBoundsExceeded,
- ),
- sponsored_data_size => ensure!(
- new_limit <= CUSTOM_DATA_LIMIT,
- <Error<T>>::CollectionLimitBoundsExceeded,
- ),
- token_limit => ensure!(
- old_limit >= new_limit && new_limit > 0,
- <CommonError<T>>::CollectionTokenLimitExceeded
- ),
- owner_can_transfer => ensure!(
- old_limit || !new_limit,
- <Error<T>>::OwnerPermissionsCantBeReverted,
- ),
- owner_can_destroy => ensure!(
- old_limit || !new_limit,
- <Error<T>>::OwnerPermissionsCantBeReverted,
- ),
- sponsored_data_rate_limit => {},
- transfers_enabled => {},
- );
-
- target_collection.limits = new_limit;
-
- target_collection.save()
- }
- }
-}
pallets/nft/src/mock.rsdiffbeforeafterboth--- a/pallets/nft/src/mock.rs
+++ /dev/null
@@ -1,177 +0,0 @@
-#![allow(clippy::from_over_into)]
-
-use crate as pallet_template;
-use sp_core::H256;
-use frame_support::{parameter_types, traits::Everything, weights::IdentityFee};
-use sp_runtime::{
- traits::{BlakeTwo256, IdentityLookup},
- testing::Header,
-};
-use pallet_transaction_payment::{CurrencyAdapter};
-use frame_system as system;
-use pallet_evm::AddressMapping;
-use crate::{EvmBackwardsAddressMapping, CrossAccountId};
-use codec::{Encode, Decode};
-use scale_info::TypeInfo;
-
-type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;
-type Block = frame_system::mocking::MockBlock<Test>;
-
-// Configure a mock runtime to test the pallet.
-frame_support::construct_runtime!(
- pub enum Test where
- Block = Block,
- NodeBlock = Block,
- UncheckedExtrinsic = UncheckedExtrinsic,
- {
- System: frame_system::{Pallet, Call, Config, Storage, Event<T>},
- TemplateModule: pallet_template::{Pallet, Call, Storage},
- Balances: pallet_balances::{Pallet, Call, Storage},
- }
-);
-
-parameter_types! {
- pub const BlockHashCount: u64 = 250;
- pub const SS58Prefix: u8 = 42;
-}
-
-impl system::Config for Test {
- type BaseCallFilter = Everything;
- type BlockWeights = ();
- type BlockLength = ();
- type DbWeight = ();
- type Origin = Origin;
- type Call = Call;
- type Index = u64;
- type BlockNumber = u64;
- type Hash = H256;
- type Hashing = BlakeTwo256;
- type AccountId = u64;
- type Lookup = IdentityLookup<Self::AccountId>;
- type Header = Header;
- type Event = ();
- type BlockHashCount = BlockHashCount;
- type Version = ();
- type PalletInfo = PalletInfo;
- type AccountData = pallet_balances::AccountData<u64>;
- type OnNewAccount = ();
- type OnKilledAccount = ();
- type SystemWeightInfo = ();
- type SS58Prefix = SS58Prefix;
- type OnSetCode = ();
-}
-
-parameter_types! {
- pub const ExistentialDeposit: u64 = 1;
- pub const MaxLocks: u32 = 50;
-}
-//frame_system::Module<Test>;
-impl pallet_balances::Config for Test {
- type AccountStore = System;
- type Balance = u64;
- type DustRemoval = ();
- type Event = ();
- type ExistentialDeposit = ExistentialDeposit;
- type WeightInfo = ();
- type MaxLocks = MaxLocks;
- type MaxReserves = ();
- type ReserveIdentifier = [u8; 8];
-}
-
-parameter_types! {
- pub const TransactionByteFee: u64 = 1;
- pub const OperationalFeeMultiplier: u8 = 5;
-}
-
-impl pallet_transaction_payment::Config for Test {
- type OnChargeTransaction = CurrencyAdapter<pallet_balances::Pallet<Test>, ()>;
- type TransactionByteFee = TransactionByteFee;
- type WeightToFee = IdentityFee<u64>;
- type FeeMultiplierUpdate = ();
- type OperationalFeeMultiplier = OperationalFeeMultiplier;
-}
-
-parameter_types! {
- pub const MinimumPeriod: u64 = 1;
-}
-impl pallet_timestamp::Config for Test {
- type Moment = u64;
- type OnTimestampSet = ();
- type MinimumPeriod = MinimumPeriod;
- type WeightInfo = ();
-}
-
-parameter_types! {
- pub const CollectionCreationPrice: u32 = 0;
- pub TreasuryAccountId: u64 = 1234;
- pub EthereumChainId: u32 = 1111;
-}
-
-pub struct TestEvmAddressMapping;
-impl AddressMapping<u64> for TestEvmAddressMapping {
- fn into_account_id(_addr: sp_core::H160) -> u64 {
- unimplemented!()
- }
-}
-
-pub struct TestEvmBackwardsAddressMapping;
-impl EvmBackwardsAddressMapping<u64> for TestEvmBackwardsAddressMapping {
- fn from_account_id(_account_id: u64) -> sp_core::H160 {
- unimplemented!()
- }
-}
-
-#[derive(Encode, Decode, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, TypeInfo)]
-pub struct TestCrossAccountId(u64, sp_core::H160);
-impl CrossAccountId<u64> for TestCrossAccountId {
- fn from_sub(sub: u64) -> Self {
- let mut eth = [0; 20];
- eth[12..20].copy_from_slice(&sub.to_be_bytes());
- Self(sub, sp_core::H160(eth))
- }
- fn as_sub(&self) -> &u64 {
- &self.0
- }
- fn from_eth(eth: sp_core::H160) -> Self {
- let mut sub_raw = [0; 8];
- sub_raw.copy_from_slice(ð.0[0..8]);
- let sub = u64::from_be_bytes(sub_raw);
- Self(sub, eth)
- }
- fn as_eth(&self) -> &sp_core::H160 {
- &self.1
- }
-}
-
-pub struct TestEtheremTransactionSender;
-impl pallet_ethereum::EthereumTransactionSender for TestEtheremTransactionSender {
- fn submit_logs_transaction(
- _tx: pallet_ethereum::Transaction,
- _logs: Vec<pallet_ethereum::Log>,
- ) -> Result<(), sp_runtime::DispatchError> {
- Ok(())
- }
-}
-
-impl pallet_evm_coder_substrate::Config for Test {
- type EthereumTransactionSender = TestEtheremTransactionSender;
-}
-
-impl pallet_template::Config for Test {
- type Event = ();
- type WeightInfo = ();
- type CollectionCreationPrice = CollectionCreationPrice;
- type Currency = pallet_balances::Pallet<Test>;
- type TreasuryAccountId = TreasuryAccountId;
- type EvmAddressMapping = TestEvmAddressMapping;
- type EvmBackwardsAddressMapping = TestEvmBackwardsAddressMapping;
- type CrossAccountId = TestCrossAccountId;
-}
-
-// Build genesis storage according to the mock runtime.
-pub fn new_test_ext() -> sp_io::TestExternalities {
- system::GenesisConfig::default()
- .build_storage::<Test>()
- .unwrap()
- .into()
-}
pallets/nft/src/sponsorship.rsdiffbeforeafterboth--- a/pallets/nft/src/sponsorship.rs
+++ /dev/null
@@ -1,282 +0,0 @@
-use crate::{
- Config, Call, CreateItemBasket, VariableMetaDataBasket, ReFungibleTransferBasket,
- FungibleTransferBasket, NftTransferBasket, CreateItemData, CollectionMode, NftApproveBasket,
- FungibleApproveBasket, RefungibleApproveBasket,
-};
-use core::marker::PhantomData;
-use up_sponsorship::SponsorshipHandler;
-use frame_support::{
- traits::{IsSubType},
- storage::{StorageMap, StorageDoubleMap, StorageNMap},
-};
-use nft_data_structs::{
- CollectionId, FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT, MetaUpdatePermission,
- NFT_SPONSOR_TRANSFER_TIMEOUT, REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT, TokenId,
-};
-use pallet_common::{CollectionHandle};
-use pallet_common::account::CrossAccountId;
-
-pub fn withdraw_transfer<T: Config>(
- collection: &CollectionHandle<T>,
- who: &T::CrossAccountId,
- item_id: &TokenId,
-) -> Option<()> {
- // preliminary sponsoring correctness check
- match collection.mode {
- CollectionMode::NFT => {
- let owner = pallet_nonfungible::TokenData::<T>::get((collection.id, item_id))?.owner;
- if !owner.conv_eq(who) {
- return None;
- }
- }
- CollectionMode::Fungible(_) => {
- if item_id != &TokenId::default() {
- return None;
- }
- if <pallet_fungible::Balance<T>>::get((collection.id, who)) == 0 {
- return None;
- }
- }
- CollectionMode::ReFungible => {
- if !<pallet_refungible::Owned<T>>::get((collection.id, who, item_id)) {
- return None;
- }
- }
- }
-
- // sponsor timeout
- let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
- let limit = collection
- .limits
- .sponsor_transfer_timeout(match collection.mode {
- CollectionMode::NFT => NFT_SPONSOR_TRANSFER_TIMEOUT,
- CollectionMode::Fungible(_) => FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
- CollectionMode::ReFungible => REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
- });
-
- let last_tx_block = match collection.mode {
- CollectionMode::NFT => <NftTransferBasket<T>>::get(collection.id, item_id),
- CollectionMode::Fungible(_) => {
- <FungibleTransferBasket<T>>::get(collection.id, who.as_sub())
- }
- CollectionMode::ReFungible => {
- <ReFungibleTransferBasket<T>>::get((collection.id, item_id, who.as_sub()))
- }
- };
-
- if let Some(last_tx_block) = last_tx_block {
- let timeout = last_tx_block + limit.into();
- if block_number < timeout {
- return None;
- }
- }
-
- match collection.mode {
- CollectionMode::NFT => <NftTransferBasket<T>>::insert(collection.id, item_id, block_number),
- CollectionMode::Fungible(_) => {
- <FungibleTransferBasket<T>>::insert(collection.id, who.as_sub(), block_number)
- }
- CollectionMode::ReFungible => <ReFungibleTransferBasket<T>>::insert(
- (collection.id, item_id, who.as_sub()),
- block_number,
- ),
- };
-
- Some(())
-}
-
-pub fn withdraw_create_item<T: Config>(
- collection: &CollectionHandle<T>,
- who: &T::AccountId,
- _properties: &CreateItemData,
-) -> Option<()> {
- if _properties.data_size() as u32 > collection.limits.sponsored_data_size() {
- return None;
- }
-
- // sponsor timeout
- let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
- let limit = collection
- .limits
- .sponsor_transfer_timeout(match _properties {
- CreateItemData::NFT(_) => NFT_SPONSOR_TRANSFER_TIMEOUT,
- CreateItemData::Fungible(_) => FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
- CreateItemData::ReFungible(_) => REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
- });
-
- if let Some(last_tx_block) = <CreateItemBasket<T>>::get((collection.id, &who)) {
- let timeout = last_tx_block + limit.into();
- if block_number < timeout {
- return None;
- }
- }
-
- CreateItemBasket::<T>::insert((collection.id, who.clone()), block_number);
-
- Some(())
-}
-
-pub fn withdraw_set_variable_meta_data<T: Config>(
- who: &T::CrossAccountId,
- collection: &CollectionHandle<T>,
- item_id: &TokenId,
- data: &[u8],
-) -> Option<()> {
- // TODO: make it work for admins
- if collection.meta_update_permission != MetaUpdatePermission::ItemOwner {
- return None;
- }
- // preliminary sponsoring correctness check
- match collection.mode {
- CollectionMode::NFT => {
- let owner = pallet_nonfungible::TokenData::<T>::get((collection.id, item_id))?.owner;
- if !owner.conv_eq(who) {
- return None;
- }
- }
- CollectionMode::Fungible(_) => {
- if item_id != &TokenId::default() {
- return None;
- }
- if <pallet_fungible::Balance<T>>::get((collection.id, who)) == 0 {
- return None;
- }
- }
- CollectionMode::ReFungible => {
- if !<pallet_refungible::Owned<T>>::get((collection.id, who, item_id)) {
- return None;
- }
- }
- }
-
- // Can't sponsor fungible collection, this tx will be rejected
- // as invalid
- if matches!(collection.mode, CollectionMode::Fungible(_)) {
- return None;
- }
- if data.len() > collection.limits.sponsored_data_size() as usize {
- return None;
- }
-
- let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
- let limit = collection.limits.sponsored_data_rate_limit()?;
-
- if let Some(last_tx_block) = VariableMetaDataBasket::<T>::get(collection.id, item_id) {
- let timeout = last_tx_block + limit.into();
- if block_number < timeout {
- return None;
- }
- }
-
- <VariableMetaDataBasket<T>>::insert(collection.id, item_id, block_number);
-
- Some(())
-}
-
-pub fn withdraw_approve<T: Config>(
- collection: &CollectionHandle<T>,
- who: &T::AccountId,
- item_id: &TokenId,
-) -> Option<()> {
- // sponsor timeout
- let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
- let limit = collection.limits.sponsor_approve_timeout();
-
- let last_tx_block = match collection.mode {
- CollectionMode::NFT => <NftApproveBasket<T>>::get(collection.id, item_id),
- CollectionMode::Fungible(_) => <FungibleApproveBasket<T>>::get(collection.id, who),
- CollectionMode::ReFungible => {
- <RefungibleApproveBasket<T>>::get((collection.id, item_id, who))
- }
- };
-
- if let Some(last_tx_block) = last_tx_block {
- let timeout = last_tx_block + limit.into();
- if block_number < timeout {
- return None;
- }
- }
-
- match collection.mode {
- CollectionMode::NFT => <NftApproveBasket<T>>::insert(collection.id, item_id, block_number),
- CollectionMode::Fungible(_) => {
- <FungibleApproveBasket<T>>::insert(collection.id, who, block_number)
- }
- CollectionMode::ReFungible => {
- <RefungibleApproveBasket<T>>::insert((collection.id, item_id, who), block_number)
- }
- };
-
- Some(())
-}
-
-fn load<T: Config>(id: CollectionId) -> Option<(T::AccountId, CollectionHandle<T>)> {
- let collection = CollectionHandle::new(id)?;
- let sponsor = collection.sponsorship.sponsor().cloned()?;
- Some((sponsor, collection))
-}
-
-pub struct NftSponsorshipHandler<T>(PhantomData<T>);
-impl<T, C> SponsorshipHandler<T::AccountId, C> for NftSponsorshipHandler<T>
-where
- T: Config,
- C: IsSubType<Call<T>>,
-{
- fn get_sponsor(who: &T::AccountId, call: &C) -> Option<T::AccountId> {
- match IsSubType::<Call<T>>::is_sub_type(call)? {
- Call::create_item {
- collection_id,
- data,
- ..
- } => {
- let (sponsor, collection) = load(*collection_id)?;
- withdraw_create_item::<T>(&collection, who, data).map(|()| sponsor)
- }
- Call::transfer {
- collection_id,
- item_id,
- ..
- } => {
- let (sponsor, collection) = load(*collection_id)?;
- withdraw_transfer::<T>(
- &collection,
- &T::CrossAccountId::from_sub(who.clone()),
- item_id,
- )
- .map(|()| sponsor)
- }
- Call::transfer_from {
- collection_id,
- item_id,
- from,
- ..
- } => {
- let (sponsor, collection) = load(*collection_id)?;
- withdraw_transfer::<T>(&collection, from, item_id).map(|()| sponsor)
- }
- Call::approve {
- collection_id,
- item_id,
- ..
- } => {
- let (sponsor, collection) = load(*collection_id)?;
- withdraw_approve::<T>(&collection, who, item_id).map(|()| sponsor)
- }
- Call::set_variable_meta_data {
- collection_id,
- item_id,
- data,
- } => {
- let (sponsor, collection) = load(*collection_id)?;
- withdraw_set_variable_meta_data::<T>(
- &T::CrossAccountId::from_sub(who.clone()),
- &collection,
- item_id,
- data,
- )
- .map(|()| sponsor)
- }
- _ => None,
- }
- }
-}
pallets/nft/src/tests.rsdiffbeforeafterboth--- a/pallets/nft/src/tests.rs
+++ /dev/null
@@ -1,2291 +0,0 @@
-// Tests to be written here
-use super::*;
-use crate::mock::*;
-use crate::{AccessMode, CollectionMode, Ownership, CreateItemData};
-use nft_data_structs::{
- CreateNftData, CreateFungibleData, CreateReFungibleData, CollectionId, TokenId,
- MAX_DECIMAL_POINTS,
-};
-use frame_support::{assert_noop, assert_ok};
-use sp_std::convert::TryInto;
-
-fn default_nft_data() -> CreateNftData {
- CreateNftData {
- const_data: vec![1, 2, 3].try_into().unwrap(),
- variable_data: vec![3, 2, 1].try_into().unwrap(),
- }
-}
-
-fn default_fungible_data() -> CreateFungibleData {
- CreateFungibleData { value: 5 }
-}
-
-fn default_re_fungible_data() -> CreateReFungibleData {
- CreateReFungibleData {
- const_data: vec![1, 2, 3].try_into().unwrap(),
- variable_data: vec![3, 2, 1].try_into().unwrap(),
- pieces: 1023,
- }
-}
-
-fn create_test_collection_for_owner(
- mode: &CollectionMode,
- owner: u64,
- id: CollectionId,
-) -> CollectionId {
- let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
-
- let origin1 = Origin::signed(owner);
- assert_ok!(TemplateModule::create_collection(
- origin1,
- col_name1,
- col_desc1,
- token_prefix1,
- mode.clone()
- ));
-
- let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
- let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
- let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();
- assert_eq!(TemplateModule::collection_id(id).unwrap().owner, owner);
- assert_eq!(
- TemplateModule::collection_id(id).unwrap().name,
- saved_col_name
- );
- assert_eq!(TemplateModule::collection_id(id).unwrap().mode, *mode);
- assert_eq!(
- TemplateModule::collection_id(id).unwrap().description,
- saved_description
- );
- assert_eq!(
- TemplateModule::collection_id(id).unwrap().token_prefix,
- saved_prefix
- );
- id
-}
-
-fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {
- create_test_collection_for_owner(&mode, 1, id)
-}
-
-fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {
- let origin1 = Origin::signed(1);
- assert_ok!(TemplateModule::create_item(
- origin1,
- collection_id,
- account(1),
- data.clone()
- ));
-}
-
-fn account(sub: u64) -> TestCrossAccountId {
- TestCrossAccountId::from_sub(sub)
-}
-
-// Use cases tests region
-// #region
-
-#[test]
-fn set_version_schema() {
- new_test_ext().execute_with(|| {
- let origin1 = Origin::signed(1);
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- assert_ok!(TemplateModule::set_schema_version(
- origin1,
- collection_id,
- SchemaVersion::Unique
- ));
- assert_eq!(
- TemplateModule::collection_id(collection_id)
- .unwrap()
- .schema_version,
- SchemaVersion::Unique
- );
- });
-}
-
-#[test]
-fn create_fungible_collection_fails_with_large_decimal_numbers() {
- new_test_ext().execute_with(|| {
- let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
-
- let origin1 = Origin::signed(1);
- assert_noop!(
- TemplateModule::create_collection(
- origin1,
- col_name1,
- col_desc1,
- token_prefix1,
- CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)
- ),
- Error::<Test>::CollectionDecimalPointLimitExceeded
- );
- });
-}
-
-#[test]
-fn create_nft_item() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.clone().into());
- let item = TemplateModule::nft_item_id(collection_id, 1).unwrap();
- assert_eq!(item.const_data, data.const_data.into_inner());
- assert_eq!(item.variable_data, data.variable_data.into_inner());
- });
-}
-
-// Use cases tests region
-// #region
-#[test]
-fn create_nft_multiple_items() {
- new_test_ext().execute_with(|| {
- create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
-
- let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];
-
- assert_ok!(TemplateModule::create_multiple_items(
- origin1,
- 1,
- account(1),
- items_data
- .clone()
- .into_iter()
- .map(|d| { d.into() })
- .collect()
- ));
- for (index, data) in items_data.into_iter().enumerate() {
- let item = TemplateModule::nft_item_id(1, (index + 1) as TokenId).unwrap();
- assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());
- assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());
- }
- });
-}
-
-#[test]
-fn create_refungible_item() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);
-
- let data = default_re_fungible_data();
- create_test_item(collection_id, &data.clone().into());
- let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();
- assert_eq!(item.const_data, data.const_data.into_inner());
- assert_eq!(item.variable_data, data.variable_data.into_inner());
- assert_eq!(
- item.owner[0],
- Ownership {
- owner: account(1),
- fraction: 1023
- }
- );
- });
-}
-
-#[test]
-fn create_multiple_refungible_items() {
- new_test_ext().execute_with(|| {
- create_test_collection(&CollectionMode::ReFungible, 1);
-
- let origin1 = Origin::signed(1);
-
- let items_data = vec![
- default_re_fungible_data(),
- default_re_fungible_data(),
- default_re_fungible_data(),
- ];
-
- assert_ok!(TemplateModule::create_multiple_items(
- origin1,
- 1,
- account(1),
- items_data
- .clone()
- .into_iter()
- .map(|d| { d.into() })
- .collect()
- ));
- for (index, data) in items_data.into_iter().enumerate() {
- let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId).unwrap();
- assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());
- assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());
- assert_eq!(
- item.owner[0],
- Ownership {
- owner: account(1),
- fraction: 1023
- }
- );
- }
- });
-}
-
-#[test]
-fn create_fungible_item() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);
-
- let data = default_fungible_data();
- create_test_item(collection_id, &data.into());
-
- assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).value, 5);
- });
-}
-
-//#[test]
-// fn create_multiple_fungible_items() {
-// new_test_ext().execute_with(|| {
-// default_limits();
-
-// create_test_collection(&CollectionMode::Fungible(3), 1);
-
-// let origin1 = Origin::signed(1);
-
-// let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];
-
-// assert_ok!(TemplateModule::create_multiple_items(
-// origin1.clone(),
-// 1,
-// 1,
-// items_data.clone().into_iter().map(|d| { d.into() }).collect()
-// ));
-
-// for (index, _) in items_data.iter().enumerate() {
-// assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);
-// }
-// assert_eq!(TemplateModule::balance_count(1, 1), 3000);
-// assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);
-// });
-// }
-
-#[test]
-fn transfer_fungible_item() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);
-
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- let data = default_fungible_data();
- create_test_item(collection_id, &data.into());
-
- assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 5);
- assert_eq!(TemplateModule::balance_count(1, 1), 5);
-
- // change owner scenario
- assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 5));
- assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 0);
- assert_eq!(TemplateModule::balance_count(1, 1), 0);
- assert_eq!(TemplateModule::balance_count(1, 2), 5);
-
- // split item scenario
- assert_ok!(TemplateModule::transfer(
- origin2.clone(),
- account(3),
- 1,
- 1,
- 3
- ));
- assert_eq!(TemplateModule::balance_count(1, 2), 2);
- assert_eq!(TemplateModule::balance_count(1, 3), 3);
-
- // split item and new owner has account scenario
- assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 1));
- assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 1);
- assert_eq!(TemplateModule::fungible_item_id(1, 3).value, 4);
- assert_eq!(TemplateModule::balance_count(1, 2), 1);
- assert_eq!(TemplateModule::balance_count(1, 3), 4);
- });
-}
-
-#[test]
-fn transfer_refungible_item() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);
-
- let data = default_re_fungible_data();
- create_test_item(collection_id, &data.clone().into());
-
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
- {
- let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();
- assert_eq!(item.const_data, data.const_data.into_inner());
- assert_eq!(item.variable_data, data.variable_data.into_inner());
- assert_eq!(
- item.owner[0],
- Ownership {
- owner: account(1),
- fraction: 1023
- }
- );
- }
- assert_eq!(TemplateModule::balance_count(1, 1), 1023);
- assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
-
- // change owner scenario
- assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1023));
- assert_eq!(
- TemplateModule::refungible_item_id(1, 1).unwrap().owner[0],
- Ownership {
- owner: account(2),
- fraction: 1023
- }
- );
- assert_eq!(TemplateModule::balance_count(1, 1), 0);
- assert_eq!(TemplateModule::balance_count(1, 2), 1023);
- // assert_eq!(TemplateModule::address_tokens(1, 1), []);
- assert_eq!(TemplateModule::address_tokens(1, 2), [1]);
-
- // split item scenario
- assert_ok!(TemplateModule::transfer(
- origin2.clone(),
- account(3),
- 1,
- 1,
- 500
- ));
- {
- let item = TemplateModule::refungible_item_id(1, 1).unwrap();
- assert_eq!(
- item.owner[0],
- Ownership {
- owner: account(2),
- fraction: 523
- }
- );
- assert_eq!(
- item.owner[1],
- Ownership {
- owner: account(3),
- fraction: 500
- }
- );
- }
- assert_eq!(TemplateModule::balance_count(1, 2), 523);
- assert_eq!(TemplateModule::balance_count(1, 3), 500);
- assert_eq!(TemplateModule::address_tokens(1, 2), [1]);
- assert_eq!(TemplateModule::address_tokens(1, 3), [1]);
-
- // split item and new owner has account scenario
- assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 200));
- {
- let item = TemplateModule::refungible_item_id(1, 1).unwrap();
- assert_eq!(
- item.owner[0],
- Ownership {
- owner: account(2),
- fraction: 323
- }
- );
- assert_eq!(
- item.owner[1],
- Ownership {
- owner: account(3),
- fraction: 700
- }
- );
- }
- assert_eq!(TemplateModule::balance_count(1, 2), 323);
- assert_eq!(TemplateModule::balance_count(1, 3), 700);
- assert_eq!(TemplateModule::address_tokens(1, 2), [1]);
- assert_eq!(TemplateModule::address_tokens(1, 3), [1]);
- });
-}
-
-#[test]
-fn transfer_nft_item() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
- assert_eq!(TemplateModule::balance_count(1, 1), 1);
- assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
-
- let origin1 = Origin::signed(1);
- // default scenario
- assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));
- assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));
- assert_eq!(TemplateModule::balance_count(1, 1), 0);
- assert_eq!(TemplateModule::balance_count(1, 2), 1);
- // assert_eq!(TemplateModule::address_tokens(1, 1), []);
- assert_eq!(TemplateModule::address_tokens(1, 2), [1]);
- });
-}
-
-#[test]
-fn nft_approve_and_transfer_from() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
-
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- assert_eq!(TemplateModule::balance_count(1, 1), 1);
- assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
-
- // neg transfer
- assert_noop!(
- TemplateModule::transfer_from(origin2.clone(), account(1), account(2), 1, 1, 1),
- Error::<Test>::NoPermission
- );
-
- // do approve
- assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 5));
- assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);
- assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);
-
- assert_ok!(TemplateModule::transfer_from(
- origin2,
- account(1),
- account(3),
- 1,
- 1,
- 1
- ));
- assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);
- });
-}
-
-#[test]
-fn nft_approve_and_transfer_from_allow_list() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.clone().into());
-
- assert_eq!(
- &TemplateModule::nft_item_id(1, 1).unwrap().const_data,
- &data.const_data.into_inner()
- );
- assert_eq!(TemplateModule::balance_count(1, 1), 1);
- assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
-
- assert_ok!(TemplateModule::set_mint_permission(
- origin1.clone(),
- 1,
- true
- ));
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- 1,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- 1,
- account(1)
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- 1,
- account(2)
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- 1,
- account(3)
- ));
-
- // do approve
- assert_ok!(TemplateModule::approve(
- origin1.clone(),
- account(2),
- 1,
- 1,
- 5
- ));
- assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);
- assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));
- assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);
-
- assert_ok!(TemplateModule::transfer_from(
- origin2,
- account(1),
- account(3),
- 1,
- 1,
- 1
- ));
- assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);
- });
-}
-
-#[test]
-fn refungible_approve_and_transfer_from() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);
-
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- let data = default_re_fungible_data();
- create_test_item(collection_id, &data.into());
-
- assert_eq!(TemplateModule::balance_count(1, 1), 1023);
- assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
-
- assert_ok!(TemplateModule::set_mint_permission(
- origin1.clone(),
- 1,
- true
- ));
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- 1,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- 1,
- account(1)
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- 1,
- account(2)
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- 1,
- account(3)
- ));
-
- // do approve
- assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1023));
- assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1023);
-
- assert_ok!(TemplateModule::transfer_from(
- origin2,
- account(1),
- account(3),
- 1,
- 1,
- 100
- ));
- assert_eq!(TemplateModule::balance_count(1, 1), 923);
- assert_eq!(TemplateModule::balance_count(1, 3), 100);
- assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
- assert_eq!(TemplateModule::address_tokens(1, 3), [1]);
-
- assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 923);
- });
-}
-
-#[test]
-fn fungible_approve_and_transfer_from() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);
-
- let data = default_fungible_data();
- create_test_item(collection_id, &data.into());
-
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- assert_eq!(TemplateModule::balance_count(1, 1), 5);
-
- assert_ok!(TemplateModule::set_mint_permission(
- origin1.clone(),
- 1,
- true
- ));
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- 1,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- 1,
- account(1)
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- 1,
- account(2)
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- 1,
- account(3)
- ));
-
- // do approve
- assert_ok!(TemplateModule::approve(
- origin1.clone(),
- account(2),
- 1,
- 1,
- 5
- ));
- assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);
- assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));
- assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);
- assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);
-
- assert_ok!(TemplateModule::transfer_from(
- origin2.clone(),
- account(1),
- account(3),
- 1,
- 1,
- 4
- ));
- assert_eq!(TemplateModule::balance_count(1, 1), 1);
- assert_eq!(TemplateModule::balance_count(1, 3), 4);
-
- assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);
-
- assert_noop!(
- TemplateModule::transfer_from(origin2, account(1), account(3), 1, 1, 4),
- Error::<Test>::NoPermission
- );
- });
-}
-
-#[test]
-fn change_collection_owner() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
- assert_ok!(TemplateModule::change_collection_owner(
- origin1,
- collection_id,
- 2
- ));
- assert_eq!(
- TemplateModule::collection_id(collection_id).unwrap().owner,
- 2
- );
- });
-}
-
-#[test]
-fn destroy_collection() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
- assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));
- });
-}
-
-#[test]
-fn burn_nft_item() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
- assert_ok!(TemplateModule::add_collection_admin(
- origin1.clone(),
- collection_id,
- account(2)
- ));
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
-
- // check balance (collection with id = 1, user id = 1)
- assert_eq!(TemplateModule::balance_count(1, 1), 1);
-
- // burn item
- assert_ok!(TemplateModule::burn_item(
- origin1.clone(),
- collection_id,
- 1,
- 1
- ));
- assert_noop!(
- TemplateModule::burn_item(origin1, collection_id, 1, 1),
- Error::<Test>::TokenNotFound
- );
-
- assert_eq!(TemplateModule::balance_count(1, 1), 0);
- });
-}
-
-#[test]
-fn burn_fungible_item() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);
-
- let origin1 = Origin::signed(1);
- assert_ok!(TemplateModule::add_collection_admin(
- origin1.clone(),
- collection_id,
- account(2)
- ));
-
- let data = default_fungible_data();
- create_test_item(collection_id, &data.into());
-
- // check balance (collection with id = 1, user id = 1)
- assert_eq!(TemplateModule::balance_count(1, 1), 5);
-
- // burn item
- assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));
- assert_noop!(
- TemplateModule::burn_item(origin1, 1, 1, 5),
- Error::<Test>::TokenValueNotEnough
- );
-
- assert_eq!(TemplateModule::balance_count(1, 1), 0);
- });
-}
-
-#[test]
-fn burn_refungible_item() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);
- let origin1 = Origin::signed(1);
-
- assert_ok!(TemplateModule::set_mint_permission(
- origin1.clone(),
- collection_id,
- true
- ));
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- 1,
- account(1)
- ));
-
- assert_ok!(TemplateModule::add_collection_admin(
- origin1.clone(),
- 1,
- account(2)
- ));
-
- let data = default_re_fungible_data();
- create_test_item(collection_id, &data.into());
-
- // check balance (collection with id = 1, user id = 2)
- assert_eq!(TemplateModule::balance_count(1, 1), 1023);
-
- // burn item
- assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 1023));
- assert_noop!(
- TemplateModule::burn_item(origin1, 1, 1, 1023),
- Error::<Test>::TokenNotFound
- );
-
- assert_eq!(TemplateModule::balance_count(1, 1), 0);
- });
-}
-
-#[test]
-fn add_collection_admin() {
- new_test_ext().execute_with(|| {
- let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);
- create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);
- create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);
-
- let origin1 = Origin::signed(1);
-
- // collection admin
- assert_ok!(TemplateModule::add_collection_admin(
- origin1.clone(),
- collection1_id,
- account(2)
- ));
- assert_ok!(TemplateModule::add_collection_admin(
- origin1,
- collection1_id,
- account(3)
- ));
-
- assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(2)),);
- assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(3)),);
- });
-}
-
-#[test]
-fn remove_collection_admin() {
- new_test_ext().execute_with(|| {
- let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);
- create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);
- create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);
-
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- // collection admin
- assert_ok!(TemplateModule::add_collection_admin(
- origin1.clone(),
- collection1_id,
- account(2)
- ));
- assert_ok!(TemplateModule::add_collection_admin(
- origin1,
- collection1_id,
- account(3)
- ));
-
- assert!(TemplateModule::admin_list_collection(1).contains(&account(2)),);
- assert!(TemplateModule::admin_list_collection(1).contains(&account(3)),);
-
- // remove admin
- assert_ok!(TemplateModule::remove_collection_admin(
- origin2,
- 1,
- account(3)
- ));
- assert!(!TemplateModule::admin_list_collection(1).contains(&account(3)),);
- });
-}
-
-#[test]
-fn balance_of() {
- new_test_ext().execute_with(|| {
- let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);
- let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);
- let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, 3);
-
- // check balance before
- assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);
- assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);
- assert_eq!(
- TemplateModule::balance_count(re_fungible_collection_id, 1),
- 0
- );
-
- let nft_data = default_nft_data();
- create_test_item(nft_collection_id, &nft_data.into());
-
- let fungible_data = default_fungible_data();
- create_test_item(fungible_collection_id, &fungible_data.into());
-
- let re_fungible_data = default_re_fungible_data();
- create_test_item(re_fungible_collection_id, &re_fungible_data.into());
-
- // check balance (collection with id = 1, user id = 1)
- assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);
- assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 5);
- assert_eq!(
- TemplateModule::balance_count(re_fungible_collection_id, 1),
- 1023
- );
- assert_eq!(
- TemplateModule::nft_item_id(nft_collection_id, 1)
- .unwrap()
- .owner,
- account(1)
- );
- assert_eq!(
- TemplateModule::fungible_item_id(fungible_collection_id, 1).value,
- 5
- );
- assert_eq!(
- TemplateModule::refungible_item_id(re_fungible_collection_id, 1)
- .unwrap()
- .owner[0]
- .owner,
- account(1)
- );
- });
-}
-
-#[test]
-fn approve() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
-
- let origin1 = Origin::signed(1);
-
- // approve
- assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1));
- assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);
- });
-}
-
-#[test]
-fn transfer_from() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
-
- // approve
- assert_ok!(TemplateModule::approve(
- origin1.clone(),
- account(2),
- 1,
- 1,
- 1
- ));
- assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);
-
- assert_ok!(TemplateModule::set_mint_permission(
- origin1.clone(),
- 1,
- true
- ));
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- 1,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- 1,
- account(1)
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- 1,
- account(2)
- ));
- assert_ok!(TemplateModule::add_to_allow_list(origin1, 1, account(3)));
-
- assert_ok!(TemplateModule::transfer_from(
- origin2,
- account(1),
- account(2),
- 1,
- 1,
- 1
- ));
-
- // after transfer
- assert_eq!(TemplateModule::balance_count(1, 1), 0);
- assert_eq!(TemplateModule::balance_count(1, 2), 1);
- });
-}
-
-// #endregion
-
-// Coverage tests region
-// #region
-
-#[test]
-fn owner_can_add_address_to_allow_list() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1,
- collection_id,
- account(2)
- ));
- assert!(TemplateModule::allow_list(collection_id, 2));
- });
-}
-
-#[test]
-fn admin_can_add_address_to_allow_list() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- assert_ok!(TemplateModule::add_collection_admin(
- origin1,
- collection_id,
- account(2)
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin2,
- collection_id,
- account(3)
- ));
- assert!(TemplateModule::allow_list(collection_id, 3));
- });
-}
-
-#[test]
-fn nonprivileged_user_cannot_add_address_to_allow_list() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin2 = Origin::signed(2);
- assert_noop!(
- TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),
- Error::<Test>::NoPermission
- );
- });
-}
-
-#[test]
-fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {
- new_test_ext().execute_with(|| {
- let origin1 = Origin::signed(1);
-
- assert_noop!(
- TemplateModule::add_to_allow_list(origin1, 1, account(2)),
- Error::<Test>::CollectionNotFound
- );
- });
-}
-
-#[test]
-fn nobody_can_add_address_to_allow_list_of_deleted_collection() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
- assert_ok!(TemplateModule::destroy_collection(
- origin1.clone(),
- collection_id
- ));
- assert_noop!(
- TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),
- Error::<Test>::CollectionNotFound
- );
- });
-}
-
-// If address is already added to allow list, nothing happens
-#[test]
-fn address_is_already_added_to_allow_list() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
- let origin1 = Origin::signed(1);
-
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- collection_id,
- account(2)
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1,
- collection_id,
- account(2)
- ));
- assert!(TemplateModule::allow_list(collection_id, 2));
- });
-}
-
-#[test]
-fn owner_can_remove_address_from_allow_list() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- collection_id,
- account(2)
- ));
- assert_ok!(TemplateModule::remove_from_allow_list(
- origin1,
- collection_id,
- account(2)
- ));
- assert!(!TemplateModule::allow_list(collection_id, 2));
- });
-}
-
-#[test]
-fn admin_can_remove_address_from_allow_list() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- assert_ok!(TemplateModule::add_collection_admin(
- origin1.clone(),
- collection_id,
- account(2)
- ));
-
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1,
- collection_id,
- account(3)
- ));
- assert_ok!(TemplateModule::remove_from_allow_list(
- origin2,
- collection_id,
- account(3)
- ));
- assert!(!TemplateModule::allow_list(collection_id, 3));
- });
-}
-
-#[test]
-fn nonprivileged_user_cannot_remove_address_from_allow_list() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1,
- collection_id,
- account(2)
- ));
- assert_noop!(
- TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),
- Error::<Test>::NoPermission
- );
- assert!(TemplateModule::allow_list(collection_id, 2));
- });
-}
-
-#[test]
-fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {
- new_test_ext().execute_with(|| {
- let origin1 = Origin::signed(1);
-
- assert_noop!(
- TemplateModule::remove_from_allow_list(origin1, 1, account(2)),
- Error::<Test>::CollectionNotFound
- );
- });
-}
-
-#[test]
-fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- collection_id,
- account(2)
- ));
- assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));
- assert_noop!(
- TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),
- Error::<Test>::CollectionNotFound
- );
- assert!(!TemplateModule::allow_list(collection_id, 2));
- });
-}
-
-// If address is already removed from allow list, nothing happens
-#[test]
-fn address_is_already_removed_from_allow_list() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
- let origin1 = Origin::signed(1);
-
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- collection_id,
- account(2)
- ));
- assert_ok!(TemplateModule::remove_from_allow_list(
- origin1.clone(),
- collection_id,
- account(2)
- ));
- assert_ok!(TemplateModule::remove_from_allow_list(
- origin1,
- collection_id,
- account(2)
- ));
- assert!(!TemplateModule::allow_list(collection_id, 2));
- });
-}
-
-// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)
-#[test]
-fn allow_list_test_1() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- collection_id,
- account(2)
- ));
-
- assert_noop!(
- TemplateModule::transfer(origin1, account(3), 1, 1, 1),
- Error::<Test>::AddresNotInAllowList
- );
- });
-}
-
-#[test]
-fn allow_list_test_2() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
- let origin1 = Origin::signed(1);
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- 1,
- account(1)
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- 1,
- account(2)
- ));
-
- // do approve
- assert_ok!(TemplateModule::approve(
- origin1.clone(),
- account(1),
- 1,
- 1,
- 1
- ));
- assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);
-
- assert_ok!(TemplateModule::remove_from_allow_list(
- origin1.clone(),
- 1,
- account(1)
- ));
-
- assert_noop!(
- TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),
- Error::<Test>::AddresNotInAllowList
- );
- });
-}
-
-// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)
-#[test]
-fn allow_list_test_3() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- 1,
- account(1)
- ));
-
- assert_noop!(
- TemplateModule::transfer(origin1, account(3), 1, 1, 1),
- Error::<Test>::AddresNotInAllowList
- );
- });
-}
-
-#[test]
-fn allow_list_test_4() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- collection_id,
- account(1)
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- collection_id,
- account(2)
- ));
-
- // do approve
- assert_ok!(TemplateModule::approve(
- origin1.clone(),
- account(1),
- 1,
- 1,
- 1
- ));
- assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);
-
- assert_ok!(TemplateModule::remove_from_allow_list(
- origin1.clone(),
- collection_id,
- account(2)
- ));
-
- assert_noop!(
- TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),
- Error::<Test>::AddresNotInAllowList
- );
- });
-}
-
-// If Public Access mode is set to AllowList, tokens can’t be destroyed by a non-allowlisted address (even if it owned them before enabling AllowList mode)
-#[test]
-fn allow_list_test_5() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_noop!(
- TemplateModule::burn_item(origin1.clone(), 1, 1, 5),
- Error::<Test>::AddresNotInAllowList
- );
- });
-}
-
-// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).
-#[test]
-fn allow_list_test_6() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
-
- // do approve
- assert_noop!(
- TemplateModule::approve(origin1, account(1), 1, 1, 5),
- Error::<Test>::AddresNotInAllowList
- );
- });
-}
-
-// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and
-// tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)
-#[test]
-fn allow_list_test_7() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
-
- let origin1 = Origin::signed(1);
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- collection_id,
- account(1)
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- collection_id,
- account(2)
- ));
-
- assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1));
- });
-}
-
-#[test]
-fn allow_list_test_8() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
-
- let origin1 = Origin::signed(1);
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- collection_id,
- account(1)
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- collection_id,
- account(2)
- ));
-
- // do approve
- assert_ok!(TemplateModule::approve(
- origin1.clone(),
- account(1),
- 1,
- 1,
- 5
- ));
- assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 5);
-
- assert_ok!(TemplateModule::transfer_from(
- origin1,
- account(1),
- account(2),
- 1,
- 1,
- 1
- ));
- });
-}
-
-// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.
-#[test]
-fn allow_list_test_9() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
- let origin1 = Origin::signed(1);
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::set_mint_permission(
- origin1,
- collection_id,
- false
- ));
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
- });
-}
-
-// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.
-#[test]
-fn allow_list_test_10() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::set_mint_permission(
- origin1.clone(),
- collection_id,
- false
- ));
-
- assert_ok!(TemplateModule::add_collection_admin(
- origin1,
- collection_id,
- account(2)
- ));
-
- assert_ok!(TemplateModule::create_item(
- origin2,
- collection_id,
- account(2),
- default_nft_data().into()
- ));
- });
-}
-
-// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and allow listed address.
-#[test]
-fn allow_list_test_11() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::set_mint_permission(
- origin1.clone(),
- collection_id,
- false
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1,
- collection_id,
- account(2)
- ));
-
- assert_noop!(
- TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),
- Error::<Test>::PublicMintingNotAllowed
- );
- });
-}
-
-// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-allow listed address.
-#[test]
-fn allow_list_test_12() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::set_mint_permission(
- origin1,
- collection_id,
- false
- ));
-
- assert_noop!(
- TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),
- Error::<Test>::PublicMintingNotAllowed
- );
- });
-}
-
-// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.
-#[test]
-fn allow_list_test_13() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::set_mint_permission(
- origin1,
- collection_id,
- true
- ));
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
- });
-}
-
-// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.
-#[test]
-fn allow_list_test_14() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::set_mint_permission(
- origin1.clone(),
- collection_id,
- true
- ));
-
- assert_ok!(TemplateModule::add_collection_admin(
- origin1,
- collection_id,
- account(2)
- ));
-
- assert_ok!(TemplateModule::create_item(
- origin2,
- 1,
- account(2),
- default_nft_data().into()
- ));
- });
-}
-
-// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-allow listed address.
-#[test]
-fn allow_list_test_15() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::set_mint_permission(
- origin1,
- collection_id,
- true
- ));
-
- assert_noop!(
- TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),
- Error::<Test>::AddresNotInAllowList
- );
- });
-}
-
-// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by non-privileged and allow listed address.
-#[test]
-fn allow_list_test_16() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- assert_ok!(TemplateModule::set_public_access_mode(
- origin1.clone(),
- collection_id,
- AccessMode::AllowList
- ));
- assert_ok!(TemplateModule::set_mint_permission(
- origin1.clone(),
- collection_id,
- true
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1,
- collection_id,
- account(2)
- ));
-
- assert_ok!(TemplateModule::create_item(
- origin2,
- 1,
- account(2),
- default_nft_data().into()
- ));
- });
-}
-
-// Total number of collections. Positive test
-#[test]
-fn total_number_collections_bound() {
- new_test_ext().execute_with(|| {
- create_test_collection(&CollectionMode::NFT, 1);
- });
-}
-
-// Total number of collections. Negotive test
-#[test]
-fn total_number_collections_bound_neg() {
- new_test_ext().execute_with(|| {
- let origin1 = Origin::signed(1);
-
- for i in 0..COLLECTION_NUMBER_LIMIT {
- create_test_collection(&CollectionMode::NFT, i + 1);
- }
-
- let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
- let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
- let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
-
- // 11-th collection in chain. Expects error
- assert_noop!(
- TemplateModule::create_collection(
- origin1,
- col_name1,
- col_desc1,
- token_prefix1,
- CollectionMode::NFT
- ),
- Error::<Test>::TotalCollectionsLimitExceeded
- );
- });
-}
-
-// Owned tokens by a single address. Positive test
-#[test]
-fn owned_tokens_bound() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.clone().into());
- create_test_item(collection_id, &data.into());
- });
-}
-
-// Owned tokens by a single address. Negotive test
-#[test]
-fn owned_tokens_bound_neg() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
-
- for _ in 0..ACCOUNT_TOKEN_OWNERSHIP_LIMIT {
- let data = default_nft_data();
- create_test_item(collection_id, &data.clone().into());
- }
-
- let data = default_nft_data();
- assert_noop!(
- TemplateModule::create_item(origin1, 1, account(1), data.into()),
- Error::<Test>::AccountTokenLimitExceeded
- );
- });
-}
-
-// Number of collection admins. Positive test
-#[test]
-fn collection_admins_bound() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
-
- assert_ok!(TemplateModule::add_collection_admin(
- origin1.clone(),
- collection_id,
- account(2)
- ));
- assert_ok!(TemplateModule::add_collection_admin(
- origin1,
- collection_id,
- account(3)
- ));
- });
-}
-
-// Number of collection admins. Negotive test
-#[test]
-fn collection_admins_bound_neg() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
-
- for i in 0..COLLECTION_ADMINS_LIMIT {
- assert_ok!(TemplateModule::add_collection_admin(
- origin1.clone(),
- collection_id,
- account(2 + i)
- ));
- }
- assert_noop!(
- TemplateModule::add_collection_admin(
- origin1,
- collection_id,
- account(3 + COLLECTION_ADMINS_LIMIT)
- ),
- Error::<Test>::CollectionAdminsLimitExceeded
- );
- });
-}
-// #endregion
-
-#[test]
-fn set_const_on_chain_schema() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
- assert_ok!(TemplateModule::set_const_on_chain_schema(
- origin1,
- collection_id,
- b"test const on chain schema".to_vec()
- ));
-
- assert_eq!(
- TemplateModule::collection_id(collection_id)
- .unwrap()
- .const_on_chain_schema,
- b"test const on chain schema".to_vec()
- );
- assert_eq!(
- TemplateModule::collection_id(collection_id)
- .unwrap()
- .variable_on_chain_schema,
- b"".to_vec()
- );
- });
-}
-
-#[test]
-fn set_variable_on_chain_schema() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
- assert_ok!(TemplateModule::set_variable_on_chain_schema(
- origin1,
- collection_id,
- b"test variable on chain schema".to_vec()
- ));
-
- assert_eq!(
- TemplateModule::collection_id(collection_id)
- .unwrap()
- .const_on_chain_schema,
- b"".to_vec()
- );
- assert_eq!(
- TemplateModule::collection_id(collection_id)
- .unwrap()
- .variable_on_chain_schema,
- b"test variable on chain schema".to_vec()
- );
- });
-}
-
-#[test]
-fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
-
- let data = default_nft_data();
- create_test_item(1, &data.into());
-
- let variable_data = b"test data".to_vec();
- assert_ok!(TemplateModule::set_variable_meta_data(
- origin1,
- collection_id,
- 1,
- variable_data.clone()
- ));
-
- assert_eq!(
- TemplateModule::nft_item_id(collection_id, 1)
- .unwrap()
- .variable_data,
- variable_data
- );
- });
-}
-
-#[test]
-fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);
-
- let origin1 = Origin::signed(1);
-
- let data = default_re_fungible_data();
- create_test_item(1, &data.into());
-
- let variable_data = b"test data".to_vec();
- assert_ok!(TemplateModule::set_variable_meta_data(
- origin1,
- collection_id,
- 1,
- variable_data.clone()
- ));
-
- assert_eq!(
- TemplateModule::refungible_item_id(collection_id, 1)
- .unwrap()
- .variable_data,
- variable_data
- );
- });
-}
-
-#[test]
-fn set_variable_meta_data_on_fungible_token_fails() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);
-
- let origin1 = Origin::signed(1);
-
- let data = default_fungible_data();
- create_test_item(1, &data.into());
-
- let variable_data = b"test data".to_vec();
- assert_noop!(
- TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),
- Error::<Test>::CantStoreMetadataInFungibleTokens
- );
- });
-}
-
-#[test]
-fn set_variable_meta_data_on_nft_token_fails_for_big_data() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
-
- let data = default_nft_data();
- create_test_item(1, &data.into());
-
- let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();
- assert_noop!(
- TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),
- Error::<Test>::TokenVariableDataLimitExceeded
- );
- });
-}
-
-#[test]
-fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);
-
- let origin1 = Origin::signed(1);
-
- let data = default_re_fungible_data();
- create_test_item(1, &data.into());
-
- let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();
- assert_noop!(
- TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),
- Error::<Test>::TokenVariableDataLimitExceeded
- );
- });
-}
-
-#[test]
-fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {
- new_test_ext().execute_with(|| {
- //default_limits();
-
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
-
- let origin1 = Origin::signed(1);
-
- let data = default_nft_data();
- create_test_item(1, &data.into());
-
- assert_ok!(TemplateModule::set_meta_update_permission_flag(
- origin1.clone(),
- collection_id,
- MetaUpdatePermission::ItemOwner,
- ));
-
- let variable_data = b"ten chars.".to_vec();
- assert_ok!(TemplateModule::set_variable_meta_data(
- origin1,
- collection_id,
- 1,
- variable_data.clone()
- ));
-
- assert_eq!(
- TemplateModule::nft_item_id(collection_id, 1)
- .unwrap()
- .variable_data,
- variable_data
- );
- });
-}
-
-#[test]
-fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {
- new_test_ext().execute_with(|| {
- let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);
-
- let origin1 = Origin::signed(1);
-
- assert_ok!(TemplateModule::set_mint_permission(
- origin1.clone(),
- collection_id,
- true
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin1.clone(),
- collection_id,
- account(1)
- ));
-
- let data = default_nft_data();
- create_test_item(1, &data.into());
-
- assert_ok!(TemplateModule::set_meta_update_permission_flag(
- origin1.clone(),
- collection_id,
- MetaUpdatePermission::ItemOwner,
- ));
-
- let variable_data = b"1234567890123".to_vec();
- assert_noop!(
- TemplateModule::set_variable_meta_data(
- origin1,
- collection_id,
- 1,
- variable_data.clone()
- ),
- Error::<Test>::TokenVariableDataLimitExceeded
- );
- })
-}
-
-#[test]
-fn collection_transfer_flag_works() {
- new_test_ext().execute_with(|| {
- let origin1 = Origin::signed(1);
-
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
- assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, 1, true));
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
- assert_eq!(TemplateModule::balance_count(1, 1), 1);
- assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
-
- let origin1 = Origin::signed(1);
-
- // default scenario
- assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));
- assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));
- assert_eq!(TemplateModule::balance_count(1, 1), 0);
- assert_eq!(TemplateModule::balance_count(1, 2), 1);
-
- assert_eq!(TemplateModule::address_tokens(1, 2), [1]);
- });
-}
-
-#[test]
-fn set_variable_meta_data_on_nft_with_admin_flag() {
- new_test_ext().execute_with(|| {
- // default_limits();
-
- let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, 1);
-
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- assert_ok!(TemplateModule::set_mint_permission(
- origin2.clone(),
- collection_id,
- true
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin2.clone(),
- collection_id,
- account(1)
- ));
-
- assert_ok!(TemplateModule::add_collection_admin(
- origin2.clone(),
- collection_id,
- account(1)
- ));
-
- let data = default_nft_data();
- create_test_item(1, &data.into());
-
- assert_ok!(TemplateModule::set_meta_update_permission_flag(
- origin2.clone(),
- collection_id,
- MetaUpdatePermission::Admin,
- ));
-
- let variable_data = b"test.".to_vec();
- assert_ok!(TemplateModule::set_variable_meta_data(
- origin1,
- collection_id,
- 1,
- variable_data.clone()
- ));
-
- assert_eq!(
- TemplateModule::nft_item_id(collection_id, 1)
- .unwrap()
- .variable_data,
- variable_data
- );
- });
-}
-
-#[test]
-fn set_variable_meta_data_on_nft_with_admin_flag_neg() {
- new_test_ext().execute_with(|| {
- // default_limits();
-
- let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, 1);
-
- let origin1 = Origin::signed(1);
- let origin2 = Origin::signed(2);
-
- assert_ok!(TemplateModule::set_mint_permission(
- origin2.clone(),
- collection_id,
- true
- ));
- assert_ok!(TemplateModule::add_to_allow_list(
- origin2.clone(),
- collection_id,
- account(1)
- ));
-
- let data = default_nft_data();
- create_test_item(1, &data.into());
-
- assert_ok!(TemplateModule::set_meta_update_permission_flag(
- origin2.clone(),
- collection_id,
- MetaUpdatePermission::Admin,
- ));
-
- let variable_data = b"test.".to_vec();
- assert_noop!(
- TemplateModule::set_variable_meta_data(
- origin1,
- collection_id,
- 1,
- variable_data.clone()
- ),
- Error::<Test>::NoPermission
- );
- });
-}
-
-#[test]
-fn set_variable_meta_flag_after_freeze() {
- new_test_ext().execute_with(|| {
- // default_limits();
-
- let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, 1);
-
- let origin2 = Origin::signed(2);
-
- assert_ok!(TemplateModule::set_meta_update_permission_flag(
- origin2.clone(),
- collection_id,
- MetaUpdatePermission::None,
- ));
- assert_noop!(
- TemplateModule::set_meta_update_permission_flag(
- origin2.clone(),
- collection_id,
- MetaUpdatePermission::Admin
- ),
- Error::<Test>::MetadataFlagFrozen
- );
- });
-}
-
-#[test]
-fn set_variable_meta_data_on_nft_with_none_flag_neg() {
- new_test_ext().execute_with(|| {
- // default_limits();
-
- let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);
- let origin1 = Origin::signed(1);
-
- let data = default_nft_data();
- create_test_item(1, &data.into());
-
- assert_ok!(TemplateModule::set_meta_update_permission_flag(
- origin1.clone(),
- collection_id,
- MetaUpdatePermission::None,
- ));
-
- let variable_data = b"test.".to_vec();
- assert_noop!(
- TemplateModule::set_variable_meta_data(
- origin1.clone(),
- collection_id,
- 1,
- variable_data.clone()
- ),
- Error::<Test>::MetadataUpdateDenied
- );
- });
-}
-
-#[test]
-fn collection_transfer_flag_works_neg() {
- new_test_ext().execute_with(|| {
- let origin1 = Origin::signed(1);
-
- let collection_id = create_test_collection(&CollectionMode::NFT, 1);
- assert_ok!(TemplateModule::set_transfers_enabled_flag(
- origin1, 1, false
- ));
-
- let data = default_nft_data();
- create_test_item(collection_id, &data.into());
- assert_eq!(TemplateModule::balance_count(1, 1), 1);
- assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
-
- let origin1 = Origin::signed(1);
-
- // default scenario
- assert_noop!(
- TemplateModule::transfer(origin1, account(2), 1, 1, 1000),
- Error::<Test>::TransferNotAllowed
- );
- assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(1));
- assert_eq!(TemplateModule::balance_count(1, 1), 1);
- assert_eq!(TemplateModule::balance_count(1, 2), 0);
-
- assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
- });
-}
pallets/nft/src/weights.rsdiffbeforeafterboth--- a/pallets/nft/src/weights.rs
+++ /dev/null
@@ -1,315 +0,0 @@
-// Template adopted from https://github.com/paritytech/substrate/blob/master/.maintain/frame-weight-template.hbs
-
-//! Autogenerated weights for pallet_nft
-//!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2021-10-21, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]`
-//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 128
-
-// Executed Command:
-// target/release/nft
-// benchmark
-// --pallet
-// pallet-nft
-// --wasm-execution
-// compiled
-// --extrinsic
-// *
-// --template
-// .maintain/frame-weight-template.hbs
-// --steps=50
-// --repeat=20
-// --output=./pallets/nft/src/weights.rs
-
-
-#![cfg_attr(rustfmt, rustfmt_skip)]
-#![allow(unused_parens)]
-#![allow(unused_imports)]
-#![allow(clippy::unnecessary_cast)]
-
-use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}};
-use sp_std::marker::PhantomData;
-
-/// Weight functions needed for pallet_nft.
-pub trait WeightInfo {
- fn create_collection() -> Weight;
- fn destroy_collection() -> Weight;
- fn add_to_allow_list() -> Weight;
- fn remove_from_allow_list() -> Weight;
- fn set_public_access_mode() -> Weight;
- fn set_mint_permission() -> Weight;
- fn change_collection_owner() -> Weight;
- fn add_collection_admin() -> Weight;
- fn remove_collection_admin() -> Weight;
- fn set_collection_sponsor() -> Weight;
- fn confirm_sponsorship() -> Weight;
- fn remove_collection_sponsor() -> Weight;
- fn set_transfers_enabled_flag() -> Weight;
- fn set_offchain_schema(b: u32, ) -> Weight;
- fn set_const_on_chain_schema(b: u32, ) -> Weight;
- fn set_variable_on_chain_schema(b: u32, ) -> Weight;
- fn set_schema_version() -> Weight;
- fn set_collection_limits() -> Weight;
- fn set_meta_update_permission_flag() -> Weight;
-}
-
-/// Weights for pallet_nft using the Substrate node and recommended hardware.
-pub struct SubstrateWeight<T>(PhantomData<T>);
-impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
- // Storage: Common CreatedCollectionCount (r:1 w:1)
- // Storage: Common DestroyedCollectionCount (r:1 w:0)
- // Storage: System Account (r:2 w:2)
- // Storage: Common CollectionById (r:0 w:1)
- fn create_collection() -> Weight {
- (23_803_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(4 as Weight))
- .saturating_add(T::DbWeight::get().writes(4 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- // Storage: Common DestroyedCollectionCount (r:1 w:1)
- // Storage: Nonfungible TokensMinted (r:0 w:1)
- // Storage: Nonfungible TokensBurnt (r:0 w:1)
- fn destroy_collection() -> Weight {
- (27_831_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(2 as Weight))
- .saturating_add(T::DbWeight::get().writes(4 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:0)
- // Storage: Common Allowlist (r:0 w:1)
- fn add_to_allow_list() -> Weight {
- (6_629_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:0)
- // Storage: Common Allowlist (r:0 w:1)
- fn remove_from_allow_list() -> Weight {
- (6_596_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_public_access_mode() -> Weight {
- (6_338_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_mint_permission() -> Weight {
- (6_383_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn change_collection_owner() -> Weight {
- (6_493_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:0)
- // Storage: Common IsAdmin (r:0 w:1)
- fn add_collection_admin() -> Weight {
- (6_850_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:0)
- // Storage: Common IsAdmin (r:0 w:1)
- fn remove_collection_admin() -> Weight {
- (6_615_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_collection_sponsor() -> Weight {
- (6_430_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn confirm_sponsorship() -> Weight {
- (6_125_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn remove_collection_sponsor() -> Weight {
- (6_236_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_transfers_enabled_flag() -> Weight {
- (6_500_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_offchain_schema(_b: u32, ) -> Weight {
- (6_538_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_const_on_chain_schema(_b: u32, ) -> Weight {
- (6_542_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_variable_on_chain_schema(b: u32, ) -> Weight {
- (6_092_000 as Weight)
- // Standard Error: 0
- .saturating_add((2_000 as Weight).saturating_mul(b as Weight))
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_schema_version() -> Weight {
- (6_470_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_collection_limits() -> Weight {
- (6_841_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_meta_update_permission_flag() -> Weight {
- (6_278_000 as Weight)
- .saturating_add(T::DbWeight::get().reads(1 as Weight))
- .saturating_add(T::DbWeight::get().writes(1 as Weight))
- }
-}
-
-// For backwards compatibility and tests
-impl WeightInfo for () {
- // Storage: Common CreatedCollectionCount (r:1 w:1)
- // Storage: Common DestroyedCollectionCount (r:1 w:0)
- // Storage: System Account (r:2 w:2)
- // Storage: Common CollectionById (r:0 w:1)
- fn create_collection() -> Weight {
- (23_803_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(4 as Weight))
- .saturating_add(RocksDbWeight::get().writes(4 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- // Storage: Common DestroyedCollectionCount (r:1 w:1)
- // Storage: Nonfungible TokensMinted (r:0 w:1)
- // Storage: Nonfungible TokensBurnt (r:0 w:1)
- fn destroy_collection() -> Weight {
- (27_831_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(2 as Weight))
- .saturating_add(RocksDbWeight::get().writes(4 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:0)
- // Storage: Common Allowlist (r:0 w:1)
- fn add_to_allow_list() -> Weight {
- (6_629_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:0)
- // Storage: Common Allowlist (r:0 w:1)
- fn remove_from_allow_list() -> Weight {
- (6_596_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_public_access_mode() -> Weight {
- (6_338_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_mint_permission() -> Weight {
- (6_383_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn change_collection_owner() -> Weight {
- (6_493_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:0)
- // Storage: Common IsAdmin (r:0 w:1)
- fn add_collection_admin() -> Weight {
- (6_850_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:0)
- // Storage: Common IsAdmin (r:0 w:1)
- fn remove_collection_admin() -> Weight {
- (6_615_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_collection_sponsor() -> Weight {
- (6_430_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn confirm_sponsorship() -> Weight {
- (6_125_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn remove_collection_sponsor() -> Weight {
- (6_236_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_transfers_enabled_flag() -> Weight {
- (6_500_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_offchain_schema(_b: u32, ) -> Weight {
- (6_538_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_const_on_chain_schema(_b: u32, ) -> Weight {
- (6_542_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_variable_on_chain_schema(b: u32, ) -> Weight {
- (6_092_000 as Weight)
- // Standard Error: 0
- .saturating_add((2_000 as Weight).saturating_mul(b as Weight))
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_schema_version() -> Weight {
- (6_470_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_collection_limits() -> Weight {
- (6_841_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
- // Storage: Common CollectionById (r:1 w:1)
- fn set_meta_update_permission_flag() -> Weight {
- (6_278_000 as Weight)
- .saturating_add(RocksDbWeight::get().reads(1 as Weight))
- .saturating_add(RocksDbWeight::get().writes(1 as Weight))
- }
-}
\ No newline at end of file
pallets/nonfungible/Cargo.tomldiffbeforeafterboth--- a/pallets/nonfungible/Cargo.toml
+++ b/pallets/nonfungible/Cargo.toml
@@ -16,7 +16,7 @@
sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
sp-core = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
pallet-common = { default-features = false, path = '../common' }
-nft-data-structs = { default-features = false, path = '../../primitives/nft' }
+up-data-structs = { default-features = false, path = '../../primitives/data-structs' }
evm-coder = { default-features = false, path = '../../crates/evm-coder' }
pallet-evm-coder-substrate = { default-features = false, path = '../evm-coder-substrate' }
ethereum = { version = "0.10.0", default-features = false }
@@ -32,7 +32,7 @@
"frame-system/std",
"sp-runtime/std",
"sp-std/std",
- "nft-data-structs/std",
+ "up-data-structs/std",
"pallet-common/std",
"evm-coder/std",
"ethereum/std",
pallets/nonfungible/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/benchmarking.rs
+++ b/pallets/nonfungible/src/benchmarking.rs
@@ -4,7 +4,7 @@
use sp_std::prelude::*;
use pallet_common::benchmarking::{create_collection_raw, create_data};
use frame_benchmarking::{benchmarks, account};
-use nft_data_structs::{CollectionMode, MAX_ITEMS_PER_BATCH};
+use up_data_structs::{CollectionMode, MAX_ITEMS_PER_BATCH};
use pallet_common::bench_init;
use core::convert::TryInto;
pallets/nonfungible/src/common.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/common.rs
+++ b/pallets/nonfungible/src/common.rs
@@ -1,7 +1,7 @@
use core::marker::PhantomData;
use frame_support::{dispatch::DispatchResultWithPostInfo, ensure, fail, weights::Weight};
-use nft_data_structs::TokenId;
+use up_data_structs::TokenId;
use pallet_common::{CommonCollectionOperations, CommonWeightInfo, with_weight};
use sp_runtime::DispatchError;
use sp_std::vec::Vec;
@@ -47,11 +47,11 @@
}
fn map_create_data<T: Config>(
- data: nft_data_structs::CreateItemData,
+ data: up_data_structs::CreateItemData,
to: &T::CrossAccountId,
) -> Result<CreateItemData<T>, DispatchError> {
match data {
- nft_data_structs::CreateItemData::NFT(data) => Ok(CreateItemData {
+ up_data_structs::CreateItemData::NFT(data) => Ok(CreateItemData {
const_data: data.const_data,
variable_data: data.variable_data,
owner: to.clone(),
@@ -65,7 +65,7 @@
&self,
sender: T::CrossAccountId,
to: T::CrossAccountId,
- data: nft_data_structs::CreateItemData,
+ data: up_data_structs::CreateItemData,
) -> DispatchResultWithPostInfo {
with_weight(
<Pallet<T>>::create_item(self, &sender, map_create_data(data, &to)?),
@@ -77,7 +77,7 @@
&self,
sender: T::CrossAccountId,
to: T::CrossAccountId,
- data: Vec<nft_data_structs::CreateItemData>,
+ data: Vec<up_data_structs::CreateItemData>,
) -> DispatchResultWithPostInfo {
let data = data
.into_iter()
pallets/nonfungible/src/erc.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -4,7 +4,7 @@
};
use evm_coder::{ToLog, execution::*, generate_stubgen, solidity, solidity_interface, types::*, weight};
use frame_support::BoundedVec;
-use nft_data_structs::TokenId;
+use up_data_structs::TokenId;
use pallet_evm_coder_substrate::dispatch_to_evm;
use sp_core::{H160, U256};
use sp_std::{vec::Vec, vec};
pallets/nonfungible/src/lib.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/lib.rs
+++ b/pallets/nonfungible/src/lib.rs
@@ -2,7 +2,7 @@
use erc::ERC721Events;
use frame_support::{BoundedVec, ensure};
-use nft_data_structs::{
+use up_data_structs::{
AccessMode, CUSTOM_DATA_LIMIT, Collection, CollectionId, CustomDataLimit, TokenId,
};
use pallet_common::{
@@ -42,7 +42,7 @@
pub mod pallet {
use super::*;
use frame_support::{Blake2_128Concat, Twox64Concat, pallet_prelude::*, storage::Key};
- use nft_data_structs::{CollectionId, TokenId};
+ use up_data_structs::{CollectionId, TokenId};
use super::weights::WeightInfo;
#[pallet::error]
@@ -59,7 +59,7 @@
}
#[pallet::pallet]
- #[pallet::generate_store(pub trait Store)]
+ #[pallet::generate_store(pub(super) trait Store)]
pub struct Pallet<T>(_);
#[pallet::storage]
@@ -185,9 +185,18 @@
.checked_add(1)
.ok_or(ArithmeticError::Overflow)?;
+ let balance = <AccountBalance<T>>::get((collection.id, token_data.owner.clone()))
+ .checked_sub(1)
+ .ok_or(ArithmeticError::Overflow)?;
+
+ if balance == 0 {
+ <AccountBalance<T>>::remove((collection.id, token_data.owner.clone()));
+ } else {
+ <AccountBalance<T>>::insert((collection.id, token_data.owner.clone()), balance);
+ }
// =========
- <Owned<T>>::remove((collection.id, &token_data.owner, token));
+ <Owned<T>>::remove((collection.id, &token_data.owner.clone(), token));
<TokensBurnt<T>>::insert(collection.id, burnt);
<TokenData<T>>::remove((collection.id, token));
let old_spender = <Allowance<T>>::take((collection.id, token));
pallets/nonfungible/src/weights.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/weights.rs
+++ b/pallets/nonfungible/src/weights.rs
@@ -7,7 +7,7 @@
//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 128
// Executed Command:
-// target/release/nft
+// target/release/unique-collator
// benchmark
// --pallet
// pallet-nonfungible
pallets/refungible/Cargo.tomldiffbeforeafterboth--- a/pallets/refungible/Cargo.toml
+++ b/pallets/refungible/Cargo.toml
@@ -16,7 +16,7 @@
sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
sp-core = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
pallet-common = { default-features = false, path = '../common' }
-nft-data-structs = { default-features = false, path = '../../primitives/nft' }
+up-data-structs = { default-features = false, path = '../../primitives/data-structs' }
frame-benchmarking = { default-features = false, optional = true, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
scale-info = { version = "1.0.0", default-features = false, features = [
"derive",
@@ -29,7 +29,7 @@
"frame-system/std",
"sp-runtime/std",
"sp-std/std",
- "nft-data-structs/std",
+ "up-data-structs/std",
"pallet-common/std",
'frame-benchmarking/std',
]
pallets/refungible/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/refungible/src/benchmarking.rs
+++ b/pallets/refungible/src/benchmarking.rs
@@ -4,7 +4,7 @@
use sp_std::prelude::*;
use pallet_common::benchmarking::{create_collection_raw, create_data};
use frame_benchmarking::{benchmarks, account};
-use nft_data_structs::{CollectionMode, MAX_ITEMS_PER_BATCH};
+use up_data_structs::{CollectionMode, MAX_ITEMS_PER_BATCH};
use pallet_common::bench_init;
use core::convert::TryInto;
use core::iter::IntoIterator;
pallets/refungible/src/common.rsdiffbeforeafterboth--- a/pallets/refungible/src/common.rs
+++ b/pallets/refungible/src/common.rs
@@ -2,7 +2,7 @@
use sp_std::collections::btree_map::BTreeMap;
use frame_support::{dispatch::DispatchResultWithPostInfo, fail, weights::Weight};
-use nft_data_structs::TokenId;
+use up_data_structs::TokenId;
use pallet_common::{CommonCollectionOperations, CommonWeightInfo, with_weight};
use sp_runtime::DispatchError;
use sp_std::vec::Vec;
@@ -67,11 +67,11 @@
}
fn map_create_data<T: Config>(
- data: nft_data_structs::CreateItemData,
+ data: up_data_structs::CreateItemData,
to: &T::CrossAccountId,
) -> Result<CreateItemData<T>, DispatchError> {
match data {
- nft_data_structs::CreateItemData::ReFungible(data) => Ok(CreateItemData {
+ up_data_structs::CreateItemData::ReFungible(data) => Ok(CreateItemData {
const_data: data.const_data,
variable_data: data.variable_data,
users: {
@@ -89,7 +89,7 @@
&self,
sender: T::CrossAccountId,
to: T::CrossAccountId,
- data: nft_data_structs::CreateItemData,
+ data: up_data_structs::CreateItemData,
) -> DispatchResultWithPostInfo {
with_weight(
<Pallet<T>>::create_item(self, &sender, map_create_data(data, &to)?),
@@ -101,7 +101,7 @@
&self,
sender: T::CrossAccountId,
to: T::CrossAccountId,
- data: Vec<nft_data_structs::CreateItemData>,
+ data: Vec<up_data_structs::CreateItemData>,
) -> DispatchResultWithPostInfo {
let data = data
.into_iter()
pallets/refungible/src/erc.rsdiffbeforeafterboth--- a/pallets/refungible/src/erc.rs
+++ b/pallets/refungible/src/erc.rs
@@ -1,4 +1,4 @@
-use nft_data_structs::TokenId;
+use up_data_structs::TokenId;
use pallet_common::erc::CommonEvmHandler;
use crate::{Config, RefungibleHandle};
pallets/refungible/src/lib.rsdiffbeforeafterboth--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -1,7 +1,7 @@
#![cfg_attr(not(feature = "std"), no_std)]
use frame_support::{ensure, BoundedVec};
-use nft_data_structs::{
+use up_data_structs::{
AccessMode, CUSTOM_DATA_LIMIT, Collection, CollectionId, CustomDataLimit,
MAX_REFUNGIBLE_PIECES, TokenId,
};
@@ -37,7 +37,7 @@
pub mod pallet {
use super::*;
use frame_support::{Blake2_128, Blake2_128Concat, Twox64Concat, pallet_prelude::*, storage::Key};
- use nft_data_structs::{CollectionId, TokenId};
+ use up_data_structs::{CollectionId, TokenId};
use super::weights::WeightInfo;
#[pallet::error]
@@ -54,7 +54,7 @@
}
#[pallet::pallet]
- #[pallet::generate_store(pub trait Store)]
+ #[pallet::generate_store(pub(super) trait Store)]
pub struct Pallet<T>(_);
#[pallet::storage]
@@ -175,6 +175,8 @@
<TotalSupply<T>>::remove_prefix((id,), None);
<Balance<T>>::remove_prefix((id,), None);
<Allowance<T>>::remove_prefix((id,), None);
+ <Owned<T>>::remove_prefix((id,), None);
+ <AccountBalance<T>>::remove_prefix((id,), None);
Ok(())
}
@@ -464,7 +466,11 @@
token: TokenId,
amount: u128,
) {
- <Allowance<T>>::insert((collection.id, token, sender, spender), amount);
+ if amount == 0 {
+ <Allowance<T>>::remove((collection.id, token, sender, spender));
+ } else {
+ <Allowance<T>>::insert((collection.id, token, sender, spender), amount);
+ }
// TODO: ERC20 approval event
<PalletCommon<T>>::deposit_event(CommonEvent::Approved(
collection.id,
pallets/refungible/src/weights.rsdiffbeforeafterboth--- a/pallets/refungible/src/weights.rs
+++ b/pallets/refungible/src/weights.rs
@@ -7,7 +7,7 @@
//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 128
// Executed Command:
-// target/release/nft
+// target/release/unique-collator
// benchmark
// --pallet
// pallet-refungible
pallets/scheduler/Cargo.tomldiffbeforeafterboth--- a/pallets/scheduler/Cargo.toml
+++ b/pallets/scheduler/Cargo.toml
@@ -1,12 +1,12 @@
[package]
name = "pallet-unq-scheduler"
-version = "3.0.0"
-authors = ["Parity Technologies <admin@parity.io>"]
+version = "0.1.0"
+authors = ["Unique Network <support@uniquenetwork.io>"]
edition = "2021"
-license = "Unlicense"
-homepage = "https://substrate.dev"
-repository = "https://github.com/paritytech/substrate/"
-description = "FRAME example pallet"
+license = "All Rights Reserved"
+homepage = "https://unique.network"
+repository = "https://github.com/UniqueNetwork/unique-chain"
+description = "Unique Scheduler pallet"
readme = "README.md"
[dependencies]
pallets/scheduler/src/lib.rsdiffbeforeafterboth--- a/pallets/scheduler/src/lib.rs
+++ b/pallets/scheduler/src/lib.rs
@@ -738,9 +738,7 @@
use super::*;
use frame_support::{
- Hashable, assert_err, assert_noop, assert_ok, ord_parameter_types, parameter_types,
- traits::{Contains, OnFinalize, OnInitialize},
- weights::constants::RocksDbWeight,
+ ord_parameter_types, parameter_types, traits::Contains, weights::constants::RocksDbWeight,
};
use sp_core::H256;
use sp_runtime::{
@@ -749,7 +747,6 @@
traits::{BlakeTwo256, IdentityLookup},
};
use frame_system::{EnsureOneOf, EnsureRoot, EnsureSignedBy};
- use substrate_test_utils::assert_eq_uvec;
use crate as scheduler;
mod logger {
@@ -758,9 +755,6 @@
thread_local! {
static LOG: RefCell<Vec<(OriginCaller, u32)>> = RefCell::new(Vec::new());
- }
- pub fn log() -> Vec<(OriginCaller, u32)> {
- LOG.with(|log| log.borrow().clone())
}
pub trait Config: system::Config {
type Event: From<Event> + Into<<Self as system::Config>::Event>;
@@ -871,24 +865,5 @@
type MaxScheduledPerBlock = MaxScheduledPerBlock;
type WeightInfo = ();
type SponsorshipHandler = ();
- }
-
- pub fn new_test_ext() -> sp_io::TestExternalities {
- let t = system::GenesisConfig::default()
- .build_storage::<Test>()
- .unwrap();
- t.into()
- }
-
- fn run_to_block(n: u64) {
- while System::block_number() < n {
- Scheduler::on_finalize(System::block_number());
- System::set_block_number(System::block_number() + 1);
- Scheduler::on_initialize(System::block_number());
- }
- }
-
- fn root() -> OriginCaller {
- system::RawOrigin::Root.into()
}
}
pallets/unique/Cargo.tomldiffbeforeafterboth--- /dev/null
+++ b/pallets/unique/Cargo.toml
@@ -0,0 +1,150 @@
+################################################################################
+# Package
+
+[package]
+authors = ['Unique Network <support@uniquenetwork.io>']
+description = 'Unique Pallet'
+edition = '2018'
+homepage = 'https://unique.network'
+license = 'All Rights Reserved'
+name = 'pallet-unique'
+repository = 'https://github.com/UniqueNetwork/unique-chain'
+version = '0.1.0'
+
+[package.metadata.docs.rs]
+targets = ['x86_64-unknown-linux-gnu']
+
+[features]
+default = ['std']
+runtime-benchmarks = ['frame-benchmarking', 'pallet-common/runtime-benchmarks']
+std = [
+ 'codec/std',
+ 'serde/std',
+ 'frame-support/std',
+ 'frame-system/std',
+ 'pallet-balances/std',
+ 'pallet-evm/std',
+ 'pallet-timestamp/std',
+ 'pallet-randomness-collective-flip/std',
+ 'pallet-transaction-payment/std',
+ 'pallet-common/std',
+ 'pallet-fungible/std',
+ 'pallet-nonfungible/std',
+ 'pallet-refungible/std',
+ 'fp-evm/std',
+ 'up-data-structs/std',
+ 'up-sponsorship/std',
+ 'up-evm-mapping/std',
+ 'sp-std/std',
+ 'sp-api/std',
+ 'sp-runtime/std',
+ 'frame-benchmarking/std',
+ 'ethereum/std',
+ 'rlp/std',
+
+ 'primitive-types/std',
+ 'evm-coder/std',
+ 'pallet-evm-coder-substrate/std',
+]
+limit-testing = ["up-data-structs/limit-testing"]
+
+################################################################################
+# Substrate Dependencies
+
+[dependencies.codec]
+default-features = false
+features = ['derive']
+package = 'parity-scale-codec'
+version = '2.3.0'
+
+[dependencies.frame-benchmarking]
+default-features = false
+optional = true
+git = 'https://github.com/paritytech/substrate.git'
+branch = 'polkadot-v0.9.12'
+
+[dependencies.frame-support]
+default-features = false
+git = 'https://github.com/paritytech/substrate.git'
+branch = 'polkadot-v0.9.12'
+
+[dependencies.frame-system]
+default-features = false
+git = 'https://github.com/paritytech/substrate.git'
+branch = 'polkadot-v0.9.12'
+
+[dependencies.pallet-balances]
+default-features = false
+git = 'https://github.com/paritytech/substrate.git'
+branch = 'polkadot-v0.9.12'
+
+[dependencies.pallet-timestamp]
+default-features = false
+git = 'https://github.com/paritytech/substrate.git'
+branch = 'polkadot-v0.9.12'
+
+[dependencies.pallet-randomness-collective-flip]
+default-features = false
+git = 'https://github.com/paritytech/substrate.git'
+branch = 'polkadot-v0.9.12'
+
+[dependencies.sp-std]
+default-features = false
+git = 'https://github.com/paritytech/substrate.git'
+branch = 'polkadot-v0.9.12'
+
+[dependencies.pallet-transaction-payment]
+default-features = false
+git = 'https://github.com/paritytech/substrate.git'
+branch = 'polkadot-v0.9.12'
+
+[dependencies.serde]
+default-features = false
+features = ['derive']
+version = '1.0.130'
+
+[dependencies.sp-runtime]
+default-features = false
+git = 'https://github.com/paritytech/substrate.git'
+branch = 'polkadot-v0.9.12'
+
+[dependencies.sp-core]
+default-features = false
+git = 'https://github.com/paritytech/substrate.git'
+branch = 'polkadot-v0.9.12'
+
+[dependencies.sp-io]
+default-features = false
+git = 'https://github.com/paritytech/substrate.git'
+branch = 'polkadot-v0.9.12'
+
+
+################################################################################
+# Local Dependencies
+[dependencies]
+up-data-structs = { default-features = false, path = "../../primitives/data-structs" }
+
+scale-info = { version = "1.0.0", default-features = false, features = [
+ "derive",
+] }
+ethereum = { version = "0.10.0", default-features = false }
+rlp = { default-features = false, version = "0.5.0" }
+sp-api = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.12" }
+
+up-sponsorship = { version = "0.1.0", default-features = false, git = "https://github.com/UniqueNetwork/pallet-sponsoring" }
+up-evm-mapping = { default-features = false, path = "../../primitives/evm-mapping" }
+evm-coder = { default-features = false, path = "../../crates/evm-coder" }
+pallet-evm-coder-substrate = { default-features = false, path = "../../pallets/evm-coder-substrate" }
+primitive-types = { version = "0.10.1", default-features = false, features = [
+ "serde_no_std",
+] }
+
+pallet-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier.git", branch = "unique-polkadot-v0.9.12-weights" }
+pallet-ethereum = { default-features = false, git = "https://github.com/uniquenetwork/frontier.git", branch = "unique-polkadot-v0.9.12-weights" }
+fp-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier.git", branch = "unique-polkadot-v0.9.12-weights" }
+hex-literal = "0.3.3"
+
+pallet-common = { default-features = false, path = "../common" }
+pallet-fungible = { default-features = false, path = "../fungible" }
+pallet-nonfungible = { default-features = false, path = "../nonfungible" }
+pallet-refungible = { default-features = false, path = "../refungible" }
pallets/unique/src/benchmarking.rsdiffbeforeafterboth--- /dev/null
+++ b/pallets/unique/src/benchmarking.rs
@@ -0,0 +1,173 @@
+#![cfg(feature = "runtime-benchmarks")]
+
+use super::*;
+use crate::Pallet;
+use frame_system::RawOrigin;
+use frame_benchmarking::{benchmarks, account};
+use up_data_structs::*;
+use core::convert::TryInto;
+use sp_runtime::DispatchError;
+use pallet_common::benchmarking::{create_data, create_u16_data};
+
+const SEED: u32 = 1;
+
+fn create_collection_helper<T: Config>(
+ owner: T::AccountId,
+ mode: CollectionMode,
+) -> Result<CollectionId, DispatchError> {
+ T::Currency::deposit_creating(&owner, T::CollectionCreationPrice::get());
+ let col_name = create_u16_data(MAX_COLLECTION_NAME_LENGTH)
+ .try_into()
+ .unwrap();
+ let col_desc = create_u16_data(MAX_COLLECTION_DESCRIPTION_LENGTH)
+ .try_into()
+ .unwrap();
+ let token_prefix = create_data(MAX_TOKEN_PREFIX_LENGTH).try_into().unwrap();
+ <Pallet<T>>::create_collection(
+ RawOrigin::Signed(owner).into(),
+ col_name,
+ col_desc,
+ token_prefix,
+ mode,
+ )?;
+ Ok(<pallet_common::CreatedCollectionCount<T>>::get())
+}
+fn create_nft_collection<T: Config>(owner: T::AccountId) -> Result<CollectionId, DispatchError> {
+ create_collection_helper::<T>(owner, CollectionMode::NFT)
+}
+
+benchmarks! {
+
+ create_collection {
+ let col_name: Vec<u16> = create_u16_data(MAX_COLLECTION_NAME_LENGTH);
+ let col_desc: Vec<u16> = create_u16_data(MAX_COLLECTION_DESCRIPTION_LENGTH);
+ let token_prefix: Vec<u8> = create_data(MAX_TOKEN_PREFIX_LENGTH);
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = account("caller", 0, SEED);
+ T::Currency::deposit_creating(&caller, T::CollectionCreationPrice::get());
+ }: _(RawOrigin::Signed(caller.clone()), col_name.clone(), col_desc.clone(), token_prefix.clone(), mode)
+ verify {
+ assert_eq!(<pallet_common::CollectionById<T>>::get(CollectionId(1)).unwrap().owner, caller);
+ }
+
+ destroy_collection {
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ }: _(RawOrigin::Signed(caller.clone()), collection)
+
+ add_to_allow_list {
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let allowlist_account: T::AccountId = account("admin", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ }: _(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(allowlist_account))
+
+ remove_from_allow_list {
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let allowlist_account: T::AccountId = account("admin", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ <Pallet<T>>::add_to_allow_list(RawOrigin::Signed(caller.clone()).into(), collection, T::CrossAccountId::from_sub(allowlist_account.clone()))?;
+ }: _(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(allowlist_account))
+
+ set_public_access_mode {
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ }: _(RawOrigin::Signed(caller.clone()), collection, AccessMode::AllowList)
+
+ set_mint_permission {
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ }: _(RawOrigin::Signed(caller.clone()), collection, true)
+
+ change_collection_owner {
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ let new_owner: T::AccountId = account("admin", 0, SEED);
+ }: _(RawOrigin::Signed(caller.clone()), collection, new_owner)
+
+ add_collection_admin {
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ let new_admin: T::AccountId = account("admin", 0, SEED);
+ }: _(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(new_admin))
+
+ remove_collection_admin {
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ let new_admin: T::AccountId = account("admin", 0, SEED);
+ <Pallet<T>>::add_collection_admin(RawOrigin::Signed(caller.clone()).into(), collection, T::CrossAccountId::from_sub(new_admin.clone()))?;
+ }: _(RawOrigin::Signed(caller.clone()), collection, T::CrossAccountId::from_sub(new_admin))
+
+ set_collection_sponsor {
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ }: _(RawOrigin::Signed(caller.clone()), collection, caller.clone())
+
+ confirm_sponsorship {
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ <Pallet<T>>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), collection, caller.clone())?;
+ }: _(RawOrigin::Signed(caller.clone()), collection)
+
+ remove_collection_sponsor {
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ <Pallet<T>>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), collection, caller.clone())?;
+ <Pallet<T>>::confirm_sponsorship(RawOrigin::Signed(caller.clone()).into(), collection)?;
+ }: _(RawOrigin::Signed(caller.clone()), collection)
+
+ set_transfers_enabled_flag {
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ }: _(RawOrigin::Signed(caller.clone()), collection, false)
+
+ set_offchain_schema {
+ let b in 0..OFFCHAIN_SCHEMA_LIMIT;
+
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ let data = create_data(b as usize);
+ }: set_offchain_schema(RawOrigin::Signed(caller.clone()), collection, data)
+
+ set_const_on_chain_schema {
+ let b in 0..CONST_ON_CHAIN_SCHEMA_LIMIT;
+
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ let data = create_data(b as usize);
+ }: set_const_on_chain_schema(RawOrigin::Signed(caller.clone()), collection, data)
+
+ set_variable_on_chain_schema {
+ let b in 0..VARIABLE_ON_CHAIN_SCHEMA_LIMIT;
+
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ let data = create_data(b as usize);
+ }: set_variable_on_chain_schema(RawOrigin::Signed(caller.clone()), collection, data)
+
+ set_schema_version {
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ }: set_schema_version(RawOrigin::Signed(caller.clone()), collection, SchemaVersion::Unique)
+
+ set_collection_limits{
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+
+ let cl = CollectionLimits {
+ account_token_ownership_limit: Some(0),
+ sponsored_data_size: Some(0),
+ token_limit: Some(1),
+ sponsor_transfer_timeout: Some(0),
+ sponsor_approve_timeout: None,
+ owner_can_destroy: Some(true),
+ owner_can_transfer: Some(true),
+ sponsored_data_rate_limit: None,
+ transfers_enabled: Some(true),
+ };
+ }: set_collection_limits(RawOrigin::Signed(caller.clone()), collection, cl)
+
+ set_meta_update_permission_flag {
+ let caller: T::AccountId = account("caller", 0, SEED);
+ let collection = create_nft_collection::<T>(caller.clone())?;
+ }: _(RawOrigin::Signed(caller.clone()), collection, MetaUpdatePermission::Admin)
+}
pallets/unique/src/common.rsdiffbeforeafterboth--- /dev/null
+++ b/pallets/unique/src/common.rs
@@ -0,0 +1,52 @@
+use core::marker::PhantomData;
+use frame_support::{weights::Weight};
+use pallet_common::{CommonWeightInfo};
+
+use pallet_fungible::{common::CommonWeights as FungibleWeights};
+use pallet_nonfungible::{common::CommonWeights as NonfungibleWeights};
+use pallet_refungible::{common::CommonWeights as RefungibleWeights};
+
+use crate::{Config, dispatch::dispatch_weight};
+
+macro_rules! max_weight_of {
+ ($method:ident ( $($args:tt)* )) => {
+ <FungibleWeights<T>>::$method($($args)*)
+ .max(<NonfungibleWeights<T>>::$method($($args)*))
+ .max(<RefungibleWeights<T>>::$method($($args)*))
+ };
+}
+
+pub struct CommonWeights<T: Config>(PhantomData<T>);
+impl<T: Config> CommonWeightInfo for CommonWeights<T> {
+ fn create_item() -> up_data_structs::Weight {
+ dispatch_weight::<T>() + max_weight_of!(create_item())
+ }
+
+ fn create_multiple_items(amount: u32) -> Weight {
+ dispatch_weight::<T>() + max_weight_of!(create_multiple_items(amount))
+ }
+
+ fn burn_item() -> Weight {
+ dispatch_weight::<T>() + max_weight_of!(burn_item())
+ }
+
+ fn transfer() -> up_data_structs::Weight {
+ dispatch_weight::<T>() + max_weight_of!(transfer())
+ }
+
+ fn approve() -> up_data_structs::Weight {
+ dispatch_weight::<T>() + max_weight_of!(approve())
+ }
+
+ fn transfer_from() -> up_data_structs::Weight {
+ dispatch_weight::<T>() + max_weight_of!(transfer_from())
+ }
+
+ fn set_variable_metadata(bytes: u32) -> up_data_structs::Weight {
+ dispatch_weight::<T>() + max_weight_of!(set_variable_metadata(bytes))
+ }
+
+ fn burn_from() -> Weight {
+ dispatch_weight::<T>() + max_weight_of!(burn_from())
+ }
+}
pallets/unique/src/dispatch.rsdiffbeforeafterboth--- /dev/null
+++ b/pallets/unique/src/dispatch.rs
@@ -0,0 +1,88 @@
+use frame_support::{
+ dispatch::{DispatchErrorWithPostInfo, DispatchResultWithPostInfo},
+ traits::Get,
+ weights::Weight,
+};
+use up_data_structs::{CollectionId, CollectionMode, Pays, PostDispatchInfo};
+use pallet_common::{CollectionHandle, CommonCollectionOperations};
+use pallet_fungible::FungibleHandle;
+use pallet_nonfungible::NonfungibleHandle;
+use pallet_refungible::RefungibleHandle;
+
+use crate::Config;
+
+// TODO: move to benchmarking
+/// Price of [`dispatch_call`] call with noop `call` argument
+pub fn dispatch_weight<T: Config>() -> Weight {
+ // Read collection
+ <T as frame_system::Config>::DbWeight::get().reads(1)
+ // Dynamic dispatch?
+ + 6_000_000
+ // submit_logs is measured as part of collection pallets
+}
+
+pub enum Dispatched<T: Config> {
+ Fungible(FungibleHandle<T>),
+ Nonfungible(NonfungibleHandle<T>),
+ Refungible(RefungibleHandle<T>),
+}
+impl<T: Config> Dispatched<T> {
+ pub fn dispatch(handle: CollectionHandle<T>) -> Self {
+ match handle.mode {
+ CollectionMode::Fungible(_) => Self::Fungible(FungibleHandle::cast(handle)),
+ CollectionMode::NFT => Self::Nonfungible(NonfungibleHandle::cast(handle)),
+ CollectionMode::ReFungible => Self::Refungible(RefungibleHandle::cast(handle)),
+ }
+ }
+ fn into_inner(self) -> CollectionHandle<T> {
+ match self {
+ Dispatched::Fungible(f) => f.into_inner(),
+ Dispatched::Nonfungible(f) => f.into_inner(),
+ Dispatched::Refungible(f) => f.into_inner(),
+ }
+ }
+ pub fn as_dyn(&self) -> &dyn CommonCollectionOperations<T> {
+ match self {
+ Dispatched::Fungible(h) => h,
+ Dispatched::Nonfungible(h) => h,
+ Dispatched::Refungible(h) => h,
+ }
+ }
+}
+
+/// Helper function to implement substrate calls for common collection methods
+pub fn dispatch_call<
+ T: Config,
+ C: FnOnce(&dyn pallet_common::CommonCollectionOperations<T>) -> DispatchResultWithPostInfo,
+>(
+ collection: CollectionId,
+ call: C,
+) -> DispatchResultWithPostInfo {
+ let handle =
+ CollectionHandle::try_get(collection).map_err(|error| DispatchErrorWithPostInfo {
+ post_info: PostDispatchInfo {
+ actual_weight: Some(dispatch_weight::<T>()),
+ pays_fee: Pays::Yes,
+ },
+ error,
+ })?;
+ let dispatched = Dispatched::dispatch(handle);
+ let mut result = call(dispatched.as_dyn());
+ match &mut result {
+ Ok(PostDispatchInfo {
+ actual_weight: Some(weight),
+ ..
+ })
+ | Err(DispatchErrorWithPostInfo {
+ post_info: PostDispatchInfo {
+ actual_weight: Some(weight),
+ ..
+ },
+ ..
+ }) => *weight += dispatch_weight::<T>(),
+ _ => {}
+ }
+
+ dispatched.into_inner().submit_logs();
+ result
+}
pallets/unique/src/eth/mod.rsdiffbeforeafterboth--- /dev/null
+++ b/pallets/unique/src/eth/mod.rs
@@ -0,0 +1,80 @@
+pub mod sponsoring;
+
+use fp_evm::PrecompileResult;
+use pallet_common::{
+ CollectionById,
+ erc::CommonEvmHandler,
+ eth::{map_eth_to_id, map_eth_to_token_id},
+};
+use pallet_fungible::FungibleHandle;
+use pallet_nonfungible::NonfungibleHandle;
+use pallet_refungible::{RefungibleHandle, erc::RefungibleTokenHandle};
+use sp_std::borrow::ToOwned;
+use sp_std::vec::Vec;
+use sp_core::{H160, U256};
+use crate::{CollectionMode, Config, dispatch::Dispatched};
+use pallet_common::CollectionHandle;
+
+pub struct UniqueErcSupport<T: Config>(core::marker::PhantomData<T>);
+
+impl<T: Config> pallet_evm::OnMethodCall<T> for UniqueErcSupport<T> {
+ fn is_reserved(target: &H160) -> bool {
+ map_eth_to_id(target).is_some()
+ }
+ fn is_used(target: &H160) -> bool {
+ map_eth_to_id(target)
+ .map(<CollectionById<T>>::contains_key)
+ .unwrap_or(false)
+ }
+ fn get_code(target: &H160) -> Option<Vec<u8>> {
+ if let Some(collection_id) = map_eth_to_id(target) {
+ let collection = <CollectionById<T>>::get(collection_id)?;
+ Some(
+ match collection.mode {
+ CollectionMode::NFT => <NonfungibleHandle<T>>::CODE,
+ CollectionMode::Fungible(_) => <FungibleHandle<T>>::CODE,
+ CollectionMode::ReFungible => <RefungibleHandle<T>>::CODE,
+ }
+ .to_owned(),
+ )
+ } else if let Some((collection_id, _token_id)) = map_eth_to_token_id(target) {
+ let collection = <CollectionById<T>>::get(collection_id)?;
+ if collection.mode != CollectionMode::ReFungible {
+ return None;
+ }
+ // TODO: check token existence
+ Some(<RefungibleTokenHandle<T>>::CODE.to_owned())
+ } else {
+ None
+ }
+ }
+ fn call(
+ source: &H160,
+ target: &H160,
+ gas_limit: u64,
+ input: &[u8],
+ value: U256,
+ ) -> Option<PrecompileResult> {
+ if let Some(collection_id) = map_eth_to_id(target) {
+ let collection = <CollectionHandle<T>>::new_with_gas_limit(collection_id, gas_limit)?;
+ let dispatched = Dispatched::dispatch(collection);
+
+ match dispatched {
+ Dispatched::Fungible(h) => h.call(source, input, value),
+ Dispatched::Nonfungible(h) => h.call(source, input, value),
+ Dispatched::Refungible(h) => h.call(source, input, value),
+ }
+ } else if let Some((collection_id, token_id)) = map_eth_to_token_id(target) {
+ let collection = <CollectionHandle<T>>::new_with_gas_limit(collection_id, gas_limit)?;
+ if collection.mode != CollectionMode::ReFungible {
+ return None;
+ }
+
+ let handle = RefungibleHandle::cast(collection);
+ // TODO: check token existence
+ RefungibleTokenHandle(handle, token_id).call(source, input, value)
+ } else {
+ None
+ }
+ }
+}
pallets/unique/src/eth/sponsoring.rsdiffbeforeafterboth--- /dev/null
+++ b/pallets/unique/src/eth/sponsoring.rs
@@ -0,0 +1,74 @@
+//! Implements EVM sponsoring logic via OnChargeEVMTransaction
+
+use crate::{Config, sponsorship::*};
+use evm_coder::{Call, abi::AbiReader};
+use pallet_common::{CollectionHandle, eth::map_eth_to_id};
+use sp_core::H160;
+use sp_std::prelude::*;
+use up_sponsorship::SponsorshipHandler;
+use core::marker::PhantomData;
+use core::convert::TryInto;
+use up_data_structs::TokenId;
+use up_evm_mapping::EvmBackwardsAddressMapping;
+use pallet_common::account::CrossAccountId;
+
+use pallet_nonfungible::erc::{UniqueNFTCall, ERC721UniqueExtensionsCall, ERC721Call};
+use pallet_fungible::erc::{UniqueFungibleCall, ERC20Call};
+
+pub struct UniqueEthSponsorshipHandler<T: Config>(PhantomData<*const T>);
+impl<T: Config> SponsorshipHandler<H160, (H160, Vec<u8>)> for UniqueEthSponsorshipHandler<T> {
+ fn get_sponsor(who: &H160, call: &(H160, Vec<u8>)) -> Option<H160> {
+ let collection_id = map_eth_to_id(&call.0)?;
+ let collection = <CollectionHandle<T>>::new(collection_id)?;
+ let sponsor = collection.sponsorship.sponsor()?.clone();
+ let sponsor =
+ <T as pallet_common::Config>::EvmBackwardsAddressMapping::from_account_id(sponsor);
+ let who = T::CrossAccountId::from_eth(*who);
+ let (method_id, mut reader) = AbiReader::new_call(&call.1).ok()?;
+ match &collection.mode {
+ crate::CollectionMode::NFT => {
+ let call = <UniqueNFTCall<T>>::parse(method_id, &mut reader).ok()??;
+ match call {
+ UniqueNFTCall::ERC721UniqueExtensions(
+ ERC721UniqueExtensionsCall::Transfer { token_id, .. },
+ ) => {
+ let token_id: TokenId = token_id.try_into().ok()?;
+ withdraw_transfer::<T>(&collection, &who, &token_id).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);
+ withdraw_transfer::<T>(&collection, &from, &token_id).map(|()| sponsor)
+ }
+ UniqueNFTCall::ERC721(ERC721Call::Approve { token_id, .. }) => {
+ let token_id: TokenId = token_id.try_into().ok()?;
+ withdraw_approve::<T>(&collection, who.as_sub(), &token_id)
+ .map(|()| sponsor)
+ }
+ _ => None,
+ }
+ }
+ crate::CollectionMode::Fungible(_) => {
+ let call = <UniqueFungibleCall<T>>::parse(method_id, &mut reader).ok()??;
+ #[allow(clippy::single_match)]
+ match call {
+ UniqueFungibleCall::ERC20(ERC20Call::Transfer { .. }) => {
+ withdraw_transfer::<T>(&collection, &who, &TokenId::default())
+ .map(|()| sponsor)
+ }
+ UniqueFungibleCall::ERC20(ERC20Call::TransferFrom { from, .. }) => {
+ let from = T::CrossAccountId::from_eth(from);
+ withdraw_transfer::<T>(&collection, &from, &TokenId::default())
+ .map(|()| sponsor)
+ }
+ UniqueFungibleCall::ERC20(ERC20Call::Approve { .. }) => {
+ withdraw_approve::<T>(&collection, who.as_sub(), &TokenId::default())
+ .map(|()| sponsor)
+ }
+ _ => None,
+ }
+ }
+ _ => None,
+ }
+ }
+}
pallets/unique/src/lib.rsdiffbeforeafterboth--- /dev/null
+++ b/pallets/unique/src/lib.rs
@@ -0,0 +1,955 @@
+//
+// This file is subject to the terms and conditions defined in
+// file 'LICENSE', which is part of this source code package.
+//
+
+#![recursion_limit = "1024"]
+#![cfg_attr(not(feature = "std"), no_std)]
+#![allow(
+ clippy::too_many_arguments,
+ clippy::unnecessary_mut_passed,
+ clippy::unused_unit
+)]
+
+extern crate alloc;
+
+pub use serde::{Serialize, Deserialize};
+
+pub use frame_support::{
+ construct_runtime, decl_module, decl_storage, decl_error,
+ dispatch::DispatchResult,
+ ensure, fail, parameter_types,
+ traits::{
+ ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced, Randomness,
+ IsSubType, WithdrawReasons,
+ },
+ weights::{
+ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},
+ DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,
+ WeightToFeePolynomial, DispatchClass,
+ },
+ StorageValue, transactional,
+ pallet_prelude::DispatchResultWithPostInfo,
+};
+use scale_info::TypeInfo;
+use frame_system::{self as system, ensure_signed};
+use sp_runtime::{sp_std::prelude::Vec};
+use up_data_structs::{
+ MAX_DECIMAL_POINTS, MAX_SPONSOR_TIMEOUT, MAX_TOKEN_OWNERSHIP, CUSTOM_DATA_LIMIT,
+ VARIABLE_ON_CHAIN_SCHEMA_LIMIT, CONST_ON_CHAIN_SCHEMA_LIMIT, OFFCHAIN_SCHEMA_LIMIT,
+ FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT, REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
+ NFT_SPONSOR_TRANSFER_TIMEOUT, AccessMode, Collection, CreateItemData, CollectionLimits,
+ CollectionId, CollectionMode, TokenId, SchemaVersion, SponsorshipState, MetaUpdatePermission,
+};
+use pallet_common::{
+ account::CrossAccountId, CollectionHandle, Pallet as PalletCommon, Error as CommonError,
+ CommonWeightInfo,
+};
+use pallet_refungible::{Pallet as PalletRefungible, RefungibleHandle};
+use pallet_fungible::{Pallet as PalletFungible, FungibleHandle};
+use pallet_nonfungible::{Pallet as PalletNonfungible, NonfungibleHandle};
+
+#[cfg(test)]
+mod mock;
+
+#[cfg(test)]
+mod tests;
+
+mod eth;
+mod sponsorship;
+pub use sponsorship::UniqueSponsorshipHandler;
+pub use eth::sponsoring::UniqueEthSponsorshipHandler;
+
+pub use eth::UniqueErcSupport;
+
+pub mod common;
+use common::CommonWeights;
+pub mod dispatch;
+use dispatch::dispatch_call;
+
+#[cfg(feature = "runtime-benchmarks")]
+mod benchmarking;
+pub mod weights;
+use weights::WeightInfo;
+
+decl_error! {
+ /// Error for non-fungible-token module.
+ pub enum Error for Module<T: Config> {
+ /// Decimal_points parameter must be lower than MAX_DECIMAL_POINTS constant, currently it is 30.
+ CollectionDecimalPointLimitExceeded,
+ /// This address is not set as sponsor, use setCollectionSponsor first.
+ ConfirmUnsetSponsorFail,
+ /// Length of items properties must be greater than 0.
+ EmptyArgument,
+ /// Collection limit bounds per collection exceeded
+ CollectionLimitBoundsExceeded,
+ /// Tried to enable permissions which are only permitted to be disabled
+ OwnerPermissionsCantBeReverted,
+ }
+}
+pub trait Config:
+ system::Config
+ + pallet_evm_coder_substrate::Config
+ + pallet_common::Config
+ + pallet_nonfungible::Config
+ + pallet_refungible::Config
+ + pallet_fungible::Config
+ + Sized
+ + TypeInfo
+{
+ /// Weight information for extrinsics in this pallet.
+ type WeightInfo: WeightInfo;
+}
+
+type SelfWeightOf<T> = <T as Config>::WeightInfo;
+
+// # Used definitions
+//
+// ## User control levels
+//
+// chain-controlled - key is uncontrolled by user
+// i.e autoincrementing index
+// can use non-cryptographic hash
+// real - key is controlled by user
+// but it is hard to generate enough colliding values, i.e owner of signed txs
+// can use non-cryptographic hash
+// controlled - key is completly controlled by users
+// i.e maps with mutable keys
+// should use cryptographic hash
+//
+// ## User control level downgrade reasons
+//
+// ?1 - chain-controlled -> controlled
+// collections/tokens can be destroyed, resulting in massive holes
+// ?2 - chain-controlled -> controlled
+// same as ?1, but can be only added, resulting in easier exploitation
+// ?3 - real -> controlled
+// no confirmation required, so addresses can be easily generated
+decl_storage! {
+ trait Store for Module<T: Config> as Unique {
+
+ //#region Private members
+ /// Used for migrations
+ ChainVersion: u64;
+ //#endregion
+
+ //#region Tokens transfer rate limit baskets
+ /// (Collection id (controlled?2), who created (real))
+ /// TODO: Off chain worker should remove from this map when collection gets removed
+ pub CreateItemBasket get(fn create_item_basket): map hasher(blake2_128_concat) (CollectionId, T::AccountId) => Option<T::BlockNumber>;
+ /// Collection id (controlled?2), token id (controlled?2)
+ pub NftTransferBasket get(fn nft_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;
+ /// Collection id (controlled?2), owning user (real)
+ pub FungibleTransferBasket get(fn fungible_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;
+ /// Collection id (controlled?2), token id (controlled?2)
+ pub ReFungibleTransferBasket get(fn refungible_transfer_basket): nmap hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;
+ //#endregion
+
+ /// Variable metadata sponsoring
+ /// Collection id (controlled?2), token id (controlled?2)
+ pub VariableMetaDataBasket get(fn variable_meta_data_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;
+ /// Approval sponsoring
+ pub NftApproveBasket get(fn nft_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;
+ pub FungibleApproveBasket get(fn fungible_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;
+ pub RefungibleApproveBasket get(fn refungible_approve_basket): nmap hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;
+ }
+}
+
+decl_module! {
+ pub struct Module<T: Config> for enum Call
+ where
+ origin: T::Origin
+ {
+ type Error = Error<T>;
+
+ fn on_initialize(_now: T::BlockNumber) -> Weight {
+ 0
+ }
+
+ /// This method creates a Collection of NFTs. Each Token may have multiple properties encoded as an array of bytes of certain length. The initial owner of the collection is set to the address that signed the transaction and can be changed later.
+ ///
+ /// # Permissions
+ ///
+ /// * Anyone.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_name: UTF-16 string with collection name (limit 64 characters), will be stored as zero-terminated.
+ ///
+ /// * collection_description: UTF-16 string with collection description (limit 256 characters), will be stored as zero-terminated.
+ ///
+ /// * token_prefix: UTF-8 string with token prefix.
+ ///
+ /// * mode: [CollectionMode] collection type and type dependent data.
+ // returns collection ID
+ #[weight = <SelfWeightOf<T>>::create_collection()]
+ #[transactional]
+ pub fn create_collection(origin,
+ collection_name: Vec<u16>,
+ collection_description: Vec<u16>,
+ token_prefix: Vec<u8>,
+ mode: CollectionMode) -> DispatchResult {
+
+ // Anyone can create a collection
+ let who = ensure_signed(origin)?;
+
+ // Create new collection
+ let new_collection = Collection {
+ owner: who,
+ name: collection_name,
+ mode: mode.clone(),
+ mint_mode: false,
+ access: AccessMode::Normal,
+ description: collection_description,
+ token_prefix,
+ offchain_schema: Vec::new(),
+ schema_version: SchemaVersion::ImageURL,
+ sponsorship: SponsorshipState::Disabled,
+ variable_on_chain_schema: Vec::new(),
+ const_on_chain_schema: Vec::new(),
+ limits: Default::default(),
+ meta_update_permission: Default::default(),
+ };
+
+ let _id = match mode {
+ CollectionMode::NFT => {<PalletNonfungible<T>>::init_collection(new_collection)?},
+ CollectionMode::Fungible(decimal_points) => {
+ // check params
+ ensure!(decimal_points <= MAX_DECIMAL_POINTS, Error::<T>::CollectionDecimalPointLimitExceeded);
+ <PalletFungible<T>>::init_collection(new_collection)?
+ }
+ CollectionMode::ReFungible => {
+ <PalletRefungible<T>>::init_collection(new_collection)?
+ }
+ };
+
+ Ok(())
+ }
+
+ /// **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: collection to destroy.
+ #[weight = <SelfWeightOf<T>>::destroy_collection()]
+ #[transactional]
+ pub fn destroy_collection(origin, collection_id: CollectionId) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+
+ let collection = <CollectionHandle<T>>::try_get(collection_id)?;
+ collection.check_is_owner(&sender)?;
+
+ // =========
+
+ match collection.mode {
+ CollectionMode::ReFungible => PalletRefungible::destroy_collection(RefungibleHandle::cast(collection), &sender)?,
+ CollectionMode::Fungible(_) => PalletFungible::destroy_collection(FungibleHandle::cast(collection), &sender)?,
+ CollectionMode::NFT => PalletNonfungible::destroy_collection(NonfungibleHandle::cast(collection), &sender)?,
+ }
+
+ <NftTransferBasket<T>>::remove_prefix(collection_id, None);
+ <FungibleTransferBasket<T>>::remove_prefix(collection_id, None);
+ <ReFungibleTransferBasket<T>>::remove_prefix((collection_id,), None);
+
+ <VariableMetaDataBasket<T>>::remove_prefix(collection_id, None);
+ <NftApproveBasket<T>>::remove_prefix(collection_id, None);
+ <FungibleApproveBasket<T>>::remove_prefix(collection_id, None);
+ <RefungibleApproveBasket<T>>::remove_prefix((collection_id,), None);
+
+ Ok(())
+ }
+
+ /// Add an address to allow list.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * address.
+ #[weight = <SelfWeightOf<T>>::add_to_allow_list()]
+ #[transactional]
+ pub fn add_to_allow_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{
+
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let collection = <CollectionHandle<T>>::try_get(collection_id)?;
+
+ <PalletCommon<T>>::toggle_allowlist(
+ &collection,
+ &sender,
+ &address,
+ true,
+ )?;
+
+ Ok(())
+ }
+
+ /// Remove an address from allow list.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * address.
+ #[weight = <SelfWeightOf<T>>::remove_from_allow_list()]
+ #[transactional]
+ pub fn remove_from_allow_list(origin, collection_id: CollectionId, address: T::CrossAccountId) -> DispatchResult{
+
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let collection = <CollectionHandle<T>>::try_get(collection_id)?;
+
+ <PalletCommon<T>>::toggle_allowlist(
+ &collection,
+ &sender,
+ &address,
+ false,
+ )?;
+
+ Ok(())
+ }
+
+ /// Toggle between normal and allow list access for the methods with access for `Anyone`.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * mode: [AccessMode]
+ #[weight = <SelfWeightOf<T>>::set_public_access_mode()]
+ #[transactional]
+ pub fn set_public_access_mode(origin, collection_id: CollectionId, mode: AccessMode) -> DispatchResult
+ {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+
+ let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
+ target_collection.check_is_owner(&sender)?;
+
+ target_collection.access = mode;
+ target_collection.save()
+ }
+
+ /// Allows Anyone to create tokens if:
+ /// * Allow List is enabled, and
+ /// * Address is added to allow list, and
+ /// * This method was called with True parameter
+ ///
+ /// # Permissions
+ /// * Collection Owner
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * mint_permission: Boolean parameter. If True, allows minting to Anyone with conditions above.
+ #[weight = <SelfWeightOf<T>>::set_mint_permission()]
+ #[transactional]
+ pub fn set_mint_permission(origin, collection_id: CollectionId, mint_permission: bool) -> DispatchResult
+ {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+
+ let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
+ target_collection.check_is_owner(&sender)?;
+
+ target_collection.mint_mode = mint_permission;
+ target_collection.save()
+ }
+
+ /// Change the owner of the collection.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * new_owner.
+ #[weight = <SelfWeightOf<T>>::change_collection_owner()]
+ #[transactional]
+ pub fn change_collection_owner(origin, collection_id: CollectionId, new_owner: T::AccountId) -> DispatchResult {
+
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+
+ let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
+ target_collection.check_is_owner(&sender)?;
+
+ target_collection.owner = new_owner;
+ target_collection.save()
+ }
+
+ /// Adds an admin of the Collection.
+ /// NFT Collection can be controlled by multiple admin addresses (some which can also be servers, for example). Admins can issue and burn NFTs, as well as add and remove other admins, but cannot change NFT or Collection ownership.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ /// * Collection Admin.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: ID of the Collection to add admin for.
+ ///
+ /// * new_admin_id: Address of new admin to add.
+ #[weight = <SelfWeightOf<T>>::add_collection_admin()]
+ #[transactional]
+ pub fn add_collection_admin(origin, collection_id: CollectionId, new_admin_id: T::CrossAccountId) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let collection = <CollectionHandle<T>>::try_get(collection_id)?;
+
+ <PalletCommon<T>>::toggle_admin(&collection, &sender, &new_admin_id, true)
+ }
+
+ /// Remove admin address of the Collection. An admin address can remove itself. List of admins may become empty, in which case only Collection Owner will be able to add an Admin.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ /// * Collection Admin.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: ID of the Collection to remove admin for.
+ ///
+ /// * account_id: Address of admin to remove.
+ #[weight = <SelfWeightOf<T>>::remove_collection_admin()]
+ #[transactional]
+ pub fn remove_collection_admin(origin, collection_id: CollectionId, account_id: T::CrossAccountId) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let collection = <CollectionHandle<T>>::try_get(collection_id)?;
+
+ <PalletCommon<T>>::toggle_admin(&collection, &sender, &account_id, false)
+ }
+
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * new_sponsor.
+ #[weight = <SelfWeightOf<T>>::set_collection_sponsor()]
+ #[transactional]
+ pub fn set_collection_sponsor(origin, collection_id: CollectionId, new_sponsor: T::AccountId) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+
+ let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
+ target_collection.check_is_owner(&sender)?;
+
+ target_collection.sponsorship = SponsorshipState::Unconfirmed(new_sponsor);
+ target_collection.save()
+ }
+
+ /// # Permissions
+ ///
+ /// * Sponsor.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ #[weight = <SelfWeightOf<T>>::confirm_sponsorship()]
+ #[transactional]
+ pub fn confirm_sponsorship(origin, collection_id: CollectionId) -> DispatchResult {
+ let sender = ensure_signed(origin)?;
+
+ let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
+ ensure!(
+ target_collection.sponsorship.pending_sponsor() == Some(&sender),
+ Error::<T>::ConfirmUnsetSponsorFail
+ );
+
+ target_collection.sponsorship = SponsorshipState::Confirmed(sender);
+ target_collection.save()
+ }
+
+ /// Switch back to pay-per-own-transaction model.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection owner.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ #[weight = <SelfWeightOf<T>>::remove_collection_sponsor()]
+ #[transactional]
+ pub fn remove_collection_sponsor(origin, collection_id: CollectionId) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+
+ let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
+ target_collection.check_is_owner(&sender)?;
+
+ target_collection.sponsorship = SponsorshipState::Disabled;
+ target_collection.save()
+ }
+
+ /// This method creates a concrete instance of NFT Collection created with CreateCollection method.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ /// * Collection Admin.
+ /// * Anyone if
+ /// * Allow List is enabled, and
+ /// * Address is added to allow list, and
+ /// * MintPermission is enabled (see SetMintPermission method)
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: ID of the collection.
+ ///
+ /// * owner: Address, initial owner of the NFT.
+ ///
+ /// * data: Token data to store on chain.
+ #[weight = <CommonWeights<T>>::create_item()]
+ #[transactional]
+ pub fn create_item(origin, collection_id: CollectionId, owner: T::CrossAccountId, data: CreateItemData) -> DispatchResultWithPostInfo {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+
+ dispatch_call::<T, _>(collection_id, |d| d.create_item(sender, owner, data))
+ }
+
+ /// This method creates multiple items in a collection created with CreateCollection method.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ /// * Collection Admin.
+ /// * Anyone if
+ /// * Allow List is enabled, and
+ /// * Address is added to allow list, and
+ /// * MintPermission is enabled (see SetMintPermission method)
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: ID of the collection.
+ ///
+ /// * itemsData: Array items properties. Each property is an array of bytes itself, see [create_item].
+ ///
+ /// * owner: Address, initial owner of the NFT.
+ #[weight = <CommonWeights<T>>::create_multiple_items(items_data.len() as u32)]
+ #[transactional]
+ pub fn create_multiple_items(origin, collection_id: CollectionId, owner: T::CrossAccountId, items_data: Vec<CreateItemData>) -> DispatchResultWithPostInfo {
+ ensure!(!items_data.is_empty(), Error::<T>::EmptyArgument);
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+
+ dispatch_call::<T, _>(collection_id, |d| d.create_multiple_items(sender, owner, items_data))
+ }
+
+ // TODO! transaction weight
+
+ /// Set transfers_enabled value for particular collection
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: ID of the collection.
+ ///
+ /// * value: New flag value.
+ #[weight = <SelfWeightOf<T>>::set_transfers_enabled_flag()]
+ #[transactional]
+ pub fn set_transfers_enabled_flag(origin, collection_id: CollectionId, value: bool) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
+ target_collection.check_is_owner(&sender)?;
+
+ // =========
+
+ target_collection.limits.transfers_enabled = Some(value);
+ target_collection.save()
+ }
+
+ /// Destroys a concrete instance of NFT.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ /// * Collection Admin.
+ /// * Current NFT Owner.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: ID of the collection.
+ ///
+ /// * item_id: ID of NFT to burn.
+ #[weight = <CommonWeights<T>>::burn_item()]
+ #[transactional]
+ pub fn burn_item(origin, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+
+ let post_info = dispatch_call::<T, _>(collection_id, |d| d.burn_item(sender, item_id, value))?;
+ if value == 1 {
+ <NftTransferBasket<T>>::remove(collection_id, item_id);
+ <NftApproveBasket<T>>::remove(collection_id, item_id);
+ }
+ // Those maps should be cleared only if token disappears completly, need to move this part of logic to pallets?
+ // <FungibleApproveBasket<T>>::remove(collection_id, sender.as_sub());
+ // <RefungibleApproveBasket<T>>::remove((collection_id, item_id, sender.as_sub()));
+ Ok(post_info)
+ }
+
+ /// Destroys a concrete instance of NFT on behalf of the owner
+ /// See also: [`approve`]
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ /// * Collection Admin.
+ /// * Current NFT Owner.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: ID of the collection.
+ ///
+ /// * item_id: ID of NFT to burn.
+ ///
+ /// * from: owner of item
+ #[weight = <CommonWeights<T>>::burn_from()]
+ #[transactional]
+ pub fn burn_from(origin, collection_id: CollectionId, from: T::CrossAccountId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+
+ dispatch_call::<T, _>(collection_id, |d| d.burn_from(sender, from, item_id, value))
+ }
+
+ /// Change ownership of the token.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ /// * Current NFT owner
+ ///
+ /// # Arguments
+ ///
+ /// * recipient: Address of token recipient.
+ ///
+ /// * collection_id.
+ ///
+ /// * item_id: ID of the item
+ /// * Non-Fungible Mode: Required.
+ /// * Fungible Mode: Ignored.
+ /// * Re-Fungible Mode: Required.
+ ///
+ /// * value: Amount to transfer.
+ /// * Non-Fungible Mode: Ignored
+ /// * Fungible Mode: Must specify transferred amount
+ /// * Re-Fungible Mode: Must specify transferred portion (between 0 and 1)
+ #[weight = <CommonWeights<T>>::transfer()]
+ #[transactional]
+ pub fn transfer(origin, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResultWithPostInfo {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+
+ dispatch_call::<T, _>(collection_id, |d| d.transfer(sender, recipient, item_id, value))
+ }
+
+ /// Set, change, or remove approved address to transfer the ownership of the NFT.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ /// * Current NFT owner
+ ///
+ /// # Arguments
+ ///
+ /// * approved: Address that is approved to transfer this NFT or zero (if needed to remove approval).
+ ///
+ /// * collection_id.
+ ///
+ /// * item_id: ID of the item.
+ #[weight = <CommonWeights<T>>::approve()]
+ #[transactional]
+ pub fn approve(origin, spender: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, amount: u128) -> DispatchResultWithPostInfo {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+
+ dispatch_call::<T, _>(collection_id, |d| d.approve(sender, spender, item_id, amount))
+ }
+
+ /// Change ownership of a NFT on behalf of the owner. See Approve method for additional information. After this method executes, the approval is removed so that the approved address will not be able to transfer this NFT again from this owner.
+ ///
+ /// # Permissions
+ /// * Collection Owner
+ /// * Collection Admin
+ /// * Current NFT owner
+ /// * Address approved by current NFT owner
+ ///
+ /// # Arguments
+ ///
+ /// * from: Address that owns token.
+ ///
+ /// * recipient: Address of token recipient.
+ ///
+ /// * collection_id.
+ ///
+ /// * item_id: ID of the item.
+ ///
+ /// * value: Amount to transfer.
+ #[weight = <CommonWeights<T>>::transfer_from()]
+ #[transactional]
+ pub fn transfer_from(origin, from: T::CrossAccountId, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128 ) -> DispatchResultWithPostInfo {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+
+ dispatch_call::<T, _>(collection_id, |d| d.transfer_from(sender, from, recipient, item_id, value))
+ }
+
+ /// Set off-chain data schema.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * schema: String representing the offchain data schema.
+ #[weight = <CommonWeights<T>>::set_variable_metadata(data.len() as u32)]
+ #[transactional]
+ pub fn set_variable_meta_data (
+ origin,
+ collection_id: CollectionId,
+ item_id: TokenId,
+ data: Vec<u8>
+ ) -> DispatchResultWithPostInfo {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+
+ dispatch_call::<T, _>(collection_id, |d| d.set_variable_metadata(sender, item_id, data))
+ }
+
+ /// Set meta_update_permission value for particular collection
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: ID of the collection.
+ ///
+ /// * value: New flag value.
+ #[weight = <SelfWeightOf<T>>::set_meta_update_permission_flag()]
+ #[transactional]
+ pub fn set_meta_update_permission_flag(origin, collection_id: CollectionId, value: MetaUpdatePermission) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
+
+ ensure!(
+ target_collection.meta_update_permission != MetaUpdatePermission::None,
+ <CommonError<T>>::MetadataFlagFrozen,
+ );
+ target_collection.check_is_owner(&sender)?;
+
+ target_collection.meta_update_permission = value;
+
+ target_collection.save()
+ }
+
+ /// Set schema standard
+ /// ImageURL
+ /// Unique
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * schema: SchemaVersion: enum
+ #[weight = <SelfWeightOf<T>>::set_schema_version()]
+ #[transactional]
+ pub fn set_schema_version(
+ origin,
+ collection_id: CollectionId,
+ version: SchemaVersion
+ ) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
+ target_collection.check_is_owner_or_admin(&sender)?;
+ target_collection.schema_version = version;
+ target_collection.save()
+ }
+
+ /// Set off-chain data schema.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * schema: String representing the offchain data schema.
+ #[weight = <SelfWeightOf<T>>::set_offchain_schema(schema.len() as u32)]
+ #[transactional]
+ pub fn set_offchain_schema(
+ origin,
+ collection_id: CollectionId,
+ schema: Vec<u8>
+ ) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
+ target_collection.check_is_owner_or_admin(&sender)?;
+
+ // check schema limit
+ ensure!(schema.len() as u32 <= OFFCHAIN_SCHEMA_LIMIT, "");
+
+ target_collection.offchain_schema = schema;
+ target_collection.save()
+ }
+
+ /// Set const on-chain data schema.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * schema: String representing the const on-chain data schema.
+ #[weight = <SelfWeightOf<T>>::set_const_on_chain_schema(schema.len() as u32)]
+ #[transactional]
+ pub fn set_const_on_chain_schema (
+ origin,
+ collection_id: CollectionId,
+ schema: Vec<u8>
+ ) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
+ target_collection.check_is_owner_or_admin(&sender)?;
+
+ // check schema limit
+ ensure!(schema.len() as u32 <= CONST_ON_CHAIN_SCHEMA_LIMIT, "");
+
+ target_collection.const_on_chain_schema = schema;
+ target_collection.save()
+ }
+
+ /// Set variable on-chain data schema.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * schema: String representing the variable on-chain data schema.
+ #[weight = <SelfWeightOf<T>>::set_const_on_chain_schema(schema.len() as u32)]
+ #[transactional]
+ pub fn set_variable_on_chain_schema (
+ origin,
+ collection_id: CollectionId,
+ schema: Vec<u8>
+ ) -> DispatchResult {
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
+ target_collection.check_is_owner_or_admin(&sender)?;
+
+ // check schema limit
+ ensure!(schema.len() as u32 <= VARIABLE_ON_CHAIN_SCHEMA_LIMIT, "");
+
+ target_collection.variable_on_chain_schema = schema;
+ target_collection.save()
+ }
+
+ #[weight = <SelfWeightOf<T>>::set_collection_limits()]
+ #[transactional]
+ pub fn set_collection_limits(
+ origin,
+ collection_id: CollectionId,
+ new_limit: CollectionLimits,
+ ) -> DispatchResult {
+ let mut new_limit = new_limit;
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let mut target_collection = <CollectionHandle<T>>::try_get(collection_id)?;
+ target_collection.check_is_owner(&sender)?;
+ let old_limit = &target_collection.limits;
+
+ macro_rules! limit_default {
+ ($old:ident, $new:ident, $($field:ident $(($arg:expr))? => $check:expr),* $(,)?) => {{
+ $(
+ if let Some($new) = $new.$field {
+ let $old = $old.$field($($arg)?);
+ let _ = $new;
+ let _ = $old;
+ $check
+ } else {
+ $new.$field = $old.$field
+ }
+ )*
+ }};
+ }
+
+ limit_default!(old_limit, new_limit,
+ account_token_ownership_limit => ensure!(
+ new_limit <= MAX_TOKEN_OWNERSHIP,
+ <Error<T>>::CollectionLimitBoundsExceeded,
+ ),
+ sponsor_transfer_timeout(match target_collection.mode {
+ CollectionMode::NFT => NFT_SPONSOR_TRANSFER_TIMEOUT,
+ CollectionMode::Fungible(_) => FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
+ CollectionMode::ReFungible => REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
+ }) => ensure!(
+ new_limit <= MAX_SPONSOR_TIMEOUT,
+ <Error<T>>::CollectionLimitBoundsExceeded,
+ ),
+ sponsored_data_size => ensure!(
+ new_limit <= CUSTOM_DATA_LIMIT,
+ <Error<T>>::CollectionLimitBoundsExceeded,
+ ),
+ token_limit => ensure!(
+ old_limit >= new_limit && new_limit > 0,
+ <CommonError<T>>::CollectionTokenLimitExceeded
+ ),
+ owner_can_transfer => ensure!(
+ old_limit || !new_limit,
+ <Error<T>>::OwnerPermissionsCantBeReverted,
+ ),
+ owner_can_destroy => ensure!(
+ old_limit || !new_limit,
+ <Error<T>>::OwnerPermissionsCantBeReverted,
+ ),
+ sponsored_data_rate_limit => {},
+ transfers_enabled => {},
+ );
+
+ target_collection.limits = new_limit;
+
+ target_collection.save()
+ }
+ }
+}
pallets/unique/src/mock.rsdiffbeforeafterboth--- /dev/null
+++ b/pallets/unique/src/mock.rs
@@ -0,0 +1,204 @@
+#![allow(clippy::from_over_into)]
+
+use crate as pallet_template;
+use sp_core::H256;
+use frame_support::{parameter_types, traits::Everything, weights::IdentityFee};
+use sp_runtime::{
+ traits::{BlakeTwo256, IdentityLookup},
+ testing::Header,
+};
+use pallet_transaction_payment::{CurrencyAdapter};
+use frame_system as system;
+use pallet_evm::AddressMapping;
+use pallet_common::account::{EvmBackwardsAddressMapping, CrossAccountId};
+use codec::{Encode, Decode};
+use scale_info::TypeInfo;
+
+type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;
+type Block = frame_system::mocking::MockBlock<Test>;
+
+// Configure a mock runtime to test the pallet.
+frame_support::construct_runtime!(
+ pub enum Test where
+ Block = Block,
+ NodeBlock = Block,
+ UncheckedExtrinsic = UncheckedExtrinsic,
+ {
+ System: frame_system::{Pallet, Call, Config, Storage, Event<T>},
+ TemplateModule: pallet_template::{Pallet, Call, Storage},
+ Balances: pallet_balances::{Pallet, Call, Storage},
+ Common: pallet_common::{Pallet, Storage, Event<T>},
+ Fungible: pallet_fungible::{Pallet, Storage},
+ Refungible: pallet_refungible::{Pallet, Storage},
+ Nonfungible: pallet_nonfungible::{Pallet, Storage},
+ }
+);
+
+parameter_types! {
+ pub const BlockHashCount: u64 = 250;
+ pub const SS58Prefix: u8 = 42;
+}
+
+impl system::Config for Test {
+ type BaseCallFilter = Everything;
+ type BlockWeights = ();
+ type BlockLength = ();
+ type DbWeight = ();
+ type Origin = Origin;
+ type Call = Call;
+ type Index = u64;
+ type BlockNumber = u64;
+ type Hash = H256;
+ type Hashing = BlakeTwo256;
+ type AccountId = u64;
+ type Lookup = IdentityLookup<Self::AccountId>;
+ type Header = Header;
+ type Event = ();
+ type BlockHashCount = BlockHashCount;
+ type Version = ();
+ type PalletInfo = PalletInfo;
+ type AccountData = pallet_balances::AccountData<u64>;
+ type OnNewAccount = ();
+ type OnKilledAccount = ();
+ type SystemWeightInfo = ();
+ type SS58Prefix = SS58Prefix;
+ type OnSetCode = ();
+}
+
+parameter_types! {
+ pub const ExistentialDeposit: u64 = 1;
+ pub const MaxLocks: u32 = 50;
+}
+//frame_system::Module<Test>;
+impl pallet_balances::Config for Test {
+ type AccountStore = System;
+ type Balance = u64;
+ type DustRemoval = ();
+ type Event = ();
+ type ExistentialDeposit = ExistentialDeposit;
+ type WeightInfo = ();
+ type MaxLocks = MaxLocks;
+ type MaxReserves = ();
+ type ReserveIdentifier = [u8; 8];
+}
+
+parameter_types! {
+ pub const TransactionByteFee: u64 = 1;
+ pub const OperationalFeeMultiplier: u8 = 5;
+}
+
+impl pallet_transaction_payment::Config for Test {
+ type OnChargeTransaction = CurrencyAdapter<pallet_balances::Pallet<Test>, ()>;
+ type TransactionByteFee = TransactionByteFee;
+ type WeightToFee = IdentityFee<u64>;
+ type FeeMultiplierUpdate = ();
+ type OperationalFeeMultiplier = OperationalFeeMultiplier;
+}
+
+parameter_types! {
+ pub const MinimumPeriod: u64 = 1;
+}
+impl pallet_timestamp::Config for Test {
+ type Moment = u64;
+ type OnTimestampSet = ();
+ type MinimumPeriod = MinimumPeriod;
+ type WeightInfo = ();
+}
+
+parameter_types! {
+ pub const CollectionCreationPrice: u32 = 0;
+ pub TreasuryAccountId: u64 = 1234;
+ pub EthereumChainId: u32 = 1111;
+}
+
+pub struct TestEvmAddressMapping;
+impl AddressMapping<u64> for TestEvmAddressMapping {
+ fn into_account_id(_addr: sp_core::H160) -> u64 {
+ unimplemented!()
+ }
+}
+
+pub struct TestEvmBackwardsAddressMapping;
+impl EvmBackwardsAddressMapping<u64> for TestEvmBackwardsAddressMapping {
+ fn from_account_id(_account_id: u64) -> sp_core::H160 {
+ unimplemented!()
+ }
+}
+
+#[derive(Encode, Decode, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, TypeInfo)]
+pub struct TestCrossAccountId(u64, sp_core::H160);
+impl CrossAccountId<u64> for TestCrossAccountId {
+ fn as_sub(&self) -> &u64 {
+ &self.0
+ }
+ fn as_eth(&self) -> &sp_core::H160 {
+ &self.1
+ }
+ fn from_sub(sub: u64) -> Self {
+ let mut eth = [0; 20];
+ eth[12..20].copy_from_slice(&sub.to_be_bytes());
+ Self(sub, sp_core::H160(eth))
+ }
+ fn from_eth(eth: sp_core::H160) -> Self {
+ let mut sub_raw = [0; 8];
+ sub_raw.copy_from_slice(ð.0[0..8]);
+ let sub = u64::from_be_bytes(sub_raw);
+ Self(sub, eth)
+ }
+ fn conv_eq(&self, other: &Self) -> bool {
+ self.as_sub() == other.as_sub()
+ }
+}
+
+impl Default for TestCrossAccountId {
+ fn default() -> Self {
+ Self::from_sub(0)
+ }
+}
+
+pub struct TestEtheremTransactionSender;
+impl pallet_ethereum::EthereumTransactionSender for TestEtheremTransactionSender {
+ fn submit_logs_transaction(
+ _tx: pallet_ethereum::Transaction,
+ _logs: Vec<pallet_ethereum::Log>,
+ ) -> Result<(), sp_runtime::DispatchError> {
+ Ok(())
+ }
+}
+
+impl pallet_evm_coder_substrate::Config for Test {
+ type EthereumTransactionSender = TestEtheremTransactionSender;
+}
+
+impl pallet_common::Config for Test {
+ type Event = ();
+ type EvmBackwardsAddressMapping = TestEvmBackwardsAddressMapping;
+ type EvmAddressMapping = TestEvmAddressMapping;
+ type CrossAccountId = TestCrossAccountId;
+
+ type Currency = Balances;
+ type CollectionCreationPrice = CollectionCreationPrice;
+ type TreasuryAccountId = TreasuryAccountId;
+}
+
+impl pallet_fungible::Config for Test {
+ type WeightInfo = ();
+}
+impl pallet_refungible::Config for Test {
+ type WeightInfo = ();
+}
+impl pallet_nonfungible::Config for Test {
+ type WeightInfo = ();
+}
+
+impl pallet_template::Config for Test {
+ type WeightInfo = ();
+}
+
+// Build genesis storage according to the mock runtime.
+pub fn new_test_ext() -> sp_io::TestExternalities {
+ system::GenesisConfig::default()
+ .build_storage::<Test>()
+ .unwrap()
+ .into()
+}
pallets/unique/src/sponsorship.rsdiffbeforeafterboth--- /dev/null
+++ b/pallets/unique/src/sponsorship.rs
@@ -0,0 +1,282 @@
+use crate::{
+ Config, Call, CreateItemBasket, VariableMetaDataBasket, ReFungibleTransferBasket,
+ FungibleTransferBasket, NftTransferBasket, CreateItemData, CollectionMode, NftApproveBasket,
+ FungibleApproveBasket, RefungibleApproveBasket,
+};
+use core::marker::PhantomData;
+use up_sponsorship::SponsorshipHandler;
+use frame_support::{
+ traits::{IsSubType},
+ storage::{StorageMap, StorageDoubleMap, StorageNMap},
+};
+use up_data_structs::{
+ CollectionId, FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT, MetaUpdatePermission,
+ NFT_SPONSOR_TRANSFER_TIMEOUT, REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT, TokenId,
+};
+use pallet_common::{CollectionHandle};
+use pallet_common::account::CrossAccountId;
+
+pub fn withdraw_transfer<T: Config>(
+ collection: &CollectionHandle<T>,
+ who: &T::CrossAccountId,
+ item_id: &TokenId,
+) -> Option<()> {
+ // preliminary sponsoring correctness check
+ match collection.mode {
+ CollectionMode::NFT => {
+ let owner = pallet_nonfungible::TokenData::<T>::get((collection.id, item_id))?.owner;
+ if !owner.conv_eq(who) {
+ return None;
+ }
+ }
+ CollectionMode::Fungible(_) => {
+ if item_id != &TokenId::default() {
+ return None;
+ }
+ if <pallet_fungible::Balance<T>>::get((collection.id, who)) == 0 {
+ return None;
+ }
+ }
+ CollectionMode::ReFungible => {
+ if !<pallet_refungible::Owned<T>>::get((collection.id, who, item_id)) {
+ return None;
+ }
+ }
+ }
+
+ // sponsor timeout
+ let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
+ let limit = collection
+ .limits
+ .sponsor_transfer_timeout(match collection.mode {
+ CollectionMode::NFT => NFT_SPONSOR_TRANSFER_TIMEOUT,
+ CollectionMode::Fungible(_) => FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
+ CollectionMode::ReFungible => REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
+ });
+
+ let last_tx_block = match collection.mode {
+ CollectionMode::NFT => <NftTransferBasket<T>>::get(collection.id, item_id),
+ CollectionMode::Fungible(_) => {
+ <FungibleTransferBasket<T>>::get(collection.id, who.as_sub())
+ }
+ CollectionMode::ReFungible => {
+ <ReFungibleTransferBasket<T>>::get((collection.id, item_id, who.as_sub()))
+ }
+ };
+
+ if let Some(last_tx_block) = last_tx_block {
+ let timeout = last_tx_block + limit.into();
+ if block_number < timeout {
+ return None;
+ }
+ }
+
+ match collection.mode {
+ CollectionMode::NFT => <NftTransferBasket<T>>::insert(collection.id, item_id, block_number),
+ CollectionMode::Fungible(_) => {
+ <FungibleTransferBasket<T>>::insert(collection.id, who.as_sub(), block_number)
+ }
+ CollectionMode::ReFungible => <ReFungibleTransferBasket<T>>::insert(
+ (collection.id, item_id, who.as_sub()),
+ block_number,
+ ),
+ };
+
+ Some(())
+}
+
+pub fn withdraw_create_item<T: Config>(
+ collection: &CollectionHandle<T>,
+ who: &T::AccountId,
+ _properties: &CreateItemData,
+) -> Option<()> {
+ if _properties.data_size() as u32 > collection.limits.sponsored_data_size() {
+ return None;
+ }
+
+ // sponsor timeout
+ let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
+ let limit = collection
+ .limits
+ .sponsor_transfer_timeout(match _properties {
+ CreateItemData::NFT(_) => NFT_SPONSOR_TRANSFER_TIMEOUT,
+ CreateItemData::Fungible(_) => FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
+ CreateItemData::ReFungible(_) => REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
+ });
+
+ if let Some(last_tx_block) = <CreateItemBasket<T>>::get((collection.id, &who)) {
+ let timeout = last_tx_block + limit.into();
+ if block_number < timeout {
+ return None;
+ }
+ }
+
+ CreateItemBasket::<T>::insert((collection.id, who.clone()), block_number);
+
+ Some(())
+}
+
+pub fn withdraw_set_variable_meta_data<T: Config>(
+ who: &T::CrossAccountId,
+ collection: &CollectionHandle<T>,
+ item_id: &TokenId,
+ data: &[u8],
+) -> Option<()> {
+ // TODO: make it work for admins
+ if collection.meta_update_permission != MetaUpdatePermission::ItemOwner {
+ return None;
+ }
+ // preliminary sponsoring correctness check
+ match collection.mode {
+ CollectionMode::NFT => {
+ let owner = pallet_nonfungible::TokenData::<T>::get((collection.id, item_id))?.owner;
+ if !owner.conv_eq(who) {
+ return None;
+ }
+ }
+ CollectionMode::Fungible(_) => {
+ if item_id != &TokenId::default() {
+ return None;
+ }
+ if <pallet_fungible::Balance<T>>::get((collection.id, who)) == 0 {
+ return None;
+ }
+ }
+ CollectionMode::ReFungible => {
+ if !<pallet_refungible::Owned<T>>::get((collection.id, who, item_id)) {
+ return None;
+ }
+ }
+ }
+
+ // Can't sponsor fungible collection, this tx will be rejected
+ // as invalid
+ if matches!(collection.mode, CollectionMode::Fungible(_)) {
+ return None;
+ }
+ if data.len() > collection.limits.sponsored_data_size() as usize {
+ return None;
+ }
+
+ let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
+ let limit = collection.limits.sponsored_data_rate_limit()?;
+
+ if let Some(last_tx_block) = VariableMetaDataBasket::<T>::get(collection.id, item_id) {
+ let timeout = last_tx_block + limit.into();
+ if block_number < timeout {
+ return None;
+ }
+ }
+
+ <VariableMetaDataBasket<T>>::insert(collection.id, item_id, block_number);
+
+ Some(())
+}
+
+pub fn withdraw_approve<T: Config>(
+ collection: &CollectionHandle<T>,
+ who: &T::AccountId,
+ item_id: &TokenId,
+) -> Option<()> {
+ // sponsor timeout
+ let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
+ let limit = collection.limits.sponsor_approve_timeout();
+
+ let last_tx_block = match collection.mode {
+ CollectionMode::NFT => <NftApproveBasket<T>>::get(collection.id, item_id),
+ CollectionMode::Fungible(_) => <FungibleApproveBasket<T>>::get(collection.id, who),
+ CollectionMode::ReFungible => {
+ <RefungibleApproveBasket<T>>::get((collection.id, item_id, who))
+ }
+ };
+
+ if let Some(last_tx_block) = last_tx_block {
+ let timeout = last_tx_block + limit.into();
+ if block_number < timeout {
+ return None;
+ }
+ }
+
+ match collection.mode {
+ CollectionMode::NFT => <NftApproveBasket<T>>::insert(collection.id, item_id, block_number),
+ CollectionMode::Fungible(_) => {
+ <FungibleApproveBasket<T>>::insert(collection.id, who, block_number)
+ }
+ CollectionMode::ReFungible => {
+ <RefungibleApproveBasket<T>>::insert((collection.id, item_id, who), block_number)
+ }
+ };
+
+ Some(())
+}
+
+fn load<T: Config>(id: CollectionId) -> Option<(T::AccountId, CollectionHandle<T>)> {
+ let collection = CollectionHandle::new(id)?;
+ let sponsor = collection.sponsorship.sponsor().cloned()?;
+ Some((sponsor, collection))
+}
+
+pub struct UniqueSponsorshipHandler<T>(PhantomData<T>);
+impl<T, C> SponsorshipHandler<T::AccountId, C> for UniqueSponsorshipHandler<T>
+where
+ T: Config,
+ C: IsSubType<Call<T>>,
+{
+ fn get_sponsor(who: &T::AccountId, call: &C) -> Option<T::AccountId> {
+ match IsSubType::<Call<T>>::is_sub_type(call)? {
+ Call::create_item {
+ collection_id,
+ data,
+ ..
+ } => {
+ let (sponsor, collection) = load(*collection_id)?;
+ withdraw_create_item::<T>(&collection, who, data).map(|()| sponsor)
+ }
+ Call::transfer {
+ collection_id,
+ item_id,
+ ..
+ } => {
+ let (sponsor, collection) = load(*collection_id)?;
+ withdraw_transfer::<T>(
+ &collection,
+ &T::CrossAccountId::from_sub(who.clone()),
+ item_id,
+ )
+ .map(|()| sponsor)
+ }
+ Call::transfer_from {
+ collection_id,
+ item_id,
+ from,
+ ..
+ } => {
+ let (sponsor, collection) = load(*collection_id)?;
+ withdraw_transfer::<T>(&collection, from, item_id).map(|()| sponsor)
+ }
+ Call::approve {
+ collection_id,
+ item_id,
+ ..
+ } => {
+ let (sponsor, collection) = load(*collection_id)?;
+ withdraw_approve::<T>(&collection, who, item_id).map(|()| sponsor)
+ }
+ Call::set_variable_meta_data {
+ collection_id,
+ item_id,
+ data,
+ } => {
+ let (sponsor, collection) = load(*collection_id)?;
+ withdraw_set_variable_meta_data::<T>(
+ &T::CrossAccountId::from_sub(who.clone()),
+ &collection,
+ item_id,
+ data,
+ )
+ .map(|()| sponsor)
+ }
+ _ => None,
+ }
+ }
+}
pallets/unique/src/tests.rsdiffbeforeafterboth1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode};5use up_data_structs::{6 COLLECTION_NUMBER_LIMIT, CollectionId, CreateItemData, CreateFungibleData, CreateNftData,7 CreateReFungibleData, MAX_DECIMAL_POINTS, COLLECTION_ADMINS_LIMIT, MetaUpdatePermission,8 TokenId,9};10use frame_support::{assert_noop, assert_ok};11use sp_std::convert::TryInto;1213fn default_nft_data() -> CreateNftData {14 CreateNftData {15 const_data: vec![1, 2, 3].try_into().unwrap(),16 variable_data: vec![3, 2, 1].try_into().unwrap(),17 }18}1920fn default_fungible_data() -> CreateFungibleData {21 CreateFungibleData { value: 5 }22}2324fn default_re_fungible_data() -> CreateReFungibleData {25 CreateReFungibleData {26 const_data: vec![1, 2, 3].try_into().unwrap(),27 variable_data: vec![3, 2, 1].try_into().unwrap(),28 pieces: 1023,29 }30}3132fn create_test_collection_for_owner(33 mode: &CollectionMode,34 owner: u64,35 id: CollectionId,36) -> CollectionId {37 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();38 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();39 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4041 let origin1 = Origin::signed(owner);42 assert_ok!(TemplateModule::create_collection(43 origin1,44 col_name1,45 col_desc1,46 token_prefix1,47 mode.clone()48 ));4950 let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();51 let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();52 let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();53 assert_eq!(54 <pallet_common::CollectionById<Test>>::get(id)55 .unwrap()56 .owner,57 owner58 );59 assert_eq!(60 <pallet_common::CollectionById<Test>>::get(id).unwrap().name,61 saved_col_name62 );63 assert_eq!(64 <pallet_common::CollectionById<Test>>::get(id).unwrap().mode,65 *mode66 );67 assert_eq!(68 <pallet_common::CollectionById<Test>>::get(id)69 .unwrap()70 .description,71 saved_description72 );73 assert_eq!(74 <pallet_common::CollectionById<Test>>::get(id)75 .unwrap()76 .token_prefix,77 saved_prefix78 );79 id80}8182fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {83 create_test_collection_for_owner(&mode, 1, id)84}8586fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {87 let origin1 = Origin::signed(1);88 assert_ok!(TemplateModule::create_item(89 origin1,90 collection_id,91 account(1),92 data.clone()93 ));94}9596fn account(sub: u64) -> TestCrossAccountId {97 TestCrossAccountId::from_sub(sub)98}99100// Use cases tests region101// #region102103#[test]104fn set_version_schema() {105 new_test_ext().execute_with(|| {106 let origin1 = Origin::signed(1);107 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));108109 assert_ok!(TemplateModule::set_schema_version(110 origin1,111 collection_id,112 SchemaVersion::Unique113 ));114 assert_eq!(115 <pallet_common::CollectionById<Test>>::get(collection_id)116 .unwrap()117 .schema_version,118 SchemaVersion::Unique119 );120 });121}122123#[test]124fn create_fungible_collection_fails_with_large_decimal_numbers() {125 new_test_ext().execute_with(|| {126 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();127 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();128 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();129130 let origin1 = Origin::signed(1);131 assert_noop!(132 TemplateModule::create_collection(133 origin1,134 col_name1,135 col_desc1,136 token_prefix1,137 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)138 ),139 Error::<Test>::CollectionDecimalPointLimitExceeded140 );141 });142}143144#[test]145fn create_nft_item() {146 new_test_ext().execute_with(|| {147 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));148149 let data = default_nft_data();150 create_test_item(collection_id, &data.clone().into());151152 let item = <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1)).unwrap();153 assert_eq!(item.const_data, data.const_data.into_inner());154 assert_eq!(item.variable_data, data.variable_data.into_inner());155 });156}157158// Use cases tests region159// #region160#[test]161fn create_nft_multiple_items() {162 new_test_ext().execute_with(|| {163 create_test_collection(&CollectionMode::NFT, CollectionId(1));164165 let origin1 = Origin::signed(1);166167 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];168169 assert_ok!(TemplateModule::create_multiple_items(170 origin1,171 CollectionId(1),172 account(1),173 items_data174 .clone()175 .into_iter()176 .map(|d| { d.into() })177 .collect()178 ));179 for (index, data) in items_data.into_iter().enumerate() {180 let item = <pallet_nonfungible::TokenData<Test>>::get((181 CollectionId(1),182 TokenId((index + 1) as u32),183 ))184 .unwrap();185 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());186 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());187 }188 });189}190191#[test]192fn create_refungible_item() {193 new_test_ext().execute_with(|| {194 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));195196 let data = default_re_fungible_data();197 create_test_item(collection_id, &data.clone().into());198 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));199 let balance =200 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));201 assert_eq!(item.const_data, data.const_data.into_inner());202 assert_eq!(item.variable_data, data.variable_data.into_inner());203 assert_eq!(balance, 1023);204 });205}206207#[test]208fn create_multiple_refungible_items() {209 new_test_ext().execute_with(|| {210 create_test_collection(&CollectionMode::ReFungible, CollectionId(1));211212 let origin1 = Origin::signed(1);213214 let items_data = vec![215 default_re_fungible_data(),216 default_re_fungible_data(),217 default_re_fungible_data(),218 ];219220 assert_ok!(TemplateModule::create_multiple_items(221 origin1,222 CollectionId(1),223 account(1),224 items_data225 .clone()226 .into_iter()227 .map(|d| { d.into() })228 .collect()229 ));230 for (index, data) in items_data.into_iter().enumerate() {231 let item = <pallet_refungible::TokenData<Test>>::get((232 CollectionId(1),233 TokenId((index + 1) as u32),234 ));235 let balance =236 <pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));237 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());238 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());239 assert_eq!(balance, 1023);240 }241 });242}243244#[test]245fn create_fungible_item() {246 new_test_ext().execute_with(|| {247 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));248249 let data = default_fungible_data();250 create_test_item(collection_id, &data.into());251252 assert_eq!(253 <pallet_fungible::Balance<Test>>::get((collection_id, account(1))),254 5255 );256 });257}258259//#[test]260// fn create_multiple_fungible_items() {261// new_test_ext().execute_with(|| {262// default_limits();263264// create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));265266// let origin1 = Origin::signed(1);267268// let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];269270// assert_ok!(TemplateModule::create_multiple_items(271// origin1.clone(),272// 1,273// 1,274// items_data.clone().into_iter().map(|d| { d.into() }).collect()275// ));276277// for (index, _) in items_data.iter().enumerate() {278// assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);279// }280// assert_eq!(TemplateModule::balance_count(1, 1), 3000);281// assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);282// });283// }284285#[test]286fn transfer_fungible_item() {287 new_test_ext().execute_with(|| {288 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));289290 let origin1 = Origin::signed(1);291 let origin2 = Origin::signed(2);292293 let data = default_fungible_data();294 create_test_item(collection_id, &data.into());295296 assert_eq!(297 <pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),298 5299 );300301 // change owner scenario302 assert_ok!(TemplateModule::transfer(303 origin1,304 account(2),305 CollectionId(1),306 TokenId(0),307 5308 ));309 assert_eq!(310 <pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),311 0312 );313314 // split item scenario315 assert_ok!(TemplateModule::transfer(316 origin2.clone(),317 account(3),318 CollectionId(1),319 TokenId(0),320 3321 ));322323 // split item and new owner has account scenario324 assert_ok!(TemplateModule::transfer(325 origin2,326 account(3),327 CollectionId(1),328 TokenId(0),329 1330 ));331 assert_eq!(332 <pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))),333 1334 );335 assert_eq!(336 <pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))),337 4338 );339 });340}341342#[test]343fn transfer_refungible_item() {344 new_test_ext().execute_with(|| {345 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));346347 // Create RFT 1 in 1023 pieces for account 1348 let data = default_re_fungible_data();349 create_test_item(collection_id, &data.clone().into());350 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));351 assert_eq!(item.const_data, data.const_data.into_inner());352 assert_eq!(item.variable_data, data.variable_data.into_inner());353 assert_eq!(354 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),355 1356 );357 assert_eq!(358 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),359 1023360 );361 assert_eq!(362 <pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),363 true364 );365366 // Account 1 transfers all 1023 pieces of RFT 1 to account 2367 let origin1 = Origin::signed(1);368 let origin2 = Origin::signed(2);369 assert_ok!(TemplateModule::transfer(370 origin1,371 account(2),372 CollectionId(1),373 TokenId(1),374 1023375 ));376 assert_eq!(377 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),378 1023379 );380 assert_eq!(381 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),382 0383 );384 assert_eq!(385 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),386 1387 );388 assert_eq!(389 <pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),390 false391 );392 assert_eq!(393 <pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),394 true395 );396397 // Account 2 transfers 500 pieces of RFT 1 to account 3398 assert_ok!(TemplateModule::transfer(399 origin2.clone(),400 account(3),401 CollectionId(1),402 TokenId(1),403 500404 ));405 assert_eq!(406 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),407 523408 );409 assert_eq!(410 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),411 500412 );413 assert_eq!(414 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),415 1416 );417 assert_eq!(418 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),419 1420 );421 assert_eq!(422 <pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),423 true424 );425 assert_eq!(426 <pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),427 true428 );429430 // Account 2 transfers 200 more pieces of RFT 1 to account 3 with pre-existing balance431 assert_ok!(TemplateModule::transfer(432 origin2,433 account(3),434 CollectionId(1),435 TokenId(1),436 200437 ));438 assert_eq!(439 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),440 323441 );442 assert_eq!(443 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),444 700445 );446 assert_eq!(447 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),448 1449 );450 assert_eq!(451 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),452 1453 );454 assert_eq!(455 <pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),456 true457 );458 assert_eq!(459 <pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),460 true461 );462 });463}464465#[test]466fn transfer_nft_item() {467 new_test_ext().execute_with(|| {468 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));469470 let data = default_nft_data();471 create_test_item(collection_id, &data.into());472 assert_eq!(473 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),474 1475 );476 assert_eq!(477 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),478 true479 );480481 let origin1 = Origin::signed(1);482 // default scenario483 assert_ok!(TemplateModule::transfer(484 origin1,485 account(2),486 CollectionId(1),487 TokenId(1),488 1489 ));490 assert_eq!(491 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),492 0493 );494 assert_eq!(495 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),496 1497 );498 assert_eq!(499 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),500 false501 );502 assert_eq!(503 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),504 true505 );506 });507}508509#[test]510fn transfer_nft_item_wrong_value() {511 new_test_ext().execute_with(|| {512 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));513514 let data = default_nft_data();515 create_test_item(collection_id, &data.into());516 assert_eq!(517 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),518 1519 );520 assert_eq!(521 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),522 true523 );524525 let origin1 = Origin::signed(1);526527 assert_noop!(528 TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 2)529 .map_err(|e| e.error),530 <pallet_nonfungible::Error::<Test>>::NonfungibleItemsHaveNoAmount531 );532 });533}534535#[test]536fn transfer_nft_item_zero_value() {537 new_test_ext().execute_with(|| {538 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));539540 let data = default_nft_data();541 create_test_item(collection_id, &data.into());542 assert_eq!(543 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),544 1545 );546 assert_eq!(547 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),548 true549 );550551 let origin1 = Origin::signed(1);552553 // Transferring 0 amount works on NFT...554 assert_ok!(TemplateModule::transfer(555 origin1,556 account(2),557 CollectionId(1),558 TokenId(1),559 0560 ));561 // ... and results in no transfer562 assert_eq!(563 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),564 1565 );566 assert_eq!(567 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),568 true569 );570 });571}572573#[test]574fn nft_approve_and_transfer_from() {575 new_test_ext().execute_with(|| {576 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));577578 let data = default_nft_data();579 create_test_item(collection_id, &data.into());580581 let origin1 = Origin::signed(1);582 let origin2 = Origin::signed(2);583584 assert_eq!(585 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),586 1587 );588 assert_eq!(589 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),590 true591 );592593 // neg transfer_from594 assert_noop!(595 TemplateModule::transfer_from(596 origin2.clone(),597 account(1),598 account(2),599 CollectionId(1),600 TokenId(1),601 1602 )603 .map_err(|e| e.error),604 CommonError::<Test>::TokenValueNotEnough605 );606607 // do approve608 assert_ok!(TemplateModule::approve(609 origin1,610 account(2),611 CollectionId(1),612 TokenId(1),613 1614 ));615 assert_eq!(616 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),617 account(2)618 );619620 assert_ok!(TemplateModule::transfer_from(621 origin2,622 account(1),623 account(3),624 CollectionId(1),625 TokenId(1),626 1627 ));628 assert!(629 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()630 );631 });632}633634#[test]635fn nft_approve_and_transfer_from_allow_list() {636 new_test_ext().execute_with(|| {637 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));638639 let origin1 = Origin::signed(1);640 let origin2 = Origin::signed(2);641642 // Create NFT 1 for account 1643 let data = default_nft_data();644 create_test_item(collection_id, &data.clone().into());645 assert_eq!(646 &<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))647 .unwrap()648 .const_data,649 &data.const_data.into_inner()650 );651 assert_eq!(652 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),653 1654 );655 assert_eq!(656 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),657 true658 );659660 // Allow allow-list users to mint and add accounts 1, 2, and 3 to allow-list661 assert_ok!(TemplateModule::set_mint_permission(662 origin1.clone(),663 CollectionId(1),664 true665 ));666 assert_ok!(TemplateModule::set_public_access_mode(667 origin1.clone(),668 CollectionId(1),669 AccessMode::AllowList670 ));671 assert_ok!(TemplateModule::add_to_allow_list(672 origin1.clone(),673 CollectionId(1),674 account(1)675 ));676 assert_ok!(TemplateModule::add_to_allow_list(677 origin1.clone(),678 CollectionId(1),679 account(2)680 ));681 assert_ok!(TemplateModule::add_to_allow_list(682 origin1.clone(),683 CollectionId(1),684 account(3)685 ));686687 // Account 1 approves account 2 for NFT 1688 assert_ok!(TemplateModule::approve(689 origin1.clone(),690 account(2),691 CollectionId(1),692 TokenId(1),693 1694 ));695 assert_eq!(696 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),697 account(2)698 );699700 // Account 2 transfers NFT 1 from account 1 to account 3701 assert_ok!(TemplateModule::transfer_from(702 origin2,703 account(1),704 account(3),705 CollectionId(1),706 TokenId(1),707 1708 ));709 assert!(710 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()711 );712 });713}714715#[test]716fn refungible_approve_and_transfer_from() {717 new_test_ext().execute_with(|| {718 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));719720 let origin1 = Origin::signed(1);721 let origin2 = Origin::signed(2);722723 // Create RFT 1 in 1023 pieces for account 1724 let data = default_re_fungible_data();725 create_test_item(collection_id, &data.into());726727 assert_eq!(728 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),729 1730 );731 assert_eq!(732 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),733 1023734 );735 assert_eq!(736 <pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),737 true738 );739740 // Allow public minting, enable allow-list and add accounts 1, 2, 3 to allow-list741 assert_ok!(TemplateModule::set_mint_permission(742 origin1.clone(),743 CollectionId(1),744 true745 ));746 assert_ok!(TemplateModule::set_public_access_mode(747 origin1.clone(),748 CollectionId(1),749 AccessMode::AllowList750 ));751 assert_ok!(TemplateModule::add_to_allow_list(752 origin1.clone(),753 CollectionId(1),754 account(1)755 ));756 assert_ok!(TemplateModule::add_to_allow_list(757 origin1.clone(),758 CollectionId(1),759 account(2)760 ));761 assert_ok!(TemplateModule::add_to_allow_list(762 origin1.clone(),763 CollectionId(1),764 account(3)765 ));766767 // Account 1 approves account 2 for 1023 pieces of RFT 1768 assert_ok!(TemplateModule::approve(769 origin1,770 account(2),771 CollectionId(1),772 TokenId(1),773 1023774 ));775 assert_eq!(776 <pallet_refungible::Allowance<Test>>::get((777 CollectionId(1),778 TokenId(1),779 account(1),780 account(2)781 )),782 1023783 );784785 // Account 2 transfers 100 pieces of RFT 1 from account 1 to account 3786 assert_ok!(TemplateModule::transfer_from(787 origin2,788 account(1),789 account(3),790 CollectionId(1),791 TokenId(1),792 100793 ));794 assert_eq!(795 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),796 1797 );798 assert_eq!(799 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),800 1801 );802 assert_eq!(803 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),804 923805 );806 assert_eq!(807 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),808 100809 );810 assert_eq!(811 <pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),812 true813 );814 assert_eq!(815 <pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),816 true817 );818 assert_eq!(819 <pallet_refungible::Allowance<Test>>::get((820 CollectionId(1),821 TokenId(1),822 account(1),823 account(2)824 )),825 923826 );827 });828}829830#[test]831fn fungible_approve_and_transfer_from() {832 new_test_ext().execute_with(|| {833 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));834835 let data = default_fungible_data();836 create_test_item(collection_id, &data.into());837838 let origin1 = Origin::signed(1);839 let origin2 = Origin::signed(2);840841 assert_ok!(TemplateModule::set_mint_permission(842 origin1.clone(),843 CollectionId(1),844 true845 ));846 assert_ok!(TemplateModule::set_public_access_mode(847 origin1.clone(),848 CollectionId(1),849 AccessMode::AllowList850 ));851 assert_ok!(TemplateModule::add_to_allow_list(852 origin1.clone(),853 CollectionId(1),854 account(1)855 ));856 assert_ok!(TemplateModule::add_to_allow_list(857 origin1.clone(),858 CollectionId(1),859 account(2)860 ));861 assert_ok!(TemplateModule::add_to_allow_list(862 origin1.clone(),863 CollectionId(1),864 account(3)865 ));866867 // do approve868 assert_ok!(TemplateModule::approve(869 origin1.clone(),870 account(2),871 CollectionId(1),872 TokenId(0),873 5874 ));875 assert_eq!(876 <pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),877 5878 );879 assert_ok!(TemplateModule::approve(880 origin1,881 account(3),882 CollectionId(1),883 TokenId(0),884 5885 ));886 assert_eq!(887 <pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),888 5889 );890 assert_eq!(891 <pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))),892 5893 );894895 assert_ok!(TemplateModule::transfer_from(896 origin2.clone(),897 account(1),898 account(3),899 CollectionId(1),900 TokenId(0),901 4902 ));903904 assert_eq!(905 <pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),906 1907 );908909 assert_noop!(910 TemplateModule::transfer_from(911 origin2,912 account(1),913 account(3),914 CollectionId(1),915 TokenId(0),916 4917 )918 .map_err(|e| e.error),919 CommonError::<Test>::TokenValueNotEnough920 );921 });922}923924#[test]925fn change_collection_owner() {926 new_test_ext().execute_with(|| {927 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));928929 let origin1 = Origin::signed(1);930 assert_ok!(TemplateModule::change_collection_owner(931 origin1,932 collection_id,933 2934 ));935 assert_eq!(936 <pallet_common::CollectionById<Test>>::get(collection_id)937 .unwrap()938 .owner,939 2940 );941 });942}943944#[test]945fn destroy_collection() {946 new_test_ext().execute_with(|| {947 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));948949 let origin1 = Origin::signed(1);950 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));951 });952}953954#[test]955fn burn_nft_item() {956 new_test_ext().execute_with(|| {957 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));958959 let origin1 = Origin::signed(1);960961 let data = default_nft_data();962 create_test_item(collection_id, &data.into());963964 // check balance (collection with id = 1, user id = 1)965 assert_eq!(966 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),967 1968 );969970 // burn item971 assert_ok!(TemplateModule::burn_item(972 origin1.clone(),973 collection_id,974 TokenId(1),975 1976 ));977 assert_eq!(978 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),979 0980 );981 });982}983984#[test]985fn burn_same_nft_item_twice() {986 new_test_ext().execute_with(|| {987 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));988989 let origin1 = Origin::signed(1);990991 let data = default_nft_data();992 create_test_item(collection_id, &data.into());993994 // check balance (collection with id = 1, user id = 1)995 assert_eq!(996 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),997 1998 );9991000 // burn item1001 assert_ok!(TemplateModule::burn_item(1002 origin1.clone(),1003 collection_id,1004 TokenId(1),1005 11006 ));10071008 // burn item again1009 assert_noop!(1010 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1).map_err(|e| e.error),1011 CommonError::<Test>::TokenNotFound1012 );10131014 assert_eq!(1015 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1016 01017 );1018 });1019}10201021#[test]1022fn burn_fungible_item() {1023 new_test_ext().execute_with(|| {1024 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));10251026 let origin1 = Origin::signed(1);1027 assert_ok!(TemplateModule::add_collection_admin(1028 origin1.clone(),1029 collection_id,1030 account(2)1031 ));10321033 let data = default_fungible_data();1034 create_test_item(collection_id, &data.into());10351036 // check balance (collection with id = 1, user id = 1)1037 assert_eq!(1038 <pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1039 51040 );10411042 // burn item1043 assert_ok!(TemplateModule::burn_item(1044 origin1.clone(),1045 CollectionId(1),1046 TokenId(0),1047 51048 ));1049 assert_noop!(1050 TemplateModule::burn_item(origin1, CollectionId(1), TokenId(0), 5).map_err(|e| e.error),1051 CommonError::<Test>::TokenValueTooLow1052 );10531054 assert_eq!(1055 <pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1056 01057 );1058 });1059}10601061#[test]1062fn burn_fungible_item_with_token_id() {1063 new_test_ext().execute_with(|| {1064 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));10651066 let origin1 = Origin::signed(1);1067 assert_ok!(TemplateModule::add_collection_admin(1068 origin1.clone(),1069 collection_id,1070 account(2)1071 ));10721073 let data = default_fungible_data();1074 create_test_item(collection_id, &data.into());10751076 // check balance (collection with id = 1, user id = 1)1077 assert_eq!(1078 <pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1079 51080 );10811082 // Try to burn item using Token ID1083 assert_noop!(1084 TemplateModule::burn_item(origin1, CollectionId(1), TokenId(1), 5).map_err(|e| e.error),1085 <pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId1086 );1087 });1088}1089#[test]1090fn burn_refungible_item() {1091 new_test_ext().execute_with(|| {1092 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));1093 let origin1 = Origin::signed(1);10941095 assert_ok!(TemplateModule::set_mint_permission(1096 origin1.clone(),1097 collection_id,1098 true1099 ));1100 assert_ok!(TemplateModule::set_public_access_mode(1101 origin1.clone(),1102 collection_id,1103 AccessMode::AllowList1104 ));1105 assert_ok!(TemplateModule::add_to_allow_list(1106 origin1.clone(),1107 collection_id,1108 account(1)1109 ));11101111 assert_ok!(TemplateModule::add_collection_admin(1112 origin1.clone(),1113 collection_id,1114 account(2)1115 ));11161117 let data = default_re_fungible_data();1118 create_test_item(collection_id, &data.into());11191120 // check balance (collection with id = 1, user id = 2)1121 assert_eq!(1122 <pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),1123 11124 );1125 assert_eq!(1126 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1127 10231128 );11291130 // burn item1131 assert_ok!(TemplateModule::burn_item(1132 origin1.clone(),1133 collection_id,1134 TokenId(1),1135 10231136 ));1137 assert_noop!(1138 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1023)1139 .map_err(|e| e.error),1140 CommonError::<Test>::TokenValueTooLow1141 );11421143 assert_eq!(1144 <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1145 01146 );1147 });1148}11491150#[test]1151fn add_collection_admin() {1152 new_test_ext().execute_with(|| {1153 let collection1_id =1154 create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1155 let origin1 = Origin::signed(1);11561157 // Add collection admins1158 assert_ok!(TemplateModule::add_collection_admin(1159 origin1.clone(),1160 collection1_id,1161 account(2)1162 ));1163 assert_ok!(TemplateModule::add_collection_admin(1164 origin1,1165 collection1_id,1166 account(3)1167 ));11681169 // Owner is not an admin by default1170 assert_eq!(1171 <pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))),1172 false1173 );1174 assert!(<pallet_common::IsAdmin<Test>>::get((1175 CollectionId(1),1176 account(2)1177 )));1178 assert!(<pallet_common::IsAdmin<Test>>::get((1179 CollectionId(1),1180 account(3)1181 )));1182 });1183}11841185#[test]1186fn remove_collection_admin() {1187 new_test_ext().execute_with(|| {1188 let collection1_id =1189 create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1190 let origin1 = Origin::signed(1);1191 let origin2 = Origin::signed(2);11921193 // Add collection admins 2 and 31194 assert_ok!(TemplateModule::add_collection_admin(1195 origin1.clone(),1196 collection1_id,1197 account(2)1198 ));1199 assert_ok!(TemplateModule::add_collection_admin(1200 origin1,1201 collection1_id,1202 account(3)1203 ));12041205 assert!(<pallet_common::IsAdmin<Test>>::get((1206 CollectionId(1),1207 account(2)1208 )));1209 assert!(<pallet_common::IsAdmin<Test>>::get((1210 CollectionId(1),1211 account(3)1212 )));12131214 // remove admin 31215 assert_ok!(TemplateModule::remove_collection_admin(1216 origin2,1217 CollectionId(1),1218 account(3)1219 ));12201221 // 2 is still admin, 3 is not an admin anymore1222 assert!(<pallet_common::IsAdmin<Test>>::get((1223 CollectionId(1),1224 account(2)1225 )));1226 assert_eq!(1227 <pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))),1228 false1229 );1230 });1231}12321233#[test]1234fn balance_of() {1235 new_test_ext().execute_with(|| {1236 let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1237 let fungible_collection_id =1238 create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));1239 let re_fungible_collection_id =1240 create_test_collection(&CollectionMode::ReFungible, CollectionId(3));12411242 // check balance before1243 assert_eq!(1244 <pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1245 01246 );1247 assert_eq!(1248 <pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1249 01250 );1251 assert_eq!(1252 <pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1253 01254 );12551256 let nft_data = default_nft_data();1257 create_test_item(nft_collection_id, &nft_data.into());12581259 let fungible_data = default_fungible_data();1260 create_test_item(fungible_collection_id, &fungible_data.into());12611262 let re_fungible_data = default_re_fungible_data();1263 create_test_item(re_fungible_collection_id, &re_fungible_data.into());12641265 // check balance (collection with id = 1, user id = 1)1266 assert_eq!(1267 <pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1268 11269 );1270 assert_eq!(1271 <pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1272 51273 );1274 assert_eq!(1275 <pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1276 11277 );12781279 assert_eq!(1280 <pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))),1281 true1282 );1283 assert_eq!(1284 <pallet_refungible::Owned<Test>>::get((1285 re_fungible_collection_id,1286 account(1),1287 TokenId(1)1288 )),1289 true1290 );1291 });1292}12931294#[test]1295fn approve() {1296 new_test_ext().execute_with(|| {1297 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12981299 let data = default_nft_data();1300 create_test_item(collection_id, &data.into());13011302 let origin1 = Origin::signed(1);13031304 // approve1305 assert_ok!(TemplateModule::approve(1306 origin1,1307 account(2),1308 CollectionId(1),1309 TokenId(1),1310 11311 ));1312 assert_eq!(1313 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1314 account(2)1315 );1316 });1317}13181319#[test]1320fn transfer_from() {1321 new_test_ext().execute_with(|| {1322 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1323 let origin1 = Origin::signed(1);1324 let origin2 = Origin::signed(2);13251326 let data = default_nft_data();1327 create_test_item(collection_id, &data.into());13281329 // approve1330 assert_ok!(TemplateModule::approve(1331 origin1.clone(),1332 account(2),1333 CollectionId(1),1334 TokenId(1),1335 11336 ));1337 assert_eq!(1338 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1339 account(2)1340 );13411342 assert_ok!(TemplateModule::set_mint_permission(1343 origin1.clone(),1344 CollectionId(1),1345 true1346 ));1347 assert_ok!(TemplateModule::set_public_access_mode(1348 origin1.clone(),1349 CollectionId(1),1350 AccessMode::AllowList1351 ));1352 assert_ok!(TemplateModule::add_to_allow_list(1353 origin1.clone(),1354 CollectionId(1),1355 account(1)1356 ));1357 assert_ok!(TemplateModule::add_to_allow_list(1358 origin1.clone(),1359 CollectionId(1),1360 account(2)1361 ));1362 assert_ok!(TemplateModule::add_to_allow_list(1363 origin1,1364 CollectionId(1),1365 account(3)1366 ));13671368 assert_ok!(TemplateModule::transfer_from(1369 origin2,1370 account(1),1371 account(2),1372 CollectionId(1),1373 TokenId(1),1374 11375 ));13761377 // after transfer1378 assert_eq!(1379 <pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))),1380 01381 );1382 assert_eq!(1383 <pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))),1384 11385 );1386 });1387}13881389// #endregion13901391// Coverage tests region1392// #region13931394#[test]1395fn owner_can_add_address_to_allow_list() {1396 new_test_ext().execute_with(|| {1397 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13981399 let origin1 = Origin::signed(1);1400 assert_ok!(TemplateModule::add_to_allow_list(1401 origin1,1402 collection_id,1403 account(2)1404 ));1405 assert!(<pallet_common::Allowlist<Test>>::get((1406 collection_id,1407 account(2)1408 )));1409 });1410}14111412#[test]1413fn admin_can_add_address_to_allow_list() {1414 new_test_ext().execute_with(|| {1415 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1416 let origin1 = Origin::signed(1);1417 let origin2 = Origin::signed(2);14181419 assert_ok!(TemplateModule::add_collection_admin(1420 origin1,1421 collection_id,1422 account(2)1423 ));1424 assert_ok!(TemplateModule::add_to_allow_list(1425 origin2,1426 collection_id,1427 account(3)1428 ));1429 assert!(<pallet_common::Allowlist<Test>>::get((1430 collection_id,1431 account(3)1432 )));1433 });1434}14351436#[test]1437fn nonprivileged_user_cannot_add_address_to_allow_list() {1438 new_test_ext().execute_with(|| {1439 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14401441 let origin2 = Origin::signed(2);1442 assert_noop!(1443 TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),1444 CommonError::<Test>::NoPermission1445 );1446 });1447}14481449#[test]1450fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1451 new_test_ext().execute_with(|| {1452 let origin1 = Origin::signed(1);14531454 assert_noop!(1455 TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(2)),1456 CommonError::<Test>::CollectionNotFound1457 );1458 });1459}14601461#[test]1462fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1463 new_test_ext().execute_with(|| {1464 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14651466 let origin1 = Origin::signed(1);1467 assert_ok!(TemplateModule::destroy_collection(1468 origin1.clone(),1469 collection_id1470 ));1471 assert_noop!(1472 TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),1473 CommonError::<Test>::CollectionNotFound1474 );1475 });1476}14771478// If address is already added to allow list, nothing happens1479#[test]1480fn address_is_already_added_to_allow_list() {1481 new_test_ext().execute_with(|| {1482 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1483 let origin1 = Origin::signed(1);14841485 assert_ok!(TemplateModule::add_to_allow_list(1486 origin1.clone(),1487 collection_id,1488 account(2)1489 ));1490 assert_ok!(TemplateModule::add_to_allow_list(1491 origin1,1492 collection_id,1493 account(2)1494 ));1495 assert!(<pallet_common::Allowlist<Test>>::get((1496 collection_id,1497 account(2)1498 )));1499 });1500}15011502#[test]1503fn owner_can_remove_address_from_allow_list() {1504 new_test_ext().execute_with(|| {1505 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15061507 let origin1 = Origin::signed(1);1508 assert_ok!(TemplateModule::add_to_allow_list(1509 origin1.clone(),1510 collection_id,1511 account(2)1512 ));1513 assert_ok!(TemplateModule::remove_from_allow_list(1514 origin1,1515 collection_id,1516 account(2)1517 ));1518 assert_eq!(1519 <pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1520 false1521 );1522 });1523}15241525#[test]1526fn admin_can_remove_address_from_allow_list() {1527 new_test_ext().execute_with(|| {1528 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1529 let origin1 = Origin::signed(1);1530 let origin2 = Origin::signed(2);15311532 // Owner adds admin1533 assert_ok!(TemplateModule::add_collection_admin(1534 origin1.clone(),1535 collection_id,1536 account(2)1537 ));15381539 // Owner adds address 3 to allow list1540 assert_ok!(TemplateModule::add_to_allow_list(1541 origin1,1542 collection_id,1543 account(3)1544 ));15451546 // Admin removes address 3 from allow list1547 assert_ok!(TemplateModule::remove_from_allow_list(1548 origin2,1549 collection_id,1550 account(3)1551 ));1552 assert_eq!(1553 <pallet_common::Allowlist<Test>>::get((collection_id, account(3))),1554 false1555 );1556 });1557}15581559#[test]1560fn nonprivileged_user_cannot_remove_address_from_allow_list() {1561 new_test_ext().execute_with(|| {1562 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1563 let origin1 = Origin::signed(1);1564 let origin2 = Origin::signed(2);15651566 assert_ok!(TemplateModule::add_to_allow_list(1567 origin1,1568 collection_id,1569 account(2)1570 ));1571 assert_noop!(1572 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1573 CommonError::<Test>::NoPermission1574 );1575 assert!(<pallet_common::Allowlist<Test>>::get((1576 collection_id,1577 account(2)1578 )));1579 });1580}15811582#[test]1583fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1584 new_test_ext().execute_with(|| {1585 let origin1 = Origin::signed(1);15861587 assert_noop!(1588 TemplateModule::remove_from_allow_list(origin1, CollectionId(1), account(2)),1589 CommonError::<Test>::CollectionNotFound1590 );1591 });1592}15931594#[test]1595fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1596 new_test_ext().execute_with(|| {1597 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1598 let origin1 = Origin::signed(1);1599 let origin2 = Origin::signed(2);16001601 // Add account 2 to allow list1602 assert_ok!(TemplateModule::add_to_allow_list(1603 origin1.clone(),1604 collection_id,1605 account(2)1606 ));16071608 // Account 2 is in collection allow-list1609 assert!(<pallet_common::Allowlist<Test>>::get((1610 collection_id,1611 account(2)1612 )));16131614 // Destroy collection1615 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));16161617 // Attempt to remove account 2 from collection allow-list => error1618 assert_noop!(1619 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1620 CommonError::<Test>::CollectionNotFound1621 );16221623 // Account 2 is not found in collection allow-list anyway1624 assert_eq!(1625 <pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1626 false1627 );1628 });1629}16301631// If address is already removed from allow list, nothing happens1632#[test]1633fn address_is_already_removed_from_allow_list() {1634 new_test_ext().execute_with(|| {1635 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1636 let origin1 = Origin::signed(1);16371638 assert_ok!(TemplateModule::add_to_allow_list(1639 origin1.clone(),1640 collection_id,1641 account(2)1642 ));1643 assert_ok!(TemplateModule::remove_from_allow_list(1644 origin1.clone(),1645 collection_id,1646 account(2)1647 ));1648 assert_eq!(1649 <pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1650 false1651 );1652 assert_ok!(TemplateModule::remove_from_allow_list(1653 origin1,1654 collection_id,1655 account(2)1656 ));1657 assert_eq!(1658 <pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1659 false1660 );1661 });1662}16631664// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1665#[test]1666fn allow_list_test_1() {1667 new_test_ext().execute_with(|| {1668 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16691670 let origin1 = Origin::signed(1);16711672 let data = default_nft_data();1673 create_test_item(collection_id, &data.into());16741675 assert_ok!(TemplateModule::set_public_access_mode(1676 origin1.clone(),1677 collection_id,1678 AccessMode::AllowList1679 ));1680 assert_ok!(TemplateModule::add_to_allow_list(1681 origin1.clone(),1682 collection_id,1683 account(2)1684 ));16851686 assert_noop!(1687 TemplateModule::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1)1688 .map_err(|e| e.error),1689 CommonError::<Test>::AddressNotInAllowlist1690 );1691 });1692}16931694#[test]1695fn allow_list_test_2() {1696 new_test_ext().execute_with(|| {1697 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1698 let origin1 = Origin::signed(1);16991700 let data = default_nft_data();1701 create_test_item(collection_id, &data.into());17021703 assert_ok!(TemplateModule::set_public_access_mode(1704 origin1.clone(),1705 collection_id,1706 AccessMode::AllowList1707 ));1708 assert_ok!(TemplateModule::add_to_allow_list(1709 origin1.clone(),1710 collection_id,1711 account(1)1712 ));1713 assert_ok!(TemplateModule::add_to_allow_list(1714 origin1.clone(),1715 collection_id,1716 account(2)1717 ));17181719 // do approve1720 assert_ok!(TemplateModule::approve(1721 origin1.clone(),1722 account(1),1723 collection_id,1724 TokenId(1),1725 11726 ));1727 assert_eq!(1728 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1729 account(1)1730 );17311732 assert_ok!(TemplateModule::remove_from_allow_list(1733 origin1.clone(),1734 collection_id,1735 account(1)1736 ));17371738 assert_noop!(1739 TemplateModule::transfer_from(1740 origin1,1741 account(1),1742 account(3),1743 CollectionId(1),1744 TokenId(1),1745 11746 )1747 .map_err(|e| e.error),1748 CommonError::<Test>::AddressNotInAllowlist1749 );1750 });1751}17521753// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1754#[test]1755fn allow_list_test_3() {1756 new_test_ext().execute_with(|| {1757 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17581759 let origin1 = Origin::signed(1);17601761 let data = default_nft_data();1762 create_test_item(collection_id, &data.into());17631764 assert_ok!(TemplateModule::set_public_access_mode(1765 origin1.clone(),1766 collection_id,1767 AccessMode::AllowList1768 ));1769 assert_ok!(TemplateModule::add_to_allow_list(1770 origin1.clone(),1771 collection_id,1772 account(1)1773 ));17741775 assert_noop!(1776 TemplateModule::transfer(origin1, account(3), collection_id, TokenId(1), 1)1777 .map_err(|e| e.error),1778 CommonError::<Test>::AddressNotInAllowlist1779 );1780 });1781}17821783#[test]1784fn allow_list_test_4() {1785 new_test_ext().execute_with(|| {1786 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17871788 let origin1 = Origin::signed(1);17891790 let data = default_nft_data();1791 create_test_item(collection_id, &data.into());17921793 assert_ok!(TemplateModule::set_public_access_mode(1794 origin1.clone(),1795 collection_id,1796 AccessMode::AllowList1797 ));1798 assert_ok!(TemplateModule::add_to_allow_list(1799 origin1.clone(),1800 collection_id,1801 account(1)1802 ));1803 assert_ok!(TemplateModule::add_to_allow_list(1804 origin1.clone(),1805 collection_id,1806 account(2)1807 ));18081809 // do approve1810 assert_ok!(TemplateModule::approve(1811 origin1.clone(),1812 account(1),1813 collection_id,1814 TokenId(1),1815 11816 ));1817 assert_eq!(1818 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1819 account(1)1820 );18211822 assert_ok!(TemplateModule::remove_from_allow_list(1823 origin1.clone(),1824 collection_id,1825 account(2)1826 ));18271828 assert_noop!(1829 TemplateModule::transfer_from(1830 origin1,1831 account(1),1832 account(3),1833 collection_id,1834 TokenId(1),1835 11836 )1837 .map_err(|e| e.error),1838 CommonError::<Test>::AddressNotInAllowlist1839 );1840 });1841}18421843// If Public Access mode is set to AllowList, tokens can’t be destroyed by a non-allowlisted address (even if it owned them before enabling AllowList mode)1844#[test]1845fn allow_list_test_5() {1846 new_test_ext().execute_with(|| {1847 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18481849 let origin1 = Origin::signed(1);18501851 let data = default_nft_data();1852 create_test_item(collection_id, &data.into());18531854 assert_ok!(TemplateModule::set_public_access_mode(1855 origin1.clone(),1856 collection_id,1857 AccessMode::AllowList1858 ));1859 assert_noop!(1860 TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 1)1861 .map_err(|e| e.error),1862 CommonError::<Test>::AddressNotInAllowlist1863 );1864 });1865}18661867// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1868#[test]1869fn allow_list_test_6() {1870 new_test_ext().execute_with(|| {1871 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18721873 let origin1 = Origin::signed(1);18741875 let data = default_nft_data();1876 create_test_item(collection_id, &data.into());18771878 assert_ok!(TemplateModule::set_public_access_mode(1879 origin1.clone(),1880 collection_id,1881 AccessMode::AllowList1882 ));18831884 // do approve1885 assert_noop!(1886 TemplateModule::approve(origin1, account(1), CollectionId(1), TokenId(1), 1)1887 .map_err(|e| e.error),1888 CommonError::<Test>::AddressNotInAllowlist1889 );1890 });1891}18921893// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1894// tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1895#[test]1896fn allow_list_test_7() {1897 new_test_ext().execute_with(|| {1898 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18991900 let data = default_nft_data();1901 create_test_item(collection_id, &data.into());19021903 let origin1 = Origin::signed(1);19041905 assert_ok!(TemplateModule::set_public_access_mode(1906 origin1.clone(),1907 collection_id,1908 AccessMode::AllowList1909 ));1910 assert_ok!(TemplateModule::add_to_allow_list(1911 origin1.clone(),1912 collection_id,1913 account(1)1914 ));1915 assert_ok!(TemplateModule::add_to_allow_list(1916 origin1.clone(),1917 collection_id,1918 account(2)1919 ));19201921 assert_ok!(TemplateModule::transfer(1922 origin1,1923 account(2),1924 CollectionId(1),1925 TokenId(1),1926 11927 ));1928 });1929}19301931#[test]1932fn allow_list_test_8() {1933 new_test_ext().execute_with(|| {1934 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19351936 // Create NFT for account 11937 let data = default_nft_data();1938 create_test_item(collection_id, &data.into());19391940 let origin1 = Origin::signed(1);19411942 // Toggle Allow List mode and add accounts 1 and 21943 assert_ok!(TemplateModule::set_public_access_mode(1944 origin1.clone(),1945 collection_id,1946 AccessMode::AllowList1947 ));1948 assert_ok!(TemplateModule::add_to_allow_list(1949 origin1.clone(),1950 collection_id,1951 account(1)1952 ));1953 assert_ok!(TemplateModule::add_to_allow_list(1954 origin1.clone(),1955 collection_id,1956 account(2)1957 ));19581959 // Sself-approve account 1 for NFT 11960 assert_ok!(TemplateModule::approve(1961 origin1.clone(),1962 account(1),1963 CollectionId(1),1964 TokenId(1),1965 11966 ));1967 assert_eq!(1968 <pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1969 account(1)1970 );19711972 // Transfer from 1 to 21973 assert_ok!(TemplateModule::transfer_from(1974 origin1,1975 account(1),1976 account(2),1977 CollectionId(1),1978 TokenId(1),1979 11980 ));1981 });1982}19831984// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.1985#[test]1986fn allow_list_test_9() {1987 new_test_ext().execute_with(|| {1988 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1989 let origin1 = Origin::signed(1);19901991 assert_ok!(TemplateModule::set_public_access_mode(1992 origin1.clone(),1993 collection_id,1994 AccessMode::AllowList1995 ));1996 assert_ok!(TemplateModule::set_mint_permission(1997 origin1,1998 collection_id,1999 false2000 ));20012002 let data = default_nft_data();2003 create_test_item(collection_id, &data.into());2004 });2005}20062007// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.2008#[test]2009fn allow_list_test_10() {2010 new_test_ext().execute_with(|| {2011 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20122013 let origin1 = Origin::signed(1);2014 let origin2 = Origin::signed(2);20152016 assert_ok!(TemplateModule::set_public_access_mode(2017 origin1.clone(),2018 collection_id,2019 AccessMode::AllowList2020 ));2021 assert_ok!(TemplateModule::set_mint_permission(2022 origin1.clone(),2023 collection_id,2024 false2025 ));20262027 assert_ok!(TemplateModule::add_collection_admin(2028 origin1,2029 collection_id,2030 account(2)2031 ));20322033 assert_ok!(TemplateModule::create_item(2034 origin2,2035 collection_id,2036 account(2),2037 default_nft_data().into()2038 ));2039 });2040}20412042// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and allow listed address.2043#[test]2044fn allow_list_test_11() {2045 new_test_ext().execute_with(|| {2046 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20472048 let origin1 = Origin::signed(1);2049 let origin2 = Origin::signed(2);20502051 assert_ok!(TemplateModule::set_public_access_mode(2052 origin1.clone(),2053 collection_id,2054 AccessMode::AllowList2055 ));2056 assert_ok!(TemplateModule::set_mint_permission(2057 origin1.clone(),2058 collection_id,2059 false2060 ));2061 assert_ok!(TemplateModule::add_to_allow_list(2062 origin1,2063 collection_id,2064 account(2)2065 ));20662067 assert_noop!(2068 TemplateModule::create_item(2069 origin2,2070 CollectionId(1),2071 account(2),2072 default_nft_data().into()2073 )2074 .map_err(|e| e.error),2075 CommonError::<Test>::PublicMintingNotAllowed2076 );2077 });2078}20792080// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-allow listed address.2081#[test]2082fn allow_list_test_12() {2083 new_test_ext().execute_with(|| {2084 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20852086 let origin1 = Origin::signed(1);2087 let origin2 = Origin::signed(2);20882089 assert_ok!(TemplateModule::set_public_access_mode(2090 origin1.clone(),2091 collection_id,2092 AccessMode::AllowList2093 ));2094 assert_ok!(TemplateModule::set_mint_permission(2095 origin1,2096 collection_id,2097 false2098 ));20992100 assert_noop!(2101 TemplateModule::create_item(2102 origin2,2103 CollectionId(1),2104 account(2),2105 default_nft_data().into()2106 )2107 .map_err(|e| e.error),2108 CommonError::<Test>::PublicMintingNotAllowed2109 );2110 });2111}21122113// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.2114#[test]2115fn allow_list_test_13() {2116 new_test_ext().execute_with(|| {2117 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21182119 let origin1 = Origin::signed(1);21202121 assert_ok!(TemplateModule::set_public_access_mode(2122 origin1.clone(),2123 collection_id,2124 AccessMode::AllowList2125 ));2126 assert_ok!(TemplateModule::set_mint_permission(2127 origin1,2128 collection_id,2129 true2130 ));21312132 let data = default_nft_data();2133 create_test_item(collection_id, &data.into());2134 });2135}21362137// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.2138#[test]2139fn allow_list_test_14() {2140 new_test_ext().execute_with(|| {2141 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21422143 let origin1 = Origin::signed(1);2144 let origin2 = Origin::signed(2);21452146 assert_ok!(TemplateModule::set_public_access_mode(2147 origin1.clone(),2148 collection_id,2149 AccessMode::AllowList2150 ));2151 assert_ok!(TemplateModule::set_mint_permission(2152 origin1.clone(),2153 collection_id,2154 true2155 ));21562157 assert_ok!(TemplateModule::add_collection_admin(2158 origin1,2159 collection_id,2160 account(2)2161 ));21622163 assert_ok!(TemplateModule::create_item(2164 origin2,2165 collection_id,2166 account(2),2167 default_nft_data().into()2168 ));2169 });2170}21712172// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-allow listed address.2173#[test]2174fn allow_list_test_15() {2175 new_test_ext().execute_with(|| {2176 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21772178 let origin1 = Origin::signed(1);2179 let origin2 = Origin::signed(2);21802181 assert_ok!(TemplateModule::set_public_access_mode(2182 origin1.clone(),2183 collection_id,2184 AccessMode::AllowList2185 ));2186 assert_ok!(TemplateModule::set_mint_permission(2187 origin1,2188 collection_id,2189 true2190 ));21912192 assert_noop!(2193 TemplateModule::create_item(2194 origin2,2195 collection_id,2196 account(2),2197 default_nft_data().into()2198 )2199 .map_err(|e| e.error),2200 CommonError::<Test>::AddressNotInAllowlist2201 );2202 });2203}22042205// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by non-privileged and allow listed address.2206#[test]2207fn allow_list_test_16() {2208 new_test_ext().execute_with(|| {2209 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22102211 let origin1 = Origin::signed(1);2212 let origin2 = Origin::signed(2);22132214 assert_ok!(TemplateModule::set_public_access_mode(2215 origin1.clone(),2216 collection_id,2217 AccessMode::AllowList2218 ));2219 assert_ok!(TemplateModule::set_mint_permission(2220 origin1.clone(),2221 collection_id,2222 true2223 ));2224 assert_ok!(TemplateModule::add_to_allow_list(2225 origin1,2226 collection_id,2227 account(2)2228 ));22292230 assert_ok!(TemplateModule::create_item(2231 origin2,2232 collection_id,2233 account(2),2234 default_nft_data().into()2235 ));2236 });2237}22382239// Total number of collections. Positive test2240#[test]2241fn total_number_collections_bound() {2242 new_test_ext().execute_with(|| {2243 create_test_collection(&CollectionMode::NFT, CollectionId(1));2244 });2245}22462247#[test]2248fn create_max_collections() {2249 new_test_ext().execute_with(|| {2250 for i in 1..=COLLECTION_NUMBER_LIMIT {2251 create_test_collection(&CollectionMode::NFT, CollectionId(i));2252 }2253 });2254}22552256// Total number of collections. Negative test2257#[test]2258fn total_number_collections_bound_neg() {2259 new_test_ext().execute_with(|| {2260 let origin1 = Origin::signed(1);22612262 for i in 1..=COLLECTION_NUMBER_LIMIT {2263 create_test_collection(&CollectionMode::NFT, CollectionId(i));2264 }22652266 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2267 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2268 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();22692270 // 11-th collection in chain. Expects error2271 assert_noop!(2272 TemplateModule::create_collection(2273 origin1,2274 col_name1,2275 col_desc1,2276 token_prefix1,2277 CollectionMode::NFT2278 ),2279 CommonError::<Test>::TotalCollectionsLimitExceeded2280 );2281 });2282}22832284// Owned tokens by a single address. Positive test2285#[test]2286fn owned_tokens_bound() {2287 new_test_ext().execute_with(|| {2288 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22892290 let data = default_nft_data();2291 create_test_item(collection_id, &data.clone().into());2292 create_test_item(collection_id, &data.into());2293 });2294}22952296// Owned tokens by a single address. Negotive test2297#[test]2298fn owned_tokens_bound_neg() {2299 new_test_ext().execute_with(|| {2300 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23012302 let origin1 = Origin::signed(1);23032304 for _ in 1..=MAX_TOKEN_OWNERSHIP {2305 let data = default_nft_data();2306 create_test_item(collection_id, &data.clone().into());2307 }23082309 let data = default_nft_data();2310 assert_noop!(2311 TemplateModule::create_item(origin1, CollectionId(1), account(1), data.into())2312 .map_err(|e| e.error),2313 CommonError::<Test>::AccountTokenLimitExceeded2314 );2315 });2316}23172318// Number of collection admins. Positive test2319#[test]2320fn collection_admins_bound() {2321 new_test_ext().execute_with(|| {2322 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23232324 let origin1 = Origin::signed(1);23252326 assert_ok!(TemplateModule::add_collection_admin(2327 origin1.clone(),2328 collection_id,2329 account(2)2330 ));2331 assert_ok!(TemplateModule::add_collection_admin(2332 origin1,2333 collection_id,2334 account(3)2335 ));2336 });2337}23382339// Number of collection admins. Negotive test2340#[test]2341fn collection_admins_bound_neg() {2342 new_test_ext().execute_with(|| {2343 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23442345 let origin1 = Origin::signed(1);23462347 for i in 0..COLLECTION_ADMINS_LIMIT {2348 assert_ok!(TemplateModule::add_collection_admin(2349 origin1.clone(),2350 collection_id,2351 account((2 + i).into())2352 ));2353 }2354 assert_noop!(2355 TemplateModule::add_collection_admin(2356 origin1,2357 collection_id,2358 account((3 + COLLECTION_ADMINS_LIMIT).into())2359 ),2360 CommonError::<Test>::CollectionAdminCountExceeded2361 );2362 });2363}2364// #endregion23652366#[test]2367fn set_const_on_chain_schema() {2368 new_test_ext().execute_with(|| {2369 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23702371 let origin1 = Origin::signed(1);2372 assert_ok!(TemplateModule::set_const_on_chain_schema(2373 origin1,2374 collection_id,2375 b"test const on chain schema".to_vec()2376 ));23772378 assert_eq!(2379 <pallet_common::CollectionById<Test>>::get(collection_id)2380 .unwrap()2381 .const_on_chain_schema,2382 b"test const on chain schema".to_vec()2383 );2384 assert_eq!(2385 <pallet_common::CollectionById<Test>>::get(collection_id)2386 .unwrap()2387 .variable_on_chain_schema,2388 b"".to_vec()2389 );2390 });2391}23922393#[test]2394fn set_variable_on_chain_schema() {2395 new_test_ext().execute_with(|| {2396 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23972398 let origin1 = Origin::signed(1);2399 assert_ok!(TemplateModule::set_variable_on_chain_schema(2400 origin1,2401 collection_id,2402 b"test variable on chain schema".to_vec()2403 ));24042405 assert_eq!(2406 <pallet_common::CollectionById<Test>>::get(collection_id)2407 .unwrap()2408 .const_on_chain_schema,2409 b"".to_vec()2410 );2411 assert_eq!(2412 <pallet_common::CollectionById<Test>>::get(collection_id)2413 .unwrap()2414 .variable_on_chain_schema,2415 b"test variable on chain schema".to_vec()2416 );2417 });2418}24192420#[test]2421fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {2422 new_test_ext().execute_with(|| {2423 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));24242425 let origin1 = Origin::signed(1);24262427 let data = default_nft_data();2428 create_test_item(CollectionId(1), &data.into());24292430 let variable_data = b"test data".to_vec();2431 assert_ok!(TemplateModule::set_variable_meta_data(2432 origin1,2433 collection_id,2434 TokenId(1),2435 variable_data.clone()2436 ));24372438 assert_eq!(2439 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2440 .unwrap()2441 .variable_data,2442 variable_data2443 );2444 });2445}24462447#[test]2448fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {2449 new_test_ext().execute_with(|| {2450 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));24512452 let origin1 = Origin::signed(1);24532454 let data = default_re_fungible_data();2455 create_test_item(collection_id, &data.into());24562457 let variable_data = b"test data".to_vec();2458 assert_ok!(TemplateModule::set_variable_meta_data(2459 origin1,2460 collection_id,2461 TokenId(1),2462 variable_data.clone()2463 ));24642465 assert_eq!(2466 <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1))).variable_data,2467 variable_data2468 );2469 });2470}24712472#[test]2473fn set_variable_meta_data_on_fungible_token_fails() {2474 new_test_ext().execute_with(|| {2475 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));24762477 let origin1 = Origin::signed(1);24782479 let data = default_fungible_data();2480 create_test_item(collection_id, &data.into());24812482 let variable_data = b"test data".to_vec();2483 assert_noop!(2484 TemplateModule::set_variable_meta_data(2485 origin1,2486 collection_id,2487 TokenId(0),2488 variable_data2489 )2490 .map_err(|e| e.error),2491 <pallet_fungible::Error<Test>>::FungibleItemsDontHaveData2492 );2493 });2494}24952496#[test]2497fn set_variable_meta_data_on_nft_token_fails_for_big_data() {2498 new_test_ext().execute_with(|| {2499 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));25002501 let origin1 = Origin::signed(1);25022503 let data = default_nft_data();2504 create_test_item(collection_id, &data.into());25052506 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2507 assert_noop!(2508 TemplateModule::set_variable_meta_data(2509 origin1,2510 collection_id,2511 TokenId(1),2512 variable_data2513 )2514 .map_err(|e| e.error),2515 CommonError::<Test>::TokenVariableDataLimitExceeded2516 );2517 });2518}25192520#[test]2521fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2522 new_test_ext().execute_with(|| {2523 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));25242525 let origin1 = Origin::signed(1);25262527 let data = default_re_fungible_data();2528 create_test_item(collection_id, &data.into());25292530 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2531 assert_noop!(2532 TemplateModule::set_variable_meta_data(2533 origin1,2534 collection_id,2535 TokenId(1),2536 variable_data2537 )2538 .map_err(|e| e.error),2539 CommonError::<Test>::TokenVariableDataLimitExceeded2540 );2541 });2542}25432544#[test]2545fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {2546 new_test_ext().execute_with(|| {2547 //default_limits();25482549 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));25502551 let origin1 = Origin::signed(1);25522553 let data = default_nft_data();2554 create_test_item(collection_id, &data.into());25552556 assert_ok!(TemplateModule::set_meta_update_permission_flag(2557 origin1.clone(),2558 collection_id,2559 MetaUpdatePermission::ItemOwner,2560 ));25612562 let variable_data = b"ten chars.".to_vec();2563 assert_ok!(TemplateModule::set_variable_meta_data(2564 origin1,2565 collection_id,2566 TokenId(1),2567 variable_data.clone()2568 ));25692570 assert_eq!(2571 <pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))2572 .unwrap()2573 .variable_data,2574 variable_data2575 );2576 });2577}25782579#[test]2580fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {2581 new_test_ext().execute_with(|| {2582 let collection_id =2583 create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));25842585 let origin1 = Origin::signed(1);25862587 assert_ok!(TemplateModule::set_mint_permission(2588 origin1.clone(),2589 collection_id,2590 true2591 ));2592 assert_ok!(TemplateModule::add_to_allow_list(2593 origin1.clone(),2594 collection_id,2595 account(1)2596 ));25972598 let data = default_nft_data();2599 create_test_item(collection_id, &data.into());26002601 assert_ok!(TemplateModule::set_meta_update_permission_flag(2602 origin1.clone(),2603 collection_id,2604 MetaUpdatePermission::ItemOwner,2605 ));26062607 let variable_data = b"1234567890123".to_vec();2608 assert_noop!(2609 TemplateModule::set_variable_meta_data(2610 origin1,2611 collection_id,2612 TokenId(1),2613 variable_data.clone()2614 )2615 .map_err(|e| e.error),2616 CommonError::<Test>::TokenVariableDataLimitExceeded2617 );2618 })2619}26202621#[test]2622fn collection_transfer_flag_works() {2623 new_test_ext().execute_with(|| {2624 let origin1 = Origin::signed(1);26252626 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2627 assert_ok!(TemplateModule::set_transfers_enabled_flag(2628 origin1,2629 collection_id,2630 true2631 ));26322633 let data = default_nft_data();2634 create_test_item(collection_id, &data.into());2635 assert_eq!(2636 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2637 12638 );2639 assert_eq!(2640 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2641 true2642 );26432644 let origin1 = Origin::signed(1);26452646 // default scenario2647 assert_ok!(TemplateModule::transfer(2648 origin1,2649 account(2),2650 collection_id,2651 TokenId(1),2652 12653 ));2654 assert_eq!(2655 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2656 false2657 );2658 assert_eq!(2659 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2660 true2661 );2662 assert_eq!(2663 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2664 02665 );2666 assert_eq!(2667 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2668 12669 );2670 });2671}26722673#[test]2674fn set_variable_meta_data_on_nft_with_admin_flag() {2675 new_test_ext().execute_with(|| {2676 // default_limits();26772678 let collection_id =2679 create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));26802681 let origin1 = Origin::signed(1);2682 let origin2 = Origin::signed(2);26832684 assert_ok!(TemplateModule::set_mint_permission(2685 origin2.clone(),2686 collection_id,2687 true2688 ));2689 assert_ok!(TemplateModule::add_to_allow_list(2690 origin2.clone(),2691 collection_id,2692 account(1)2693 ));26942695 assert_ok!(TemplateModule::add_collection_admin(2696 origin2.clone(),2697 collection_id,2698 account(1)2699 ));27002701 let data = default_nft_data();2702 create_test_item(collection_id, &data.into());27032704 assert_ok!(TemplateModule::set_meta_update_permission_flag(2705 origin2.clone(),2706 collection_id,2707 MetaUpdatePermission::Admin,2708 ));27092710 let variable_data = b"test.".to_vec();2711 assert_ok!(TemplateModule::set_variable_meta_data(2712 origin1,2713 collection_id,2714 TokenId(1),2715 variable_data.clone()2716 ));27172718 assert_eq!(2719 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2720 .unwrap()2721 .variable_data,2722 variable_data2723 );2724 });2725}27262727#[test]2728fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2729 new_test_ext().execute_with(|| {2730 // default_limits();27312732 let collection_id =2733 create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));27342735 let origin1 = Origin::signed(1);2736 let origin2 = Origin::signed(2);27372738 assert_ok!(TemplateModule::set_mint_permission(2739 origin2.clone(),2740 collection_id,2741 true2742 ));2743 assert_ok!(TemplateModule::add_to_allow_list(2744 origin2.clone(),2745 collection_id,2746 account(1)2747 ));27482749 let data = default_nft_data();2750 create_test_item(collection_id, &data.into());27512752 assert_ok!(TemplateModule::set_meta_update_permission_flag(2753 origin2.clone(),2754 collection_id,2755 MetaUpdatePermission::Admin,2756 ));27572758 let variable_data = b"test.".to_vec();2759 assert_noop!(2760 TemplateModule::set_variable_meta_data(2761 origin1,2762 collection_id,2763 TokenId(1),2764 variable_data.clone()2765 )2766 .map_err(|e| e.error),2767 CommonError::<Test>::NoPermission2768 );2769 });2770}27712772#[test]2773fn set_variable_meta_flag_after_freeze() {2774 new_test_ext().execute_with(|| {2775 // default_limits();27762777 let collection_id =2778 create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));27792780 let origin2 = Origin::signed(2);27812782 assert_ok!(TemplateModule::set_meta_update_permission_flag(2783 origin2.clone(),2784 collection_id,2785 MetaUpdatePermission::None,2786 ));2787 assert_noop!(2788 TemplateModule::set_meta_update_permission_flag(2789 origin2.clone(),2790 collection_id,2791 MetaUpdatePermission::Admin2792 ),2793 CommonError::<Test>::MetadataFlagFrozen2794 );2795 });2796}27972798#[test]2799fn set_variable_meta_data_on_nft_with_none_flag_neg() {2800 new_test_ext().execute_with(|| {2801 // default_limits();28022803 let collection_id =2804 create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2805 let origin1 = Origin::signed(1);28062807 let data = default_nft_data();2808 create_test_item(collection_id, &data.into());28092810 assert_ok!(TemplateModule::set_meta_update_permission_flag(2811 origin1.clone(),2812 collection_id,2813 MetaUpdatePermission::None,2814 ));28152816 let variable_data = b"test.".to_vec();2817 assert_noop!(2818 TemplateModule::set_variable_meta_data(2819 origin1.clone(),2820 collection_id,2821 TokenId(1),2822 variable_data.clone()2823 )2824 .map_err(|e| e.error),2825 CommonError::<Test>::NoPermission2826 );2827 });2828}28292830#[test]2831fn collection_transfer_flag_works_neg() {2832 new_test_ext().execute_with(|| {2833 let origin1 = Origin::signed(1);28342835 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2836 assert_ok!(TemplateModule::set_transfers_enabled_flag(2837 origin1,2838 collection_id,2839 false2840 ));28412842 let data = default_nft_data();2843 create_test_item(collection_id, &data.into());2844 assert_eq!(2845 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2846 12847 );2848 assert_eq!(2849 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2850 true2851 );28522853 let origin1 = Origin::signed(1);28542855 // default scenario2856 assert_noop!(2857 TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1)2858 .map_err(|e| e.error),2859 CommonError::<Test>::TransferNotAllowed2860 );2861 assert_eq!(2862 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2863 12864 );2865 assert_eq!(2866 <pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2867 02868 );2869 assert_eq!(2870 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2871 true2872 );2873 assert_eq!(2874 <pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2875 false2876 );2877 });2878}pallets/unique/src/weights.rsdiffbeforeafterboth--- /dev/null
+++ b/pallets/unique/src/weights.rs
@@ -0,0 +1,315 @@
+// Template adopted from https://github.com/paritytech/substrate/blob/master/.maintain/frame-weight-template.hbs
+
+//! Autogenerated weights for pallet_unique
+//!
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
+//! DATE: 2021-10-21, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 128
+
+// Executed Command:
+// target/release/unique-collator
+// benchmark
+// --pallet
+// pallet-unique
+// --wasm-execution
+// compiled
+// --extrinsic
+// *
+// --template
+// .maintain/frame-weight-template.hbs
+// --steps=50
+// --repeat=20
+// --output=./pallets/unique/src/weights.rs
+
+
+#![cfg_attr(rustfmt, rustfmt_skip)]
+#![allow(unused_parens)]
+#![allow(unused_imports)]
+#![allow(clippy::unnecessary_cast)]
+
+use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}};
+use sp_std::marker::PhantomData;
+
+/// Weight functions needed for pallet_unique.
+pub trait WeightInfo {
+ fn create_collection() -> Weight;
+ fn destroy_collection() -> Weight;
+ fn add_to_allow_list() -> Weight;
+ fn remove_from_allow_list() -> Weight;
+ fn set_public_access_mode() -> Weight;
+ fn set_mint_permission() -> Weight;
+ fn change_collection_owner() -> Weight;
+ fn add_collection_admin() -> Weight;
+ fn remove_collection_admin() -> Weight;
+ fn set_collection_sponsor() -> Weight;
+ fn confirm_sponsorship() -> Weight;
+ fn remove_collection_sponsor() -> Weight;
+ fn set_transfers_enabled_flag() -> Weight;
+ fn set_offchain_schema(b: u32, ) -> Weight;
+ fn set_const_on_chain_schema(b: u32, ) -> Weight;
+ fn set_variable_on_chain_schema(b: u32, ) -> Weight;
+ fn set_schema_version() -> Weight;
+ fn set_collection_limits() -> Weight;
+ fn set_meta_update_permission_flag() -> Weight;
+}
+
+/// Weights for pallet_unique using the Substrate node and recommended hardware.
+pub struct SubstrateWeight<T>(PhantomData<T>);
+impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
+ // Storage: Common CreatedCollectionCount (r:1 w:1)
+ // Storage: Common DestroyedCollectionCount (r:1 w:0)
+ // Storage: System Account (r:2 w:2)
+ // Storage: Common CollectionById (r:0 w:1)
+ fn create_collection() -> Weight {
+ (23_803_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(4 as Weight))
+ .saturating_add(T::DbWeight::get().writes(4 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ // Storage: Common DestroyedCollectionCount (r:1 w:1)
+ // Storage: Nonfungible TokensMinted (r:0 w:1)
+ // Storage: Nonfungible TokensBurnt (r:0 w:1)
+ fn destroy_collection() -> Weight {
+ (27_831_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(2 as Weight))
+ .saturating_add(T::DbWeight::get().writes(4 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:0)
+ // Storage: Common Allowlist (r:0 w:1)
+ fn add_to_allow_list() -> Weight {
+ (6_629_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:0)
+ // Storage: Common Allowlist (r:0 w:1)
+ fn remove_from_allow_list() -> Weight {
+ (6_596_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_public_access_mode() -> Weight {
+ (6_338_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_mint_permission() -> Weight {
+ (6_383_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn change_collection_owner() -> Weight {
+ (6_493_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:0)
+ // Storage: Common IsAdmin (r:0 w:1)
+ fn add_collection_admin() -> Weight {
+ (6_850_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:0)
+ // Storage: Common IsAdmin (r:0 w:1)
+ fn remove_collection_admin() -> Weight {
+ (6_615_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_collection_sponsor() -> Weight {
+ (6_430_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn confirm_sponsorship() -> Weight {
+ (6_125_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn remove_collection_sponsor() -> Weight {
+ (6_236_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_transfers_enabled_flag() -> Weight {
+ (6_500_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_offchain_schema(_b: u32, ) -> Weight {
+ (6_538_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_const_on_chain_schema(_b: u32, ) -> Weight {
+ (6_542_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_variable_on_chain_schema(b: u32, ) -> Weight {
+ (6_092_000 as Weight)
+ // Standard Error: 0
+ .saturating_add((2_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_schema_version() -> Weight {
+ (6_470_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_collection_limits() -> Weight {
+ (6_841_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_meta_update_permission_flag() -> Weight {
+ (6_278_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(1 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
+}
+
+// For backwards compatibility and tests
+impl WeightInfo for () {
+ // Storage: Common CreatedCollectionCount (r:1 w:1)
+ // Storage: Common DestroyedCollectionCount (r:1 w:0)
+ // Storage: System Account (r:2 w:2)
+ // Storage: Common CollectionById (r:0 w:1)
+ fn create_collection() -> Weight {
+ (23_803_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(4 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(4 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ // Storage: Common DestroyedCollectionCount (r:1 w:1)
+ // Storage: Nonfungible TokensMinted (r:0 w:1)
+ // Storage: Nonfungible TokensBurnt (r:0 w:1)
+ fn destroy_collection() -> Weight {
+ (27_831_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(2 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(4 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:0)
+ // Storage: Common Allowlist (r:0 w:1)
+ fn add_to_allow_list() -> Weight {
+ (6_629_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:0)
+ // Storage: Common Allowlist (r:0 w:1)
+ fn remove_from_allow_list() -> Weight {
+ (6_596_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_public_access_mode() -> Weight {
+ (6_338_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_mint_permission() -> Weight {
+ (6_383_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn change_collection_owner() -> Weight {
+ (6_493_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:0)
+ // Storage: Common IsAdmin (r:0 w:1)
+ fn add_collection_admin() -> Weight {
+ (6_850_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:0)
+ // Storage: Common IsAdmin (r:0 w:1)
+ fn remove_collection_admin() -> Weight {
+ (6_615_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_collection_sponsor() -> Weight {
+ (6_430_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn confirm_sponsorship() -> Weight {
+ (6_125_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn remove_collection_sponsor() -> Weight {
+ (6_236_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_transfers_enabled_flag() -> Weight {
+ (6_500_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_offchain_schema(_b: u32, ) -> Weight {
+ (6_538_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_const_on_chain_schema(_b: u32, ) -> Weight {
+ (6_542_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_variable_on_chain_schema(b: u32, ) -> Weight {
+ (6_092_000 as Weight)
+ // Standard Error: 0
+ .saturating_add((2_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_schema_version() -> Weight {
+ (6_470_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_collection_limits() -> Weight {
+ (6_841_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+ // Storage: Common CollectionById (r:1 w:1)
+ fn set_meta_update_permission_flag() -> Weight {
+ (6_278_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(1 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
+}
\ No newline at end of file
primitives/data-structs/Cargo.tomldiffbeforeafterboth--- /dev/null
+++ b/primitives/data-structs/Cargo.toml
@@ -0,0 +1,39 @@
+[package]
+name = "up-data-structs"
+authors = ["Unique Network <support@uniquenetwork.io>"]
+description = "Unique data structs definitions"
+edition = "2021"
+license = 'All Rights Reserved'
+homepage = "https://unique.network"
+repository = 'https://github.com/UniqueNetwork/unique-chain'
+version = '0.1.0'
+
+[dependencies]
+scale-info = { version = "1.0.0", default-features = false, features = ["derive"] }
+codec = { package = "parity-scale-codec", version = "2.3.0", default-features = false, features = [
+ 'derive',
+] }
+serde = { version = "1.0.130", features = [
+ 'derive',
+], default-features = false, optional = true }
+frame-support = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
+frame-system = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
+sp-core = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
+sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
+sp-runtime = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
+derivative = "2.2.0"
+
+[features]
+default = ["std"]
+std = [
+ "serde1",
+ "serde/std",
+ "codec/std",
+ "frame-system/std",
+ "frame-support/std",
+ "sp-runtime/std",
+ "sp-core/std",
+ "sp-std/std",
+]
+serde1 = ["serde"]
+limit-testing = []
primitives/data-structs/src/lib.rsdiffbeforeafterboth--- /dev/null
+++ b/primitives/data-structs/src/lib.rs
@@ -0,0 +1,437 @@
+#![cfg_attr(not(feature = "std"), no_std)]
+
+use core::convert::{TryFrom, TryInto};
+
+#[cfg(feature = "serde")]
+pub use serde::{Serialize, Deserialize};
+
+use sp_core::U256;
+use sp_runtime::{ArithmeticError, sp_std::prelude::Vec};
+use codec::{Decode, Encode, EncodeLike, MaxEncodedLen};
+pub use frame_support::{
+ BoundedVec, construct_runtime, decl_event, decl_module, decl_storage, decl_error,
+ dispatch::DispatchResult,
+ ensure, fail, parameter_types,
+ traits::{
+ Currency, ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced,
+ Randomness, IsSubType, WithdrawReasons,
+ },
+ weights::{
+ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},
+ DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,
+ WeightToFeePolynomial, DispatchClass,
+ },
+ StorageValue, transactional,
+};
+use derivative::Derivative;
+use scale_info::TypeInfo;
+
+pub const MAX_DECIMAL_POINTS: DecimalPoints = 30;
+pub const MAX_REFUNGIBLE_PIECES: u128 = 1_000_000_000_000_000_000_000;
+pub const MAX_SPONSOR_TIMEOUT: u32 = 10_368_000;
+
+pub const MAX_TOKEN_OWNERSHIP: u32 = if cfg!(not(feature = "limit-testing")) {
+ 10_000_000
+} else {
+ 10
+};
+pub const COLLECTION_NUMBER_LIMIT: u32 = if cfg!(not(feature = "limit-testing")) {
+ 100_000
+} else {
+ 10
+};
+pub const CUSTOM_DATA_LIMIT: u32 = if cfg!(not(feature = "limit-testing")) {
+ 2048
+} else {
+ 10
+};
+pub const COLLECTION_ADMINS_LIMIT: u32 = 5;
+pub const COLLECTION_TOKEN_LIMIT: u32 = u32::MAX;
+pub const ACCOUNT_TOKEN_OWNERSHIP_LIMIT: u32 = if cfg!(not(feature = "limit-testing")) {
+ 1_000_000
+} else {
+ 10
+};
+
+// Timeouts for item types in passed blocks
+pub const NFT_SPONSOR_TRANSFER_TIMEOUT: u32 = 5;
+pub const FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT: u32 = 5;
+pub const REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT: u32 = 5;
+
+pub const SPONSOR_APPROVE_TIMEOUT: u32 = 5;
+
+// Schema limits
+pub const OFFCHAIN_SCHEMA_LIMIT: u32 = 1024;
+pub const VARIABLE_ON_CHAIN_SCHEMA_LIMIT: u32 = 1024;
+pub const CONST_ON_CHAIN_SCHEMA_LIMIT: u32 = 1024;
+
+pub const MAX_COLLECTION_NAME_LENGTH: usize = 64;
+pub const MAX_COLLECTION_DESCRIPTION_LENGTH: usize = 256;
+pub const MAX_TOKEN_PREFIX_LENGTH: usize = 16;
+
+/// How much items can be created per single
+/// create_many call
+pub const MAX_ITEMS_PER_BATCH: u32 = 200;
+
+parameter_types! {
+ pub const CustomDataLimit: u32 = CUSTOM_DATA_LIMIT;
+}
+
+#[derive(Encode, Decode, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug, Default, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+pub struct CollectionId(pub u32);
+impl EncodeLike<u32> for CollectionId {}
+impl EncodeLike<CollectionId> for u32 {}
+
+#[derive(Encode, Decode, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug, Default, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+pub struct TokenId(pub u32);
+impl EncodeLike<u32> for TokenId {}
+impl EncodeLike<TokenId> for u32 {}
+
+impl TokenId {
+ pub fn try_next(self) -> Result<TokenId, ArithmeticError> {
+ self.0
+ .checked_add(1)
+ .ok_or(ArithmeticError::Overflow)
+ .map(Self)
+ }
+}
+
+impl From<TokenId> for U256 {
+ fn from(t: TokenId) -> Self {
+ t.0.into()
+ }
+}
+
+impl TryFrom<U256> for TokenId {
+ type Error = &'static str;
+
+ fn try_from(value: U256) -> Result<Self, Self::Error> {
+ Ok(TokenId(value.try_into().map_err(|_| "too large token id")?))
+ }
+}
+
+pub struct OverflowError;
+impl From<OverflowError> for &'static str {
+ fn from(_: OverflowError) -> Self {
+ "overflow occured"
+ }
+}
+
+pub type DecimalPoints = u8;
+
+#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+pub enum CollectionMode {
+ NFT,
+ // decimal points
+ Fungible(DecimalPoints),
+ ReFungible,
+}
+
+impl CollectionMode {
+ pub fn id(&self) -> u8 {
+ match self {
+ CollectionMode::NFT => 1,
+ CollectionMode::Fungible(_) => 2,
+ CollectionMode::ReFungible => 3,
+ }
+ }
+}
+
+pub trait SponsoringResolve<AccountId, Call> {
+ fn resolve(who: &AccountId, call: &Call) -> Option<AccountId>;
+}
+
+#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+pub enum AccessMode {
+ Normal,
+ AllowList,
+}
+impl Default for AccessMode {
+ fn default() -> Self {
+ Self::Normal
+ }
+}
+
+#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+pub enum SchemaVersion {
+ ImageURL,
+ Unique,
+}
+impl Default for SchemaVersion {
+ fn default() -> Self {
+ Self::ImageURL
+ }
+}
+
+#[derive(Encode, Decode, Default, Debug, Clone, PartialEq, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+pub struct Ownership<AccountId> {
+ pub owner: AccountId,
+ pub fraction: u128,
+}
+
+#[derive(Encode, Decode, Debug, Clone, PartialEq, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+pub enum SponsorshipState<AccountId> {
+ /// The fees are applied to the transaction sender
+ Disabled,
+ Unconfirmed(AccountId),
+ /// Transactions are sponsored by specified account
+ Confirmed(AccountId),
+}
+
+impl<AccountId> SponsorshipState<AccountId> {
+ pub fn sponsor(&self) -> Option<&AccountId> {
+ match self {
+ Self::Confirmed(sponsor) => Some(sponsor),
+ _ => None,
+ }
+ }
+
+ pub fn pending_sponsor(&self) -> Option<&AccountId> {
+ match self {
+ Self::Unconfirmed(sponsor) | Self::Confirmed(sponsor) => Some(sponsor),
+ _ => None,
+ }
+ }
+
+ pub fn confirmed(&self) -> bool {
+ matches!(self, Self::Confirmed(_))
+ }
+}
+
+impl<T> Default for SponsorshipState<T> {
+ fn default() -> Self {
+ Self::Disabled
+ }
+}
+
+#[derive(Encode, Decode, Clone, PartialEq, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+pub struct Collection<AccountId> {
+ pub owner: AccountId,
+ pub mode: CollectionMode,
+ pub access: AccessMode,
+ pub name: Vec<u16>, // 64 include null escape char
+ pub description: Vec<u16>, // 256 include null escape char
+ pub token_prefix: Vec<u8>, // 16 include null escape char
+ pub mint_mode: bool,
+ pub offchain_schema: Vec<u8>,
+ pub schema_version: SchemaVersion,
+ pub sponsorship: SponsorshipState<AccountId>,
+ pub limits: CollectionLimits, // Collection private restrictions
+ pub variable_on_chain_schema: Vec<u8>, //
+ pub const_on_chain_schema: Vec<u8>, //
+ pub meta_update_permission: MetaUpdatePermission,
+}
+
+#[derive(Encode, Decode, Debug, Clone, PartialEq, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+pub struct NftItemType<AccountId> {
+ pub owner: AccountId,
+ pub const_data: Vec<u8>,
+ pub variable_data: Vec<u8>,
+}
+
+#[derive(Encode, Decode, Default, Debug, Clone, PartialEq, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+pub struct FungibleItemType {
+ pub value: u128,
+}
+
+#[derive(Encode, Decode, Debug, Clone, PartialEq, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+pub struct ReFungibleItemType<AccountId> {
+ pub owner: Vec<Ownership<AccountId>>,
+ pub const_data: Vec<u8>,
+ pub variable_data: Vec<u8>,
+}
+
+/// All fields are wrapped in `Option`s, where None means chain default
+#[derive(Encode, Decode, Debug, Default, Clone, PartialEq, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+pub struct CollectionLimits {
+ pub account_token_ownership_limit: Option<u32>,
+ pub sponsored_data_size: Option<u32>,
+ /// None - setVariableMetadata is not sponsored
+ /// Some(v) - setVariableMetadata is sponsored
+ /// if there is v block between txs
+ pub sponsored_data_rate_limit: Option<(Option<u32>,)>,
+ pub token_limit: Option<u32>,
+
+ // Timeouts for item types in passed blocks
+ pub sponsor_transfer_timeout: Option<u32>,
+ pub sponsor_approve_timeout: Option<u32>,
+ pub owner_can_transfer: Option<bool>,
+ pub owner_can_destroy: Option<bool>,
+ pub transfers_enabled: Option<bool>,
+}
+
+impl CollectionLimits {
+ pub fn account_token_ownership_limit(&self) -> u32 {
+ self.account_token_ownership_limit
+ .unwrap_or(ACCOUNT_TOKEN_OWNERSHIP_LIMIT)
+ .min(MAX_TOKEN_OWNERSHIP)
+ }
+ pub fn sponsored_data_size(&self) -> u32 {
+ self.sponsored_data_size
+ .unwrap_or(CUSTOM_DATA_LIMIT)
+ .min(CUSTOM_DATA_LIMIT)
+ }
+ pub fn token_limit(&self) -> u32 {
+ self.token_limit
+ .unwrap_or(COLLECTION_TOKEN_LIMIT)
+ .min(COLLECTION_TOKEN_LIMIT)
+ }
+ pub fn sponsor_transfer_timeout(&self, default: u32) -> u32 {
+ self.sponsor_transfer_timeout
+ .unwrap_or(default)
+ .min(MAX_SPONSOR_TIMEOUT)
+ }
+ pub fn sponsor_approve_timeout(&self) -> u32 {
+ self.sponsor_approve_timeout
+ .unwrap_or(SPONSOR_APPROVE_TIMEOUT)
+ .min(MAX_SPONSOR_TIMEOUT)
+ }
+ pub fn owner_can_transfer(&self) -> bool {
+ self.owner_can_transfer.unwrap_or(true)
+ }
+ pub fn owner_can_destroy(&self) -> bool {
+ self.owner_can_destroy.unwrap_or(true)
+ }
+ pub fn transfers_enabled(&self) -> bool {
+ self.transfers_enabled.unwrap_or(true)
+ }
+ pub fn sponsored_data_rate_limit(&self) -> Option<u32> {
+ self.sponsored_data_rate_limit
+ .unwrap_or((None,))
+ .0
+ .map(|v| v.min(MAX_SPONSOR_TIMEOUT))
+ }
+}
+
+/// BoundedVec doesn't supports serde
+#[cfg(feature = "serde1")]
+mod bounded_serde {
+ use core::convert::TryFrom;
+ use frame_support::{BoundedVec, traits::Get};
+ use serde::{
+ ser::{self, Serialize},
+ de::{self, Deserialize, Error},
+ };
+ use sp_std::vec::Vec;
+
+ pub fn serialize<D, V, S>(value: &BoundedVec<V, S>, serializer: D) -> Result<D::Ok, D::Error>
+ where
+ D: ser::Serializer,
+ V: Serialize,
+ {
+ (value as &Vec<_>).serialize(serializer)
+ }
+
+ pub fn deserialize<'de, D, V, S>(deserializer: D) -> Result<BoundedVec<V, S>, D::Error>
+ where
+ D: de::Deserializer<'de>,
+ V: de::Deserialize<'de>,
+ S: Get<u32>,
+ {
+ // TODO: Implement custom visitor, which will limit vec size at parse time? Will serde only be used by chainspec?
+ let vec = <Vec<V>>::deserialize(deserializer)?;
+ let len = vec.len();
+ TryFrom::try_from(vec).map_err(|_| D::Error::invalid_length(len, &"lesser size"))
+ }
+}
+
+#[derive(Encode, Decode, MaxEncodedLen, Default, PartialEq, Clone, Derivative, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+#[derivative(Debug)]
+pub struct CreateNftData {
+ #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
+ #[derivative(Debug = "ignore")]
+ pub const_data: BoundedVec<u8, CustomDataLimit>,
+ #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
+ #[derivative(Debug = "ignore")]
+ pub variable_data: BoundedVec<u8, CustomDataLimit>,
+}
+
+#[derive(Encode, Decode, MaxEncodedLen, Default, Debug, Clone, PartialEq, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+pub struct CreateFungibleData {
+ pub value: u128,
+}
+
+#[derive(Encode, Decode, MaxEncodedLen, Default, PartialEq, Clone, Derivative, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+#[derivative(Debug)]
+pub struct CreateReFungibleData {
+ #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
+ #[derivative(Debug = "ignore")]
+ pub const_data: BoundedVec<u8, CustomDataLimit>,
+ #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
+ #[derivative(Debug = "ignore")]
+ pub variable_data: BoundedVec<u8, CustomDataLimit>,
+ pub pieces: u128,
+}
+
+#[derive(Encode, Decode, Debug, Clone, PartialEq, TypeInfo)]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+pub enum MetaUpdatePermission {
+ ItemOwner,
+ Admin,
+ None,
+}
+
+impl Default for MetaUpdatePermission {
+ fn default() -> Self {
+ Self::ItemOwner
+ }
+}
+
+#[derive(Encode, Decode, MaxEncodedLen, PartialEq, Clone, Debug, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+pub enum CreateItemData {
+ NFT(CreateNftData),
+ Fungible(CreateFungibleData),
+ ReFungible(CreateReFungibleData),
+}
+
+impl CreateItemData {
+ pub fn data_size(&self) -> usize {
+ match self {
+ CreateItemData::NFT(data) => data.variable_data.len() + data.const_data.len(),
+ CreateItemData::ReFungible(data) => data.variable_data.len() + data.const_data.len(),
+ _ => 0,
+ }
+ }
+}
+
+impl From<CreateNftData> for CreateItemData {
+ fn from(item: CreateNftData) -> Self {
+ CreateItemData::NFT(item)
+ }
+}
+
+impl From<CreateReFungibleData> for CreateItemData {
+ fn from(item: CreateReFungibleData) -> Self {
+ CreateItemData::ReFungible(item)
+ }
+}
+
+impl From<CreateFungibleData> for CreateItemData {
+ fn from(item: CreateFungibleData) -> Self {
+ CreateItemData::Fungible(item)
+ }
+}
+
+#[derive(Encode, Decode, MaxEncodedLen, PartialEq, Clone, Debug, TypeInfo)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+pub struct CollectionStats {
+ pub created: u32,
+ pub destroyed: u32,
+ pub alive: u32,
+}
primitives/nft/Cargo.tomldiffbeforeafterboth--- a/primitives/nft/Cargo.toml
+++ /dev/null
@@ -1,39 +0,0 @@
-[package]
-name = "nft-data-structs"
-authors = ['Substrate DevHub <https://github.com/substrate-developer-hub>']
-description = "Nft data structs definitions"
-edition = "2021"
-license = 'GPL-3.0'
-homepage = "https://substrate.dev"
-repository = 'https://github.com/clover-network/clover'
-version = '0.9.0'
-
-[dependencies]
-scale-info = { version = "1.0.0", default-features = false, features = ["derive"] }
-codec = { package = "parity-scale-codec", version = "2.3.0", default-features = false, features = [
- 'derive',
-] }
-serde = { version = "1.0.130", features = [
- 'derive',
-], default-features = false, optional = true }
-frame-support = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
-frame-system = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
-sp-core = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
-sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
-sp-runtime = { default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.12' }
-derivative = "2.2.0"
-
-[features]
-default = ["std"]
-std = [
- "serde1",
- "serde/std",
- "codec/std",
- "frame-system/std",
- "frame-support/std",
- "sp-runtime/std",
- "sp-core/std",
- "sp-std/std",
-]
-serde1 = ["serde"]
-limit-testing = []
primitives/nft/src/lib.rsdiffbeforeafterboth--- a/primitives/nft/src/lib.rs
+++ /dev/null
@@ -1,433 +0,0 @@
-#![cfg_attr(not(feature = "std"), no_std)]
-
-use core::convert::{TryFrom, TryInto};
-
-#[cfg(feature = "serde")]
-pub use serde::{Serialize, Deserialize};
-
-use sp_core::U256;
-use sp_runtime::{ArithmeticError, sp_std::prelude::Vec};
-use codec::{Decode, Encode, EncodeLike, MaxEncodedLen};
-pub use frame_support::{
- BoundedVec, construct_runtime, decl_event, decl_module, decl_storage, decl_error,
- dispatch::DispatchResult,
- ensure, fail, parameter_types,
- traits::{
- Currency, ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced,
- Randomness, IsSubType, WithdrawReasons,
- },
- weights::{
- constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},
- DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,
- WeightToFeePolynomial, DispatchClass,
- },
- StorageValue, transactional,
-};
-use derivative::Derivative;
-use scale_info::TypeInfo;
-
-pub const MAX_DECIMAL_POINTS: DecimalPoints = 30;
-pub const MAX_REFUNGIBLE_PIECES: u128 = 1_000_000_000_000_000_000_000;
-pub const MAX_SPONSOR_TIMEOUT: u32 = 10_368_000;
-pub const MAX_TOKEN_OWNERSHIP: u32 = 10_000_000;
-
-pub const COLLECTION_NUMBER_LIMIT: u32 = if cfg!(not(feature = "limit-testing")) {
- 100000
-} else {
- 10
-};
-pub const CUSTOM_DATA_LIMIT: u32 = if cfg!(not(feature = "limit-testing")) {
- 2048
-} else {
- 10
-};
-pub const COLLECTION_ADMINS_LIMIT: u32 = 5;
-pub const COLLECTION_TOKEN_LIMIT: u32 = u32::MAX;
-pub const ACCOUNT_TOKEN_OWNERSHIP_LIMIT: u32 = if cfg!(not(feature = "limit-testing")) {
- 1000000
-} else {
- 10
-};
-
-// Timeouts for item types in passed blocks
-pub const NFT_SPONSOR_TRANSFER_TIMEOUT: u32 = 5;
-pub const FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT: u32 = 5;
-pub const REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT: u32 = 5;
-
-pub const SPONSOR_APPROVE_TIMEOUT: u32 = 5;
-
-// Schema limits
-pub const OFFCHAIN_SCHEMA_LIMIT: u32 = 1024;
-pub const VARIABLE_ON_CHAIN_SCHEMA_LIMIT: u32 = 1024;
-pub const CONST_ON_CHAIN_SCHEMA_LIMIT: u32 = 1024;
-
-pub const MAX_COLLECTION_NAME_LENGTH: usize = 64;
-pub const MAX_COLLECTION_DESCRIPTION_LENGTH: usize = 256;
-pub const MAX_TOKEN_PREFIX_LENGTH: usize = 16;
-
-/// How much items can be created per single
-/// create_many call
-pub const MAX_ITEMS_PER_BATCH: u32 = 200;
-
-parameter_types! {
- pub const CustomDataLimit: u32 = CUSTOM_DATA_LIMIT;
-}
-
-#[derive(Encode, Decode, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug, Default, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub struct CollectionId(pub u32);
-impl EncodeLike<u32> for CollectionId {}
-impl EncodeLike<CollectionId> for u32 {}
-
-#[derive(Encode, Decode, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug, Default, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub struct TokenId(pub u32);
-impl EncodeLike<u32> for TokenId {}
-impl EncodeLike<TokenId> for u32 {}
-
-impl TokenId {
- pub fn try_next(self) -> Result<TokenId, ArithmeticError> {
- self.0
- .checked_add(1)
- .ok_or(ArithmeticError::Overflow)
- .map(Self)
- }
-}
-
-impl From<TokenId> for U256 {
- fn from(t: TokenId) -> Self {
- t.0.into()
- }
-}
-
-impl TryFrom<U256> for TokenId {
- type Error = &'static str;
-
- fn try_from(value: U256) -> Result<Self, Self::Error> {
- Ok(TokenId(value.try_into().map_err(|_| "too large token id")?))
- }
-}
-
-pub struct OverflowError;
-impl From<OverflowError> for &'static str {
- fn from(_: OverflowError) -> Self {
- "overflow occured"
- }
-}
-
-pub type DecimalPoints = u8;
-
-#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub enum CollectionMode {
- NFT,
- // decimal points
- Fungible(DecimalPoints),
- ReFungible,
-}
-
-impl CollectionMode {
- pub fn id(&self) -> u8 {
- match self {
- CollectionMode::NFT => 1,
- CollectionMode::Fungible(_) => 2,
- CollectionMode::ReFungible => 3,
- }
- }
-}
-
-pub trait SponsoringResolve<AccountId, Call> {
- fn resolve(who: &AccountId, call: &Call) -> Option<AccountId>;
-}
-
-#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub enum AccessMode {
- Normal,
- AllowList,
-}
-impl Default for AccessMode {
- fn default() -> Self {
- Self::Normal
- }
-}
-
-#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub enum SchemaVersion {
- ImageURL,
- Unique,
-}
-impl Default for SchemaVersion {
- fn default() -> Self {
- Self::ImageURL
- }
-}
-
-#[derive(Encode, Decode, Default, Debug, Clone, PartialEq, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub struct Ownership<AccountId> {
- pub owner: AccountId,
- pub fraction: u128,
-}
-
-#[derive(Encode, Decode, Debug, Clone, PartialEq, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub enum SponsorshipState<AccountId> {
- /// The fees are applied to the transaction sender
- Disabled,
- Unconfirmed(AccountId),
- /// Transactions are sponsored by specified account
- Confirmed(AccountId),
-}
-
-impl<AccountId> SponsorshipState<AccountId> {
- pub fn sponsor(&self) -> Option<&AccountId> {
- match self {
- Self::Confirmed(sponsor) => Some(sponsor),
- _ => None,
- }
- }
-
- pub fn pending_sponsor(&self) -> Option<&AccountId> {
- match self {
- Self::Unconfirmed(sponsor) | Self::Confirmed(sponsor) => Some(sponsor),
- _ => None,
- }
- }
-
- pub fn confirmed(&self) -> bool {
- matches!(self, Self::Confirmed(_))
- }
-}
-
-impl<T> Default for SponsorshipState<T> {
- fn default() -> Self {
- Self::Disabled
- }
-}
-
-#[derive(Encode, Decode, Clone, PartialEq, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub struct Collection<AccountId> {
- pub owner: AccountId,
- pub mode: CollectionMode,
- pub access: AccessMode,
- pub name: Vec<u16>, // 64 include null escape char
- pub description: Vec<u16>, // 256 include null escape char
- pub token_prefix: Vec<u8>, // 16 include null escape char
- pub mint_mode: bool,
- pub offchain_schema: Vec<u8>,
- pub schema_version: SchemaVersion,
- pub sponsorship: SponsorshipState<AccountId>,
- pub limits: CollectionLimits, // Collection private restrictions
- pub variable_on_chain_schema: Vec<u8>, //
- pub const_on_chain_schema: Vec<u8>, //
- pub meta_update_permission: MetaUpdatePermission,
-}
-
-#[derive(Encode, Decode, Debug, Clone, PartialEq, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub struct NftItemType<AccountId> {
- pub owner: AccountId,
- pub const_data: Vec<u8>,
- pub variable_data: Vec<u8>,
-}
-
-#[derive(Encode, Decode, Default, Debug, Clone, PartialEq, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub struct FungibleItemType {
- pub value: u128,
-}
-
-#[derive(Encode, Decode, Debug, Clone, PartialEq, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub struct ReFungibleItemType<AccountId> {
- pub owner: Vec<Ownership<AccountId>>,
- pub const_data: Vec<u8>,
- pub variable_data: Vec<u8>,
-}
-
-/// All fields are wrapped in `Option`s, where None means chain default
-#[derive(Encode, Decode, Debug, Default, Clone, PartialEq, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub struct CollectionLimits {
- pub account_token_ownership_limit: Option<u32>,
- pub sponsored_data_size: Option<u32>,
- /// None - setVariableMetadata is not sponsored
- /// Some(v) - setVariableMetadata is sponsored
- /// if there is v block between txs
- pub sponsored_data_rate_limit: Option<(Option<u32>,)>,
- pub token_limit: Option<u32>,
-
- // Timeouts for item types in passed blocks
- pub sponsor_transfer_timeout: Option<u32>,
- pub sponsor_approve_timeout: Option<u32>,
- pub owner_can_transfer: Option<bool>,
- pub owner_can_destroy: Option<bool>,
- pub transfers_enabled: Option<bool>,
-}
-
-impl CollectionLimits {
- pub fn account_token_ownership_limit(&self) -> u32 {
- self.account_token_ownership_limit
- .unwrap_or(ACCOUNT_TOKEN_OWNERSHIP_LIMIT)
- .min(MAX_TOKEN_OWNERSHIP)
- }
- pub fn sponsored_data_size(&self) -> u32 {
- self.sponsored_data_size
- .unwrap_or(CUSTOM_DATA_LIMIT)
- .min(CUSTOM_DATA_LIMIT)
- }
- pub fn token_limit(&self) -> u32 {
- self.token_limit
- .unwrap_or(COLLECTION_TOKEN_LIMIT)
- .min(COLLECTION_TOKEN_LIMIT)
- }
- pub fn sponsor_transfer_timeout(&self, default: u32) -> u32 {
- self.sponsor_transfer_timeout
- .unwrap_or(default)
- .min(MAX_SPONSOR_TIMEOUT)
- }
- pub fn sponsor_approve_timeout(&self) -> u32 {
- self.sponsor_approve_timeout
- .unwrap_or(SPONSOR_APPROVE_TIMEOUT)
- .min(MAX_SPONSOR_TIMEOUT)
- }
- pub fn owner_can_transfer(&self) -> bool {
- self.owner_can_transfer.unwrap_or(true)
- }
- pub fn owner_can_destroy(&self) -> bool {
- self.owner_can_destroy.unwrap_or(true)
- }
- pub fn transfers_enabled(&self) -> bool {
- self.transfers_enabled.unwrap_or(true)
- }
- pub fn sponsored_data_rate_limit(&self) -> Option<u32> {
- self.sponsored_data_rate_limit
- .unwrap_or((None,))
- .0
- .map(|v| v.min(MAX_SPONSOR_TIMEOUT))
- }
-}
-
-/// BoundedVec doesn't supports serde
-#[cfg(feature = "serde1")]
-mod bounded_serde {
- use core::convert::TryFrom;
- use frame_support::{BoundedVec, traits::Get};
- use serde::{
- ser::{self, Serialize},
- de::{self, Deserialize, Error},
- };
- use sp_std::vec::Vec;
-
- pub fn serialize<D, V, S>(value: &BoundedVec<V, S>, serializer: D) -> Result<D::Ok, D::Error>
- where
- D: ser::Serializer,
- V: Serialize,
- {
- (value as &Vec<_>).serialize(serializer)
- }
-
- pub fn deserialize<'de, D, V, S>(deserializer: D) -> Result<BoundedVec<V, S>, D::Error>
- where
- D: de::Deserializer<'de>,
- V: de::Deserialize<'de>,
- S: Get<u32>,
- {
- // TODO: Implement custom visitor, which will limit vec size at parse time? Will serde only be used by chainspec?
- let vec = <Vec<V>>::deserialize(deserializer)?;
- let len = vec.len();
- TryFrom::try_from(vec).map_err(|_| D::Error::invalid_length(len, &"lesser size"))
- }
-}
-
-#[derive(Encode, Decode, MaxEncodedLen, Default, PartialEq, Clone, Derivative, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-#[derivative(Debug)]
-pub struct CreateNftData {
- #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
- #[derivative(Debug = "ignore")]
- pub const_data: BoundedVec<u8, CustomDataLimit>,
- #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
- #[derivative(Debug = "ignore")]
- pub variable_data: BoundedVec<u8, CustomDataLimit>,
-}
-
-#[derive(Encode, Decode, MaxEncodedLen, Default, Debug, Clone, PartialEq, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub struct CreateFungibleData {
- pub value: u128,
-}
-
-#[derive(Encode, Decode, MaxEncodedLen, Default, PartialEq, Clone, Derivative, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-#[derivative(Debug)]
-pub struct CreateReFungibleData {
- #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
- #[derivative(Debug = "ignore")]
- pub const_data: BoundedVec<u8, CustomDataLimit>,
- #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
- #[derivative(Debug = "ignore")]
- pub variable_data: BoundedVec<u8, CustomDataLimit>,
- pub pieces: u128,
-}
-
-#[derive(Encode, Decode, Debug, Clone, PartialEq, TypeInfo)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
-pub enum MetaUpdatePermission {
- ItemOwner,
- Admin,
- None,
-}
-
-impl Default for MetaUpdatePermission {
- fn default() -> Self {
- Self::ItemOwner
- }
-}
-
-#[derive(Encode, Decode, MaxEncodedLen, PartialEq, Clone, Debug, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub enum CreateItemData {
- NFT(CreateNftData),
- Fungible(CreateFungibleData),
- ReFungible(CreateReFungibleData),
-}
-
-impl CreateItemData {
- pub fn data_size(&self) -> usize {
- match self {
- CreateItemData::NFT(data) => data.variable_data.len() + data.const_data.len(),
- CreateItemData::ReFungible(data) => data.variable_data.len() + data.const_data.len(),
- _ => 0,
- }
- }
-}
-
-impl From<CreateNftData> for CreateItemData {
- fn from(item: CreateNftData) -> Self {
- CreateItemData::NFT(item)
- }
-}
-
-impl From<CreateReFungibleData> for CreateItemData {
- fn from(item: CreateReFungibleData) -> Self {
- CreateItemData::ReFungible(item)
- }
-}
-
-impl From<CreateFungibleData> for CreateItemData {
- fn from(item: CreateFungibleData) -> Self {
- CreateItemData::Fungible(item)
- }
-}
-
-#[derive(Encode, Decode, MaxEncodedLen, PartialEq, Clone, Debug, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub struct CollectionStats {
- pub created: u32,
- pub destroyed: u32,
- pub alive: u32,
-}
primitives/rpc/Cargo.tomldiffbeforeafterboth--- a/primitives/rpc/Cargo.toml
+++ b/primitives/rpc/Cargo.toml
@@ -5,7 +5,7 @@
[dependencies]
pallet-common = { default-features = false, path = '../../pallets/common' }
-nft-data-structs = { default-features = false, path = '../nft' }
+up-data-structs = { default-features = false, path = '../data-structs' }
codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false, features = [
"derive",
] }
@@ -23,5 +23,5 @@
"sp-api/std",
"sp-runtime/std",
"pallet-common/std",
- "nft-data-structs/std",
+ "up-data-structs/std",
]
primitives/rpc/src/lib.rsdiffbeforeafterboth--- a/primitives/rpc/src/lib.rs
+++ b/primitives/rpc/src/lib.rs
@@ -1,12 +1,12 @@
#![cfg_attr(not(feature = "std"), no_std)]
-use nft_data_structs::{CollectionId, TokenId, Collection, CollectionStats};
+use up_data_structs::{CollectionId, TokenId, Collection, CollectionStats};
use sp_std::vec::Vec;
use sp_core::H160;
use codec::Decode;
sp_api::decl_runtime_apis! {
- pub trait NftApi<CrossAccountId, AccountId> where
+ pub trait UniqueApi<CrossAccountId, AccountId> where
AccountId: Decode,
CrossAccountId: pallet_common::account::CrossAccountId<AccountId>,
{
runtime/Cargo.tomldiffbeforeafterboth--- a/runtime/Cargo.toml
+++ b/runtime/Cargo.toml
@@ -4,12 +4,12 @@
[package]
authors = ['Unique Network <support@uniquenetwork.io>']
build = 'build.rs'
-description = 'Substrate node nft'
+description = 'Unique Runtime'
edition = '2018'
homepage = 'https://unique.network'
license = 'All Rights Reserved'
-name = 'nft-runtime'
-repository = 'https://github.com/usetech-llc/nft_private/'
+name = 'unique-runtime'
+repository = 'https://github.com/UniqueNetwork/unique-chain'
version = '0.9.12'
[package.metadata.docs.rs]
@@ -32,7 +32,7 @@
'pallet-fungible/runtime-benchmarks',
'pallet-refungible/runtime-benchmarks',
'pallet-nonfungible/runtime-benchmarks',
- 'pallet-nft/runtime-benchmarks',
+ 'pallet-unique/runtime-benchmarks',
'pallet-inflation/runtime-benchmarks',
'pallet-xcm/runtime-benchmarks',
'sp-runtime/runtime-benchmarks',
@@ -80,10 +80,10 @@
'pallet-fungible/std',
'pallet-refungible/std',
'pallet-nonfungible/std',
- 'pallet-nft/std',
+ 'pallet-unique/std',
'pallet-unq-scheduler/std',
- 'pallet-nft-charge-transaction/std',
- 'nft-data-structs/std',
+ 'pallet-charge-transaction/std',
+ 'up-data-structs/std',
'sp-api/std',
'sp-block-builder/std',
"sp-consensus-aura/std",
@@ -102,7 +102,7 @@
"orml-vesting/std",
]
-limit-testing = ['pallet-nft/limit-testing', 'nft-data-structs/limit-testing']
+limit-testing = ['pallet-unique/limit-testing', 'up-data-structs/limit-testing']
################################################################################
# Substrate Dependencies
@@ -376,18 +376,18 @@
"derive",
] }
derivative = "2.2.0"
-pallet-nft = { path = '../pallets/nft', default-features = false, version = '3.0.0' }
+pallet-unique = { path = '../pallets/unique', default-features = false }
up-rpc = { path = "../primitives/rpc", default-features = false }
up-evm-mapping = { path = "../primitives/evm-mapping", default-features = false }
-pallet-inflation = { path = '../pallets/inflation', default-features = false, version = '3.0.0' }
-nft-data-structs = { path = '../primitives/nft', default-features = false, version = '0.9.0' }
+pallet-inflation = { path = '../pallets/inflation', default-features = false }
+up-data-structs = { path = '../primitives/data-structs', default-features = false }
pallet-common = { default-features = false, path = "../pallets/common" }
pallet-fungible = { default-features = false, path = "../pallets/fungible" }
pallet-refungible = { default-features = false, path = "../pallets/refungible" }
pallet-nonfungible = { default-features = false, path = "../pallets/nonfungible" }
-pallet-unq-scheduler = { path = '../pallets/scheduler', default-features = false, version = '3.0.0' }
+pallet-unq-scheduler = { path = '../pallets/scheduler', default-features = false }
# pallet-contract-helpers = { path = '../pallets/contract-helpers', default-features = false, version = '0.1.0' }
-pallet-nft-charge-transaction = { git = "https://github.com/UniqueNetwork/pallet-sponsoring", package = "pallet-template-transaction-payment", default-features = false, version = '3.0.0' }
+pallet-charge-transaction = { git = "https://github.com/UniqueNetwork/pallet-sponsoring", package = "pallet-template-transaction-payment", default-features = false, version = '3.0.0' }
pallet-evm-migration = { path = '../pallets/evm-migration', default-features = false }
pallet-evm-contract-helpers = { path = '../pallets/evm-contract-helpers', default-features = false }
pallet-evm-transaction-payment = { path = '../pallets/evm-transaction-payment', default-features = false }
runtime/src/lib.rsdiffbeforeafterboth--- a/runtime/src/lib.rs
+++ b/runtime/src/lib.rs
@@ -53,7 +53,7 @@
WeightToFeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients,
},
};
-use nft_data_structs::*;
+use up_data_structs::*;
// use pallet_contracts::weights::WeightInfo;
// #[cfg(any(feature = "std", test))]
use frame_system::{
@@ -146,7 +146,7 @@
spec_name: create_runtime_str!("opal"),
impl_name: create_runtime_str!("opal"),
authoring_version: 1,
- spec_version: 912202,
+ spec_version: 912204,
impl_version: 1,
apis: RUNTIME_API_VERSIONS,
transaction_version: 1,
@@ -287,7 +287,7 @@
type Event = Event;
type OnMethodCall = (
pallet_evm_migration::OnMethodCall<Self>,
- pallet_nft::NftErcSupport<Self>,
+ pallet_unique::UniqueErcSupport<Self>,
pallet_evm_contract_helpers::HelpersOnMethodCall<Self>,
);
type OnCreate = pallet_evm_contract_helpers::HelpersOnCreate<Self>;
@@ -780,9 +780,8 @@
type WeightInfo = pallet_nonfungible::weights::SubstrateWeight<Self>;
}
-/// Used for the pallet nft in `./nft.rs`
-impl pallet_nft::Config for Runtime {
- type WeightInfo = pallet_nft::weights::SubstrateWeight<Self>;
+impl pallet_unique::Config for Runtime {
+ type WeightInfo = pallet_unique::weights::SubstrateWeight<Self>;
}
parameter_types! {
@@ -803,11 +802,11 @@
// }
type EvmSponsorshipHandler = (
- pallet_nft::NftEthSponsorshipHandler<Runtime>,
+ pallet_unique::UniqueEthSponsorshipHandler<Runtime>,
pallet_evm_contract_helpers::HelpersContractSponsoring<Runtime>,
);
type SponsorshipHandler = (
- pallet_nft::NftSponsorshipHandler<Runtime>,
+ pallet_unique::UniqueSponsorshipHandler<Runtime>,
//pallet_contract_helpers::ContractSponsorshipHandler<Runtime>,
pallet_evm_transaction_payment::BridgeSponsorshipHandler<Runtime>,
);
@@ -831,7 +830,7 @@
type EvmBackwardsAddressMapping = up_evm_mapping::MapBackwardsAddressTruncated;
}
-impl pallet_nft_charge_transaction::Config for Runtime {
+impl pallet_charge_transaction::Config for Runtime {
type SponsorshipHandler = SponsorshipHandler;
}
@@ -882,10 +881,10 @@
// Unique Pallets
Inflation: pallet_inflation::{Pallet, Call, Storage} = 60,
- Nft: pallet_nft::{Pallet, Call, Storage} = 61,
+ Unique: pallet_unique::{Pallet, Call, Storage} = 61,
// Scheduler: pallet_unq_scheduler::{Pallet, Call, Storage, Event<T>} = 62,
// free = 63
- Charging: pallet_nft_charge_transaction::{Pallet, Call, Storage } = 64,
+ Charging: pallet_charge_transaction::{Pallet, Call, Storage } = 64,
// ContractHelpers: pallet_contract_helpers::{Pallet, Call, Storage} = 65,
Common: pallet_common::{Pallet, Storage, Event<T>} = 66,
Fungible: pallet_fungible::{Pallet, Storage} = 67,
@@ -945,7 +944,7 @@
system::CheckEra<Runtime>,
system::CheckNonce<Runtime>,
system::CheckWeight<Runtime>,
- pallet_nft_charge_transaction::ChargeTransactionPayment<Runtime>,
+ pallet_charge_transaction::ChargeTransactionPayment<Runtime>,
//pallet_contract_helpers::ContractHelpersExtension<Runtime>,
);
/// Unchecked extrinsic type as expected by this runtime.
@@ -1015,9 +1014,9 @@
}
}
-macro_rules! dispatch_nft_runtime {
+macro_rules! dispatch_unique_runtime {
($collection:ident.$method:ident($($name:ident),*)) => {{
- use pallet_nft::dispatch::Dispatched;
+ use pallet_unique::dispatch::Dispatched;
let collection = Dispatched::dispatch(<pallet_common::CollectionHandle<Runtime>>::new($collection).unwrap());
let dispatch = collection.as_dyn();
@@ -1026,34 +1025,34 @@
}};
}
impl_runtime_apis! {
- impl up_rpc::NftApi<Block, CrossAccountId, AccountId>
+ impl up_rpc::UniqueApi<Block, CrossAccountId, AccountId>
for Runtime
{
fn account_tokens(collection: CollectionId, account: CrossAccountId) -> Vec<TokenId> {
- dispatch_nft_runtime!(collection.account_tokens(account))
+ dispatch_unique_runtime!(collection.account_tokens(account))
}
fn token_exists(collection: CollectionId, token: TokenId) -> bool {
- dispatch_nft_runtime!(collection.token_exists(token))
+ dispatch_unique_runtime!(collection.token_exists(token))
}
fn token_owner(collection: CollectionId, token: TokenId) -> CrossAccountId {
- dispatch_nft_runtime!(collection.token_owner(token))
+ dispatch_unique_runtime!(collection.token_owner(token))
}
fn const_metadata(collection: CollectionId, token: TokenId) -> Vec<u8> {
- dispatch_nft_runtime!(collection.const_metadata(token))
+ dispatch_unique_runtime!(collection.const_metadata(token))
}
fn variable_metadata(collection: CollectionId, token: TokenId) -> Vec<u8> {
- dispatch_nft_runtime!(collection.variable_metadata(token))
+ dispatch_unique_runtime!(collection.variable_metadata(token))
}
fn collection_tokens(collection: CollectionId) -> u32 {
- dispatch_nft_runtime!(collection.collection_tokens())
+ dispatch_unique_runtime!(collection.collection_tokens())
}
fn account_balance(collection: CollectionId, account: CrossAccountId) -> u32 {
- dispatch_nft_runtime!(collection.account_balance(account))
+ dispatch_unique_runtime!(collection.account_balance(account))
}
fn balance(collection: CollectionId, account: CrossAccountId, token: TokenId) -> u128 {
- dispatch_nft_runtime!(collection.balance(account, token))
+ dispatch_unique_runtime!(collection.balance(account, token))
}
fn allowance(
collection: CollectionId,
@@ -1061,11 +1060,11 @@
spender: CrossAccountId,
token: TokenId,
) -> u128 {
- dispatch_nft_runtime!(collection.allowance(sender, spender, token))
+ dispatch_unique_runtime!(collection.allowance(sender, spender, token))
}
fn eth_contract_code(account: H160) -> Option<Vec<u8>> {
- <pallet_nft::NftErcSupport<Runtime>>::get_code(&account)
+ <pallet_unique::UniqueErcSupport<Runtime>>::get_code(&account)
.or_else(|| <pallet_evm_migration::OnMethodCall<Runtime>>::get_code(&account))
.or_else(|| <pallet_evm_contract_helpers::HelpersOnMethodCall<Self>>::get_code(&account))
}
@@ -1079,7 +1078,7 @@
<pallet_common::Pallet<Runtime>>::allowed(collection, user)
}
fn last_token_id(collection: CollectionId) -> TokenId {
- dispatch_nft_runtime!(collection.last_token_id())
+ dispatch_unique_runtime!(collection.last_token_id())
}
fn collection_by_id(collection: CollectionId) -> Option<Collection<AccountId>> {
<pallet_common::CollectionById<Runtime>>::get(collection)
@@ -1365,7 +1364,7 @@
let mut list = Vec::<BenchmarkList>::new();
list_benchmark!(list, extra, pallet_evm_migration, EvmMigration);
- list_benchmark!(list, extra, pallet_nft, Nft);
+ list_benchmark!(list, extra, pallet_unique, Unique);
list_benchmark!(list, extra, pallet_inflation, Inflation);
list_benchmark!(list, extra, pallet_fungible, Fungible);
list_benchmark!(list, extra, pallet_refungible, Refungible);
@@ -1399,7 +1398,7 @@
let params = (&config, &allowlist);
add_benchmark!(params, batches, pallet_evm_migration, EvmMigration);
- add_benchmark!(params, batches, pallet_nft, Nft);
+ add_benchmark!(params, batches, pallet_unique, Unique);
add_benchmark!(params, batches, pallet_inflation, Inflation);
add_benchmark!(params, batches, pallet_fungible, Fungible);
add_benchmark!(params, batches, pallet_refungible, Refungible);
tests/Dockerfile-testsdiffbeforeafterboth--- a/tests/Dockerfile-tests
+++ b/tests/Dockerfile-tests
@@ -7,8 +7,8 @@
RUN apt -y update; apt -y upgrade; apt -y install curl
-RUN mkdir nft_parachain
-WORKDIR /nft_parachain
+RUN mkdir unique_parachain
+WORKDIR /unique_parachain
RUN apt-get -y update && \
apt-get -y upgrade && \
tests/README.mddiffbeforeafterboth--- a/tests/README.md
+++ b/tests/README.md
@@ -5,7 +5,7 @@
1. Checkout polkadot in sibling folder with this project
```bash
git clone https://github.com/paritytech/polkadot.git && cd polkadot
-git checkout release-v0.9.9
+git checkout release-v0.9.12
```
2. Build with nightly-2021-11-11
tests/package.jsondiffbeforeafterboth--- a/tests/package.json
+++ b/tests/package.json
@@ -1,7 +1,7 @@
{
- "name": "nfttests",
+ "name": "unique-tests",
"version": "1.0.0",
- "description": "Substrate Nft tests",
+ "description": "Unique Chain Tests",
"main": "",
"devDependencies": {
"@polkadot/dev": "0.63.18",
tests/src/addCollectionAdmin.test.tsdiffbeforeafterboth--- a/tests/src/addCollectionAdmin.test.ts
+++ b/tests/src/addCollectionAdmin.test.ts
@@ -23,7 +23,7 @@
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.owner.toString()).to.be.equal(alice.address);
- const changeAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
+ const changeAdminTx = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
await submitTransactionAsync(alice, changeAdminTx);
const adminListAfterAddAdmin = await getAdminList(api, collectionId);
@@ -41,13 +41,13 @@
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.owner.toString()).to.be.equal(alice.address);
- const changeAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
+ const changeAdminTx = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
await submitTransactionAsync(alice, changeAdminTx);
const adminListAfterAddAdmin = await getAdminList(api, collectionId);
expect(adminListAfterAddAdmin).to.be.deep.contains(normalizeAccountId(bob.address));
- const changeAdminTxCharlie = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(charlie.address));
+ const changeAdminTxCharlie = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(charlie.address));
await submitTransactionAsync(bob, changeAdminTxCharlie);
const adminListAfterAddNewAdmin = await getAdminList(api, collectionId);
expect(adminListAfterAddNewAdmin).to.be.deep.contains(normalizeAccountId(bob.address));
@@ -63,7 +63,7 @@
const alice = privateKey('//Alice');
const nonOwner = privateKey('//Bob_stash');
- const changeAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(alice.address));
+ const changeAdminTx = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(alice.address));
await expect(submitTransactionExpectFailAsync(nonOwner, changeAdminTx)).to.be.rejected;
const adminListAfterAddAdmin = await getAdminList(api, collectionId);
@@ -80,7 +80,7 @@
const alice = privateKey('//Alice');
const bob = privateKey('//Bob');
- const changeOwnerTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
+ const changeOwnerTx = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
await expect(submitTransactionExpectFailAsync(alice, changeOwnerTx)).to.be.rejected;
// Verifying that nothing bad happened (network is live, new collections can be created, etc.)
@@ -94,7 +94,7 @@
const alice = privateKey('//Alice');
const bob = privateKey('//Bob');
await destroyCollectionExpectSuccess(collectionId);
- const changeOwnerTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
+ const changeOwnerTx = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
await expect(submitTransactionExpectFailAsync(alice, changeOwnerTx)).to.be.rejected;
// Verifying that nothing bad happened (network is live, new collections can be created, etc.)
@@ -125,7 +125,7 @@
expect(adminListAfterAddAdmin).to.be.deep.contains(normalizeAccountId(accounts[i]));
}
- const tx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(accounts[chainAdminLimit]));
+ const tx = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(accounts[chainAdminLimit]));
await expect(submitTransactionExpectFailAsync(alice, tx)).to.be.rejected;
});
});
tests/src/addToAllowList.test.tsdiffbeforeafterboth--- a/tests/src/addToAllowList.test.ts
+++ b/tests/src/addToAllowList.test.ts
@@ -59,7 +59,7 @@
const collectionId = await getCreatedCollectionCount(api) + 1;
const bob = privateKey('//Bob');
- const tx = api.tx.nft.addToAllowList(collectionId, normalizeAccountId(bob.address));
+ const tx = api.tx.unique.addToAllowList(collectionId, normalizeAccountId(bob.address));
await expect(submitTransactionExpectFailAsync(alice, tx)).to.be.rejected;
});
});
@@ -71,7 +71,7 @@
// tslint:disable-next-line: no-bitwise
const collectionId = await createCollectionExpectSuccess();
await destroyCollectionExpectSuccess(collectionId);
- const tx = api.tx.nft.addToAllowList(collectionId, normalizeAccountId(bob.address));
+ const tx = api.tx.unique.addToAllowList(collectionId, normalizeAccountId(bob.address));
await expect(submitTransactionExpectFailAsync(alice, tx)).to.be.rejected;
});
});
@@ -83,7 +83,7 @@
const collectionId = await createCollectionExpectSuccess();
await enableAllowListExpectSuccess(alice, collectionId);
await enablePublicMintingExpectSuccess(alice, collectionId);
- const tx = api.tx.nft.createItem(collectionId, normalizeAccountId(ferdie.address), 'NFT');
+ const tx = api.tx.unique.createItem(collectionId, normalizeAccountId(ferdie.address), 'NFT');
await expect(submitTransactionExpectFailAsync(ferdie, tx)).to.be.rejected;
});
});
tests/src/addToContractAllowList.test.tsdiffbeforeafterboth--- a/tests/src/addToContractAllowList.test.ts
+++ b/tests/src/addToContractAllowList.test.ts
@@ -24,10 +24,10 @@
const bob = privateKey('//Bob');
const [contract, deployer] = await deployFlipper(api);
- const allowListedBefore = (await api.query.nft.contractAllowList(contract.address, bob.address)).toJSON();
- const addTx = api.tx.nft.addToContractAllowList(contract.address, bob.address);
+ const allowListedBefore = (await api.query.unique.contractAllowList(contract.address, bob.address)).toJSON();
+ const addTx = api.tx.unique.addToContractAllowList(contract.address, bob.address);
const addEvents = await submitTransactionAsync(deployer, addTx);
- const allowListedAfter = (await api.query.nft.contractAllowList(contract.address, bob.address)).toJSON();
+ const allowListedAfter = (await api.query.unique.contractAllowList(contract.address, bob.address)).toJSON();
expect(getGenericResult(addEvents).success).to.be.true;
expect(allowListedBefore).to.be.false;
@@ -40,12 +40,12 @@
const bob = privateKey('//Bob');
const [contract, deployer] = await deployFlipper(api);
- const allowListedBefore = (await api.query.nft.contractAllowList(contract.address, bob.address)).toJSON();
- const addTx = api.tx.nft.addToContractAllowList(contract.address, bob.address);
+ const allowListedBefore = (await api.query.unique.contractAllowList(contract.address, bob.address)).toJSON();
+ const addTx = api.tx.unique.addToContractAllowList(contract.address, bob.address);
const addEvents = await submitTransactionAsync(deployer, addTx);
- const allowListedAfter = (await api.query.nft.contractAllowList(contract.address, bob.address)).toJSON();
+ const allowListedAfter = (await api.query.unique.contractAllowList(contract.address, bob.address)).toJSON();
const addAgainEvents = await submitTransactionAsync(deployer, addTx);
- const allowListedAgainAfter = (await api.query.nft.contractAllowList(contract.address, bob.address)).toJSON();
+ const allowListedAgainAfter = (await api.query.unique.contractAllowList(contract.address, bob.address)).toJSON();
expect(getGenericResult(addEvents).success).to.be.true;
expect(allowListedBefore).to.be.false;
@@ -64,10 +64,10 @@
const bob = privateKey('//Bob');
const charlieGuineaPig = privateKey('//Charlie');
- const allowListedBefore = (await api.query.nft.contractAllowList(charlieGuineaPig.address, bob.address)).toJSON();
- const addTx = api.tx.nft.addToContractAllowList(charlieGuineaPig.address, bob.address);
+ const allowListedBefore = (await api.query.unique.contractAllowList(charlieGuineaPig.address, bob.address)).toJSON();
+ const addTx = api.tx.unique.addToContractAllowList(charlieGuineaPig.address, bob.address);
await expect(submitTransactionExpectFailAsync(alice, addTx)).to.be.rejected;
- const allowListedAfter = (await api.query.nft.contractAllowList(charlieGuineaPig.address, bob.address)).toJSON();
+ const allowListedAfter = (await api.query.unique.contractAllowList(charlieGuineaPig.address, bob.address)).toJSON();
expect(allowListedBefore).to.be.false;
expect(allowListedAfter).to.be.false;
@@ -79,10 +79,10 @@
const bob = privateKey('//Bob');
const [contract] = await deployFlipper(api);
- const allowListedBefore = (await api.query.nft.contractAllowList(contract.address, bob.address)).toJSON();
- const addTx = api.tx.nft.addToContractAllowList(contract.address, bob.address);
+ const allowListedBefore = (await api.query.unique.contractAllowList(contract.address, bob.address)).toJSON();
+ const addTx = api.tx.unique.addToContractAllowList(contract.address, bob.address);
await expect(submitTransactionExpectFailAsync(bob, addTx)).to.be.rejected;
- const allowListedAfter = (await api.query.nft.contractAllowList(contract.address, bob.address)).toJSON();
+ const allowListedAfter = (await api.query.unique.contractAllowList(contract.address, bob.address)).toJSON();
expect(allowListedBefore).to.be.false;
expect(allowListedAfter).to.be.false;
tests/src/allowLists.test.tsdiffbeforeafterboth--- a/tests/src/allowLists.test.ts
+++ b/tests/src/allowLists.test.ts
@@ -189,7 +189,7 @@
await enableAllowListExpectSuccess(alice, collectionId);
await usingApi(async (api) => {
- const tx = api.tx.nft.burnItem(collectionId, itemId, /*normalizeAccountId(Alice.address),*/ 11);
+ const tx = api.tx.unique.burnItem(collectionId, itemId, /*normalizeAccountId(Alice.address),*/ 11);
const badTransaction = async function () {
await submitTransactionExpectFailAsync(alice, tx);
};
tests/src/approve.test.tsdiffbeforeafterboth--- a/tests/src/approve.test.ts
+++ b/tests/src/approve.test.ts
@@ -24,7 +24,6 @@
} from './util/helpers';
chai.use(chaiAsPromised);
-const expect = chai.expect;
describe('Integration Test approve(spender, collection_id, item_id, amount):', () => {
let alice: IKeyringPair;
@@ -102,13 +101,13 @@
});
it('Fungible up to an approved amount', async () => {
- const collectionId = await createCollectionExpectSuccess({ mode:{ type: 'Fungible', decimalPoints: 0 }});
+ const collectionId = await createCollectionExpectSuccess({mode:{type: 'Fungible', decimalPoints: 0}});
const itemId = await createItemExpectSuccess(alice, collectionId, 'Fungible', bob.address);
await approveExpectSuccess(collectionId, itemId, bob, charlie.address);
});
it('ReFungible up to an approved amount', async () => {
- const collectionId = await createCollectionExpectSuccess({ mode:{ type: 'ReFungible' } });
+ const collectionId = await createCollectionExpectSuccess({mode:{type: 'ReFungible'}});
const itemId = await createItemExpectSuccess(alice, collectionId, 'ReFungible', bob.address);
await approveExpectSuccess(collectionId, itemId, bob, charlie.address);
});
@@ -135,14 +134,14 @@
});
it('Fungible up to an approved amount', async () => {
- const collectionId = await createCollectionExpectSuccess({ mode:{ type: 'Fungible', decimalPoints: 0 }});
+ const collectionId = await createCollectionExpectSuccess({mode:{type: 'Fungible', decimalPoints: 0}});
const itemId = await createItemExpectSuccess(alice, collectionId, 'Fungible', bob.address);
await approveExpectSuccess(collectionId, itemId, bob, charlie.address);
await transferFromExpectSuccess(collectionId, itemId, charlie, bob, alice, 1, 'Fungible');
});
it('ReFungible up to an approved amount', async () => {
- const collectionId = await createCollectionExpectSuccess({ mode:{ type: 'ReFungible' } });
+ const collectionId = await createCollectionExpectSuccess({mode:{type: 'ReFungible'}});
const itemId = await createItemExpectSuccess(alice, collectionId, 'ReFungible', bob.address);
await approveExpectSuccess(collectionId, itemId, bob, charlie.address);
await transferFromExpectSuccess(collectionId, itemId, charlie, bob, alice, 1, 'ReFungible');
@@ -171,7 +170,7 @@
});
it('Fungible up to an approved amount', async () => {
- const collectionId = await createCollectionExpectSuccess({ mode:{ type: 'Fungible', decimalPoints: 0 }});
+ const collectionId = await createCollectionExpectSuccess({mode:{type: 'Fungible', decimalPoints: 0}});
const itemId = await createItemExpectSuccess(alice, collectionId, 'Fungible', bob.address);
await approveExpectSuccess(collectionId, itemId, bob, charlie.address);
await transferFromExpectSuccess(collectionId, itemId, charlie, bob, alice, 1, 'Fungible');
@@ -179,7 +178,7 @@
});
it('ReFungible up to an approved amount', async () => {
- const collectionId = await createCollectionExpectSuccess({ mode:{ type: 'ReFungible' } });
+ const collectionId = await createCollectionExpectSuccess({mode:{type: 'ReFungible'}});
const itemId = await createItemExpectSuccess(alice, collectionId, 'ReFungible', bob.address);
await approveExpectSuccess(collectionId, itemId, bob, charlie.address);
await transferFromExpectSuccess(collectionId, itemId, charlie, bob, alice, 1, 'ReFungible');
@@ -203,7 +202,7 @@
});
it('If a user B is approved to transfer 10 Fungible tokens from user A, they can transfer 2 tokens to user C, which will result in decreasing approval from 10 to 8. Then user B can transfer 8 tokens to user D.', async () => {
- const collectionId = await createCollectionExpectSuccess({ mode:{ type: 'Fungible', decimalPoints: 0 }});
+ const collectionId = await createCollectionExpectSuccess({mode:{type: 'Fungible', decimalPoints: 0}});
const itemId = await createItemExpectSuccess(alice, collectionId, 'Fungible', alice.address);
await approveExpectSuccess(collectionId, itemId, alice, bob.address, 10);
await transferFromExpectSuccess(collectionId, itemId, bob, alice, charlie, 2, 'Fungible');
@@ -306,7 +305,7 @@
});
it('Fungible up to an approved amount', async () => {
- const collectionId = await createCollectionExpectSuccess({ mode:{ type: 'Fungible', decimalPoints: 0 }});
+ const collectionId = await createCollectionExpectSuccess({mode:{type: 'Fungible', decimalPoints: 0}});
const itemId = await createItemExpectSuccess(alice, collectionId, 'Fungible', charlie.address);
await transferFromExpectSuccess(collectionId, itemId, alice, charlie, dave, 1, 'Fungible');
await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);
@@ -314,7 +313,7 @@
});
it('ReFungible up to an approved amount', async () => {
- const collectionId = await createCollectionExpectSuccess({ mode:{ type: 'ReFungible' } });
+ const collectionId = await createCollectionExpectSuccess({mode:{type: 'ReFungible'}});
const itemId = await createItemExpectSuccess(alice, collectionId, 'ReFungible', charlie.address);
await transferFromExpectSuccess(collectionId, itemId, alice, charlie, dave, 1, 'ReFungible');
await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);
@@ -338,7 +337,7 @@
});
it.skip('Owned 10, approval 1: 1, approval 2: 1, resulting approved value: 2. Fungible', async () => {
- const collectionId = await createCollectionExpectSuccess({ mode:{ type: 'Fungible', decimalPoints: 0 }});
+ const collectionId = await createCollectionExpectSuccess({mode:{type: 'Fungible', decimalPoints: 0}});
await createItemExpectSuccess(alice, collectionId, 'Fungible', alice.address);
await approveExpectSuccess(collectionId, 0, alice, bob.address, 1);
await approveExpectSuccess(collectionId, 0, alice, charlie.address, 1);
@@ -348,7 +347,7 @@
});
it.skip('Owned 10, approval 1: 1, approval 2: 1, resulting approved value: 2. ReFungible', async () => {
- const collectionId = await createCollectionExpectSuccess({ mode:{ type: 'ReFungible' } });
+ const collectionId = await createCollectionExpectSuccess({mode:{type: 'ReFungible'}});
const itemId = await createItemExpectSuccess(alice, collectionId, 'ReFungible', alice.address);
await approveExpectSuccess(collectionId, itemId, alice, bob.address, 1);
await approveExpectSuccess(collectionId, itemId, alice, charlie.address, 1);
@@ -359,7 +358,7 @@
// Canceled by changing approve logic
it.skip('Cannot approve for more than total user`s amount (owned: 10, approval 1: 5 - should succeed, approval 2: 6 - should fail). Fungible', async () => {
- const collectionId = await createCollectionExpectSuccess({ mode:{ type: 'Fungible', decimalPoints: 0 }});
+ const collectionId = await createCollectionExpectSuccess({mode:{type: 'Fungible', decimalPoints: 0}});
await createItemExpectSuccess(alice, collectionId, 'Fungible', dave.address);
await approveExpectSuccess(collectionId, 0, dave, bob.address, 5);
await approveExpectFail(collectionId, 0, dave, charlie, 6);
@@ -367,7 +366,7 @@
// Canceled by changing approve logic
it.skip('Cannot approve for more than total users amount (owned: 100, approval 1: 50 - should succeed, approval 2: 51 - should fail). ReFungible', async () => {
- const collectionId = await createCollectionExpectSuccess({ mode:{ type: 'ReFungible' } });
+ const collectionId = await createCollectionExpectSuccess({mode:{type: 'ReFungible'}});
const itemId = await createItemExpectSuccess(alice, collectionId, 'ReFungible', dave.address);
await approveExpectSuccess(collectionId, itemId, dave, bob.address, 50);
await approveExpectFail(collectionId, itemId, dave, charlie, 51);
tests/src/burnItem.test.tsdiffbeforeafterboth--- a/tests/src/burnItem.test.ts
+++ b/tests/src/burnItem.test.ts
@@ -40,7 +40,7 @@
const tokenId = await createItemExpectSuccess(alice, collectionId, createMode);
await usingApi(async (api) => {
- const tx = api.tx.nft.burnItem(collectionId, tokenId, 1);
+ const tx = api.tx.unique.burnItem(collectionId, tokenId, 1);
const events = await submitTransactionAsync(alice, tx);
const result = getGenericResult(events);
@@ -58,7 +58,7 @@
await usingApi(async (api) => {
// Destroy 1 of 10
- const tx = api.tx.nft.burnItem(collectionId, tokenId, 1);
+ const tx = api.tx.unique.burnItem(collectionId, tokenId, 1);
const events = await submitTransactionAsync(alice, tx);
const result = getGenericResult(events);
@@ -77,7 +77,7 @@
const tokenId = await createItemExpectSuccess(alice, collectionId, createMode);
await usingApi(async (api) => {
- const tx = api.tx.nft.burnItem(collectionId, tokenId, 100);
+ const tx = api.tx.unique.burnItem(collectionId, tokenId, 100);
const events = await submitTransactionAsync(alice, tx);
const result = getGenericResult(events);
@@ -97,7 +97,7 @@
await usingApi(async (api) => {
// Transfer 1/100 of the token to Bob
- const transfertx = api.tx.nft.transfer(normalizeAccountId(bob.address), collectionId, tokenId, 1);
+ const transfertx = api.tx.unique.transfer(normalizeAccountId(bob.address), collectionId, tokenId, 1);
const events1 = await submitTransactionAsync(alice, transfertx);
const result1 = getGenericResult(events1);
@@ -106,7 +106,7 @@
const aliceBalanceBefore = await getBalance(api, collectionId, alice.address, tokenId);
// Bob burns his portion
- const tx = api.tx.nft.burnItem(collectionId, tokenId, 1);
+ const tx = api.tx.unique.burnItem(collectionId, tokenId, 1);
const events2 = await submitTransactionAsync(bob, tx);
const result2 = getGenericResult(events2);
@@ -146,7 +146,7 @@
await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);
await usingApi(async (api) => {
- const tx = api.tx.nft.burnItem(collectionId, tokenId, 1);
+ const tx = api.tx.unique.burnItem(collectionId, tokenId, 1);
const events = await submitTransactionAsync(bob, tx);
const result = getGenericResult(events);
@@ -165,7 +165,7 @@
await usingApi(async (api) => {
// Destroy 1 of 10
- const tx = api.tx.nft.burnFrom(collectionId, normalizeAccountId(alice.address), tokenId, 1);
+ const tx = api.tx.unique.burnFrom(collectionId, normalizeAccountId(alice.address), tokenId, 1);
const events = await submitTransactionAsync(bob, tx);
const result = getGenericResult(events);
@@ -186,7 +186,7 @@
await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);
await usingApi(async (api) => {
- const tx = api.tx.nft.burnFrom(collectionId, normalizeAccountId(alice.address), tokenId, 100);
+ const tx = api.tx.unique.burnFrom(collectionId, normalizeAccountId(alice.address), tokenId, 100);
const events = await submitTransactionAsync(bob, tx);
const result = getGenericResult(events);
// Get alice balance
@@ -213,7 +213,7 @@
await destroyCollectionExpectSuccess(collectionId);
await usingApi(async (api) => {
- const tx = api.tx.nft.burnItem(collectionId, tokenId, 0);
+ const tx = api.tx.unique.burnItem(collectionId, tokenId, 0);
const badTransaction = async function () {
await submitTransactionExpectFailAsync(alice, tx);
};
@@ -228,7 +228,7 @@
const tokenId = 10;
await usingApi(async (api) => {
- const tx = api.tx.nft.burnItem(collectionId, tokenId, 1);
+ const tx = api.tx.unique.burnItem(collectionId, tokenId, 1);
const badTransaction = async function () {
await submitTransactionExpectFailAsync(alice, tx);
};
@@ -243,7 +243,7 @@
const tokenId = await createItemExpectSuccess(alice, collectionId, createMode);
await usingApi(async (api) => {
- const tx = api.tx.nft.burnItem(collectionId, tokenId, 1);
+ const tx = api.tx.unique.burnItem(collectionId, tokenId, 1);
const badTransaction = async function () {
await submitTransactionExpectFailAsync(bob, tx);
};
@@ -259,12 +259,12 @@
await usingApi(async (api) => {
- const burntx = api.tx.nft.burnItem(collectionId, tokenId, 1);
+ const burntx = api.tx.unique.burnItem(collectionId, tokenId, 1);
const events1 = await submitTransactionAsync(alice, burntx);
const result1 = getGenericResult(events1);
expect(result1.success).to.be.true;
- const tx = api.tx.nft.transfer(normalizeAccountId(bob.address), collectionId, tokenId, 1);
+ const tx = api.tx.unique.transfer(normalizeAccountId(bob.address), collectionId, tokenId, 1);
const badTransaction = async function () {
await submitTransactionExpectFailAsync(alice, tx);
};
@@ -282,7 +282,7 @@
await usingApi(async (api) => {
// Destroy 11 of 10
- const tx = api.tx.nft.burnItem(collectionId, tokenId, 11);
+ const tx = api.tx.unique.burnItem(collectionId, tokenId, 11);
const badTransaction = async function () {
await submitTransactionExpectFailAsync(alice, tx);
};
tests/src/change-collection-owner.test.tsdiffbeforeafterboth--- a/tests/src/change-collection-owner.test.ts
+++ b/tests/src/change-collection-owner.test.ts
@@ -38,7 +38,7 @@
const collection =await queryCollectionExpectSuccess(api, collectionId);
expect(collection.owner.toString()).to.be.deep.eq(alice.address);
- const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);
+ const changeOwnerTx = api.tx.unique.changeCollectionOwner(collectionId, bob.address);
await submitTransactionAsync(alice, changeOwnerTx);
const collectionAfterOwnerChange = await queryCollectionExpectSuccess(api, collectionId);
@@ -57,10 +57,10 @@
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.owner.toString()).to.be.deep.eq(alice.address);
- const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);
+ const changeOwnerTx = api.tx.unique.changeCollectionOwner(collectionId, bob.address);
await submitTransactionAsync(alice, changeOwnerTx);
- const badChangeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, alice.address);
+ const badChangeOwnerTx = api.tx.unique.changeCollectionOwner(collectionId, alice.address);
await expect(submitTransactionExpectFailAsync(alice, badChangeOwnerTx)).to.be.rejected;
const collectionAfterOwnerChange = await queryCollectionExpectSuccess(api, collectionId);
@@ -78,7 +78,7 @@
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.owner.toString()).to.be.deep.eq(alice.address);
- const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);
+ const changeOwnerTx = api.tx.unique.changeCollectionOwner(collectionId, bob.address);
await submitTransactionAsync(alice, changeOwnerTx);
const collectionAfterOwnerChange = await queryCollectionExpectSuccess(api, collectionId);
@@ -99,7 +99,7 @@
ownerCanTransfer: true,
ownerCanDestroy: true,
};
- const tx1 = api.tx.nft.setCollectionLimits(
+ const tx1 = api.tx.unique.setCollectionLimits(
collectionId,
collectionLimits,
);
@@ -122,13 +122,13 @@
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.owner.toString()).to.be.deep.eq(alice.address);
- const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);
+ const changeOwnerTx = api.tx.unique.changeCollectionOwner(collectionId, bob.address);
await submitTransactionAsync(alice, changeOwnerTx);
const collectionAfterOwnerChange = await queryCollectionExpectSuccess(api, collectionId);
expect(collectionAfterOwnerChange.owner.toString()).to.be.deep.eq(bob.address);
- const changeOwnerTx2 = api.tx.nft.changeCollectionOwner(collectionId, charlie.address);
+ const changeOwnerTx2 = api.tx.unique.changeCollectionOwner(collectionId, charlie.address);
await submitTransactionAsync(bob, changeOwnerTx2);
// ownership lost
@@ -145,7 +145,7 @@
const alice = privateKey('//Alice');
const bob = privateKey('//Bob');
- const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);
+ const changeOwnerTx = api.tx.unique.changeCollectionOwner(collectionId, bob.address);
await expect(submitTransactionExpectFailAsync(bob, changeOwnerTx)).to.be.rejected;
const collectionAfterOwnerChange = await queryCollectionExpectSuccess(api, collectionId);
@@ -164,7 +164,7 @@
await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);
- const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);
+ const changeOwnerTx = api.tx.unique.changeCollectionOwner(collectionId, bob.address);
await expect(submitTransactionExpectFailAsync(bob, changeOwnerTx)).to.be.rejected;
const collectionAfterOwnerChange = await queryCollectionExpectSuccess(api, collectionId);
@@ -181,7 +181,7 @@
const alice = privateKey('//Alice');
const bob = privateKey('//Bob');
- const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);
+ const changeOwnerTx = api.tx.unique.changeCollectionOwner(collectionId, bob.address);
await expect(submitTransactionExpectFailAsync(alice, changeOwnerTx)).to.be.rejected;
// Verifying that nothing bad happened (network is live, new collections can be created, etc.)
@@ -199,10 +199,10 @@
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.owner.toString()).to.be.deep.eq(alice.address);
- const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);
+ const changeOwnerTx = api.tx.unique.changeCollectionOwner(collectionId, bob.address);
await submitTransactionAsync(alice, changeOwnerTx);
- const badChangeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, alice.address);
+ const badChangeOwnerTx = api.tx.unique.changeCollectionOwner(collectionId, alice.address);
await expect(submitTransactionExpectFailAsync(alice, badChangeOwnerTx)).to.be.rejected;
const collectionAfterOwnerChange = await queryCollectionExpectSuccess(api, collectionId);
@@ -220,7 +220,7 @@
ownerCanTransfer: true,
ownerCanDestroy: true,
};
- const tx1 = api.tx.nft.setCollectionLimits(
+ const tx1 = api.tx.unique.setCollectionLimits(
collectionId,
collectionLimits,
);
tests/src/check-event/burnItemEvent.test.tsdiffbeforeafterboth--- a/tests/src/check-event/burnItemEvent.test.ts
+++ b/tests/src/check-event/burnItemEvent.test.ts
@@ -10,7 +10,7 @@
import chaiAsPromised from 'chai-as-promised';
import privateKey from '../substrate/privateKey';
import usingApi, {submitTransactionAsync} from '../substrate/substrate-api';
-import {createCollectionExpectSuccess, createItemExpectSuccess, nftEventMessage} from '../util/helpers';
+import {createCollectionExpectSuccess, createItemExpectSuccess, uniqueEventMessage} from '../util/helpers';
chai.use(chaiAsPromised);
const expect = chai.expect;
@@ -29,9 +29,9 @@
await usingApi(async (api: ApiPromise) => {
const collectionID = await createCollectionExpectSuccess();
const itemID = await createItemExpectSuccess(alice, collectionID, 'NFT');
- const burnItem = api.tx.nft.burnItem(collectionID, itemID, 1);
+ const burnItem = api.tx.unique.burnItem(collectionID, itemID, 1);
const events = await submitTransactionAsync(alice, burnItem);
- const msg = JSON.stringify(nftEventMessage(events));
+ const msg = JSON.stringify(uniqueEventMessage(events));
expect(msg).to.be.contain(checkSection);
expect(msg).to.be.contain(checkTreasury);
expect(msg).to.be.contain(checkSystem);
tests/src/check-event/createCollectionEvent.test.tsdiffbeforeafterboth--- a/tests/src/check-event/createCollectionEvent.test.ts
+++ b/tests/src/check-event/createCollectionEvent.test.ts
@@ -10,7 +10,7 @@
import chaiAsPromised from 'chai-as-promised';
import privateKey from '../substrate/privateKey';
import usingApi, {submitTransactionAsync} from '../substrate/substrate-api';
-import {nftEventMessage} from '../util/helpers';
+import {uniqueEventMessage} from '../util/helpers';
chai.use(chaiAsPromised);
const expect = chai.expect;
@@ -27,9 +27,9 @@
});
it('Check event from createCollection(): ', async () => {
await usingApi(async (api: ApiPromise) => {
- const tx = api.tx.nft.createCollection([0x31], [0x32], '0x33', 'NFT');
+ const tx = api.tx.unique.createCollection([0x31], [0x32], '0x33', 'NFT');
const events = await submitTransactionAsync(alice, tx);
- const msg = JSON.stringify(nftEventMessage(events));
+ const msg = JSON.stringify(uniqueEventMessage(events));
expect(msg).to.be.contain(checkSection);
expect(msg).to.be.contain(checkTreasury);
expect(msg).to.be.contain(checkSystem);
tests/src/check-event/createItemEvent.test.tsdiffbeforeafterboth--- a/tests/src/check-event/createItemEvent.test.ts
+++ b/tests/src/check-event/createItemEvent.test.ts
@@ -10,7 +10,7 @@
import chaiAsPromised from 'chai-as-promised';
import privateKey from '../substrate/privateKey';
import usingApi, {submitTransactionAsync} from '../substrate/substrate-api';
-import {createCollectionExpectSuccess, nftEventMessage, normalizeAccountId} from '../util/helpers';
+import {createCollectionExpectSuccess, uniqueEventMessage, normalizeAccountId} from '../util/helpers';
chai.use(chaiAsPromised);
const expect = chai.expect;
@@ -28,9 +28,9 @@
it('Check event from createItem(): ', async () => {
await usingApi(async (api: ApiPromise) => {
const collectionID = await createCollectionExpectSuccess();
- const createItem = api.tx.nft.createItem(collectionID, normalizeAccountId(alice.address), 'NFT');
+ const createItem = api.tx.unique.createItem(collectionID, normalizeAccountId(alice.address), 'NFT');
const events = await submitTransactionAsync(alice, createItem);
- const msg = JSON.stringify(nftEventMessage(events));
+ const msg = JSON.stringify(uniqueEventMessage(events));
expect(msg).to.be.contain(checkSection);
expect(msg).to.be.contain(checkTreasury);
expect(msg).to.be.contain(checkSystem);
tests/src/check-event/createMultipleItemsEvent.test.tsdiffbeforeafterboth--- a/tests/src/check-event/createMultipleItemsEvent.test.ts
+++ b/tests/src/check-event/createMultipleItemsEvent.test.ts
@@ -10,7 +10,7 @@
import chaiAsPromised from 'chai-as-promised';
import privateKey from '../substrate/privateKey';
import usingApi, {submitTransactionAsync} from '../substrate/substrate-api';
-import {createCollectionExpectSuccess, nftEventMessage, normalizeAccountId} from '../util/helpers';
+import {createCollectionExpectSuccess, uniqueEventMessage, normalizeAccountId} from '../util/helpers';
chai.use(chaiAsPromised);
const expect = chai.expect;
@@ -29,9 +29,9 @@
await usingApi(async (api: ApiPromise) => {
const collectionID = await createCollectionExpectSuccess();
const args = [{NFT: ['0x31', '0x31']}, {NFT: ['0x32', '0x32']}, {NFT: ['0x33', '0x33']}];
- const createMultipleItems = api.tx.nft.createMultipleItems(collectionID, normalizeAccountId(alice.address), args);
+ const createMultipleItems = api.tx.unique.createMultipleItems(collectionID, normalizeAccountId(alice.address), args);
const events = await submitTransactionAsync(alice, createMultipleItems);
- const msg = JSON.stringify(nftEventMessage(events));
+ const msg = JSON.stringify(uniqueEventMessage(events));
expect(msg).to.be.contain(checkSection);
expect(msg).to.be.contain(checkTreasury);
expect(msg).to.be.contain(checkSystem);
tests/src/check-event/destroyCollectionEvent.test.tsdiffbeforeafterboth--- a/tests/src/check-event/destroyCollectionEvent.test.ts
+++ b/tests/src/check-event/destroyCollectionEvent.test.ts
@@ -10,7 +10,7 @@
import chaiAsPromised from 'chai-as-promised';
import privateKey from '../substrate/privateKey';
import usingApi, {submitTransactionAsync} from '../substrate/substrate-api';
-import {createCollectionExpectSuccess, nftEventMessage} from '../util/helpers';
+import {createCollectionExpectSuccess, uniqueEventMessage} from '../util/helpers';
chai.use(chaiAsPromised);
const expect = chai.expect;
@@ -27,9 +27,9 @@
it('Check event from destroyCollection(): ', async () => {
await usingApi(async (api: ApiPromise) => {
const collectionID = await createCollectionExpectSuccess();
- const destroyCollection = api.tx.nft.destroyCollection(collectionID);
+ const destroyCollection = api.tx.unique.destroyCollection(collectionID);
const events = await submitTransactionAsync(alice, destroyCollection);
- const msg = JSON.stringify(nftEventMessage(events));
+ const msg = JSON.stringify(uniqueEventMessage(events));
expect(msg).to.be.contain(checkTreasury);
expect(msg).to.be.contain(checkSystem);
});
tests/src/check-event/transferEvent.test.tsdiffbeforeafterboth--- a/tests/src/check-event/transferEvent.test.ts
+++ b/tests/src/check-event/transferEvent.test.ts
@@ -10,7 +10,7 @@
import chaiAsPromised from 'chai-as-promised';
import privateKey from '../substrate/privateKey';
import usingApi, {submitTransactionAsync} from '../substrate/substrate-api';
-import {createCollectionExpectSuccess, createItemExpectSuccess, nftEventMessage, normalizeAccountId} from '../util/helpers';
+import {createCollectionExpectSuccess, createItemExpectSuccess, uniqueEventMessage, normalizeAccountId} from '../util/helpers';
chai.use(chaiAsPromised);
const expect = chai.expect;
@@ -31,9 +31,9 @@
await usingApi(async (api: ApiPromise) => {
const collectionID = await createCollectionExpectSuccess();
const itemID = await createItemExpectSuccess(alice, collectionID, 'NFT');
- const transfer = api.tx.nft.transfer(normalizeAccountId(bob.address), collectionID, itemID, 1);
+ const transfer = api.tx.unique.transfer(normalizeAccountId(bob.address), collectionID, itemID, 1);
const events = await submitTransactionAsync(alice, transfer);
- const msg = JSON.stringify(nftEventMessage(events));
+ const msg = JSON.stringify(uniqueEventMessage(events));
expect(msg).to.be.contain(checkSection);
expect(msg).to.be.contain(checkTreasury);
expect(msg).to.be.contain(checkSystem);
tests/src/check-event/transferFromEvent.test.tsdiffbeforeafterboth--- a/tests/src/check-event/transferFromEvent.test.ts
+++ b/tests/src/check-event/transferFromEvent.test.ts
@@ -10,7 +10,7 @@
import chaiAsPromised from 'chai-as-promised';
import privateKey from '../substrate/privateKey';
import usingApi, {submitTransactionAsync} from '../substrate/substrate-api';
-import {createCollectionExpectSuccess, createItemExpectSuccess, nftEventMessage, normalizeAccountId} from '../util/helpers';
+import {createCollectionExpectSuccess, createItemExpectSuccess, uniqueEventMessage, normalizeAccountId} from '../util/helpers';
chai.use(chaiAsPromised);
const expect = chai.expect;
@@ -31,9 +31,9 @@
await usingApi(async (api: ApiPromise) => {
const collectionID = await createCollectionExpectSuccess();
const itemID = await createItemExpectSuccess(alice, collectionID, 'NFT');
- const transferFrom = api.tx.nft.transferFrom(normalizeAccountId(alice.address), normalizeAccountId(bob.address), collectionID, itemID, 1);
+ const transferFrom = api.tx.unique.transferFrom(normalizeAccountId(alice.address), normalizeAccountId(bob.address), collectionID, itemID, 1);
const events = await submitTransactionAsync(alice, transferFrom);
- const msg = JSON.stringify(nftEventMessage(events));
+ const msg = JSON.stringify(uniqueEventMessage(events));
expect(msg).to.be.contain(checkSection);
expect(msg).to.be.contain(checkTreasury);
expect(msg).to.be.contain(checkSystem);
tests/src/collision-tests/admVsOwnerChanges.test.tsdiffbeforeafterboth--- a/tests/src/collision-tests/admVsOwnerChanges.test.ts
+++ b/tests/src/collision-tests/admVsOwnerChanges.test.ts
@@ -34,21 +34,21 @@
await usingApi(async (api) => {
const collectionId = await createCollectionExpectSuccess();
- const changeAdminTxBob = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
+ const changeAdminTxBob = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
await submitTransactionAsync(Alice, changeAdminTxBob);
- const changeAdminTxFerdie = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(Ferdie.address));
+ const changeAdminTxFerdie = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(Ferdie.address));
await submitTransactionAsync(Bob, changeAdminTxFerdie);
const itemId = await createItemExpectSuccess(Ferdie, collectionId, 'NFT');
- const changeOwner = api.tx.nft.transferFrom(normalizeAccountId(Ferdie.address), normalizeAccountId(Bob.address), collectionId, itemId, 1);
- const approve = api.tx.nft.approve(normalizeAccountId(Bob.address), collectionId, itemId, 1);
- const sendItem = api.tx.nft.transfer(normalizeAccountId(Alice.address), collectionId, itemId, 1);
+ const changeOwner = api.tx.unique.transferFrom(normalizeAccountId(Ferdie.address), normalizeAccountId(Bob.address), collectionId, itemId, 1);
+ const approve = api.tx.unique.approve(normalizeAccountId(Bob.address), collectionId, itemId, 1);
+ const sendItem = api.tx.unique.transfer(normalizeAccountId(Alice.address), collectionId, itemId, 1);
await Promise.all([
changeOwner.signAndSend(Alice),
approve.signAndSend(Bob),
sendItem.signAndSend(Ferdie),
]);
- const itemBefore: any = await api.query.nft.nftItemList(collectionId, itemId);
+ const itemBefore: any = await api.query.unique.nftItemList(collectionId, itemId);
expect(itemBefore.owner).not.to.be.eq(Bob.address);
await waitNewBlocks(2);
});
tests/src/collision-tests/admVsOwnerData.test.tsdiffbeforeafterboth--- a/tests/src/collision-tests/admVsOwnerData.test.ts
+++ b/tests/src/collision-tests/admVsOwnerData.test.ts
@@ -32,19 +32,19 @@
const AliceData = 1;
const BobData = 2;
const collectionId = await createCollectionExpectSuccess();
- const changeAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
+ const changeAdminTx = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
await submitTransactionAsync(Alice, changeAdminTx);
const itemId = await createItemExpectSuccess(Bob, collectionId, 'NFT');
//
// tslint:disable-next-line: max-line-length
- const AliceTx = api.tx.nft.setVariableMetaData(collectionId, itemId, AliceData.toString());
+ const AliceTx = api.tx.unique.setVariableMetaData(collectionId, itemId, AliceData.toString());
// tslint:disable-next-line: max-line-length
- const BobTx = api.tx.nft.setVariableMetaData(collectionId, itemId, BobData.toString());
+ const BobTx = api.tx.unique.setVariableMetaData(collectionId, itemId, BobData.toString());
await Promise.all([
AliceTx.signAndSend(Alice),
BobTx.signAndSend(Bob),
]);
- const item: any = await api.query.nft.nftItemList(collectionId, itemId);
+ const item: any = await api.query.unique.nftItemList(collectionId, itemId);
expect(item.variableData).not.to.be.eq(null); // Pseudo-random selection of one of two values
await waitNewBlocks(2);
});
tests/src/collision-tests/admVsOwnerTake.test.tsdiffbeforeafterboth--- a/tests/src/collision-tests/admVsOwnerTake.test.ts
+++ b/tests/src/collision-tests/admVsOwnerTake.test.ts
@@ -33,19 +33,19 @@
it('The collection admin burns the token and in the same block the token owner performs a transaction on it ', async () => {
await usingApi(async (api) => {
const collectionId = await createCollectionExpectSuccess();
- const changeAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
+ const changeAdminTx = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
await submitTransactionAsync(Alice, changeAdminTx);
const itemId = await createItemExpectSuccess(Bob, collectionId, 'NFT');
//
- const sendItem = api.tx.nft.transfer(normalizeAccountId(Ferdie.address), collectionId, itemId, 1);
- const burnItem = api.tx.nft.burnItem(collectionId, itemId, 1);
+ const sendItem = api.tx.unique.transfer(normalizeAccountId(Ferdie.address), collectionId, itemId, 1);
+ const burnItem = api.tx.unique.burnItem(collectionId, itemId, 1);
await Promise.all([
sendItem.signAndSend(Bob),
burnItem.signAndSend(Alice),
]);
await waitNewBlocks(2);
let itemBurn = false;
- itemBurn = (await (api.query.nft.nftItemList(collectionId, itemId))).toJSON() as boolean;
+ itemBurn = (await (api.query.unique.nftItemList(collectionId, itemId))).toJSON() as boolean;
// tslint:disable-next-line: no-unused-expression
expect(itemBurn).to.be.null;
await waitNewBlocks(2);
tests/src/collision-tests/adminDestroyCollection.test.tsdiffbeforeafterboth--- a/tests/src/collision-tests/adminDestroyCollection.test.ts
+++ b/tests/src/collision-tests/adminDestroyCollection.test.ts
@@ -32,19 +32,19 @@
it('Adding an address to the collection allowlist in a block by the admin, and deleting the collection by the owner ', async () => {
await usingApi(async (api) => {
const collectionId = await createCollectionExpectSuccess();
- const changeAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
+ const changeAdminTx = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
await submitTransactionAsync(Alice, changeAdminTx);
await waitNewBlocks(1);
//
- const addAllowlistAdm = api.tx.nft.addToAllowList(collectionId, normalizeAccountId(Ferdie.address));
- const destroyCollection = api.tx.nft.destroyCollection(collectionId);
+ const addAllowlistAdm = api.tx.unique.addToAllowList(collectionId, normalizeAccountId(Ferdie.address));
+ const destroyCollection = api.tx.unique.destroyCollection(collectionId);
await Promise.all([
addAllowlistAdm.signAndSend(Bob),
destroyCollection.signAndSend(Alice),
]);
await waitNewBlocks(1);
let allowList = false;
- allowList = (await api.query.nft.allowList(collectionId, Ferdie.address)).toJSON() as boolean;
+ allowList = (await api.query.unique.allowList(collectionId, Ferdie.address)).toJSON() as boolean;
// tslint:disable-next-line: no-unused-expression
expect(allowList).to.be.false;
await waitNewBlocks(2);
tests/src/collision-tests/adminLimitsOff.test.tsdiffbeforeafterboth--- a/tests/src/collision-tests/adminLimitsOff.test.ts
+++ b/tests/src/collision-tests/adminLimitsOff.test.ts
@@ -39,27 +39,27 @@
await usingApi(async (api) => {
const collectionId = await createCollectionExpectSuccess();
- const chainAdminLimit = (api.consts.nft.collectionAdminsLimit as any).toNumber();
+ const chainAdminLimit = (api.consts.unique.collectionAdminsLimit as any).toNumber();
expect(chainAdminLimit).to.be.equal(5);
- const changeAdminTx1 = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(Eve.address));
+ const changeAdminTx1 = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(Eve.address));
await submitTransactionAsync(Alice, changeAdminTx1);
- const changeAdminTx2 = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(Dave.address));
+ const changeAdminTx2 = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(Dave.address));
await submitTransactionAsync(Alice, changeAdminTx2);
- const changeAdminTx3 = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
+ const changeAdminTx3 = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
await submitTransactionAsync(Alice, changeAdminTx3);
- const addAdmOne = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(Ferdie.address));
- const addAdmTwo = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(Charlie.address));
+ const addAdmOne = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(Ferdie.address));
+ const addAdmTwo = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(Charlie.address));
await Promise.all([
addAdmOne.signAndSend(Bob),
addAdmTwo.signAndSend(Alice),
]);
await waitNewBlocks(2);
- const changeAdminTx4 = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(Alice.address));
+ const changeAdminTx4 = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(Alice.address));
await expect(submitTransactionExpectFailAsync(Alice, changeAdminTx4)).to.be.rejected;
- const adminListAfterAddAdmin: any = (await api.query.nft.adminList(collectionId));
+ const adminListAfterAddAdmin: any = (await api.query.unique.adminList(collectionId));
expect(adminListAfterAddAdmin).to.be.contains(normalizeAccountId(Eve.address));
expect(adminListAfterAddAdmin).to.be.contains(normalizeAccountId(Ferdie.address));
expect(adminListAfterAddAdmin).not.to.be.contains(normalizeAccountId(Alice.address));
tests/src/collision-tests/adminRightsOff.test.tsdiffbeforeafterboth--- a/tests/src/collision-tests/adminRightsOff.test.ts
+++ b/tests/src/collision-tests/adminRightsOff.test.ts
@@ -31,20 +31,20 @@
it('In the block, the collection admin adds a token or changes data, and the collection owner deprives the admin of rights ', async () => {
await usingApi(async (api) => {
const collectionId = await createCollectionExpectSuccess();
- const changeAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
+ const changeAdminTx = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
await submitTransactionAsync(Alice, changeAdminTx);
await waitNewBlocks(1);
const args = [{ nft: ['0x31', '0x31'] }, { nft: ['0x32', '0x32'] }, { nft: ['0x33', '0x33'] }];
- const addItemAdm = api.tx.nft.createMultipleItems(collectionId, normalizeAccountId(Bob.address), args);
- const removeAdm = api.tx.nft.removeCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
+ const addItemAdm = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(Bob.address), args);
+ const removeAdm = api.tx.unique.removeCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
await Promise.all([
addItemAdm.signAndSend(Bob),
removeAdm.signAndSend(Alice),
]);
await waitNewBlocks(2);
- const itemsListIndex = await api.query.nft.itemListIndex(collectionId) as unknown as BN;
+ const itemsListIndex = await api.query.unique.itemListIndex(collectionId) as unknown as BN;
expect(itemsListIndex.toNumber()).to.be.equal(0);
- const adminList: any = (await api.query.nft.adminList(collectionId));
+ const adminList: any = (await api.query.unique.adminList(collectionId));
expect(adminList).not.to.be.contains(normalizeAccountId(Bob.address));
await waitNewBlocks(2);
});
tests/src/collision-tests/setSponsorNewOwner.test.tsdiffbeforeafterboth--- a/tests/src/collision-tests/setSponsorNewOwner.test.ts
+++ b/tests/src/collision-tests/setSponsorNewOwner.test.ts
@@ -34,14 +34,14 @@
const collectionId = await createCollectionExpectSuccess();
await setCollectionSponsorExpectSuccess(collectionId, Bob.address);
await waitNewBlocks(2);
- const confirmSponsorship = api.tx.nft.confirmSponsorship(collectionId);
- const changeCollectionOwner = api.tx.nft.changeCollectionOwner(collectionId, Ferdie.address);
+ const confirmSponsorship = api.tx.unique.confirmSponsorship(collectionId);
+ const changeCollectionOwner = api.tx.unique.changeCollectionOwner(collectionId, Ferdie.address);
await Promise.all([
confirmSponsorship.signAndSend(Bob),
changeCollectionOwner.signAndSend(Alice),
]);
await waitNewBlocks(2);
- const collection: any = (await api.query.nft.collectionById(collectionId)).toJSON();
+ const collection: any = (await api.query.unique.collectionById(collectionId)).toJSON();
expect(collection.sponsorship.confirmed).to.be.eq(Bob.address);
expect(collection.owner).to.be.eq(Ferdie.address);
await waitNewBlocks(2);
tests/src/collision-tests/sponsorPayments.test.tsdiffbeforeafterboth--- a/tests/src/collision-tests/sponsorPayments.test.ts
+++ b/tests/src/collision-tests/sponsorPayments.test.ts
@@ -35,15 +35,15 @@
it('Payment of commission if one block contains transactions for payment from the sponsor\'s balance and his (sponsor\'s) exclusion from the collection ', async () => {
await usingApi(async (api) => {
const collectionId = await createCollectionExpectSuccess();
- const changeAdminTxBob = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
+ const changeAdminTxBob = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
await submitTransactionAsync(Alice, changeAdminTxBob);
const itemId = await createItemExpectSuccess(Bob, collectionId, 'NFT');
await setCollectionSponsorExpectSuccess(collectionId, Bob.address);
await confirmSponsorshipExpectSuccess(collectionId, '//Bob');
const [alicesBalanceBefore, bobsBalanceBefore] = await getBalance(api, [alicesPublicKey, bobsPublicKey]);
- const sendItem = api.tx.nft.transfer(normalizeAccountId(Alice.address), collectionId, itemId, 1);
- const revokeSponsor = api.tx.nft.removeCollectionSponsor(collectionId);
+ const sendItem = api.tx.unique.transfer(normalizeAccountId(Alice.address), collectionId, itemId, 1);
+ const revokeSponsor = api.tx.unique.removeCollectionSponsor(collectionId);
await Promise.all([
sendItem.signAndSend(Bob),
revokeSponsor.signAndSend(Alice),
tests/src/collision-tests/tokenLimitsOff.test.tsdiffbeforeafterboth--- a/tests/src/collision-tests/tokenLimitsOff.test.ts
+++ b/tests/src/collision-tests/tokenLimitsOff.test.ts
@@ -46,7 +46,7 @@
await setMintPermissionExpectSuccess(Alice, collectionId, true);
await addToAllowListExpectSuccess(Alice, collectionId, Ferdie.address);
await addToAllowListExpectSuccess(Alice, collectionId, Bob.address);
- const setCollectionLim = api.tx.nft.setCollectionLimits(
+ const setCollectionLim = api.tx.unique.setCollectionLimits(
collectionId,
{
accountTokenOwnershipLimit,
@@ -65,16 +65,16 @@
await waitNewBlocks(2);
const args = [{ nft: ['0x31', '0x31'] }, { nft: ['0x32', '0x32'] }, { nft: ['0x33', '0x33'] }];
- const mintItemOne = api.tx.nft
+ const mintItemOne = api.tx.unique
.createMultipleItems(collectionId, normalizeAccountId(Ferdie.address), args);
- const mintItemTwo = api.tx.nft
+ const mintItemTwo = api.tx.unique
.createMultipleItems(collectionId, normalizeAccountId(Bob.address), args);
await Promise.all([
mintItemOne.signAndSend(Ferdie),
mintItemTwo.signAndSend(Bob),
]);
await waitNewBlocks(2);
- const itemsListIndexAfter = await api.query.nft.itemListIndex(collectionId) as unknown as BN;
+ const itemsListIndexAfter = await api.query.unique.itemListIndex(collectionId) as unknown as BN;
expect(itemsListIndexAfter.toNumber()).to.be.equal(3);
// TokenLimit = 4. The first transaction is successful. The second should fail.
await waitNewBlocks(2);
tests/src/collision-tests/turnsOffMinting.test.tsdiffbeforeafterboth--- a/tests/src/collision-tests/turnsOffMinting.test.ts
+++ b/tests/src/collision-tests/turnsOffMinting.test.ts
@@ -35,14 +35,14 @@
await setMintPermissionExpectSuccess(Alice, collectionId, true);
await addToAllowListExpectSuccess(Alice, collectionId, Ferdie.address);
- const mintItem = api.tx.nft.createItem(collectionId, normalizeAccountId(Ferdie.address), 'NFT');
- const offMinting = api.tx.nft.setMintPermission(collectionId, false);
+ const mintItem = api.tx.unique.createItem(collectionId, normalizeAccountId(Ferdie.address), 'NFT');
+ const offMinting = api.tx.unique.setMintPermission(collectionId, false);
await Promise.all([
mintItem.signAndSend(Ferdie),
offMinting.signAndSend(Alice),
]);
let itemList = false;
- itemList = (await (api.query.nft.nftItemList(collectionId, mintItem))).toJSON() as boolean;
+ itemList = (await (api.query.unique.nftItemList(collectionId, mintItem))).toJSON() as boolean;
// tslint:disable-next-line: no-unused-expression
expect(itemList).to.be.null;
await waitNewBlocks(2);
tests/src/confirmSponsorship.test.tsdiffbeforeafterboth--- a/tests/src/confirmSponsorship.test.ts
+++ b/tests/src/confirmSponsorship.test.ts
@@ -76,7 +76,7 @@
const itemId = await createItemExpectSuccess(alice, collectionId, 'NFT', zeroBalance.address);
// Transfer this tokens from unused address to Alice
- const zeroToAlice = api.tx.nft.transfer(normalizeAccountId(zeroBalance.address), collectionId, itemId, 0);
+ const zeroToAlice = api.tx.unique.transfer(normalizeAccountId(zeroBalance.address), collectionId, itemId, 0);
const events = await submitTransactionAsync(zeroBalance, zeroToAlice);
const result = getGenericResult(events);
expect(result.success).to.be.true;
@@ -103,7 +103,7 @@
const itemId = await createItemExpectSuccess(alice, collectionId, 'Fungible', zeroBalance.address);
// Transfer this tokens from unused address to Alice
- const zeroToAlice = api.tx.nft.transfer(normalizeAccountId(zeroBalance.address), collectionId, itemId, 1);
+ const zeroToAlice = api.tx.unique.transfer(normalizeAccountId(zeroBalance.address), collectionId, itemId, 1);
const events1 = await submitTransactionAsync(zeroBalance, zeroToAlice);
const result1 = getGenericResult(events1);
expect(result1.success).to.be.true;
@@ -129,7 +129,7 @@
const itemId = await createItemExpectSuccess(alice, collectionId, 'ReFungible', zeroBalance.address);
// Transfer this tokens from unused address to Alice
- const zeroToAlice = api.tx.nft.transfer(normalizeAccountId(zeroBalance.address), collectionId, itemId, 1);
+ const zeroToAlice = api.tx.unique.transfer(normalizeAccountId(zeroBalance.address), collectionId, itemId, 1);
const events1 = await submitTransactionAsync(zeroBalance, zeroToAlice);
const result1 = getGenericResult(events1);
@@ -184,13 +184,13 @@
// Transfer this token from Alice to unused address and back
// Alice to Zero gets sponsored
- const aliceToZero = api.tx.nft.transfer(normalizeAccountId(zeroBalance.address), collectionId, itemId, 0);
+ const aliceToZero = api.tx.unique.transfer(normalizeAccountId(zeroBalance.address), collectionId, itemId, 0);
const events1 = await submitTransactionAsync(alice, aliceToZero);
const result1 = getGenericResult(events1);
// Second transfer should fail
const sponsorBalanceBefore = (await api.query.system.account(bob.address)).data.free.toBigInt();
- const zeroToAlice = api.tx.nft.transfer(normalizeAccountId(alice.address), collectionId, itemId, 0);
+ const zeroToAlice = api.tx.unique.transfer(normalizeAccountId(alice.address), collectionId, itemId, 0);
const badTransaction = async function () {
await submitTransactionExpectFailAsync(zeroBalance, zeroToAlice);
};
@@ -222,7 +222,7 @@
const itemId = await createItemExpectSuccess(alice, collectionId, 'Fungible', zeroBalance.address);
// Transfer this tokens in parts from unused address to Alice
- const zeroToAlice = api.tx.nft.transfer(normalizeAccountId(zeroBalance.address), collectionId, itemId, 1);
+ const zeroToAlice = api.tx.unique.transfer(normalizeAccountId(zeroBalance.address), collectionId, itemId, 1);
const events1 = await submitTransactionAsync(zeroBalance, zeroToAlice);
const result1 = getGenericResult(events1);
expect(result1.success).to.be.true;
@@ -254,7 +254,7 @@
// Mint token for alice
const itemId = await createItemExpectSuccess(alice, collectionId, 'ReFungible', zeroBalance.address);
- const zeroToAlice = api.tx.nft.transfer(normalizeAccountId(alice.address), collectionId, itemId, 1);
+ const zeroToAlice = api.tx.unique.transfer(normalizeAccountId(alice.address), collectionId, itemId, 1);
// Zero to alice gets sponsored
const events1 = await submitTransactionAsync(zeroBalance, zeroToAlice);
tests/src/contracts.test.tsdiffbeforeafterboth--- a/tests/src/contracts.test.ts
+++ b/tests/src/contracts.test.ts
@@ -73,7 +73,7 @@
const collectionId = await createCollectionExpectSuccess();
const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT');
const [contract] = await deployTransferContract(api);
- const changeAdminTx = api.tx.nft.addCollectionAdmin(collectionId, contract.address);
+ const changeAdminTx = api.tx.unique.addCollectionAdmin(collectionId, contract.address);
await submitTransactionAsync(alice, changeAdminTx);
expect(await getTokenOwner(api, collectionId, tokenId)).to.be.deep.equal(normalizeAccountId(alice.address));
@@ -105,7 +105,7 @@
const result = getGenericResult(events);
expect(result.success).to.be.true;
- const tokensAfter = (await api.query.nft.nftItemList.entries(collectionId)).map((kv: any) => kv[1].toJSON());
+ const tokensAfter = (await api.query.unique.nftItemList.entries(collectionId)).map((kv: any) => kv[1].toJSON());
expect(tokensAfter).to.be.deep.equal([
{
owner: bob.address,
@@ -137,7 +137,7 @@
const result = getGenericResult(events);
expect(result.success).to.be.true;
- const tokensAfter: any = (await api.query.nft.nftItemList.entries(collectionId) as any)
+ const tokensAfter: any = (await api.query.unique.nftItemList.entries(collectionId) as any)
.map((kv: any) => kv[1].toJSON())
.sort((a: any, b: any) => a.constData.localeCompare(b.constData));
expect(tokensAfter).to.be.deep.equal([
@@ -195,7 +195,7 @@
const result = getGenericResult(events);
expect(result.success).to.be.true;
- const token: any = (await api.query.nft.nftItemList(collectionId, tokenId) as any).unwrap();
+ const token: any = (await api.query.unique.nftItemList(collectionId, tokenId) as any).unwrap();
expect(token.owner.toString()).to.be.equal(charlie.address);
});
});
@@ -213,7 +213,7 @@
const result = getGenericResult(events);
expect(result.success).to.be.true;
- const token: any = (await api.query.nft.nftItemList(collectionId, tokenId) as any).unwrap();
+ const token: any = (await api.query.unique.nftItemList(collectionId, tokenId) as any).unwrap();
expect(token.variableData.toString()).to.be.equal('0x121314');
});
});
@@ -225,7 +225,7 @@
const collectionId = await createCollectionExpectSuccess();
const [contract] = await deployTransferContract(api);
- const changeAdminTx = api.tx.nft.addCollectionAdmin(collectionId, contract.address);
+ const changeAdminTx = api.tx.unique.addCollectionAdmin(collectionId, contract.address);
await submitTransactionAsync(alice, changeAdminTx);
expect(await isAllowlisted(api, collectionId, bob.address)).to.be.false;
tests/src/createMultipleItems.test.tsdiffbeforeafterboth--- a/tests/src/createMultipleItems.test.ts
+++ b/tests/src/createMultipleItems.test.ts
@@ -34,7 +34,7 @@
expect(itemsListIndexBefore).to.be.equal(0);
const alice = privateKey('//Alice');
const args = [{NFT: ['0x31', '0x31']}, {NFT: ['0x32', '0x32']}, {NFT: ['0x33', '0x33']}];
- const createMultipleItemsTx = api.tx.nft
+ const createMultipleItemsTx = api.tx.unique
.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);
await submitTransactionAsync(alice, createMultipleItemsTx);
const itemsListIndexAfter = await getLastTokenId(api, collectionId);
@@ -65,7 +65,7 @@
{Fungible: {value: 2}},
{Fungible: {value: 3}},
];
- const createMultipleItemsTx = api.tx.nft
+ const createMultipleItemsTx = api.tx.unique
.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);
await submitTransactionAsync(alice, createMultipleItemsTx);
const token1Data = await getBalance(api, collectionId, alice.address, 0);
@@ -85,7 +85,7 @@
{ReFungible: {const_data: [0x32], variable_data: [0x32], pieces: 1}},
{ReFungible: {const_data: [0x33], variable_data: [0x33], pieces: 1}},
];
- const createMultipleItemsTx = api.tx.nft
+ const createMultipleItemsTx = api.tx.unique
.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);
await submitTransactionAsync(alice, createMultipleItemsTx);
const itemsListIndexAfter = await getLastTokenId(api, collectionId);
@@ -117,7 +117,7 @@
{NFT: ['A', 'A']},
{NFT: ['B', 'B']},
];
- const createMultipleItemsTx = api.tx.nft.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);
+ const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);
const events = await submitTransactionAsync(alice, createMultipleItemsTx);
const result = getGenericResult(events);
expect(result.success).to.be.true;
@@ -144,7 +144,7 @@
expect(itemsListIndexBefore).to.be.equal(0);
await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);
const args = [{NFT: ['0x31', '0x31']}, {NFT: ['0x32', '0x32']}, {NFT: ['0x33', '0x33']}];
- const createMultipleItemsTx = api.tx.nft
+ const createMultipleItemsTx = api.tx.unique
.createMultipleItems(collectionId, normalizeAccountId(bob.address), args);
await submitTransactionAsync(bob, createMultipleItemsTx);
const itemsListIndexAfter = await getLastTokenId(api, collectionId);
@@ -175,7 +175,7 @@
{Fungible: {value: 2}},
{Fungible: {value: 3}},
];
- const createMultipleItemsTx = api.tx.nft
+ const createMultipleItemsTx = api.tx.unique
.createMultipleItems(collectionId, normalizeAccountId(bob.address), args);
await submitTransactionAsync(bob, createMultipleItemsTx);
const token1Data = await getBalance(api, collectionId, bob.address, 0);
@@ -195,7 +195,7 @@
{ReFungible: {const_data: [0x32], variable_data: [0x32], pieces: 1}},
{ReFungible: {const_data: [0x33], variable_data: [0x33], pieces: 1}},
];
- const createMultipleItemsTx = api.tx.nft
+ const createMultipleItemsTx = api.tx.unique
.createMultipleItems(collectionId, normalizeAccountId(bob.address), args);
await submitTransactionAsync(bob, createMultipleItemsTx);
const itemsListIndexAfter = await getLastTokenId(api, collectionId);
@@ -234,7 +234,7 @@
const itemsListIndexBefore = await getLastTokenId(api, collectionId);
expect(itemsListIndexBefore).to.be.equal(0);
const args = [{NFT: ['0x31', '0x31']}, {NFT: ['0x32', '0x32']}, {NFT: ['0x33', '0x33']}];
- const createMultipleItemsTx = api.tx.nft
+ const createMultipleItemsTx = api.tx.unique
.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);
await expect(submitTransactionAsync(bob, createMultipleItemsTx)).to.be.rejected;
});
@@ -250,7 +250,7 @@
{Fungible: {value: 2}},
{Fungible: {value: 3}},
];
- const createMultipleItemsTx = api.tx.nft
+ const createMultipleItemsTx = api.tx.unique
.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);
await expect(submitTransactionAsync(bob, createMultipleItemsTx)).to.be.rejected;
});
@@ -266,7 +266,7 @@
{ReFungible: {const_data: [0x32], variable_data: [0x32], pieces: 1}},
{ReFungible: {const_data: [0x33], variable_data: [0x33], pieces: 1}},
];
- const createMultipleItemsTx = api.tx.nft
+ const createMultipleItemsTx = api.tx.unique
.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);
await expect(submitTransactionAsync(bob, createMultipleItemsTx)).to.be.rejected;
});
@@ -275,7 +275,7 @@
it('Create token in not existing collection', async () => {
await usingApi(async (api: ApiPromise) => {
const collectionId = await getCreatedCollectionCount(api) + 1;
- const createMultipleItemsTx = api.tx.nft
+ const createMultipleItemsTx = api.tx.unique
.createMultipleItems(collectionId, normalizeAccountId(alice.address), ['NFT', 'NFT', 'NFT']);
await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected;
});
@@ -291,7 +291,7 @@
{NFT: ['B'.repeat(2049), 'B'.repeat(2049)]},
{NFT: ['C'.repeat(2049), 'C'.repeat(2049)]},
];
- const createMultipleItemsTx = api.tx.nft
+ const createMultipleItemsTx = api.tx.unique
.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);
await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected;
@@ -303,7 +303,7 @@
{ReFungible: ['2'.repeat(2049), '2'.repeat(2049), 10]},
{ReFungible: ['3'.repeat(2049), '3'.repeat(2049), 10]},
];
- const createMultipleItemsTxFungible = api.tx.nft
+ const createMultipleItemsTxFungible = api.tx.unique
.createMultipleItems(collectionIdReFungible, normalizeAccountId(alice.address), argsReFungible);
await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTxFungible)).to.be.rejected;
});
@@ -312,7 +312,7 @@
it('Create tokens with different types', async () => {
await usingApi(async (api: ApiPromise) => {
const collectionId = await createCollectionExpectSuccess();
- const createMultipleItemsTx = api.tx.nft
+ const createMultipleItemsTx = api.tx.unique
.createMultipleItems(collectionId, normalizeAccountId(alice.address), ['NFT', 'Fungible', 'ReFungible']);
await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected;
// garbage collection :-D
@@ -328,7 +328,7 @@
{NFT: ['B', 'B'.repeat(2049)]},
{NFT: ['C'.repeat(2049), 'C']},
];
- const createMultipleItemsTx = await api.tx.nft
+ const createMultipleItemsTx = await api.tx.unique
.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);
await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected;
});
@@ -345,7 +345,7 @@
{NFT: ['A', 'A']},
{NFT: ['B', 'B']},
];
- const createMultipleItemsTx = api.tx.nft.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);
+ const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);
await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected;
});
});
tests/src/eth/nonFungible.test.tsdiffbeforeafterboth--- a/tests/src/eth/nonFungible.test.ts
+++ b/tests/src/eth/nonFungible.test.ts
@@ -70,7 +70,7 @@
const alice = privateKey('//Alice');
const caller = await createEthAccountWithBalance(api, web3);
- const changeAdminTx = api.tx.nft.addCollectionAdmin(collection, {Ethereum: caller});
+ const changeAdminTx = api.tx.unique.addCollectionAdmin(collection, {Ethereum: caller});
await submitTransactionAsync(alice, changeAdminTx);
const receiver = createEthAccount(web3);
@@ -109,7 +109,7 @@
const alice = privateKey('//Alice');
const caller = await createEthAccountWithBalance(api, web3);
- const changeAdminTx = api.tx.nft.addCollectionAdmin(collection, {Ethereum: caller});
+ const changeAdminTx = api.tx.unique.addCollectionAdmin(collection, {Ethereum: caller});
await submitTransactionAsync(alice, changeAdminTx);
const receiver = createEthAccount(web3);
tests/src/eth/proxy/nonFungibleProxy.test.tsdiffbeforeafterboth--- a/tests/src/eth/proxy/nonFungibleProxy.test.ts
+++ b/tests/src/eth/proxy/nonFungibleProxy.test.ts
@@ -88,7 +88,7 @@
const address = collectionIdToAddress(collection);
const contract = await proxyWrap(api, web3, new web3.eth.Contract(nonFungibleAbi as any, address, {from: caller, ...GAS_ARGS}));
- const changeAdminTx = api.tx.nft.addCollectionAdmin(collection, {Ethereum: contract.options.address});
+ const changeAdminTx = api.tx.unique.addCollectionAdmin(collection, {Ethereum: contract.options.address});
await submitTransactionAsync(alice, changeAdminTx);
{
@@ -127,7 +127,7 @@
const address = collectionIdToAddress(collection);
const contract = await proxyWrap(api, web3, new web3.eth.Contract(nonFungibleAbi as any, address, {from: caller, ...GAS_ARGS}));
- const changeAdminTx = api.tx.nft.addCollectionAdmin(collection, {Ethereum: contract.options.address});
+ const changeAdminTx = api.tx.unique.addCollectionAdmin(collection, {Ethereum: contract.options.address});
await submitTransactionAsync(alice, changeAdminTx);
{
@@ -190,7 +190,7 @@
const contract = await proxyWrap(api, web3, new web3.eth.Contract(nonFungibleAbi as any, address, {from: caller, ...GAS_ARGS}));
const tokenId = await createItemExpectSuccess(alice, collection, 'NFT', {Ethereum: contract.options.address});
- const changeAdminTx = api.tx.nft.addCollectionAdmin(collection, {Ethereum: contract.options.address});
+ const changeAdminTx = api.tx.unique.addCollectionAdmin(collection, {Ethereum: contract.options.address});
await submitTransactionAsync(alice, changeAdminTx);
{
tests/src/inflation.test.tsdiffbeforeafterboth--- a/tests/src/inflation.test.ts
+++ b/tests/src/inflation.test.ts
@@ -18,16 +18,16 @@
const totalIssuanceStart = (await api.query.inflation.startingYearTotalIssuance()).toBigInt();
const blockInflation = (await api.query.inflation.blockInflation()).toBigInt();
- const YEAR = 5259600n; // Blocks in one year
+ // const YEAR = 5259600n; // 6-second block. Blocks in one year
+ const YEAR = 2629800n; // 12-second block. Blocks in one year
+
const totalExpectedInflation = totalIssuanceStart / 10n;
const totalActualInflation = blockInflation * YEAR / blockInterval;
const tolerance = 0.00001; // Relative difference per year between theoretical and actual inflation
- let abs = totalExpectedInflation / totalActualInflation - 1n;
- if (abs < 0n) {
- abs = -abs;
- }
- expect(abs <= tolerance).to.be.true;
+ const expectedInflation = totalExpectedInflation / totalActualInflation - 1n;
+
+ expect(Math.abs(Number(expectedInflation))).to.be.lessThanOrEqual(tolerance);
});
});
tests/src/interfaces/augment-api-consts.tsdiffbeforeafterboth--- a/tests/src/interfaces/augment-api-consts.ts
+++ b/tests/src/interfaces/augment-api-consts.ts
@@ -159,7 +159,6 @@
[key: string]: Codec;
};
vesting: {
- maxVestingSchedules: u32 & AugmentedConst<ApiType>;
/**
* The minimum amount transferred to call `vested_transfer`.
**/
tests/src/interfaces/augment-api-errors.tsdiffbeforeafterboth--- a/tests/src/interfaces/augment-api-errors.ts
+++ b/tests/src/interfaces/augment-api-errors.ts
@@ -241,32 +241,6 @@
**/
[key: string]: AugmentedError<ApiType>;
};
- nft: {
- /**
- * Decimal_points parameter must be lower than MAX_DECIMAL_POINTS constant, currently it is 30.
- **/
- CollectionDecimalPointLimitExceeded: AugmentedError<ApiType>;
- /**
- * Collection limit bounds per collection exceeded
- **/
- CollectionLimitBoundsExceeded: AugmentedError<ApiType>;
- /**
- * This address is not set as sponsor, use setCollectionSponsor first.
- **/
- ConfirmUnsetSponsorFail: AugmentedError<ApiType>;
- /**
- * Length of items properties must be greater than 0.
- **/
- EmptyArgument: AugmentedError<ApiType>;
- /**
- * Tried to enable permissions which are only permitted to be disabled
- **/
- OwnerPermissionsCantBeReverted: AugmentedError<ApiType>;
- /**
- * Generic error
- **/
- [key: string]: AugmentedError<ApiType>;
- };
nonfungible: {
/**
* Used amount > 1 with NFT
@@ -390,28 +364,6 @@
* Maximum refungibility exceeded
**/
WrongRefungiblePieces: AugmentedError<ApiType>;
- /**
- * Generic error
- **/
- [key: string]: AugmentedError<ApiType>;
- };
- scheduler: {
- /**
- * Failed to schedule a call
- **/
- FailedToSchedule: AugmentedError<ApiType>;
- /**
- * Cannot find the scheduled call.
- **/
- NotFound: AugmentedError<ApiType>;
- /**
- * Reschedule failed because it does not change scheduled time.
- **/
- RescheduleNoChange: AugmentedError<ApiType>;
- /**
- * Given target block number is in the past.
- **/
- TargetBlockNumberInPast: AugmentedError<ApiType>;
/**
* Generic error
**/
@@ -475,28 +427,57 @@
**/
[key: string]: AugmentedError<ApiType>;
};
+ unique: {
+ /**
+ * Decimal_points parameter must be lower than MAX_DECIMAL_POINTS constant, currently it is 30.
+ **/
+ CollectionDecimalPointLimitExceeded: AugmentedError<ApiType>;
+ /**
+ * Collection limit bounds per collection exceeded
+ **/
+ CollectionLimitBoundsExceeded: AugmentedError<ApiType>;
+ /**
+ * This address is not set as sponsor, use setCollectionSponsor first.
+ **/
+ ConfirmUnsetSponsorFail: AugmentedError<ApiType>;
+ /**
+ * Length of items properties must be greater than 0.
+ **/
+ EmptyArgument: AugmentedError<ApiType>;
+ /**
+ * Tried to enable permissions which are only permitted to be disabled
+ **/
+ OwnerPermissionsCantBeReverted: AugmentedError<ApiType>;
+ /**
+ * Generic error
+ **/
+ [key: string]: AugmentedError<ApiType>;
+ };
vesting: {
/**
- * Amount being transferred is too low to create a vesting schedule.
+ * The vested transfer amount is too low
**/
AmountLow: AugmentedError<ApiType>;
/**
- * The account already has `MaxVestingSchedules` count of schedules and thus
- * cannot add another one. Consider merging existing schedules in order to add another.
+ * Insufficient amount of balance to lock
+ **/
+ InsufficientBalanceToLock: AugmentedError<ApiType>;
+ /**
+ * Failed because the maximum vesting schedules was exceeded
**/
- AtMaxVestingSchedules: AugmentedError<ApiType>;
+ MaxVestingSchedulesExceeded: AugmentedError<ApiType>;
/**
- * Failed to create a new schedule because some parameter was invalid.
+ * This account have too many vesting schedules
**/
- InvalidScheduleParams: AugmentedError<ApiType>;
+ TooManyVestingSchedules: AugmentedError<ApiType>;
/**
- * The account given is not vesting.
+ * Vesting period is zero
**/
- NotVesting: AugmentedError<ApiType>;
+ ZeroVestingPeriod: AugmentedError<ApiType>;
/**
- * An index was out of bounds of the vesting schedules.
+ * Number of vests is zero
**/
- ScheduleIndexOutOfBounds: AugmentedError<ApiType>;
+ ZeroVestingPeriodCount: AugmentedError<ApiType>;
/**
* Generic error
**/
tests/src/interfaces/augment-api-events.tsdiffbeforeafterboth--- a/tests/src/interfaces/augment-api-events.ts
+++ b/tests/src/interfaces/augment-api-events.ts
@@ -2,12 +2,11 @@
/* eslint-disable */
import type { EthereumLog, EvmCoreErrorExitReason } from './ethereum';
-import type { PalletCommonAccountBasicCrossAccountIdRepr } from './nft';
+import type { PalletCommonAccountBasicCrossAccountIdRepr } from './unique';
import type { ApiTypes } from '@polkadot/api/types';
-import type { Bytes, Null, Option, Result, U256, U8aFixed, u128, u32, u64, u8 } from '@polkadot/types';
+import type { Null, Option, Result, U256, U8aFixed, u128, u32, u64, u8 } from '@polkadot/types';
import type { AccountId32, H160, H256 } from '@polkadot/types/interfaces/runtime';
import type { FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchInfo, SpRuntimeDispatchError, XcmV1MultiLocation, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation } from '@polkadot/types/lookup';
-import type { ITuple } from '@polkadot/types/types';
declare module '@polkadot/api/types/events' {
export interface AugmentedEvents<ApiType> {
@@ -389,24 +388,6 @@
**/
[key: string]: AugmentedEvent<ApiType>;
};
- scheduler: {
- /**
- * Canceled some task. \[when, index\]
- **/
- Canceled: AugmentedEvent<ApiType, [u32, u32]>;
- /**
- * Dispatched some task. \[task, id, result\]
- **/
- Dispatched: AugmentedEvent<ApiType, [ITuple<[u32, u32]>, Option<Bytes>, Result<Null, SpRuntimeDispatchError>]>;
- /**
- * Scheduled some task. \[when, index\]
- **/
- Scheduled: AugmentedEvent<ApiType, [u32, u32]>;
- /**
- * Generic event
- **/
- [key: string]: AugmentedEvent<ApiType>;
- };
sudo: {
/**
* The \[sudoer\] just switched identity; the old key is supplied.
@@ -492,15 +473,17 @@
};
vesting: {
/**
- * An \[account\] has become fully vested.
+ * Claimed vesting. \[who, locked_amount\]
+ **/
+ Claimed: AugmentedEvent<ApiType, [AccountId32, u128]>;
+ /**
+ * Added new vesting schedule. \[from, to, vesting_schedule\]
**/
- VestingCompleted: AugmentedEvent<ApiType, [AccountId32]>;
+ VestingScheduleAdded: AugmentedEvent<ApiType, [AccountId32, AccountId32, OrmlVestingVestingSchedule]>;
/**
- * The amount vested has been updated. This could indicate a change in funds available.
- * The balance given is the amount which is left unvested (and thus locked).
- * \[account, unvested\]
+ * Updated vesting schedules. \[who\]
**/
- VestingUpdated: AugmentedEvent<ApiType, [AccountId32, u128]>;
+ VestingSchedulesUpdated: AugmentedEvent<ApiType, [AccountId32]>;
/**
* Generic event
**/
tests/src/interfaces/augment-api-query.tsdiffbeforeafterboth--- a/tests/src/interfaces/augment-api-query.ts
+++ b/tests/src/interfaces/augment-api-query.ts
@@ -2,12 +2,12 @@
/* eslint-disable */
import type { EthereumBlock, EthereumReceipt, EthereumTransactionLegacyTransaction, FpRpcTransactionStatus } from './ethereum';
-import type { NftDataStructsCollection, PalletCommonAccountBasicCrossAccountIdRepr, PalletNonfungibleItemData, PalletRefungibleItemData, PalletUnqSchedulerCallSpec, PalletUnqSchedulerReleases, PalletUnqSchedulerScheduledV2 } from './nft';
import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundStatus, CumulusPalletXcmpQueueOutboundStatus, CumulusPalletXcmpQueueQueueConfigData, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV1AbridgedHostConfiguration, PolkadotPrimitivesV1PersistedValidationData } from './polkadot';
+import type { PalletCommonAccountBasicCrossAccountIdRepr, PalletNonfungibleItemData, PalletRefungibleItemData, UpDataStructsCollection, UpDataStructsCollectionStats } from './unique';
import type { ApiTypes } from '@polkadot/api/types';
import type { BTreeMap, Bytes, Option, U256, Vec, bool, u128, u16, u32, u64 } from '@polkadot/types';
import type { AccountId32, H160, H256 } from '@polkadot/types/interfaces/runtime';
-import type { FrameSupportWeightsPerDispatchClassU64, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PalletVestingReleases, PalletVestingVestingInfo, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV1UpgradeRestriction, SpRuntimeGenericDigest } from '@polkadot/types/lookup';
+import type { FrameSupportWeightsPerDispatchClassU64, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV1UpgradeRestriction, SpRuntimeGenericDigest } from '@polkadot/types/lookup';
import type { AnyNumber, ITuple, Observable } from '@polkadot/types/types';
declare module '@polkadot/api/types/storage' {
@@ -58,10 +58,14 @@
/**
* Collection info
**/
- collectionById: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<Option<NftDataStructsCollection>>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
+ collectionById: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<Option<UpDataStructsCollection>>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
createdCollectionCount: AugmentedQuery<ApiType, () => Observable<u32>, []> & QueryableStorageEntry<ApiType, []>;
destroyedCollectionCount: AugmentedQuery<ApiType, () => Observable<u32>, []> & QueryableStorageEntry<ApiType, []>;
/**
+ * Not used by code, exists only to provide some types to metadata
+ **/
+ dummyStorageValue: AugmentedQuery<ApiType, () => Observable<Option<ITuple<[UpDataStructsCollectionStats, u32, u32]>>>, []> & QueryableStorageEntry<ApiType, []>;
+ /**
* List of collection admins
**/
isAdmin: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<bool>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
@@ -171,44 +175,6 @@
**/
[key: string]: QueryableStorageEntry<ApiType>;
};
- nft: {
- /**
- * Used for migrations
- **/
- chainVersion: AugmentedQuery<ApiType, () => Observable<u64>, []> & QueryableStorageEntry<ApiType, []>;
- /**
- * (Collection id (controlled?2), who created (real))
- * TODO: Off chain worker should remove from this map when collection gets removed
- **/
- createItemBasket: AugmentedQuery<ApiType, (arg: ITuple<[u32, AccountId32]> | [u32 | AnyNumber | Uint8Array, AccountId32 | string | Uint8Array]) => Observable<u32>, [ITuple<[u32, AccountId32]>]> & QueryableStorageEntry<ApiType, [ITuple<[u32, AccountId32]>]>;
- /**
- * Collection id (controlled?2), owning user (real)
- **/
- fungibleTransferBasket: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: AccountId32 | string | Uint8Array) => Observable<u32>, [u32, AccountId32]> & QueryableStorageEntry<ApiType, [u32, AccountId32]>;
- /**
- * Collection id (controlled?2), token id (controlled?2)
- **/
- nftTransferBasket: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<u32>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
- /**
- * Collection id (controlled?2), token id (controlled?2)
- **/
- reFungibleTransferBasket: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<u32>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
- /**
- * Variable metadata sponsoring
- * Collection id (controlled?2), token id (controlled?2)
- **/
- variableMetaDataBasket: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<Option<u32>>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
- /**
- * Generic query
- **/
- [key: string]: QueryableStorageEntry<ApiType>;
- };
- nftPayment: {
- /**
- * Generic query
- **/
- [key: string]: QueryableStorageEntry<ApiType>;
- };
nonfungible: {
accountBalance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u32>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
allowance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<Option<PalletCommonAccountBasicCrossAccountIdRepr>>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
@@ -383,27 +349,6 @@
**/
[key: string]: QueryableStorageEntry<ApiType>;
};
- scheduler: {
- /**
- * Items to be executed, indexed by the block number that they should be executed on.
- **/
- agenda: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<Vec<Option<PalletUnqSchedulerScheduledV2>>>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
- /**
- * Lookup from identity to the block number and index of the task.
- **/
- lookup: AugmentedQuery<ApiType, (arg: Bytes | string | Uint8Array) => Observable<Option<ITuple<[u32, u32]>>>, [Bytes]> & QueryableStorageEntry<ApiType, [Bytes]>;
- specAgenda: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<Vec<Option<PalletUnqSchedulerCallSpec>>>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
- /**
- * Storage version of the pallet.
- *
- * New networks start with last version.
- **/
- storageVersion: AugmentedQuery<ApiType, () => Observable<PalletUnqSchedulerReleases>, []> & QueryableStorageEntry<ApiType, []>;
- /**
- * Generic query
- **/
- [key: string]: QueryableStorageEntry<ApiType>;
- };
sudo: {
/**
* The `AccountId` of the sudo key.
@@ -537,17 +482,51 @@
**/
[key: string]: QueryableStorageEntry<ApiType>;
};
+ unique: {
+ /**
+ * Used for migrations
+ **/
+ chainVersion: AugmentedQuery<ApiType, () => Observable<u64>, []> & QueryableStorageEntry<ApiType, []>;
+ /**
+ * (Collection id (controlled?2), who created (real))
+ * TODO: Off chain worker should remove from this map when collection gets removed
+ **/
+ createItemBasket: AugmentedQuery<ApiType, (arg: ITuple<[u32, AccountId32]> | [u32 | AnyNumber | Uint8Array, AccountId32 | string | Uint8Array]) => Observable<Option<u32>>, [ITuple<[u32, AccountId32]>]> & QueryableStorageEntry<ApiType, [ITuple<[u32, AccountId32]>]>;
+ fungibleApproveBasket: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: AccountId32 | string | Uint8Array) => Observable<Option<u32>>, [u32, AccountId32]> & QueryableStorageEntry<ApiType, [u32, AccountId32]>;
+ /**
+ * Collection id (controlled?2), owning user (real)
+ **/
+ fungibleTransferBasket: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: AccountId32 | string | Uint8Array) => Observable<Option<u32>>, [u32, AccountId32]> & QueryableStorageEntry<ApiType, [u32, AccountId32]>;
+ /**
+ * Approval sponsoring
+ **/
+ nftApproveBasket: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<Option<u32>>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
+ /**
+ * Collection id (controlled?2), token id (controlled?2)
+ **/
+ nftTransferBasket: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<Option<u32>>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
+ refungibleApproveBasket: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array, arg3: AccountId32 | string | Uint8Array) => Observable<Option<u32>>, [u32, u32, AccountId32]> & QueryableStorageEntry<ApiType, [u32, u32, AccountId32]>;
+ /**
+ * Collection id (controlled?2), token id (controlled?2)
+ **/
+ reFungibleTransferBasket: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array, arg3: AccountId32 | string | Uint8Array) => Observable<Option<u32>>, [u32, u32, AccountId32]> & QueryableStorageEntry<ApiType, [u32, u32, AccountId32]>;
+ /**
+ * Variable metadata sponsoring
+ * Collection id (controlled?2), token id (controlled?2)
+ **/
+ variableMetaDataBasket: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<Option<u32>>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
+ /**
+ * Generic query
+ **/
+ [key: string]: QueryableStorageEntry<ApiType>;
+ };
vesting: {
/**
- * Storage version of the pallet.
+ * Vesting schedules of an account.
*
- * New networks start with latest version, as determined by the genesis build.
+ * VestingSchedules: map AccountId => Vec<VestingSchedule>
**/
- storageVersion: AugmentedQuery<ApiType, () => Observable<PalletVestingReleases>, []> & QueryableStorageEntry<ApiType, []>;
- /**
- * Information regarding the vesting of a given account.
- **/
- vesting: AugmentedQuery<ApiType, (arg: AccountId32 | string | Uint8Array) => Observable<Option<Vec<PalletVestingVestingInfo>>>, [AccountId32]> & QueryableStorageEntry<ApiType, [AccountId32]>;
+ vestingSchedules: AugmentedQuery<ApiType, (arg: AccountId32 | string | Uint8Array) => Observable<Vec<OrmlVestingVestingSchedule>>, [AccountId32]> & QueryableStorageEntry<ApiType, [AccountId32]>;
/**
* Generic query
**/
tests/src/interfaces/augment-api-rpc.tsdiffbeforeafterboth--- a/tests/src/interfaces/augment-api-rpc.ts
+++ b/tests/src/interfaces/augment-api-rpc.ts
@@ -1,7 +1,7 @@
// Auto-generated via `yarn polkadot-types-from-chain`, do not edit
/* eslint-disable */
-import type { NftDataStructsCollection, NftDataStructsCollectionId, NftDataStructsCollectionStats, NftDataStructsTokenId, PalletCommonAccountBasicCrossAccountIdRepr } from './nft';
+import type { PalletCommonAccountBasicCrossAccountIdRepr, UpDataStructsCollection, UpDataStructsCollectionId, UpDataStructsCollectionStats, UpDataStructsTokenId } from './unique';
import type { Bytes, HashMap, Json, Metadata, Null, Option, StorageKey, Text, U256, U64, Vec, bool, u128, u32, u64 } from '@polkadot/types';
import type { ExtrinsicOrHash, ExtrinsicStatus } from '@polkadot/types/interfaces/author';
import type { EpochAuthorship } from '@polkadot/types/interfaces/babe';
@@ -354,68 +354,6 @@
* Returns protocol version.
**/
version: AugmentedRpc<() => Observable<Text>>;
- };
- nft: {
- /**
- * Get amount of different user tokens
- **/
- accountBalance: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, account: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u32>>;
- /**
- * Get tokens owned by account
- **/
- accountTokens: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, account: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<NftDataStructsTokenId>>>;
- /**
- * Get admin list
- **/
- adminlist: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletCommonAccountBasicCrossAccountIdRepr>>>;
- /**
- * Get allowed amount
- **/
- allowance: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, sender: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, spender: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: NftDataStructsTokenId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;
- /**
- * Check if user is allowed to use collection
- **/
- allowed: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, account: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<bool>>;
- /**
- * Get allowlist
- **/
- allowlist: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletCommonAccountBasicCrossAccountIdRepr>>>;
- /**
- * Get amount of specific account token
- **/
- balance: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, account: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: NftDataStructsTokenId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;
- /**
- * Get collection by specified id
- **/
- collectionById: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<NftDataStructsCollection>>>;
- /**
- * Get collection stats
- **/
- collectionStats: AugmentedRpc<(at?: Hash | string | Uint8Array) => Observable<NftDataStructsCollectionStats>>;
- /**
- * Get tokens contained in collection
- **/
- collectionTokens: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<NftDataStructsTokenId>>>;
- /**
- * Get token constant metadata
- **/
- constMetadata: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, tokenId: NftDataStructsTokenId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Bytes>>;
- /**
- * Get last token id
- **/
- lastTokenId: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<NftDataStructsTokenId>>;
- /**
- * Check if token exists
- **/
- tokenExists: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, tokenId: NftDataStructsTokenId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<bool>>;
- /**
- * Get token owner
- **/
- tokenOwner: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, tokenId: NftDataStructsTokenId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<PalletCommonAccountBasicCrossAccountIdRepr>>;
- /**
- * Get token variable metadata
- **/
- variableMetadata: AugmentedRpc<(collection: NftDataStructsCollectionId | AnyNumber | Uint8Array, tokenId: NftDataStructsTokenId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Bytes>>;
};
offchain: {
/**
@@ -609,6 +547,68 @@
**/
version: AugmentedRpc<() => Observable<Text>>;
};
+ unique: {
+ /**
+ * Get amount of different user tokens
+ **/
+ accountBalance: AugmentedRpc<(collection: UpDataStructsCollectionId | AnyNumber | Uint8Array, account: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u32>>;
+ /**
+ * Get tokens owned by account
+ **/
+ accountTokens: AugmentedRpc<(collection: UpDataStructsCollectionId | AnyNumber | Uint8Array, account: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsTokenId>>>;
+ /**
+ * Get admin list
+ **/
+ adminlist: AugmentedRpc<(collection: UpDataStructsCollectionId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletCommonAccountBasicCrossAccountIdRepr>>>;
+ /**
+ * Get allowed amount
+ **/
+ allowance: AugmentedRpc<(collection: UpDataStructsCollectionId | AnyNumber | Uint8Array, sender: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, spender: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: UpDataStructsTokenId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;
+ /**
+ * Check if user is allowed to use collection
+ **/
+ allowed: AugmentedRpc<(collection: UpDataStructsCollectionId | AnyNumber | Uint8Array, account: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<bool>>;
+ /**
+ * Get allowlist
+ **/
+ allowlist: AugmentedRpc<(collection: UpDataStructsCollectionId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletCommonAccountBasicCrossAccountIdRepr>>>;
+ /**
+ * Get amount of specific account token
+ **/
+ balance: AugmentedRpc<(collection: UpDataStructsCollectionId | AnyNumber | Uint8Array, account: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: UpDataStructsTokenId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;
+ /**
+ * Get collection by specified id
+ **/
+ collectionById: AugmentedRpc<(collection: UpDataStructsCollectionId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Option<UpDataStructsCollection>>>;
+ /**
+ * Get collection stats
+ **/
+ collectionStats: AugmentedRpc<(at?: Hash | string | Uint8Array) => Observable<UpDataStructsCollectionStats>>;
+ /**
+ * Get tokens contained in collection
+ **/
+ collectionTokens: AugmentedRpc<(collection: UpDataStructsCollectionId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<UpDataStructsTokenId>>>;
+ /**
+ * Get token constant metadata
+ **/
+ constMetadata: AugmentedRpc<(collection: UpDataStructsCollectionId | AnyNumber | Uint8Array, tokenId: UpDataStructsTokenId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Bytes>>;
+ /**
+ * Get last token id
+ **/
+ lastTokenId: AugmentedRpc<(collection: UpDataStructsCollectionId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<UpDataStructsTokenId>>;
+ /**
+ * Check if token exists
+ **/
+ tokenExists: AugmentedRpc<(collection: UpDataStructsCollectionId | AnyNumber | Uint8Array, tokenId: UpDataStructsTokenId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<bool>>;
+ /**
+ * Get token owner
+ **/
+ tokenOwner: AugmentedRpc<(collection: UpDataStructsCollectionId | AnyNumber | Uint8Array, tokenId: UpDataStructsTokenId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<PalletCommonAccountBasicCrossAccountIdRepr>>;
+ /**
+ * Get token variable metadata
+ **/
+ variableMetadata: AugmentedRpc<(collection: UpDataStructsCollectionId | AnyNumber | Uint8Array, tokenId: UpDataStructsTokenId | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Bytes>>;
+ };
web3: {
/**
* Returns current client version.
tests/src/interfaces/augment-api-tx.tsdiffbeforeafterboth--- a/tests/src/interfaces/augment-api-tx.ts
+++ b/tests/src/interfaces/augment-api-tx.ts
@@ -2,13 +2,13 @@
/* eslint-disable */
import type { EthereumTransactionLegacyTransaction } from './ethereum';
-import type { NftDataStructsAccessMode, NftDataStructsCollectionLimits, NftDataStructsCollectionMode, NftDataStructsCreateItemData, NftDataStructsMetaUpdatePermission, NftDataStructsSchemaVersion, PalletCommonAccountBasicCrossAccountIdRepr } from './nft';
import type { CumulusPrimitivesParachainInherentParachainInherentData } from './polkadot';
+import type { PalletCommonAccountBasicCrossAccountIdRepr, UpDataStructsAccessMode, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCreateItemData, UpDataStructsMetaUpdatePermission, UpDataStructsSchemaVersion } from './unique';
import type { ApiTypes, SubmittableExtrinsic } from '@polkadot/api/types';
-import type { Bytes, Compact, Option, U256, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types';
+import type { Bytes, Compact, Option, U256, Vec, bool, u128, u16, u32, u64 } from '@polkadot/types';
import type { Extrinsic } from '@polkadot/types/interfaces/extrinsics';
import type { AccountId32, Call, H160, H256, MultiAddress, Perbill } from '@polkadot/types/interfaces/runtime';
-import type { PalletVestingVestingInfo, SpCoreChangesTrieChangesTrieConfiguration, XcmV1MultiLocation, XcmV2WeightLimit, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup';
+import type { SpCoreChangesTrieChangesTrieConfiguration, XcmV1MultiLocation, XcmV2WeightLimit, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup';
import type { AnyNumber, ITuple } from '@polkadot/types/types';
declare module '@polkadot/api/types/submittable' {
@@ -196,441 +196,11 @@
[key: string]: SubmittableExtrinsicFunction<ApiType>;
};
inflation: {
- /**
- * Generic tx
- **/
- [key: string]: SubmittableExtrinsicFunction<ApiType>;
- };
- nft: {
- /**
- * Adds an admin of the Collection.
- * NFT Collection can be controlled by multiple admin addresses (some which can also be servers, for example). Admins can issue and burn NFTs, as well as add and remove other admins, but cannot change NFT or Collection ownership.
- *
- * # Permissions
- *
- * * Collection Owner.
- * * Collection Admin.
- *
- * # Arguments
- *
- * * collection_id: ID of the Collection to add admin for.
- *
- * * new_admin_id: Address of new admin to add.
- **/
- addCollectionAdmin: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newAdminId: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
- /**
- * Add an address to allow list.
- *
- * # Permissions
- *
- * * Collection Owner
- * * Collection Admin
- *
- * # Arguments
- *
- * * collection_id.
- *
- * * address.
- **/
- addToAllowList: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, address: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
- /**
- * Set, change, or remove approved address to transfer the ownership of the NFT.
- *
- * # Permissions
- *
- * * Collection Owner
- * * Collection Admin
- * * Current NFT owner
- *
- * # Arguments
- *
- * * approved: Address that is approved to transfer this NFT or zero (if needed to remove approval).
- *
- * * collection_id.
- *
- * * item_id: ID of the item.
- **/
- approve: AugmentedSubmittable<(spender: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, amount: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletCommonAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
- /**
- * Destroys a concrete instance of NFT on behalf of the owner
- * See also: [`approve`]
- *
- * # Permissions
- *
- * * Collection Owner.
- * * Collection Admin.
- * * Current NFT Owner.
- *
- * # Arguments
- *
- * * collection_id: ID of the collection.
- *
- * * item_id: ID of NFT to burn.
- *
- * * from: owner of item
- **/
- burnFrom: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, from: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr, u32, u128]>;
- /**
- * Destroys a concrete instance of NFT.
- *
- * # Permissions
- *
- * * Collection Owner.
- * * Collection Admin.
- * * Current NFT Owner.
- *
- * # Arguments
- *
- * * collection_id: ID of the collection.
- *
- * * item_id: ID of NFT to burn.
- **/
- burnItem: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, u128]>;
- /**
- * Change the owner of the collection.
- *
- * # Permissions
- *
- * * Collection Owner.
- *
- * # Arguments
- *
- * * collection_id.
- *
- * * new_owner.
- **/
- changeCollectionOwner: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newOwner: AccountId32 | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, AccountId32]>;
- /**
- * # Permissions
- *
- * * Sponsor.
- *
- * # Arguments
- *
- * * collection_id.
- **/
- confirmSponsorship: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;
- /**
- * This method creates a Collection of NFTs. Each Token may have multiple properties encoded as an array of bytes of certain length. The initial owner and admin of the collection are set to the address that signed the transaction. Both addresses can be changed later.
- *
- * # Permissions
- *
- * * Anyone.
- *
- * # Arguments
- *
- * * collection_name: UTF-16 string with collection name (limit 64 characters), will be stored as zero-terminated.
- *
- * * collection_description: UTF-16 string with collection description (limit 256 characters), will be stored as zero-terminated.
- *
- * * token_prefix: UTF-8 string with token prefix.
- *
- * * mode: [CollectionMode] collection type and type dependent data.
- **/
- createCollection: AugmentedSubmittable<(collectionName: Vec<u16> | (u16 | AnyNumber | Uint8Array)[], collectionDescription: Vec<u16> | (u16 | AnyNumber | Uint8Array)[], tokenPrefix: Bytes | string | Uint8Array, mode: NftDataStructsCollectionMode | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Vec<u16>, Vec<u16>, Bytes, NftDataStructsCollectionMode]>;
- /**
- * This method creates a concrete instance of NFT Collection created with CreateCollection method.
- *
- * # Permissions
- *
- * * Collection Owner.
- * * Collection Admin.
- * * Anyone if
- * * Allow List is enabled, and
- * * Address is added to allow list, and
- * * MintPermission is enabled (see SetMintPermission method)
- *
- * # Arguments
- *
- * * collection_id: ID of the collection.
- *
- * * owner: Address, initial owner of the NFT.
- *
- * * data: Token data to store on chain.
- **/
- createItem: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, owner: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, data: NftDataStructsCreateItemData | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr, NftDataStructsCreateItemData]>;
- /**
- * This method creates multiple items in a collection created with CreateCollection method.
- *
- * # Permissions
- *
- * * Collection Owner.
- * * Collection Admin.
- * * Anyone if
- * * Allow List is enabled, and
- * * Address is added to allow list, and
- * * MintPermission is enabled (see SetMintPermission method)
- *
- * # Arguments
- *
- * * collection_id: ID of the collection.
- *
- * * itemsData: Array items properties. Each property is an array of bytes itself, see [create_item].
- *
- * * owner: Address, initial owner of the NFT.
- **/
- createMultipleItems: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, owner: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, itemsData: Vec<NftDataStructsCreateItemData> | (NftDataStructsCreateItemData | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr, Vec<NftDataStructsCreateItemData>]>;
- /**
- * **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.
- *
- * # Permissions
- *
- * * Collection Owner.
- *
- * # Arguments
- *
- * * collection_id: collection to destroy.
- **/
- destroyCollection: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;
- /**
- * Remove admin address of the Collection. An admin address can remove itself. List of admins may become empty, in which case only Collection Owner will be able to add an Admin.
- *
- * # Permissions
- *
- * * Collection Owner.
- * * Collection Admin.
- *
- * # Arguments
- *
- * * collection_id: ID of the Collection to remove admin for.
- *
- * * account_id: Address of admin to remove.
- **/
- removeCollectionAdmin: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, accountId: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
- /**
- * Switch back to pay-per-own-transaction model.
- *
- * # Permissions
- *
- * * Collection owner.
- *
- * # Arguments
- *
- * * collection_id.
- **/
- removeCollectionSponsor: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;
- /**
- * Remove an address from allow list.
- *
- * # Permissions
- *
- * * Collection Owner
- * * Collection Admin
- *
- * # Arguments
- *
- * * collection_id.
- *
- * * address.
- **/
- removeFromAllowList: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, address: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
- setCollectionLimits: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newLimit: NftDataStructsCollectionLimits | { accountTokenOwnershipLimit?: any; sponsoredDataSize?: any; sponsoredDataRateLimit?: any; tokenLimit?: any; sponsorTransferTimeout?: any; ownerCanTransfer?: any; ownerCanDestroy?: any; transfersEnabled?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, NftDataStructsCollectionLimits]>;
- /**
- * # Permissions
- *
- * * Collection Owner
- *
- * # Arguments
- *
- * * collection_id.
- *
- * * new_sponsor.
- **/
- setCollectionSponsor: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newSponsor: AccountId32 | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, AccountId32]>;
- /**
- * Set const on-chain data schema.
- *
- * # Permissions
- *
- * * Collection Owner
- * * Collection Admin
- *
- * # Arguments
- *
- * * collection_id.
- *
- * * schema: String representing the const on-chain data schema.
- **/
- setConstOnChainSchema: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, schema: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, Bytes]>;
- /**
- * Set meta_update_permission value for particular collection
- *
- * # Permissions
- *
- * * Collection Owner.
- *
- * # Arguments
- *
- * * collection_id: ID of the collection.
- *
- * * value: New flag value.
- **/
- setMetaUpdatePermissionFlag: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, value: NftDataStructsMetaUpdatePermission | 'ItemOwner' | 'Admin' | 'None' | number | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, NftDataStructsMetaUpdatePermission]>;
- /**
- * Allows Anyone to create tokens if:
- * * Allow List is enabled, and
- * * Address is added to allow list, and
- * * This method was called with True parameter
- *
- * # Permissions
- * * Collection Owner
- *
- * # Arguments
- *
- * * collection_id.
- *
- * * mint_permission: Boolean parameter. If True, allows minting to Anyone with conditions above.
- **/
- setMintPermission: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, mintPermission: bool | boolean | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, bool]>;
- /**
- * Set off-chain data schema.
- *
- * # Permissions
- *
- * * Collection Owner
- * * Collection Admin
- *
- * # Arguments
- *
- * * collection_id.
- *
- * * schema: String representing the offchain data schema.
- **/
- setOffchainSchema: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, schema: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, Bytes]>;
- /**
- * Toggle between normal and allow list access for the methods with access for `Anyone`.
- *
- * # Permissions
- *
- * * Collection Owner.
- *
- * # Arguments
- *
- * * collection_id.
- *
- * * mode: [AccessMode]
- **/
- setPublicAccessMode: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, mode: NftDataStructsAccessMode | 'Normal' | 'AllowList' | number | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, NftDataStructsAccessMode]>;
- /**
- * Set schema standard
- * ImageURL
- * Unique
- *
- * # Permissions
- *
- * * Collection Owner
- * * Collection Admin
- *
- * # Arguments
- *
- * * collection_id.
- *
- * * schema: SchemaVersion: enum
- **/
- setSchemaVersion: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, version: NftDataStructsSchemaVersion | 'ImageURL' | 'Unique' | number | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, NftDataStructsSchemaVersion]>;
- /**
- * Set transfers_enabled value for particular collection
- *
- * # Permissions
- *
- * * Collection Owner.
- *
- * # Arguments
- *
- * * collection_id: ID of the collection.
- *
- * * value: New flag value.
- **/
- setTransfersEnabledFlag: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, value: bool | boolean | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, bool]>;
- /**
- * Set off-chain data schema.
- *
- * # Permissions
- *
- * * Collection Owner
- * * Collection Admin
- *
- * # Arguments
- *
- * * collection_id.
- *
- * * schema: String representing the offchain data schema.
- **/
- setVariableMetaData: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, data: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, Bytes]>;
- /**
- * Set variable on-chain data schema.
- *
- * # Permissions
- *
- * * Collection Owner
- * * Collection Admin
- *
- * # Arguments
- *
- * * collection_id.
- *
- * * schema: String representing the variable on-chain data schema.
- **/
- setVariableOnChainSchema: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, schema: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, Bytes]>;
- /**
- * Change ownership of the token.
- *
- * # Permissions
- *
- * * Collection Owner
- * * Collection Admin
- * * Current NFT owner
- *
- * # Arguments
- *
- * * recipient: Address of token recipient.
- *
- * * collection_id.
- *
- * * item_id: ID of the item
- * * Non-Fungible Mode: Required.
- * * Fungible Mode: Ignored.
- * * Re-Fungible Mode: Required.
- *
- * * value: Amount to transfer.
- * * Non-Fungible Mode: Ignored
- * * Fungible Mode: Must specify transferred amount
- * * Re-Fungible Mode: Must specify transferred portion (between 0 and 1)
- **/
- transfer: AugmentedSubmittable<(recipient: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletCommonAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
/**
- * Change ownership of a NFT on behalf of the owner. See Approve method for additional information. After this method executes, the approval is removed so that the approved address will not be able to transfer this NFT again from this owner.
- *
- * # Permissions
- * * Collection Owner
- * * Collection Admin
- * * Current NFT owner
- * * Address approved by current NFT owner
- *
- * # Arguments
- *
- * * from: Address that owns token.
- *
- * * recipient: Address of token recipient.
- *
- * * collection_id.
- *
- * * item_id: ID of the item.
- *
- * * value: Amount to transfer.
- **/
- transferFrom: AugmentedSubmittable<(from: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, recipient: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletCommonAccountBasicCrossAccountIdRepr, PalletCommonAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
- /**
* Generic tx
**/
[key: string]: SubmittableExtrinsicFunction<ApiType>;
};
- nftPayment: {
- /**
- * Generic tx
- **/
- [key: string]: SubmittableExtrinsicFunction<ApiType>;
- };
parachainSystem: {
authorizeUpgrade: AugmentedSubmittable<(codeHash: H256 | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [H256]>;
enactAuthorizedUpgrade: AugmentedSubmittable<(code: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Bytes]>;
@@ -778,80 +348,6 @@
**/
[key: string]: SubmittableExtrinsicFunction<ApiType>;
};
- scheduler: {
- /**
- * Cancel an anonymously scheduled task.
- *
- * # <weight>
- * - S = Number of already scheduled calls
- * - Base Weight: 22.15 + 2.869 * S µs
- * - DB Weight:
- * - Read: Agenda
- * - Write: Agenda, Lookup
- * - Will use base weight of 100 which should be good for up to 30 scheduled calls
- * # </weight>
- **/
- cancel: AugmentedSubmittable<(when: u32 | AnyNumber | Uint8Array, index: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32]>;
- /**
- * Cancel a named scheduled task.
- *
- * # <weight>
- * - S = Number of already scheduled calls
- * - Base Weight: 24.91 + 2.907 * S µs
- * - DB Weight:
- * - Read: Agenda, Lookup
- * - Write: Agenda, Lookup
- * - Will use base weight of 100 which should be good for up to 30 scheduled calls
- * # </weight>
- **/
- cancelNamed: AugmentedSubmittable<(id: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Bytes]>;
- /**
- * Anonymously schedule a task.
- *
- * # <weight>
- * - S = Number of already scheduled calls
- * - Base Weight: 22.29 + .126 * S µs
- * - DB Weight:
- * - Read: Agenda
- * - Write: Agenda
- * - Will use base weight of 25 which should be good for up to 30 scheduled calls
- * # </weight>
- **/
- schedule: AugmentedSubmittable<(when: u32 | AnyNumber | Uint8Array, maybePeriodic: Option<ITuple<[u32, u32]>> | null | object | string | Uint8Array, priority: u8 | AnyNumber | Uint8Array, call: Call) => SubmittableExtrinsic<ApiType>, [u32, Option<ITuple<[u32, u32]>>, u8, Call]>;
- /**
- * Anonymously schedule a task after a delay.
- *
- * # <weight>
- * Same as [`schedule`].
- * # </weight>
- **/
- scheduleAfter: AugmentedSubmittable<(after: u32 | AnyNumber | Uint8Array, maybePeriodic: Option<ITuple<[u32, u32]>> | null | object | string | Uint8Array, priority: u8 | AnyNumber | Uint8Array, call: Call) => SubmittableExtrinsic<ApiType>, [u32, Option<ITuple<[u32, u32]>>, u8, Call]>;
- /**
- * Schedule a named task.
- *
- * # <weight>
- * - S = Number of already scheduled calls
- * - Base Weight: 29.6 + .159 * S µs
- * - DB Weight:
- * - Read: Agenda, Lookup
- * - Write: Agenda, Lookup
- * - Will use base weight of 35 which should be good for more than 30 scheduled calls
- * # </weight>
- **/
- scheduleNamed: AugmentedSubmittable<(id: Bytes | string | Uint8Array, when: u32 | AnyNumber | Uint8Array, maybePeriodic: Option<ITuple<[u32, u32]>> | null | object | string | Uint8Array, priority: u8 | AnyNumber | Uint8Array, call: Call) => SubmittableExtrinsic<ApiType>, [Bytes, u32, Option<ITuple<[u32, u32]>>, u8, Call]>;
- /**
- * Schedule a named task after a delay.
- *
- * # <weight>
- * Same as [`schedule_named`].
- * # </weight>
- **/
- scheduleNamedAfter: AugmentedSubmittable<(id: Bytes | string | Uint8Array, after: u32 | AnyNumber | Uint8Array, maybePeriodic: Option<ITuple<[u32, u32]>> | null | object | string | Uint8Array, priority: u8 | AnyNumber | Uint8Array, call: Call) => SubmittableExtrinsic<ApiType>, [Bytes, u32, Option<ITuple<[u32, u32]>>, u8, Call]>;
- /**
- * Generic tx
- **/
- [key: string]: SubmittableExtrinsicFunction<ApiType>;
- };
sudo: {
/**
* Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo
@@ -878,7 +374,7 @@
* - Weight of derivative `call` execution + 10,000.
* # </weight>
**/
- sudo: AugmentedSubmittable<(call: Call) => SubmittableExtrinsic<ApiType>, [Call]>;
+ sudo: AugmentedSubmittable<(call: Call) => SubmittableExtrinsic<ApiType>, [Call]>;
/**
* Authenticates the sudo key and dispatches a function call with `Signed` origin from
* a given account.
@@ -892,7 +388,7 @@
* - Weight of derivative `call` execution + 10,000.
* # </weight>
**/
- sudoAs: AugmentedSubmittable<(who: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, call: Call) => SubmittableExtrinsic<ApiType>, [MultiAddress, Call]>;
+ sudoAs: AugmentedSubmittable<(who: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, ) => SubmittableExtrinsic<ApiType>, [MultiAddress, Call]>;
/**
* Authenticates the sudo key and dispatches a function call with `Root` origin.
* This function does not check the weight of the call, and instead allows the
@@ -905,7 +401,7 @@
* - The weight of this call is defined by the caller.
* # </weight>
**/
- sudoUncheckedWeight: AugmentedSubmittable<(call: Call, weight: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [Call, u64]>;
+ sudoUncheckedWeight: AugmentedSubmittable<(call: Call, weight: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [Call, u64]>;
/**
* Generic tx
**/
@@ -1094,106 +590,435 @@
**/
[key: string]: SubmittableExtrinsicFunction<ApiType>;
};
- vesting: {
+ unique: {
+ /**
+ * Adds an admin of the Collection.
+ * NFT Collection can be controlled by multiple admin addresses (some which can also be servers, for example). Admins can issue and burn NFTs, as well as add and remove other admins, but cannot change NFT or Collection ownership.
+ *
+ * # Permissions
+ *
+ * * Collection Owner.
+ * * Collection Admin.
+ *
+ * # Arguments
+ *
+ * * collection_id: ID of the Collection to add admin for.
+ *
+ * * new_admin_id: Address of new admin to add.
+ **/
+ addCollectionAdmin: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newAdminId: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
/**
- * Force a vested transfer.
+ * Add an address to allow list.
*
- * The dispatch origin for this call must be _Root_.
+ * # Permissions
*
- * - `source`: The account whose funds should be transferred.
- * - `target`: The account that should be transferred the vested funds.
- * - `schedule`: The vesting schedule attached to the transfer.
+ * * Collection Owner
+ * * Collection Admin
+ *
+ * # Arguments
+ *
+ * * collection_id.
+ *
+ * * address.
+ **/
+ addToAllowList: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, address: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+ /**
+ * Set, change, or remove approved address to transfer the ownership of the NFT.
+ *
+ * # Permissions
+ *
+ * * Collection Owner
+ * * Collection Admin
+ * * Current NFT owner
+ *
+ * # Arguments
+ *
+ * * approved: Address that is approved to transfer this NFT or zero (if needed to remove approval).
+ *
+ * * collection_id.
+ *
+ * * item_id: ID of the item.
+ **/
+ approve: AugmentedSubmittable<(spender: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, amount: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletCommonAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
+ /**
+ * Destroys a concrete instance of NFT on behalf of the owner
+ * See also: [`approve`]
+ *
+ * # Permissions
+ *
+ * * Collection Owner.
+ * * Collection Admin.
+ * * Current NFT Owner.
+ *
+ * # Arguments
+ *
+ * * collection_id: ID of the collection.
+ *
+ * * item_id: ID of NFT to burn.
+ *
+ * * from: owner of item
+ **/
+ burnFrom: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, from: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr, u32, u128]>;
+ /**
+ * Destroys a concrete instance of NFT.
+ *
+ * # Permissions
+ *
+ * * Collection Owner.
+ * * Collection Admin.
+ * * Current NFT Owner.
+ *
+ * # Arguments
+ *
+ * * collection_id: ID of the collection.
+ *
+ * * item_id: ID of NFT to burn.
+ **/
+ burnItem: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, u128]>;
+ /**
+ * Change the owner of the collection.
+ *
+ * # Permissions
+ *
+ * * Collection Owner.
+ *
+ * # Arguments
+ *
+ * * collection_id.
+ *
+ * * new_owner.
+ **/
+ changeCollectionOwner: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newOwner: AccountId32 | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, AccountId32]>;
+ /**
+ * # Permissions
*
- * Emits `VestingCreated`.
+ * * Sponsor.
*
- * NOTE: This will unlock all schedules through the current block.
+ * # Arguments
*
- * # <weight>
- * - `O(1)`.
- * - DbWeight: 4 Reads, 4 Writes
- * - Reads: Vesting Storage, Balances Locks, Target Account, Source Account
- * - Writes: Vesting Storage, Balances Locks, Target Account, Source Account
- * # </weight>
+ * * collection_id.
**/
- forceVestedTransfer: AugmentedSubmittable<(source: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, target: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, schedule: PalletVestingVestingInfo | { locked?: any; perBlock?: any; startingBlock?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [MultiAddress, MultiAddress, PalletVestingVestingInfo]>;
+ confirmSponsorship: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;
/**
- * Merge two vesting schedules together, creating a new vesting schedule that unlocks over
- * the highest possible start and end blocks. If both schedules have already started the
- * current block will be used as the schedule start; with the caveat that if one schedule
- * is finished by the current block, the other will be treated as the new merged schedule,
- * unmodified.
+ * This method creates a Collection of NFTs. Each Token may have multiple properties encoded as an array of bytes of certain length. The initial owner of the collection is set to the address that signed the transaction and can be changed later.
*
- * NOTE: If `schedule1_index == schedule2_index` this is a no-op.
- * NOTE: This will unlock all schedules through the current block prior to merging.
- * NOTE: If both schedules have ended by the current block, no new schedule will be created
- * and both will be removed.
+ * # Permissions
+ *
+ * * Anyone.
+ *
+ * # Arguments
+ *
+ * * collection_name: UTF-16 string with collection name (limit 64 characters), will be stored as zero-terminated.
*
- * Merged schedule attributes:
- * - `starting_block`: `MAX(schedule1.starting_block, scheduled2.starting_block,
- * current_block)`.
- * - `ending_block`: `MAX(schedule1.ending_block, schedule2.ending_block)`.
- * - `locked`: `schedule1.locked_at(current_block) + schedule2.locked_at(current_block)`.
+ * * collection_description: UTF-16 string with collection description (limit 256 characters), will be stored as zero-terminated.
*
- * The dispatch origin for this call must be _Signed_.
+ * * token_prefix: UTF-8 string with token prefix.
*
- * - `schedule1_index`: index of the first schedule to merge.
- * - `schedule2_index`: index of the second schedule to merge.
+ * * mode: [CollectionMode] collection type and type dependent data.
**/
- mergeSchedules: AugmentedSubmittable<(schedule1Index: u32 | AnyNumber | Uint8Array, schedule2Index: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32]>;
+ createCollection: AugmentedSubmittable<(collectionName: Vec<u16> | (u16 | AnyNumber | Uint8Array)[], collectionDescription: Vec<u16> | (u16 | AnyNumber | Uint8Array)[], tokenPrefix: Bytes | string | Uint8Array, mode: UpDataStructsCollectionMode | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Vec<u16>, Vec<u16>, Bytes, UpDataStructsCollectionMode]>;
/**
- * Unlock any vested funds of the sender account.
+ * This method creates a concrete instance of NFT Collection created with CreateCollection method.
*
- * The dispatch origin for this call must be _Signed_ and the sender must have funds still
- * locked under this pallet.
+ * # Permissions
*
- * Emits either `VestingCompleted` or `VestingUpdated`.
+ * * Collection Owner.
+ * * Collection Admin.
+ * * Anyone if
+ * * Allow List is enabled, and
+ * * Address is added to allow list, and
+ * * MintPermission is enabled (see SetMintPermission method)
+ *
+ * # Arguments
+ *
+ * * collection_id: ID of the collection.
+ *
+ * * owner: Address, initial owner of the NFT.
*
- * # <weight>
- * - `O(1)`.
- * - DbWeight: 2 Reads, 2 Writes
- * - Reads: Vesting Storage, Balances Locks, [Sender Account]
- * - Writes: Vesting Storage, Balances Locks, [Sender Account]
- * # </weight>
+ * * data: Token data to store on chain.
**/
- vest: AugmentedSubmittable<() => SubmittableExtrinsic<ApiType>, []>;
+ createItem: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, owner: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, data: UpDataStructsCreateItemData | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr, UpDataStructsCreateItemData]>;
/**
- * Create a vested transfer.
+ * This method creates multiple items in a collection created with CreateCollection method.
*
- * The dispatch origin for this call must be _Signed_.
+ * # Permissions
*
- * - `target`: The account receiving the vested funds.
- * - `schedule`: The vesting schedule attached to the transfer.
+ * * Collection Owner.
+ * * Collection Admin.
+ * * Anyone if
+ * * Allow List is enabled, and
+ * * Address is added to allow list, and
+ * * MintPermission is enabled (see SetMintPermission method)
*
- * Emits `VestingCreated`.
+ * # Arguments
*
- * NOTE: This will unlock all schedules through the current block.
+ * * collection_id: ID of the collection.
+ *
+ * * itemsData: Array items properties. Each property is an array of bytes itself, see [create_item].
*
- * # <weight>
- * - `O(1)`.
- * - DbWeight: 3 Reads, 3 Writes
- * - Reads: Vesting Storage, Balances Locks, Target Account, [Sender Account]
- * - Writes: Vesting Storage, Balances Locks, Target Account, [Sender Account]
- * # </weight>
+ * * owner: Address, initial owner of the NFT.
**/
- vestedTransfer: AugmentedSubmittable<(target: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, schedule: PalletVestingVestingInfo | { locked?: any; perBlock?: any; startingBlock?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [MultiAddress, PalletVestingVestingInfo]>;
+ createMultipleItems: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, owner: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, itemsData: Vec<UpDataStructsCreateItemData> | (UpDataStructsCreateItemData | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr, Vec<UpDataStructsCreateItemData>]>;
/**
- * Unlock any vested funds of a `target` account.
+ * **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.
*
- * The dispatch origin for this call must be _Signed_.
+ * # Permissions
*
- * - `target`: The account whose vested funds should be unlocked. Must have funds still
- * locked under this pallet.
+ * * Collection Owner.
*
- * Emits either `VestingCompleted` or `VestingUpdated`.
+ * # Arguments
*
- * # <weight>
- * - `O(1)`.
- * - DbWeight: 3 Reads, 3 Writes
- * - Reads: Vesting Storage, Balances Locks, Target Account
- * - Writes: Vesting Storage, Balances Locks, Target Account
- * # </weight>
+ * * collection_id: collection to destroy.
**/
- vestOther: AugmentedSubmittable<(target: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [MultiAddress]>;
+ destroyCollection: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;
+ /**
+ * Remove admin address of the Collection. An admin address can remove itself. List of admins may become empty, in which case only Collection Owner will be able to add an Admin.
+ *
+ * # Permissions
+ *
+ * * Collection Owner.
+ * * Collection Admin.
+ *
+ * # Arguments
+ *
+ * * collection_id: ID of the Collection to remove admin for.
+ *
+ * * account_id: Address of admin to remove.
+ **/
+ removeCollectionAdmin: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, accountId: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+ /**
+ * Switch back to pay-per-own-transaction model.
+ *
+ * # Permissions
+ *
+ * * Collection owner.
+ *
+ * # Arguments
+ *
+ * * collection_id.
+ **/
+ removeCollectionSponsor: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32]>;
+ /**
+ * Remove an address from allow list.
+ *
+ * # Permissions
+ *
+ * * Collection Owner
+ * * Collection Admin
+ *
+ * # Arguments
+ *
+ * * collection_id.
+ *
+ * * address.
+ **/
+ removeFromAllowList: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, address: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+ setCollectionLimits: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newLimit: UpDataStructsCollectionLimits | { accountTokenOwnershipLimit?: any; sponsoredDataSize?: any; sponsoredDataRateLimit?: any; tokenLimit?: any; sponsorTransferTimeout?: any; sponsorApproveTimeout?: any; ownerCanTransfer?: any; ownerCanDestroy?: any; transfersEnabled?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsCollectionLimits]>;
+ /**
+ * # Permissions
+ *
+ * * Collection Owner
+ *
+ * # Arguments
+ *
+ * * collection_id.
+ *
+ * * new_sponsor.
+ **/
+ setCollectionSponsor: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newSponsor: AccountId32 | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, AccountId32]>;
+ /**
+ * Set const on-chain data schema.
+ *
+ * # Permissions
+ *
+ * * Collection Owner
+ * * Collection Admin
+ *
+ * # Arguments
+ *
+ * * collection_id.
+ *
+ * * schema: String representing the const on-chain data schema.
+ **/
+ setConstOnChainSchema: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, schema: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, Bytes]>;
+ /**
+ * Set meta_update_permission value for particular collection
+ *
+ * # Permissions
+ *
+ * * Collection Owner.
+ *
+ * # Arguments
+ *
+ * * collection_id: ID of the collection.
+ *
+ * * value: New flag value.
+ **/
+ setMetaUpdatePermissionFlag: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, value: UpDataStructsMetaUpdatePermission | 'ItemOwner' | 'Admin' | 'None' | number | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsMetaUpdatePermission]>;
+ /**
+ * Allows Anyone to create tokens if:
+ * * Allow List is enabled, and
+ * * Address is added to allow list, and
+ * * This method was called with True parameter
+ *
+ * # Permissions
+ * * Collection Owner
+ *
+ * # Arguments
+ *
+ * * collection_id.
+ *
+ * * mint_permission: Boolean parameter. If True, allows minting to Anyone with conditions above.
+ **/
+ setMintPermission: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, mintPermission: bool | boolean | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, bool]>;
+ /**
+ * Set off-chain data schema.
+ *
+ * # Permissions
+ *
+ * * Collection Owner
+ * * Collection Admin
+ *
+ * # Arguments
+ *
+ * * collection_id.
+ *
+ * * schema: String representing the offchain data schema.
+ **/
+ setOffchainSchema: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, schema: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, Bytes]>;
+ /**
+ * Toggle between normal and allow list access for the methods with access for `Anyone`.
+ *
+ * # Permissions
+ *
+ * * Collection Owner.
+ *
+ * # Arguments
+ *
+ * * collection_id.
+ *
+ * * mode: [AccessMode]
+ **/
+ setPublicAccessMode: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, mode: UpDataStructsAccessMode | 'Normal' | 'AllowList' | number | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsAccessMode]>;
+ /**
+ * Set schema standard
+ * ImageURL
+ * Unique
+ *
+ * # Permissions
+ *
+ * * Collection Owner
+ * * Collection Admin
+ *
+ * # Arguments
+ *
+ * * collection_id.
+ *
+ * * schema: SchemaVersion: enum
+ **/
+ setSchemaVersion: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, version: UpDataStructsSchemaVersion | 'ImageURL' | 'Unique' | number | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsSchemaVersion]>;
+ /**
+ * Set transfers_enabled value for particular collection
+ *
+ * # Permissions
+ *
+ * * Collection Owner.
+ *
+ * # Arguments
+ *
+ * * collection_id: ID of the collection.
+ *
+ * * value: New flag value.
+ **/
+ setTransfersEnabledFlag: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, value: bool | boolean | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, bool]>;
+ /**
+ * Set off-chain data schema.
+ *
+ * # Permissions
+ *
+ * * Collection Owner
+ * * Collection Admin
+ *
+ * # Arguments
+ *
+ * * collection_id.
+ *
+ * * schema: String representing the offchain data schema.
+ **/
+ setVariableMetaData: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, data: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, u32, Bytes]>;
+ /**
+ * Set variable on-chain data schema.
+ *
+ * # Permissions
+ *
+ * * Collection Owner
+ * * Collection Admin
+ *
+ * # Arguments
+ *
+ * * collection_id.
+ *
+ * * schema: String representing the variable on-chain data schema.
+ **/
+ setVariableOnChainSchema: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, schema: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, Bytes]>;
+ /**
+ * Change ownership of the token.
+ *
+ * # Permissions
+ *
+ * * Collection Owner
+ * * Collection Admin
+ * * Current NFT owner
+ *
+ * # Arguments
+ *
+ * * recipient: Address of token recipient.
+ *
+ * * collection_id.
+ *
+ * * item_id: ID of the item
+ * * Non-Fungible Mode: Required.
+ * * Fungible Mode: Ignored.
+ * * Re-Fungible Mode: Required.
+ *
+ * * value: Amount to transfer.
+ * * Non-Fungible Mode: Ignored
+ * * Fungible Mode: Must specify transferred amount
+ * * Re-Fungible Mode: Must specify transferred portion (between 0 and 1)
+ **/
+ transfer: AugmentedSubmittable<(recipient: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletCommonAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
+ /**
+ * Change ownership of a NFT on behalf of the owner. See Approve method for additional information. After this method executes, the approval is removed so that the approved address will not be able to transfer this NFT again from this owner.
+ *
+ * # Permissions
+ * * Collection Owner
+ * * Collection Admin
+ * * Current NFT owner
+ * * Address approved by current NFT owner
+ *
+ * # Arguments
+ *
+ * * from: Address that owns token.
+ *
+ * * recipient: Address of token recipient.
+ *
+ * * collection_id.
+ *
+ * * item_id: ID of the item.
+ *
+ * * value: Amount to transfer.
+ **/
+ transferFrom: AugmentedSubmittable<(from: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, recipient: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletCommonAccountBasicCrossAccountIdRepr, PalletCommonAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
+ /**
+ * Generic tx
+ **/
+ [key: string]: SubmittableExtrinsicFunction<ApiType>;
+ };
+ vesting: {
+ claim: AugmentedSubmittable<() => SubmittableExtrinsic<ApiType>, []>;
+ claimFor: AugmentedSubmittable<(dest: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [MultiAddress]>;
+ updateVestingSchedules: AugmentedSubmittable<(who: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, vestingSchedules: Vec<OrmlVestingVestingSchedule> | (OrmlVestingVestingSchedule | { start?: any; period?: any; periodCount?: any; perPeriod?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [MultiAddress, Vec<OrmlVestingVestingSchedule>]>;
+ vestedTransfer: AugmentedSubmittable<(dest: MultiAddress | { Id: any } | { Index: any } | { Raw: any } | { Address32: any } | { Address20: any } | string | Uint8Array, schedule: OrmlVestingVestingSchedule | { start?: any; period?: any; periodCount?: any; perPeriod?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [MultiAddress, OrmlVestingVestingSchedule]>;
/**
* Generic tx
**/
tests/src/interfaces/augment-types.tsdiffbeforeafterboth--- a/tests/src/interfaces/augment-types.ts
+++ b/tests/src/interfaces/augment-types.ts
@@ -2,8 +2,8 @@
/* eslint-disable */
import type { EthereumBlock, EthereumLog, EthereumReceipt, EthereumTransactionLegacyTransaction, EvmCoreErrorExitReason, FpRpcTransactionStatus } from './ethereum';
-import type { NftDataStructsAccessMode, NftDataStructsCollection, NftDataStructsCollectionId, NftDataStructsCollectionLimits, NftDataStructsCollectionMode, NftDataStructsCollectionStats, NftDataStructsCreateItemData, NftDataStructsMetaUpdatePermission, NftDataStructsSchemaVersion, NftDataStructsSponsorshipState, NftDataStructsTokenId, PalletCommonAccountBasicCrossAccountIdRepr, PalletNonfungibleItemData, PalletRefungibleItemData, PalletUnqSchedulerCallSpec, PalletUnqSchedulerReleases, PalletUnqSchedulerScheduledV2 } from './nft';
import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundStatus, CumulusPalletXcmpQueueOutboundStatus, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV1AbridgedHostConfiguration, PolkadotPrimitivesV1PersistedValidationData } from './polkadot';
+import type { PalletCommonAccountBasicCrossAccountIdRepr, PalletNonfungibleItemData, PalletRefungibleItemData, PalletUnqSchedulerCallSpec, PalletUnqSchedulerReleases, PalletUnqSchedulerScheduledV2, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionId, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionStats, UpDataStructsCreateItemData, UpDataStructsMetaUpdatePermission, UpDataStructsSchemaVersion, UpDataStructsSponsorshipState, UpDataStructsTokenId } from './unique';
import type { BitVec, Bool, Bytes, Data, I128, I16, I256, I32, I64, I8, Json, Null, Raw, StorageKey, Text, Type, U128, U16, U256, U32, U64, U8, USize, bool, i128, i16, i256, i32, i64, i8, u128, u16, u256, u32, u64, u8, usize } from '@polkadot/types';
import type { AssetApproval, AssetApprovalKey, AssetBalance, AssetDestroyWitness, AssetDetails, AssetMetadata, TAssetBalance, TAssetDepositBalance } from '@polkadot/types/interfaces/assets';
import type { BlockAttestations, IncludedBlocks, MoreAttestations } from '@polkadot/types/interfaces/attestations';
@@ -622,17 +622,6 @@
NextAuthority: NextAuthority;
NextConfigDescriptor: NextConfigDescriptor;
NextConfigDescriptorV1: NextConfigDescriptorV1;
- NftDataStructsAccessMode: NftDataStructsAccessMode;
- NftDataStructsCollection: NftDataStructsCollection;
- NftDataStructsCollectionId: NftDataStructsCollectionId;
- NftDataStructsCollectionLimits: NftDataStructsCollectionLimits;
- NftDataStructsCollectionMode: NftDataStructsCollectionMode;
- NftDataStructsCollectionStats: NftDataStructsCollectionStats;
- NftDataStructsCreateItemData: NftDataStructsCreateItemData;
- NftDataStructsMetaUpdatePermission: NftDataStructsMetaUpdatePermission;
- NftDataStructsSchemaVersion: NftDataStructsSchemaVersion;
- NftDataStructsSponsorshipState: NftDataStructsSponsorshipState;
- NftDataStructsTokenId: NftDataStructsTokenId;
NodeRole: NodeRole;
Nominations: Nominations;
NominatorIndex: NominatorIndex;
@@ -1026,6 +1015,17 @@
UnlockChunk: UnlockChunk;
UnrewardedRelayer: UnrewardedRelayer;
UnrewardedRelayersState: UnrewardedRelayersState;
+ UpDataStructsAccessMode: UpDataStructsAccessMode;
+ UpDataStructsCollection: UpDataStructsCollection;
+ UpDataStructsCollectionId: UpDataStructsCollectionId;
+ UpDataStructsCollectionLimits: UpDataStructsCollectionLimits;
+ UpDataStructsCollectionMode: UpDataStructsCollectionMode;
+ UpDataStructsCollectionStats: UpDataStructsCollectionStats;
+ UpDataStructsCreateItemData: UpDataStructsCreateItemData;
+ UpDataStructsMetaUpdatePermission: UpDataStructsMetaUpdatePermission;
+ UpDataStructsSchemaVersion: UpDataStructsSchemaVersion;
+ UpDataStructsSponsorshipState: UpDataStructsSponsorshipState;
+ UpDataStructsTokenId: UpDataStructsTokenId;
UpgradeGoAhead: UpgradeGoAhead;
UpgradeRestriction: UpgradeRestriction;
UpwardMessage: UpwardMessage;
tests/src/interfaces/definitions.tsdiffbeforeafterboth--- a/tests/src/interfaces/definitions.ts
+++ b/tests/src/interfaces/definitions.ts
@@ -1,3 +1,3 @@
-export {default as nft} from './nft/definitions';
+export {default as unique} from './unique/definitions';
export {default as ethereum} from './ethereum/definitions';
export {default as polkadot} from './polkadot/definitions';
tests/src/interfaces/nft/definitions.tsdiffbeforeafterboth--- a/tests/src/interfaces/nft/definitions.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-function mkDummy(name: string) {
- return {
- ['dummy' + name]: 'u32',
- };
-}
-
-type RpcParam = {
- name: string;
- type: string;
- isOptional?: true;
-};
-
-const CROSS_ACCOUNT_ID_TYPE = 'PalletCommonAccountBasicCrossAccountIdRepr';
-const TOKEN_ID_TYPE = 'NftDataStructsTokenId';
-
-const collectionParam = {name: 'collection', type: 'NftDataStructsCollectionId'};
-const tokenParam = {name: 'tokenId', type: TOKEN_ID_TYPE};
-const crossAccountParam = (name = 'account') => ({name, type: CROSS_ACCOUNT_ID_TYPE});
-const atParam = {name: 'at', type: 'Hash', isOptional: true};
-
-const fun = (description: string, params: RpcParam[], type: string) => ({
- description,
- params: [...params, atParam],
- type,
-});
-
-export default {
- rpc: {
- adminlist: fun('Get admin list', [collectionParam], 'Vec<PalletCommonAccountBasicCrossAccountIdRepr>'),
- allowlist: fun('Get allowlist', [collectionParam], 'Vec<PalletCommonAccountBasicCrossAccountIdRepr>'),
-
- accountTokens: fun('Get tokens owned by account', [collectionParam, crossAccountParam()], 'Vec<NftDataStructsTokenId>'),
- collectionTokens: fun('Get tokens contained in collection', [collectionParam], 'Vec<NftDataStructsTokenId>'),
-
- lastTokenId: fun('Get last token id', [collectionParam], TOKEN_ID_TYPE),
- accountBalance: fun('Get amount of different user tokens', [collectionParam, crossAccountParam()], 'u32'),
- balance: fun('Get amount of specific account token', [collectionParam, crossAccountParam(), tokenParam], 'u128'),
- allowance: fun('Get allowed amount', [collectionParam, crossAccountParam('sender'), crossAccountParam('spender'), tokenParam], 'u128'),
- tokenOwner: fun('Get token owner', [collectionParam, tokenParam], CROSS_ACCOUNT_ID_TYPE),
- constMetadata: fun('Get token constant metadata', [collectionParam, tokenParam], 'Vec<u8>'),
- variableMetadata: fun('Get token variable metadata', [collectionParam, tokenParam], 'Vec<u8>'),
- tokenExists: fun('Check if token exists', [collectionParam, tokenParam], 'bool'),
- collectionById: fun('Get collection by specified id', [collectionParam], 'Option<NftDataStructsCollection>'),
- collectionStats: fun('Get collection stats', [], 'NftDataStructsCollectionStats'),
- allowed: fun('Check if user is allowed to use collection', [collectionParam, crossAccountParam()], 'bool'),
- },
- types: {
- PalletCommonAccountBasicCrossAccountIdRepr: {
- _enum: {
- Substrate: 'AccountId',
- Ethereum: 'H160',
- },
- },
- NftDataStructsCollection: {
- owner: 'AccountId',
- mode: 'NftDataStructsCollectionMode',
- access: 'NftDataStructsAccessMode',
- name: 'Vec<u16>',
- description: 'Vec<u16>',
- tokenPrefix: 'Vec<u8>',
- mintMode: 'bool',
- offchainSchema: 'Vec<u8>',
- schemaVersion: 'NftDataStructsSchemaVersion',
- sponsorship: 'NftDataStructsSponsorshipState',
- limits: 'NftDataStructsCollectionLimits',
- variableOnChainSchema: 'Vec<u8>',
- constOnChainSchema: 'Vec<u8>',
- metaUpdatePermission: 'NftDataStructsMetaUpdatePermission',
- },
- NftDataStructsCollectionStats: {
- created: 'u32',
- destroyed: 'u32',
- alive: 'u32',
- },
- NftDataStructsCollectionId: 'u32',
- NftDataStructsTokenId: 'u32',
- PalletNonfungibleItemData: mkDummy('NftItemData'),
- PalletRefungibleItemData: mkDummy('RftItemData'),
- NftDataStructsCollectionMode: mkDummy('CollectionMode'),
- NftDataStructsCreateItemData: mkDummy('CreateItemData'),
- NftDataStructsCollectionLimits: {
- accountTokenOwnershipLimit: 'Option<u32>',
- sponsoredDataSize: 'Option<u32>',
- sponsoredDataRateLimit: 'Option<u32>',
- tokenLimit: 'Option<u32>',
- sponsorTransferTimeout: 'Option<u32>',
- ownerCanTransfer: 'Option<bool>',
- ownerCanDestroy: 'Option<bool>',
- transfersEnabled: 'Option<bool>',
- },
- NftDataStructsMetaUpdatePermission: {
- _enum: ['ItemOwner', 'Admin', 'None'],
- },
- NftDataStructsSponsorshipState: {
- _enum: {
- Disabled: null,
- Unconfirmed: 'AccountId',
- Confirmed: 'AccountId',
- },
- },
- NftDataStructsAccessMode: {
- _enum: ['Normal', 'AllowList'],
- },
- NftDataStructsSchemaVersion: mkDummy('SchemaVersion'),
-
- PalletUnqSchedulerScheduledV2: mkDummy('ScheduledV2'),
- PalletUnqSchedulerCallSpec: mkDummy('CallSpec'),
- PalletUnqSchedulerReleases: mkDummy('Releases'),
- },
-};
tests/src/interfaces/nft/index.tsdiffbeforeafterboth--- a/tests/src/interfaces/nft/index.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-// Auto-generated via `yarn polkadot-types-from-defs`, do not edit
-/* eslint-disable */
-
-export * from './types';
tests/src/interfaces/nft/types.tsdiffbeforeafterboth--- a/tests/src/interfaces/nft/types.ts
+++ /dev/null
@@ -1,120 +0,0 @@
-// Auto-generated via `yarn polkadot-types-from-defs`, do not edit
-/* eslint-disable */
-
-import type { Bytes, Enum, Option, Struct, Vec, bool, u16, u32 } from '@polkadot/types';
-import type { AccountId, H160 } from '@polkadot/types/interfaces/runtime';
-
-/** @name NftDataStructsAccessMode */
-export interface NftDataStructsAccessMode extends Enum {
- readonly isNormal: boolean;
- readonly isAllowList: boolean;
-}
-
-/** @name NftDataStructsCollection */
-export interface NftDataStructsCollection extends Struct {
- readonly owner: AccountId;
- readonly mode: NftDataStructsCollectionMode;
- readonly access: NftDataStructsAccessMode;
- readonly name: Vec<u16>;
- readonly description: Vec<u16>;
- readonly tokenPrefix: Bytes;
- readonly mintMode: bool;
- readonly offchainSchema: Bytes;
- readonly schemaVersion: NftDataStructsSchemaVersion;
- readonly sponsorship: NftDataStructsSponsorshipState;
- readonly limits: NftDataStructsCollectionLimits;
- readonly variableOnChainSchema: Bytes;
- readonly constOnChainSchema: Bytes;
- readonly metaUpdatePermission: NftDataStructsMetaUpdatePermission;
-}
-
-/** @name NftDataStructsCollectionId */
-export interface NftDataStructsCollectionId extends u32 {}
-
-/** @name NftDataStructsCollectionLimits */
-export interface NftDataStructsCollectionLimits extends Struct {
- readonly accountTokenOwnershipLimit: Option<u32>;
- readonly sponsoredDataSize: Option<u32>;
- readonly sponsoredDataRateLimit: Option<u32>;
- readonly tokenLimit: Option<u32>;
- readonly sponsorTransferTimeout: Option<u32>;
- readonly ownerCanTransfer: Option<bool>;
- readonly ownerCanDestroy: Option<bool>;
- readonly transfersEnabled: Option<bool>;
-}
-
-/** @name NftDataStructsCollectionMode */
-export interface NftDataStructsCollectionMode extends Struct {
- readonly dummyCollectionMode: u32;
-}
-
-/** @name NftDataStructsCollectionStats */
-export interface NftDataStructsCollectionStats extends Struct {
- readonly created: u32;
- readonly destroyed: u32;
- readonly alive: u32;
-}
-
-/** @name NftDataStructsCreateItemData */
-export interface NftDataStructsCreateItemData extends Struct {
- readonly dummyCreateItemData: u32;
-}
-
-/** @name NftDataStructsMetaUpdatePermission */
-export interface NftDataStructsMetaUpdatePermission extends Enum {
- readonly isItemOwner: boolean;
- readonly isAdmin: boolean;
- readonly isNone: boolean;
-}
-
-/** @name NftDataStructsSchemaVersion */
-export interface NftDataStructsSchemaVersion extends Struct {
- readonly dummySchemaVersion: u32;
-}
-
-/** @name NftDataStructsSponsorshipState */
-export interface NftDataStructsSponsorshipState extends Enum {
- readonly isDisabled: boolean;
- readonly isUnconfirmed: boolean;
- readonly asUnconfirmed: AccountId;
- readonly isConfirmed: boolean;
- readonly asConfirmed: AccountId;
-}
-
-/** @name NftDataStructsTokenId */
-export interface NftDataStructsTokenId extends u32 {}
-
-/** @name PalletCommonAccountBasicCrossAccountIdRepr */
-export interface PalletCommonAccountBasicCrossAccountIdRepr extends Enum {
- readonly isSubstrate: boolean;
- readonly asSubstrate: AccountId;
- readonly isEthereum: boolean;
- readonly asEthereum: H160;
-}
-
-/** @name PalletNonfungibleItemData */
-export interface PalletNonfungibleItemData extends Struct {
- readonly dummyNftItemData: u32;
-}
-
-/** @name PalletRefungibleItemData */
-export interface PalletRefungibleItemData extends Struct {
- readonly dummyRftItemData: u32;
-}
-
-/** @name PalletUnqSchedulerCallSpec */
-export interface PalletUnqSchedulerCallSpec extends Struct {
- readonly dummyCallSpec: u32;
-}
-
-/** @name PalletUnqSchedulerReleases */
-export interface PalletUnqSchedulerReleases extends Struct {
- readonly dummyReleases: u32;
-}
-
-/** @name PalletUnqSchedulerScheduledV2 */
-export interface PalletUnqSchedulerScheduledV2 extends Struct {
- readonly dummyScheduledV2: u32;
-}
-
-export type PHANTOM_NFT = 'nft';
tests/src/interfaces/types.tsdiffbeforeafterboth--- a/tests/src/interfaces/types.ts
+++ b/tests/src/interfaces/types.ts
@@ -1,6 +1,6 @@
// Auto-generated via `yarn polkadot-types-from-defs`, do not edit
/* eslint-disable */
-export * from './nft/types';
+export * from './unique/types';
export * from './ethereum/types';
export * from './polkadot/types';
tests/src/interfaces/unique/definitions.tsdiffbeforeafterboth--- /dev/null
+++ b/tests/src/interfaces/unique/definitions.ts
@@ -0,0 +1,110 @@
+function mkDummy(name: string) {
+ return {
+ ['dummy' + name]: 'u32',
+ };
+}
+
+type RpcParam = {
+ name: string;
+ type: string;
+ isOptional?: true;
+};
+
+const CROSS_ACCOUNT_ID_TYPE = 'PalletCommonAccountBasicCrossAccountIdRepr';
+const TOKEN_ID_TYPE = 'UpDataStructsTokenId';
+
+const collectionParam = {name: 'collection', type: 'UpDataStructsCollectionId'};
+const tokenParam = {name: 'tokenId', type: TOKEN_ID_TYPE};
+const crossAccountParam = (name = 'account') => ({name, type: CROSS_ACCOUNT_ID_TYPE});
+const atParam = {name: 'at', type: 'Hash', isOptional: true};
+
+const fun = (description: string, params: RpcParam[], type: string) => ({
+ description,
+ params: [...params, atParam],
+ type,
+});
+
+export default {
+ rpc: {
+ adminlist: fun('Get admin list', [collectionParam], 'Vec<PalletCommonAccountBasicCrossAccountIdRepr>'),
+ allowlist: fun('Get allowlist', [collectionParam], 'Vec<PalletCommonAccountBasicCrossAccountIdRepr>'),
+
+ accountTokens: fun('Get tokens owned by account', [collectionParam, crossAccountParam()], 'Vec<UpDataStructsTokenId>'),
+ collectionTokens: fun('Get tokens contained in collection', [collectionParam], 'Vec<UpDataStructsTokenId>'),
+
+ lastTokenId: fun('Get last token id', [collectionParam], TOKEN_ID_TYPE),
+ accountBalance: fun('Get amount of different user tokens', [collectionParam, crossAccountParam()], 'u32'),
+ balance: fun('Get amount of specific account token', [collectionParam, crossAccountParam(), tokenParam], 'u128'),
+ allowance: fun('Get allowed amount', [collectionParam, crossAccountParam('sender'), crossAccountParam('spender'), tokenParam], 'u128'),
+ tokenOwner: fun('Get token owner', [collectionParam, tokenParam], CROSS_ACCOUNT_ID_TYPE),
+ constMetadata: fun('Get token constant metadata', [collectionParam, tokenParam], 'Vec<u8>'),
+ variableMetadata: fun('Get token variable metadata', [collectionParam, tokenParam], 'Vec<u8>'),
+ tokenExists: fun('Check if token exists', [collectionParam, tokenParam], 'bool'),
+ collectionById: fun('Get collection by specified id', [collectionParam], 'Option<UpDataStructsCollection>'),
+ collectionStats: fun('Get collection stats', [], 'UpDataStructsCollectionStats'),
+ allowed: fun('Check if user is allowed to use collection', [collectionParam, crossAccountParam()], 'bool'),
+ },
+ types: {
+ PalletCommonAccountBasicCrossAccountIdRepr: {
+ _enum: {
+ Substrate: 'AccountId',
+ Ethereum: 'H160',
+ },
+ },
+ UpDataStructsCollection: {
+ owner: 'AccountId',
+ mode: 'UpDataStructsCollectionMode',
+ access: 'UpDataStructsAccessMode',
+ name: 'Vec<u16>',
+ description: 'Vec<u16>',
+ tokenPrefix: 'Vec<u8>',
+ mintMode: 'bool',
+ offchainSchema: 'Vec<u8>',
+ schemaVersion: 'UpDataStructsSchemaVersion',
+ sponsorship: 'UpDataStructsSponsorshipState',
+ limits: 'UpDataStructsCollectionLimits',
+ variableOnChainSchema: 'Vec<u8>',
+ constOnChainSchema: 'Vec<u8>',
+ metaUpdatePermission: 'UpDataStructsMetaUpdatePermission',
+ },
+ UpDataStructsCollectionStats: {
+ created: 'u32',
+ destroyed: 'u32',
+ alive: 'u32',
+ },
+ UpDataStructsCollectionId: 'u32',
+ UpDataStructsTokenId: 'u32',
+ PalletNonfungibleItemData: mkDummy('NftItemData'),
+ PalletRefungibleItemData: mkDummy('RftItemData'),
+ UpDataStructsCollectionMode: mkDummy('CollectionMode'),
+ UpDataStructsCreateItemData: mkDummy('CreateItemData'),
+ UpDataStructsCollectionLimits: {
+ accountTokenOwnershipLimit: 'Option<u32>',
+ sponsoredDataSize: 'Option<u32>',
+ sponsoredDataRateLimit: 'Option<u32>',
+ tokenLimit: 'Option<u32>',
+ sponsorTransferTimeout: 'Option<u32>',
+ ownerCanTransfer: 'Option<bool>',
+ ownerCanDestroy: 'Option<bool>',
+ transfersEnabled: 'Option<bool>',
+ },
+ UpDataStructsMetaUpdatePermission: {
+ _enum: ['ItemOwner', 'Admin', 'None'],
+ },
+ UpDataStructsSponsorshipState: {
+ _enum: {
+ Disabled: null,
+ Unconfirmed: 'AccountId',
+ Confirmed: 'AccountId',
+ },
+ },
+ UpDataStructsAccessMode: {
+ _enum: ['Normal', 'AllowList'],
+ },
+ UpDataStructsSchemaVersion: mkDummy('SchemaVersion'),
+
+ PalletUnqSchedulerScheduledV2: mkDummy('ScheduledV2'),
+ PalletUnqSchedulerCallSpec: mkDummy('CallSpec'),
+ PalletUnqSchedulerReleases: mkDummy('Releases'),
+ },
+};
tests/src/interfaces/unique/index.tsdiffbeforeafterboth--- /dev/null
+++ b/tests/src/interfaces/unique/index.ts
@@ -0,0 +1,4 @@
+// Auto-generated via `yarn polkadot-types-from-defs`, do not edit
+/* eslint-disable */
+
+export * from './types';
tests/src/interfaces/unique/types.tsdiffbeforeafterboth--- /dev/null
+++ b/tests/src/interfaces/unique/types.ts
@@ -0,0 +1,120 @@
+// Auto-generated via `yarn polkadot-types-from-defs`, do not edit
+/* eslint-disable */
+
+import type { Bytes, Enum, Option, Struct, Vec, bool, u16, u32 } from '@polkadot/types';
+import type { AccountId, H160 } from '@polkadot/types/interfaces/runtime';
+
+/** @name PalletCommonAccountBasicCrossAccountIdRepr */
+export interface PalletCommonAccountBasicCrossAccountIdRepr extends Enum {
+ readonly isSubstrate: boolean;
+ readonly asSubstrate: AccountId;
+ readonly isEthereum: boolean;
+ readonly asEthereum: H160;
+}
+
+/** @name PalletNonfungibleItemData */
+export interface PalletNonfungibleItemData extends Struct {
+ readonly dummyNftItemData: u32;
+}
+
+/** @name PalletRefungibleItemData */
+export interface PalletRefungibleItemData extends Struct {
+ readonly dummyRftItemData: u32;
+}
+
+/** @name PalletUnqSchedulerCallSpec */
+export interface PalletUnqSchedulerCallSpec extends Struct {
+ readonly dummyCallSpec: u32;
+}
+
+/** @name PalletUnqSchedulerReleases */
+export interface PalletUnqSchedulerReleases extends Struct {
+ readonly dummyReleases: u32;
+}
+
+/** @name PalletUnqSchedulerScheduledV2 */
+export interface PalletUnqSchedulerScheduledV2 extends Struct {
+ readonly dummyScheduledV2: u32;
+}
+
+/** @name UpDataStructsAccessMode */
+export interface UpDataStructsAccessMode extends Enum {
+ readonly isNormal: boolean;
+ readonly isAllowList: boolean;
+}
+
+/** @name UpDataStructsCollection */
+export interface UpDataStructsCollection extends Struct {
+ readonly owner: AccountId;
+ readonly mode: UpDataStructsCollectionMode;
+ readonly access: UpDataStructsAccessMode;
+ readonly name: Vec<u16>;
+ readonly description: Vec<u16>;
+ readonly tokenPrefix: Bytes;
+ readonly mintMode: bool;
+ readonly offchainSchema: Bytes;
+ readonly schemaVersion: UpDataStructsSchemaVersion;
+ readonly sponsorship: UpDataStructsSponsorshipState;
+ readonly limits: UpDataStructsCollectionLimits;
+ readonly variableOnChainSchema: Bytes;
+ readonly constOnChainSchema: Bytes;
+ readonly metaUpdatePermission: UpDataStructsMetaUpdatePermission;
+}
+
+/** @name UpDataStructsCollectionId */
+export interface UpDataStructsCollectionId extends u32 {}
+
+/** @name UpDataStructsCollectionLimits */
+export interface UpDataStructsCollectionLimits extends Struct {
+ readonly accountTokenOwnershipLimit: Option<u32>;
+ readonly sponsoredDataSize: Option<u32>;
+ readonly sponsoredDataRateLimit: Option<u32>;
+ readonly tokenLimit: Option<u32>;
+ readonly sponsorTransferTimeout: Option<u32>;
+ readonly ownerCanTransfer: Option<bool>;
+ readonly ownerCanDestroy: Option<bool>;
+ readonly transfersEnabled: Option<bool>;
+}
+
+/** @name UpDataStructsCollectionMode */
+export interface UpDataStructsCollectionMode extends Struct {
+ readonly dummyCollectionMode: u32;
+}
+
+/** @name UpDataStructsCollectionStats */
+export interface UpDataStructsCollectionStats extends Struct {
+ readonly created: u32;
+ readonly destroyed: u32;
+ readonly alive: u32;
+}
+
+/** @name UpDataStructsCreateItemData */
+export interface UpDataStructsCreateItemData extends Struct {
+ readonly dummyCreateItemData: u32;
+}
+
+/** @name UpDataStructsMetaUpdatePermission */
+export interface UpDataStructsMetaUpdatePermission extends Enum {
+ readonly isItemOwner: boolean;
+ readonly isAdmin: boolean;
+ readonly isNone: boolean;
+}
+
+/** @name UpDataStructsSchemaVersion */
+export interface UpDataStructsSchemaVersion extends Struct {
+ readonly dummySchemaVersion: u32;
+}
+
+/** @name UpDataStructsSponsorshipState */
+export interface UpDataStructsSponsorshipState extends Enum {
+ readonly isDisabled: boolean;
+ readonly isUnconfirmed: boolean;
+ readonly asUnconfirmed: AccountId;
+ readonly isConfirmed: boolean;
+ readonly asConfirmed: AccountId;
+}
+
+/** @name UpDataStructsTokenId */
+export interface UpDataStructsTokenId extends u32 {}
+
+export type PHANTOM_UNIQUE = 'unique';
tests/src/pallet-presence.test.tsdiffbeforeafterboth--- a/tests/src/pallet-presence.test.ts
+++ b/tests/src/pallet-presence.test.ts
@@ -35,10 +35,10 @@
'cumulusxcm',
'dmpqueue',
'inflation',
- 'nft',
+ 'unique',
'nonfungible',
'refungible',
- 'scheduler',
+ //'scheduler',
'charging',
];
tests/src/removeCollectionAdmin.test.tsdiffbeforeafterboth--- a/tests/src/removeCollectionAdmin.test.ts
+++ b/tests/src/removeCollectionAdmin.test.ts
@@ -22,14 +22,14 @@
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.owner.toString()).to.be.deep.eq(alice.address);
// first - add collection admin Bob
- const addAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
+ const addAdminTx = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
await submitTransactionAsync(alice, addAdminTx);
const adminListAfterAddAdmin = await getAdminList(api, collectionId);
expect(adminListAfterAddAdmin).to.be.deep.contains(normalizeAccountId(bob.address));
// then remove bob from admins of collection
- const removeAdminTx = api.tx.nft.removeCollectionAdmin(collectionId, normalizeAccountId(bob.address));
+ const removeAdminTx = api.tx.unique.removeCollectionAdmin(collectionId, normalizeAccountId(bob.address));
await submitTransactionAsync(alice, removeAdminTx);
const adminListAfterRemoveAdmin = await getAdminList(api, collectionId);
@@ -46,17 +46,17 @@
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.owner.toString()).to.be.eq(alice.address);
// first - add collection admin Bob
- const addAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
+ const addAdminTx = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
await submitTransactionAsync(alice, addAdminTx);
- const addAdminTx2 = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(charlie.address));
+ const addAdminTx2 = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(charlie.address));
await submitTransactionAsync(alice, addAdminTx2);
const adminListAfterAddAdmin = await getAdminList(api, collectionId);
expect(adminListAfterAddAdmin).to.be.deep.contains(normalizeAccountId(bob.address));
// then remove bob from admins of collection
- const removeAdminTx = api.tx.nft.removeCollectionAdmin(collectionId, normalizeAccountId(bob.address));
+ const removeAdminTx = api.tx.unique.removeCollectionAdmin(collectionId, normalizeAccountId(bob.address));
await submitTransactionAsync(charlie, removeAdminTx);
const adminListAfterRemoveAdmin = await getAdminList(api, collectionId);
@@ -72,7 +72,7 @@
const adminListBeforeAddAdmin = await getAdminList(api, collectionId);
expect(adminListBeforeAddAdmin).to.have.lengthOf(0);
- const tx = api.tx.nft.removeCollectionAdmin(collectionId, normalizeAccountId(alice.address));
+ const tx = api.tx.unique.removeCollectionAdmin(collectionId, normalizeAccountId(alice.address));
await submitTransactionAsync(alice, tx);
});
});
@@ -86,7 +86,7 @@
const alice = privateKey('//Alice');
const bob = privateKey('//Bob');
- const changeOwnerTx = api.tx.nft.removeCollectionAdmin(collectionId, normalizeAccountId(bob.address));
+ const changeOwnerTx = api.tx.unique.removeCollectionAdmin(collectionId, normalizeAccountId(bob.address));
await expect(submitTransactionExpectFailAsync(alice, changeOwnerTx)).to.be.rejected;
// Verifying that nothing bad happened (network is live, new collections can be created, etc.)
@@ -103,7 +103,7 @@
await destroyCollectionExpectSuccess(collectionId);
- const changeOwnerTx = api.tx.nft.removeCollectionAdmin(collectionId, normalizeAccountId(bob.address));
+ const changeOwnerTx = api.tx.unique.removeCollectionAdmin(collectionId, normalizeAccountId(bob.address));
await expect(submitTransactionExpectFailAsync(alice, changeOwnerTx)).to.be.rejected;
// Verifying that nothing bad happened (network is live, new collections can be created, etc.)
@@ -118,10 +118,10 @@
const bob = privateKey('//Bob');
const charlie = privateKey('//Charlie');
- const addAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
+ const addAdminTx = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
await submitTransactionAsync(alice, addAdminTx);
- const changeOwnerTx = api.tx.nft.removeCollectionAdmin(collectionId, normalizeAccountId(bob.address));
+ const changeOwnerTx = api.tx.unique.removeCollectionAdmin(collectionId, normalizeAccountId(bob.address));
await expect(submitTransactionExpectFailAsync(charlie, changeOwnerTx)).to.be.rejected;
// Verifying that nothing bad happened (network is live, new collections can be created, etc.)
tests/src/removeCollectionSponsor.test.tsdiffbeforeafterboth--- a/tests/src/removeCollectionSponsor.test.ts
+++ b/tests/src/removeCollectionSponsor.test.ts
@@ -54,7 +54,7 @@
// Transfer this tokens from unused address to Alice - should fail
const sponsorBalanceBefore = (await api.query.system.account(bob.address)).data.free.toBigInt();
- const zeroToAlice = api.tx.nft.transfer(normalizeAccountId(alice.address), collectionId, itemId, 0);
+ const zeroToAlice = api.tx.unique.transfer(normalizeAccountId(alice.address), collectionId, itemId, 0);
const badTransaction = async function () {
await submitTransactionExpectFailAsync(zeroBalance, zeroToAlice);
};
tests/src/scheduler.test.tsdiffbeforeafterboth--- a/tests/src/scheduler.test.ts
+++ b/tests/src/scheduler.test.ts
@@ -17,7 +17,7 @@
chai.use(chaiAsPromised);
-describe('Integration Test scheduler base transaction', () => {
+describe.skip('Integration Test scheduler base transaction', () => {
it('User can transfer owned token with delay (scheduler)', async () => {
await usingApi(async () => {
const alice = privateKey('//Alice');
tests/src/setCollectionLimits.test.tsdiffbeforeafterboth--- a/tests/src/setCollectionLimits.test.ts
+++ b/tests/src/setCollectionLimits.test.ts
@@ -41,7 +41,7 @@
});
it('execute setCollectionLimits with predefined params ', async () => {
await usingApi(async (api: ApiPromise) => {
- tx = api.tx.nft.setCollectionLimits(
+ tx = api.tx.unique.setCollectionLimits(
collectionIdForTesting,
{
accountTokenOwnershipLimit: accountTokenOwnershipLimit,
@@ -82,7 +82,7 @@
};
// The first time
- const tx1 = api.tx.nft.setCollectionLimits(
+ const tx1 = api.tx.unique.setCollectionLimits(
collectionIdForTesting,
collectionLimits,
);
@@ -93,7 +93,7 @@
expect(collectionInfo1.limits.tokenLimit.unwrap().toNumber()).to.be.equal(tokenLimit);
// The second time
- const tx2 = api.tx.nft.setCollectionLimits(
+ const tx2 = api.tx.unique.setCollectionLimits(
collectionIdForTesting,
collectionLimits,
);
@@ -121,7 +121,7 @@
await usingApi(async (api: ApiPromise) => {
const collectionCount = await getCreatedCollectionCount(api);
const nonExistedCollectionId = collectionCount + 1;
- tx = api.tx.nft.setCollectionLimits(
+ tx = api.tx.unique.setCollectionLimits(
nonExistedCollectionId,
{
accountTokenOwnershipLimit,
@@ -135,7 +135,7 @@
});
it('execute setCollectionLimits from user who is not owner of this collection', async () => {
await usingApi(async (api: ApiPromise) => {
- tx = api.tx.nft.setCollectionLimits(
+ tx = api.tx.unique.setCollectionLimits(
collectionIdForTesting,
{
accountTokenOwnershipLimit,
@@ -150,7 +150,7 @@
it('execute setCollectionLimits from admin collection', async () => {
await addCollectionAdminExpectSuccess(alice, collectionIdForTesting, bob.address);
await usingApi(async (api: ApiPromise) => {
- tx = api.tx.nft.setCollectionLimits(
+ tx = api.tx.unique.setCollectionLimits(
collectionIdForTesting,
{
accountTokenOwnershipLimit,
tests/src/setConstOnChainSchema.test.tsdiffbeforeafterboth--- a/tests/src/setConstOnChainSchema.test.ts
+++ b/tests/src/setConstOnChainSchema.test.ts
@@ -41,7 +41,7 @@
const collectionId = await createCollectionExpectSuccess();
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.owner.toString()).to.be.eq(alice.address);
- const setShema = api.tx.nft.setConstOnChainSchema(collectionId, shema);
+ const setShema = api.tx.unique.setConstOnChainSchema(collectionId, shema);
await submitTransactionAsync(alice, setShema);
});
});
@@ -52,7 +52,7 @@
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.owner.toString()).to.be.eq(alice.address);
await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);
- const setShema = api.tx.nft.setConstOnChainSchema(collectionId, shema);
+ const setShema = api.tx.unique.setConstOnChainSchema(collectionId, shema);
await submitTransactionAsync(bob, setShema);
});
});
@@ -60,7 +60,7 @@
it('Checking collection data using the ConstOnChainSchema parameter', async () => {
await usingApi(async (api) => {
const collectionId = await createCollectionExpectSuccess();
- const setShema = api.tx.nft.setConstOnChainSchema(collectionId, shema);
+ const setShema = api.tx.unique.setConstOnChainSchema(collectionId, shema);
await submitTransactionAsync(alice, setShema);
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.constOnChainSchema.toString()).to.be.eq(shema);
@@ -74,7 +74,7 @@
await usingApi(async (api) => {
// tslint:disable-next-line: radix
const collectionId = await getCreatedCollectionCount(api) + 1;
- const setShema = api.tx.nft.setConstOnChainSchema(collectionId, shema);
+ const setShema = api.tx.unique.setConstOnChainSchema(collectionId, shema);
await expect(submitTransactionExpectFailAsync(alice, setShema)).to.be.rejected;
});
});
@@ -83,7 +83,7 @@
await usingApi(async (api) => {
const collectionId = await createCollectionExpectSuccess();
await destroyCollectionExpectSuccess(collectionId);
- const setShema = api.tx.nft.setConstOnChainSchema(collectionId, shema);
+ const setShema = api.tx.unique.setConstOnChainSchema(collectionId, shema);
await expect(submitTransactionExpectFailAsync(alice, setShema)).to.be.rejected;
});
});
@@ -91,7 +91,7 @@
it('Set invalid data in schema (size too large:> 1024b)', async () => {
await usingApi(async (api) => {
const collectionId = await createCollectionExpectSuccess();
- const setShema = api.tx.nft.setConstOnChainSchema(collectionId, largeShema);
+ const setShema = api.tx.unique.setConstOnChainSchema(collectionId, largeShema);
await expect(submitTransactionExpectFailAsync(alice, setShema)).to.be.rejected;
});
});
@@ -101,7 +101,7 @@
const collectionId = await createCollectionExpectSuccess();
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.owner.toString()).to.be.eq(alice.address);
- const setShema = api.tx.nft.setConstOnChainSchema(collectionId, shema);
+ const setShema = api.tx.unique.setConstOnChainSchema(collectionId, shema);
await expect(submitTransactionExpectFailAsync(bob, setShema)).to.be.rejected;
});
});
tests/src/setPublicAccessMode.test.tsdiffbeforeafterboth--- a/tests/src/setPublicAccessMode.test.ts
+++ b/tests/src/setPublicAccessMode.test.ts
@@ -51,7 +51,7 @@
const collectionId = await createCollectionExpectSuccess();
await enableAllowListExpectSuccess(alice, collectionId);
await enablePublicMintingExpectSuccess(alice, collectionId);
- const tx = api.tx.nft.createItem(collectionId, normalizeAccountId(bob.address), 'NFT');
+ const tx = api.tx.unique.createItem(collectionId, normalizeAccountId(bob.address), 'NFT');
await expect(submitTransactionExpectFailAsync(bob, tx)).to.be.rejected;
});
});
@@ -62,7 +62,7 @@
await usingApi(async (api: ApiPromise) => {
// tslint:disable-next-line: radix
const collectionId = await getCreatedCollectionCount(api) + 1;
- const tx = api.tx.nft.setPublicAccessMode(collectionId, 'AllowList');
+ const tx = api.tx.unique.setPublicAccessMode(collectionId, 'AllowList');
await expect(submitTransactionExpectFailAsync(alice, tx)).to.be.rejected;
});
});
@@ -72,7 +72,7 @@
// tslint:disable-next-line: no-bitwise
const collectionId = await createCollectionExpectSuccess();
await destroyCollectionExpectSuccess(collectionId);
- const tx = api.tx.nft.setPublicAccessMode(collectionId, 'AllowList');
+ const tx = api.tx.unique.setPublicAccessMode(collectionId, 'AllowList');
await expect(submitTransactionExpectFailAsync(alice, tx)).to.be.rejected;
});
});
@@ -89,7 +89,7 @@
await usingApi(async (api: ApiPromise) => {
// tslint:disable-next-line: no-bitwise
const collectionId = await createCollectionExpectSuccess();
- const tx = api.tx.nft.setPublicAccessMode(collectionId, 'AllowList');
+ const tx = api.tx.unique.setPublicAccessMode(collectionId, 'AllowList');
await expect(submitTransactionExpectFailAsync(bob, tx)).to.be.rejected;
});
});
@@ -107,7 +107,7 @@
// tslint:disable-next-line: no-bitwise
const collectionId = await createCollectionExpectSuccess();
await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);
- const tx = api.tx.nft.setPublicAccessMode(collectionId, 'AllowList');
+ const tx = api.tx.unique.setPublicAccessMode(collectionId, 'AllowList');
await expect(submitTransactionExpectFailAsync(bob, tx)).to.be.rejected;
});
});
tests/src/setSchemaVersion.test.tsdiffbeforeafterboth--- a/tests/src/setSchemaVersion.test.ts
+++ b/tests/src/setSchemaVersion.test.ts
@@ -41,7 +41,7 @@
it('execute setSchemaVersion with image url and unique ', async () => {
await usingApi(async (api: ApiPromise) => {
const collectionIdForTesting = await createCollectionExpectSuccess({name: 'A', description: 'B', tokenPrefix: 'C', mode: {type: 'NFT'}});
- tx = api.tx.nft.setSchemaVersion(collectionIdForTesting, 'Unique');
+ tx = api.tx.unique.setSchemaVersion(collectionIdForTesting, 'Unique');
const events = await submitTransactionAsync(alice, tx);
const result = getCreateItemResult(events);
const collectionInfo = await getDetailedCollectionInfo(api, collectionIdForTesting);
@@ -70,7 +70,7 @@
});
it('execute setSchemaVersion with image url and unique ', async () => {
await usingApi(async (api: ApiPromise) => {
- tx = api.tx.nft.setSchemaVersion(collectionIdForTesting, 'Unique');
+ tx = api.tx.unique.setSchemaVersion(collectionIdForTesting, 'Unique');
const events = await submitTransactionAsync(bob, tx);
const result = getCreateItemResult(events);
const collectionInfo = await getDetailedCollectionInfo(api, collectionIdForTesting);
@@ -85,7 +85,7 @@
it('validate schema version with just entered data', async () => {
await usingApi(async (api: ApiPromise) => {
- tx = api.tx.nft.setSchemaVersion(collectionIdForTesting, 'ImageURL');
+ tx = api.tx.unique.setSchemaVersion(collectionIdForTesting, 'ImageURL');
const events = await submitTransactionAsync(bob, tx);
const result = getCreateItemResult(events);
const collectionInfo = await getDetailedCollectionInfo(api, collectionIdForTesting);
@@ -114,20 +114,20 @@
await usingApi(async (api: ApiPromise) => {
const collectionCount = await getCreatedCollectionCount(api);
const nonExistedCollectionId = collectionCount + 1;
- tx = api.tx.nft.setSchemaVersion(nonExistedCollectionId, 'ImageURL');
+ tx = api.tx.unique.setSchemaVersion(nonExistedCollectionId, 'ImageURL');
await expect(submitTransactionExpectFailAsync(alice, tx)).to.be.rejected;
});
});
it('execute setSchemaVersion for deleted collection', async () => {
await usingApi(async (api: ApiPromise) => {
await destroyCollectionExpectSuccess(collectionIdForTesting);
- tx = api.tx.nft.setSchemaVersion(collectionIdForTesting, 'ImageURL');
+ tx = api.tx.unique.setSchemaVersion(collectionIdForTesting, 'ImageURL');
await expect(submitTransactionExpectFailAsync(alice, tx)).to.be.rejected;
});
});
it('Regular user can`t execute setSchemaVersion with image url and unique ', async () => {
await usingApi(async (api: ApiPromise) => {
- tx = api.tx.nft.setSchemaVersion(collectionIdForTesting, 'Unique');
+ tx = api.tx.unique.setSchemaVersion(collectionIdForTesting, 'Unique');
await expect(submitTransactionAsync(charlie, tx)).to.be.rejected;
});
});
tests/src/setVariableOnChainSchema.test.tsdiffbeforeafterboth--- a/tests/src/setVariableOnChainSchema.test.ts
+++ b/tests/src/setVariableOnChainSchema.test.ts
@@ -41,7 +41,7 @@
const collectionId = await createCollectionExpectSuccess();
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.owner.toString()).to.be.eq(alice.address);
- const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, schema);
+ const setSchema = api.tx.unique.setVariableOnChainSchema(collectionId, schema);
await submitTransactionAsync(alice, setSchema);
});
});
@@ -49,7 +49,7 @@
it('Checking collection data using the setVariableOnChainSchema parameter', async () => {
await usingApi(async (api) => {
const collectionId = await createCollectionExpectSuccess();
- const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, schema);
+ const setSchema = api.tx.unique.setVariableOnChainSchema(collectionId, schema);
await submitTransactionAsync(alice, setSchema);
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.variableOnChainSchema.toString()).to.be.eq(schema);
@@ -66,7 +66,7 @@
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.owner.toString()).to.be.eq(alice.address);
await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);
- const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, schema);
+ const setSchema = api.tx.unique.setVariableOnChainSchema(collectionId, schema);
await submitTransactionAsync(bob, setSchema);
});
});
@@ -75,7 +75,7 @@
await usingApi(async (api) => {
const collectionId = await createCollectionExpectSuccess();
await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);
- const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, schema);
+ const setSchema = api.tx.unique.setVariableOnChainSchema(collectionId, schema);
await submitTransactionAsync(bob, setSchema);
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.variableOnChainSchema.toString()).to.be.eq(schema);
@@ -90,7 +90,7 @@
await usingApi(async (api) => {
// tslint:disable-next-line: radix
const collectionId = await getCreatedCollectionCount(api) + 1;
- const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, schema);
+ const setSchema = api.tx.unique.setVariableOnChainSchema(collectionId, schema);
await expect(submitTransactionExpectFailAsync(alice, setSchema)).to.be.rejected;
});
});
@@ -99,7 +99,7 @@
await usingApi(async (api) => {
const collectionId = await createCollectionExpectSuccess();
await destroyCollectionExpectSuccess(collectionId);
- const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, schema);
+ const setSchema = api.tx.unique.setVariableOnChainSchema(collectionId, schema);
await expect(submitTransactionExpectFailAsync(alice, setSchema)).to.be.rejected;
});
});
@@ -107,7 +107,7 @@
it('Set invalid data in schema (size too large:> 1024b)', async () => {
await usingApi(async (api) => {
const collectionId = await createCollectionExpectSuccess();
- const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, largeSchema);
+ const setSchema = api.tx.unique.setVariableOnChainSchema(collectionId, largeSchema);
await expect(submitTransactionExpectFailAsync(alice, setSchema)).to.be.rejected;
});
});
@@ -117,7 +117,7 @@
const collectionId = await createCollectionExpectSuccess();
const collection = await queryCollectionExpectSuccess(api, collectionId);
expect(collection.owner.toString()).to.be.eq(alice.address);
- const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, schema);
+ const setSchema = api.tx.unique.setVariableOnChainSchema(collectionId, schema);
await expect(submitTransactionExpectFailAsync(bob, setSchema)).to.be.rejected;
});
});
tests/src/substrate/substrate-api.tsdiffbeforeafterboth--- a/tests/src/substrate/substrate-api.ts
+++ b/tests/src/substrate/substrate-api.ts
@@ -24,7 +24,7 @@
},
},
rpc: {
- nft: defs.nft.rpc,
+ unique: defs.unique.rpc,
},
};
}
tests/src/toggleContractAllowList.test.tsdiffbeforeafterboth--- a/tests/src/toggleContractAllowList.test.ts
+++ b/tests/src/toggleContractAllowList.test.ts
@@ -27,10 +27,10 @@
await usingApi(async api => {
const [contract, deployer] = await deployFlipper(api);
- const enabledBefore = (await api.query.nft.contractAllowListEnabled(contract.address)).toJSON();
- const enableAllowListTx = api.tx.nft.toggleContractAllowList(contract.address, true);
+ const enabledBefore = (await api.query.unique.contractAllowListEnabled(contract.address)).toJSON();
+ const enableAllowListTx = api.tx.unique.toggleContractAllowList(contract.address, true);
const enableEvents = await submitTransactionAsync(deployer, enableAllowListTx);
- const enabled = (await api.query.nft.contractAllowListEnabled(contract.address)).toJSON();
+ const enabled = (await api.query.unique.contractAllowListEnabled(contract.address)).toJSON();
expect(getGenericResult(enableEvents).success).to.be.true;
expect(enabledBefore).to.be.false;
@@ -60,7 +60,7 @@
await deployerCanFlip();
flipValueBefore = await getFlipValue(contract, deployer);
- const enableAllowListTx = api.tx.nft.toggleContractAllowList(contract.address, true);
+ const enableAllowListTx = api.tx.unique.toggleContractAllowList(contract.address, true);
await submitTransactionAsync(deployer, enableAllowListTx);
const flipWithEnabledAllowList = contract.tx.flip(value, gasLimit);
await expect(submitTransactionExpectFailAsync(bob, flipWithEnabledAllowList)).to.be.rejected;
@@ -70,7 +70,7 @@
await deployerCanFlip();
flipValueBefore = await getFlipValue(contract, deployer);
- const addBobToAllowListTx = api.tx.nft.addToContractAllowList(contract.address, bob.address);
+ const addBobToAllowListTx = api.tx.unique.addToContractAllowList(contract.address, bob.address);
await submitTransactionAsync(deployer, addBobToAllowListTx);
const flipWithAllowlistedBob = contract.tx.flip(value, gasLimit);
await submitTransactionAsync(bob, flipWithAllowlistedBob);
@@ -80,7 +80,7 @@
await deployerCanFlip();
flipValueBefore = await getFlipValue(contract, deployer);
- const removeBobFromAllowListTx = api.tx.nft.removeFromContractAllowList(contract.address, bob.address);
+ const removeBobFromAllowListTx = api.tx.unique.removeFromContractAllowList(contract.address, bob.address);
await submitTransactionAsync(deployer, removeBobFromAllowListTx);
const bobRemoved = contract.tx.flip(value, gasLimit);
await expect(submitTransactionExpectFailAsync(bob, bobRemoved)).to.be.rejected;
@@ -90,7 +90,7 @@
await deployerCanFlip();
flipValueBefore = await getFlipValue(contract, deployer);
- const disableAllowListTx = api.tx.nft.toggleContractAllowList(contract.address, false);
+ const disableAllowListTx = api.tx.unique.toggleContractAllowList(contract.address, false);
await submitTransactionAsync(deployer, disableAllowListTx);
const allowListDisabledFlip = contract.tx.flip(value, gasLimit);
await submitTransactionAsync(bob, allowListDisabledFlip);
@@ -104,12 +104,12 @@
await usingApi(async api => {
const [contract, deployer] = await deployFlipper(api);
- const enabledBefore = (await api.query.nft.contractAllowListEnabled(contract.address)).toJSON();
- const enableAllowListTx = api.tx.nft.toggleContractAllowList(contract.address, true);
+ const enabledBefore = (await api.query.unique.contractAllowListEnabled(contract.address)).toJSON();
+ const enableAllowListTx = api.tx.unique.toggleContractAllowList(contract.address, true);
const enableEvents = await submitTransactionAsync(deployer, enableAllowListTx);
- const enabled = (await api.query.nft.contractAllowListEnabled(contract.address)).toJSON();
+ const enabled = (await api.query.unique.contractAllowListEnabled(contract.address)).toJSON();
const enableAgainEvents = await submitTransactionAsync(deployer, enableAllowListTx);
- const enabledAgain = (await api.query.nft.contractAllowListEnabled(contract.address)).toJSON();
+ const enabledAgain = (await api.query.unique.contractAllowListEnabled(contract.address)).toJSON();
expect(getGenericResult(enableEvents).success).to.be.true;
expect(enabledBefore).to.be.false;
@@ -128,10 +128,10 @@
const alice = privateKey('//Alice');
const bobGuineaPig = privateKey('//Bob');
- const enabledBefore = (await api.query.nft.contractAllowListEnabled(bobGuineaPig.address)).toJSON();
- const enableAllowListTx = api.tx.nft.toggleContractAllowList(bobGuineaPig.address, true);
+ const enabledBefore = (await api.query.unique.contractAllowListEnabled(bobGuineaPig.address)).toJSON();
+ const enableAllowListTx = api.tx.unique.toggleContractAllowList(bobGuineaPig.address, true);
await expect(submitTransactionExpectFailAsync(alice, enableAllowListTx)).to.be.rejected;
- const enabled = (await api.query.nft.contractAllowListEnabled(bobGuineaPig.address)).toJSON();
+ const enabled = (await api.query.unique.contractAllowListEnabled(bobGuineaPig.address)).toJSON();
expect(enabledBefore).to.be.false;
expect(enabled).to.be.false;
@@ -143,10 +143,10 @@
const bob = privateKey('//Bob');
const [contract] = await deployFlipper(api);
- const enabledBefore = (await api.query.nft.contractAllowListEnabled(contract.address)).toJSON();
- const enableAllowListTx = api.tx.nft.toggleContractAllowList(contract.address, true);
+ const enabledBefore = (await api.query.unique.contractAllowListEnabled(contract.address)).toJSON();
+ const enableAllowListTx = api.tx.unique.toggleContractAllowList(contract.address, true);
await expect(submitTransactionExpectFailAsync(bob, enableAllowListTx)).to.be.rejected;
- const enabled = (await api.query.nft.contractAllowListEnabled(contract.address)).toJSON();
+ const enabled = (await api.query.unique.contractAllowListEnabled(contract.address)).toJSON();
expect(enabledBefore).to.be.false;
expect(enabled).to.be.false;
tests/src/transfer.test.tsdiffbeforeafterboth--- a/tests/src/transfer.test.ts
+++ b/tests/src/transfer.test.ts
@@ -249,7 +249,7 @@
const nftCollectionId = await createCollectionExpectSuccess();
const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT');
- const transferTx = api.tx.nft.transfer(normalizeAccountId(bob), nftCollectionId, newNftTokenId, 0);
+ const transferTx = api.tx.unique.transfer(normalizeAccountId(bob), nftCollectionId, newNftTokenId, 0);
await submitTransactionAsync(alice, transferTx);
const address = normalizeAccountId(await getTokenOwner(api, nftCollectionId, newNftTokenId));
@@ -264,7 +264,7 @@
const balanceBeforeAlice = await getTokenBalance(api, reFungibleCollectionId, normalizeAccountId(alice), newReFungibleTokenId);
const balanceBeforeBob = await getTokenBalance(api, reFungibleCollectionId, normalizeAccountId(bob), newReFungibleTokenId);
- const transferTx = api.tx.nft.transfer(normalizeAccountId(bob), reFungibleCollectionId, newReFungibleTokenId, 0);
+ const transferTx = api.tx.unique.transfer(normalizeAccountId(bob), reFungibleCollectionId, newReFungibleTokenId, 0);
await submitTransactionAsync(alice, transferTx);
const balanceAfterAlice = await getTokenBalance(api, reFungibleCollectionId, normalizeAccountId(alice), newReFungibleTokenId);
@@ -282,7 +282,7 @@
const balanceBeforeAlice = await getTokenBalance(api, fungibleCollectionId, normalizeAccountId(alice), newFungibleTokenId);
const balanceBeforeBob = await getTokenBalance(api, fungibleCollectionId, normalizeAccountId(bob), newFungibleTokenId);
- const transferTx = api.tx.nft.transfer(normalizeAccountId(bob), fungibleCollectionId, newFungibleTokenId, 0);
+ const transferTx = api.tx.unique.transfer(normalizeAccountId(bob), fungibleCollectionId, newFungibleTokenId, 0);
await submitTransactionAsync(alice, transferTx);
const balanceAfterAlice = await getTokenBalance(api, fungibleCollectionId, normalizeAccountId(alice), newFungibleTokenId);
tests/src/util/helpers.tsdiffbeforeafterboth--- a/tests/src/util/helpers.ts
+++ b/tests/src/util/helpers.ts
@@ -11,7 +11,7 @@
import chai from 'chai';
import chaiAsPromised from 'chai-as-promised';
import {alicesPublicKey} from '../accounts';
-import {NftDataStructsCollection} from '../interfaces';
+import {UpDataStructsCollection} from '../interfaces';
import privateKey from '../substrate/privateKey';
import {default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync} from '../substrate/substrate-api';
import {hexToStr, strToUTF16, utf16ToStr} from './util';
@@ -105,7 +105,7 @@
}
interface IGetMessage {
- checkMsgNftMethod: string;
+ checkMsgUnqMethod: string;
checkMsgTrsMethod: string;
checkMsgSysMethod: string;
}
@@ -133,13 +133,13 @@
variableData: number[];
}
-export function nftEventMessage(events: EventRecord[]): IGetMessage {
- let checkMsgNftMethod = '';
+export function uniqueEventMessage(events: EventRecord[]): IGetMessage {
+ let checkMsgUnqMethod = '';
let checkMsgTrsMethod = '';
let checkMsgSysMethod = '';
events.forEach(({event: {method, section}}) => {
if (section === 'common') {
- checkMsgNftMethod = method;
+ checkMsgUnqMethod = method;
} else if (section === 'treasury') {
checkMsgTrsMethod = method;
} else if (section === 'system') {
@@ -147,7 +147,7 @@
} else { return null; }
});
const result: IGetMessage = {
- checkMsgNftMethod,
+ checkMsgUnqMethod,
checkMsgTrsMethod,
checkMsgSysMethod,
};
@@ -283,7 +283,7 @@
modeprm = {refungible: null};
}
- const tx = api.tx.nft.createCollection(strToUTF16(name), strToUTF16(description), strToUTF16(tokenPrefix), modeprm as any);
+ const tx = api.tx.unique.createCollection(strToUTF16(name), strToUTF16(description), strToUTF16(tokenPrefix), modeprm as any);
const events = await submitTransactionAsync(alicePrivateKey, tx);
const result = getCreateCollectionResult(events);
@@ -329,7 +329,7 @@
// Run the CreateCollection transaction
const alicePrivateKey = privateKey('//Alice');
- const tx = api.tx.nft.createCollection(strToUTF16(name), strToUTF16(description), strToUTF16(tokenPrefix), modeprm as any);
+ const tx = api.tx.unique.createCollection(strToUTF16(name), strToUTF16(description), strToUTF16(tokenPrefix), modeprm as any);
const events = await expect(submitTransactionExpectFailAsync(alicePrivateKey, tx)).to.be.rejected;
const result = getCreateCollectionResult(events);
@@ -356,7 +356,7 @@
}
export async function getAllowance(api: ApiPromise, collectionId: number, owner: CrossAccountId | string, approved: CrossAccountId | string, tokenId: number) {
- return (await api.rpc.nft.allowance(collectionId, normalizeAccountId(owner), normalizeAccountId(approved), tokenId)).toBigInt();
+ return (await api.rpc.unique.allowance(collectionId, normalizeAccountId(owner), normalizeAccountId(approved), tokenId)).toBigInt();
}
export function findUnusedAddresses(api: ApiPromise, amount: number): Promise<IKeyringPair[]> {
@@ -383,7 +383,7 @@
await usingApi(async (api) => {
// Run the DestroyCollection transaction
const alicePrivateKey = privateKey(senderSeed);
- const tx = api.tx.nft.destroyCollection(collectionId);
+ const tx = api.tx.unique.destroyCollection(collectionId);
await expect(submitTransactionExpectFailAsync(alicePrivateKey, tx)).to.be.rejected;
});
}
@@ -392,7 +392,7 @@
await usingApi(async (api) => {
// Run the DestroyCollection transaction
const alicePrivateKey = privateKey(senderSeed);
- const tx = api.tx.nft.destroyCollection(collectionId);
+ const tx = api.tx.unique.destroyCollection(collectionId);
const events = await submitTransactionAsync(alicePrivateKey, tx);
const result = getDestroyResult(events);
expect(result).to.be.true;
@@ -404,7 +404,7 @@
export async function setCollectionLimitsExpectSuccess(sender: IKeyringPair, collectionId: number, limits: any) {
await usingApi(async (api) => {
- const tx = api.tx.nft.setCollectionLimits(collectionId, limits);
+ const tx = api.tx.unique.setCollectionLimits(collectionId, limits);
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
@@ -414,7 +414,7 @@
export async function setCollectionLimitsExpectFailure(sender: IKeyringPair, collectionId: number, limits: any) {
await usingApi(async (api) => {
- const tx = api.tx.nft.setCollectionLimits(collectionId, limits);
+ const tx = api.tx.unique.setCollectionLimits(collectionId, limits);
const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
const result = getGenericResult(events);
@@ -427,7 +427,7 @@
// Run the transaction
const senderPrivateKey = privateKey(sender);
- const tx = api.tx.nft.setCollectionSponsor(collectionId, sponsor);
+ const tx = api.tx.unique.setCollectionSponsor(collectionId, sponsor);
const events = await submitTransactionAsync(senderPrivateKey, tx);
const result = getGenericResult(events);
@@ -447,7 +447,7 @@
// Run the transaction
const alicePrivateKey = privateKey(sender);
- const tx = api.tx.nft.removeCollectionSponsor(collectionId);
+ const tx = api.tx.unique.removeCollectionSponsor(collectionId);
const events = await submitTransactionAsync(alicePrivateKey, tx);
const result = getGenericResult(events);
@@ -465,7 +465,7 @@
// Run the transaction
const alicePrivateKey = privateKey(senderSeed);
- const tx = api.tx.nft.removeCollectionSponsor(collectionId);
+ const tx = api.tx.unique.removeCollectionSponsor(collectionId);
await expect(submitTransactionExpectFailAsync(alicePrivateKey, tx)).to.be.rejected;
});
}
@@ -475,7 +475,7 @@
// Run the transaction
const alicePrivateKey = privateKey(senderSeed);
- const tx = api.tx.nft.setCollectionSponsor(collectionId, sponsor);
+ const tx = api.tx.unique.setCollectionSponsor(collectionId, sponsor);
await expect(submitTransactionExpectFailAsync(alicePrivateKey, tx)).to.be.rejected;
});
}
@@ -485,7 +485,7 @@
// Run the transaction
const sender = privateKey(senderSeed);
- const tx = api.tx.nft.confirmSponsorship(collectionId);
+ const tx = api.tx.unique.confirmSponsorship(collectionId);
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
@@ -506,7 +506,7 @@
// Run the transaction
const sender = privateKey(senderSeed);
- const tx = api.tx.nft.confirmSponsorship(collectionId);
+ const tx = api.tx.unique.confirmSponsorship(collectionId);
await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
});
}
@@ -514,7 +514,7 @@
export async function setMetadataUpdatePermissionFlagExpectSuccess(sender: IKeyringPair, collectionId: number, flag: string) {
await usingApi(async (api) => {
- const tx = api.tx.nft.setMetaUpdatePermissionFlag(collectionId, flag as any);
+ const tx = api.tx.unique.setMetaUpdatePermissionFlag(collectionId, flag as any);
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
@@ -525,7 +525,7 @@
export async function setMetadataUpdatePermissionFlagExpectFailure(sender: IKeyringPair, collectionId: number, flag: string) {
await usingApi(async (api) => {
- const tx = api.tx.nft.setMetaUpdatePermissionFlag(collectionId, flag as any);
+ const tx = api.tx.unique.setMetaUpdatePermissionFlag(collectionId, flag as any);
const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
const result = getGenericResult(events);
@@ -535,7 +535,7 @@
export async function enableContractSponsoringExpectSuccess(sender: IKeyringPair, contractAddress: AccountId | string, enable: boolean) {
await usingApi(async (api) => {
- const tx = api.tx.nft.enableContractSponsoring(contractAddress, enable);
+ const tx = api.tx.unique.enableContractSponsoring(contractAddress, enable);
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
@@ -545,7 +545,7 @@
export async function enableContractSponsoringExpectFailure(sender: IKeyringPair, contractAddress: AccountId | string, enable: boolean) {
await usingApi(async (api) => {
- const tx = api.tx.nft.enableContractSponsoring(contractAddress, enable);
+ const tx = api.tx.unique.enableContractSponsoring(contractAddress, enable);
const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
const result = getGenericResult(events);
@@ -557,7 +557,7 @@
await usingApi(async (api) => {
- const tx = api.tx.nft.setTransfersEnabledFlag (collectionId, enabled);
+ const tx = api.tx.unique.setTransfersEnabledFlag (collectionId, enabled);
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
@@ -569,7 +569,7 @@
await usingApi(async (api) => {
- const tx = api.tx.nft.setTransfersEnabledFlag (collectionId, enabled);
+ const tx = api.tx.unique.setTransfersEnabledFlag (collectionId, enabled);
const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
const result = getGenericResult(events);
@@ -579,7 +579,7 @@
export async function setContractSponsoringRateLimitExpectSuccess(sender: IKeyringPair, contractAddress: AccountId | string, rateLimit: number) {
await usingApi(async (api) => {
- const tx = api.tx.nft.setContractSponsoringRateLimit(contractAddress, rateLimit);
+ const tx = api.tx.unique.setContractSponsoringRateLimit(contractAddress, rateLimit);
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
@@ -589,7 +589,7 @@
export async function setContractSponsoringRateLimitExpectFailure(sender: IKeyringPair, contractAddress: AccountId | string, rateLimit: number) {
await usingApi(async (api) => {
- const tx = api.tx.nft.setContractSponsoringRateLimit(contractAddress, rateLimit);
+ const tx = api.tx.unique.setContractSponsoringRateLimit(contractAddress, rateLimit);
const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
const result = getGenericResult(events);
@@ -599,7 +599,7 @@
export async function toggleContractAllowlistExpectSuccess(sender: IKeyringPair, contractAddress: AccountId | string, value = true) {
await usingApi(async (api) => {
- const tx = api.tx.nft.toggleContractAllowList(contractAddress, value);
+ const tx = api.tx.unique.toggleContractAllowList(contractAddress, value);
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
@@ -610,14 +610,14 @@
export async function isAllowlistedInContract(contractAddress: AccountId | string, user: string) {
let allowlisted = false;
await usingApi(async (api) => {
- allowlisted = (await api.query.nft.contractAllowList(contractAddress, user)).toJSON() as boolean;
+ allowlisted = (await api.query.unique.contractAllowList(contractAddress, user)).toJSON() as boolean;
});
return allowlisted;
}
export async function addToContractAllowListExpectSuccess(sender: IKeyringPair, contractAddress: AccountId | string, user: AccountId | string) {
await usingApi(async (api) => {
- const tx = api.tx.nft.addToContractAllowList(contractAddress.toString(), user.toString());
+ const tx = api.tx.unique.addToContractAllowList(contractAddress.toString(), user.toString());
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
@@ -627,7 +627,7 @@
export async function removeFromContractAllowListExpectSuccess(sender: IKeyringPair, contractAddress: AccountId | string, user: AccountId | string) {
await usingApi(async (api) => {
- const tx = api.tx.nft.removeFromContractAllowList(contractAddress.toString(), user.toString());
+ const tx = api.tx.unique.removeFromContractAllowList(contractAddress.toString(), user.toString());
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
@@ -637,7 +637,7 @@
export async function removeFromContractAllowListExpectFailure(sender: IKeyringPair, contractAddress: AccountId | string, user: AccountId | string) {
await usingApi(async (api) => {
- const tx = api.tx.nft.removeFromContractAllowList(contractAddress.toString(), user.toString());
+ const tx = api.tx.unique.removeFromContractAllowList(contractAddress.toString(), user.toString());
const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
const result = getGenericResult(events);
@@ -647,7 +647,7 @@
export async function setVariableMetaDataExpectSuccess(sender: IKeyringPair, collectionId: number, itemId: number, data: number[]) {
await usingApi(async (api) => {
- const tx = api.tx.nft.setVariableMetaData(collectionId, itemId, '0x' + Buffer.from(data).toString('hex'));
+ const tx = api.tx.unique.setVariableMetaData(collectionId, itemId, '0x' + Buffer.from(data).toString('hex'));
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
@@ -657,14 +657,14 @@
export async function setVariableMetaDataExpectFailure(sender: IKeyringPair, collectionId: number, itemId: number, data: number[]) {
await usingApi(async (api) => {
- const tx = api.tx.nft.setVariableMetaData(collectionId, itemId, '0x' + Buffer.from(data).toString('hex'));
+ const tx = api.tx.unique.setVariableMetaData(collectionId, itemId, '0x' + Buffer.from(data).toString('hex'));
await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
});
}
export async function setOffchainSchemaExpectSuccess(sender: IKeyringPair, collectionId: number, data: number[]) {
await usingApi(async (api) => {
- const tx = api.tx.nft.setOffchainSchema(collectionId, '0x' + Buffer.from(data).toString('hex'));
+ const tx = api.tx.unique.setOffchainSchema(collectionId, '0x' + Buffer.from(data).toString('hex'));
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
@@ -674,7 +674,7 @@
export async function setOffchainSchemaExpectFailure(sender: IKeyringPair, collectionId: number, data: number[]) {
await usingApi(async (api) => {
- const tx = api.tx.nft.setOffchainSchema(collectionId, '0x' + Buffer.from(data).toString('hex'));
+ const tx = api.tx.unique.setOffchainSchema(collectionId, '0x' + Buffer.from(data).toString('hex'));
await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
});
}
@@ -700,7 +700,7 @@
// if burning token by admin - use adminButnItemExpectSuccess
expect(balanceBefore >= BigInt(value)).to.be.true;
- const tx = api.tx.nft.burnItem(collectionId, tokenId, value);
+ const tx = api.tx.unique.burnItem(collectionId, tokenId, value);
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
expect(result.success).to.be.true;
@@ -716,8 +716,8 @@
tokenId: number, owner: IKeyringPair, approved: CrossAccountId | string, amount: number | bigint = 1,
) {
await usingApi(async (api: ApiPromise) => {
- const approveNftTx = api.tx.nft.approve(normalizeAccountId(approved), collectionId, tokenId, amount);
- const events = await submitTransactionAsync(owner, approveNftTx);
+ const approveUniqueTx = api.tx.unique.approve(normalizeAccountId(approved), collectionId, tokenId, amount);
+ const events = await submitTransactionAsync(owner, approveUniqueTx);
const result = getGenericResult(events);
expect(result.success).to.be.true;
@@ -730,8 +730,8 @@
tokenId: number, admin: IKeyringPair, owner: CrossAccountId | string, approved: CrossAccountId | string, amount: number | bigint = 1,
) {
await usingApi(async (api: ApiPromise) => {
- const approveNftTx = api.tx.nft.approve(normalizeAccountId(approved), collectionId, tokenId, amount);
- const events = await submitTransactionAsync(admin, approveNftTx);
+ const approveUniqueTx = api.tx.unique.approve(normalizeAccountId(approved), collectionId, tokenId, amount);
+ const events = await submitTransactionAsync(admin, approveUniqueTx);
const result = getGenericResult(events);
expect(result.success).to.be.true;
@@ -755,7 +755,7 @@
if (type === 'Fungible') {
balanceBefore = await getBalance(api, collectionId, to, tokenId);
}
- const transferFromTx = api.tx.nft.transferFrom(normalizeAccountId(accountFrom), to, collectionId, tokenId, value);
+ const transferFromTx = api.tx.unique.transferFrom(normalizeAccountId(accountFrom), to, collectionId, tokenId, value);
const events = await submitTransactionAsync(accountApproved, transferFromTx);
const result = getCreateItemResult(events);
// tslint:disable-next-line:no-unused-expression
@@ -783,7 +783,7 @@
value: number | bigint = 1,
) {
await usingApi(async (api: ApiPromise) => {
- const transferFromTx = api.tx.nft.transferFrom(normalizeAccountId(accountFrom.address), normalizeAccountId(accountTo.address), collectionId, tokenId, value);
+ const transferFromTx = api.tx.unique.transferFrom(normalizeAccountId(accountFrom.address), normalizeAccountId(accountTo.address), collectionId, tokenId, value);
const events = await expect(submitTransactionExpectFailAsync(accountApproved, transferFromTx)).to.be.rejected;
const result = getCreateCollectionResult(events);
// tslint:disable-next-line:no-unused-expression
@@ -803,7 +803,7 @@
export async function addCollectionAdminExpectSuccess(sender: IKeyringPair, collectionId: number, address: string | CrossAccountId) {
await usingApi(async (api) => {
- const changeAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(address));
+ const changeAdminTx = api.tx.unique.addCollectionAdmin(collectionId, normalizeAccountId(address));
const events = await submitTransactionAsync(sender, changeAdminTx);
const result = getCreateCollectionResult(events);
expect(result.success).to.be.true;
@@ -835,7 +835,7 @@
const expectedBlockNumber = blockNumber + blockSchedule;
expect(blockNumber).to.be.greaterThan(0);
- const transferTx = api.tx.nft.transfer(normalizeAccountId(recipient.address), collectionId, tokenId, value);
+ const transferTx = api.tx.unique.transfer(normalizeAccountId(recipient.address), collectionId, tokenId, value);
const scheduleTx = api.tx.scheduler.schedule(expectedBlockNumber, null, 0, transferTx as any);
await submitTransactionAsync(sender, scheduleTx);
@@ -871,7 +871,7 @@
if (type === 'Fungible') {
balanceBefore = await getBalance(api, collectionId, to, tokenId);
}
- const transferTx = api.tx.nft.transfer(to, collectionId, tokenId, value);
+ const transferTx = api.tx.unique.transfer(to, collectionId, tokenId, value);
const events = await submitTransactionAsync(sender, transferTx);
const result = getTransferResult(events);
// tslint:disable-next-line:no-unused-expression
@@ -903,7 +903,7 @@
value: number | bigint = 1,
) {
await usingApi(async (api: ApiPromise) => {
- const transferTx = api.tx.nft.transfer(normalizeAccountId(recipient.address), collectionId, tokenId, value);
+ const transferTx = api.tx.unique.transfer(normalizeAccountId(recipient.address), collectionId, tokenId, value);
const events = await expect(submitTransactionExpectFailAsync(sender, transferTx)).to.be.rejected;
const result = getGenericResult(events);
// if (events && Array.isArray(events)) {
@@ -920,8 +920,8 @@
tokenId: number, owner: IKeyringPair, approved: IKeyringPair, amount: number | bigint = 1,
) {
await usingApi(async (api: ApiPromise) => {
- const approveNftTx = api.tx.nft.approve(normalizeAccountId(approved.address), collectionId, tokenId, amount);
- const events = await expect(submitTransactionExpectFailAsync(owner, approveNftTx)).to.be.rejected;
+ const approveUniqueTx = api.tx.unique.approve(normalizeAccountId(approved.address), collectionId, tokenId, amount);
+ const events = await expect(submitTransactionExpectFailAsync(owner, approveUniqueTx)).to.be.rejected;
const result = getCreateCollectionResult(events);
// tslint:disable-next-line:no-unused-expression
expect(result.success).to.be.false;
@@ -934,47 +934,47 @@
owner: string | CrossAccountId,
token: number,
): Promise<bigint> {
- return (await api.rpc.nft.balance(collectionId, normalizeAccountId(owner), token)).toBigInt();
+ return (await api.rpc.unique.balance(collectionId, normalizeAccountId(owner), token)).toBigInt();
}
export async function getTokenOwner(
api: ApiPromise,
collectionId: number,
token: number,
): Promise<CrossAccountId> {
- return normalizeAccountId((await api.rpc.nft.tokenOwner(collectionId, token)).toJSON() as any);
+ return normalizeAccountId((await api.rpc.unique.tokenOwner(collectionId, token)).toJSON() as any);
}
export async function isTokenExists(
api: ApiPromise,
collectionId: number,
token: number,
): Promise<boolean> {
- return (await api.rpc.nft.tokenExists(collectionId, token)).toJSON();
+ return (await api.rpc.unique.tokenExists(collectionId, token)).toJSON();
}
export async function getLastTokenId(
api: ApiPromise,
collectionId: number,
): Promise<number> {
- return (await api.rpc.nft.lastTokenId(collectionId)).toJSON();
+ return (await api.rpc.unique.lastTokenId(collectionId)).toJSON();
}
export async function getAdminList(
api: ApiPromise,
collectionId: number,
): Promise<string[]> {
- return (await api.rpc.nft.adminlist(collectionId)).toHuman() as any;
+ return (await api.rpc.unique.adminlist(collectionId)).toHuman() as any;
}
export async function getVariableMetadata(
api: ApiPromise,
collectionId: number,
tokenId: number,
): Promise<number[]> {
- return [...(await api.rpc.nft.variableMetadata(collectionId, tokenId))];
+ return [...(await api.rpc.unique.variableMetadata(collectionId, tokenId))];
}
export async function getConstMetadata(
api: ApiPromise,
collectionId: number,
tokenId: number,
): Promise<number[]> {
- return [...(await api.rpc.nft.constMetadata(collectionId, tokenId))];
+ return [...(await api.rpc.unique.constMetadata(collectionId, tokenId))];
}
export async function createFungibleItemExpectSuccess(
@@ -984,7 +984,7 @@
owner: CrossAccountId | string = sender.address,
) {
return await usingApi(async (api) => {
- const tx = api.tx.nft.createItem(collectionId, normalizeAccountId(owner), {Fungible: data});
+ const tx = api.tx.unique.createItem(collectionId, normalizeAccountId(owner), {Fungible: data});
const events = await submitTransactionAsync(sender, tx);
const result = getCreateItemResult(events);
@@ -1004,13 +1004,13 @@
let tx;
if (createMode === 'Fungible') {
const createData = {fungible: {value: 10}};
- tx = api.tx.nft.createItem(collectionId, to, createData as any);
+ tx = api.tx.unique.createItem(collectionId, to, createData as any);
} else if (createMode === 'ReFungible') {
const createData = {refungible: {const_data: [], variable_data: [], pieces: 100}};
- tx = api.tx.nft.createItem(collectionId, to, createData as any);
+ tx = api.tx.unique.createItem(collectionId, to, createData as any);
} else {
const createData = {nft: {const_data: [], variable_data: []}};
- tx = api.tx.nft.createItem(collectionId, to, createData as any);
+ tx = api.tx.unique.createItem(collectionId, to, createData as any);
}
const events = await submitTransactionAsync(sender, tx);
@@ -1037,7 +1037,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 tx = api.tx.unique.createItem(collectionId, normalizeAccountId(owner), createMode);
const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
const result = getCreateItemResult(events);
@@ -1053,7 +1053,7 @@
await usingApi(async (api) => {
// Run the transaction
- const tx = api.tx.nft.setPublicAccessMode(collectionId, accessMode);
+ const tx = api.tx.unique.setPublicAccessMode(collectionId, accessMode);
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
@@ -1074,7 +1074,7 @@
await usingApi(async (api) => {
// Run the transaction
- const tx = api.tx.nft.setPublicAccessMode(collectionId, accessMode);
+ const tx = api.tx.unique.setPublicAccessMode(collectionId, accessMode);
const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
const result = getGenericResult(events);
@@ -1100,7 +1100,7 @@
await usingApi(async (api) => {
// Run the transaction
- const tx = api.tx.nft.setMintPermission(collectionId, enabled);
+ const tx = api.tx.unique.setMintPermission(collectionId, enabled);
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
expect(result.success).to.be.true;
@@ -1119,7 +1119,7 @@
export async function setMintPermissionExpectFailure(sender: IKeyringPair, collectionId: number, enabled: boolean) {
await usingApi(async (api) => {
// Run the transaction
- const tx = api.tx.nft.setMintPermission(collectionId, enabled);
+ const tx = api.tx.unique.setMintPermission(collectionId, enabled);
const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
const result = getCreateCollectionResult(events);
// tslint:disable-next-line:no-unused-expression
@@ -1130,7 +1130,7 @@
export async function setChainLimitsExpectFailure(sender: IKeyringPair, limits: IChainLimits) {
await usingApi(async (api) => {
// Run the transaction
- const tx = api.tx.nft.setChainLimits(limits);
+ const tx = api.tx.unique.setChainLimits(limits);
const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
const result = getCreateCollectionResult(events);
// tslint:disable-next-line:no-unused-expression
@@ -1139,7 +1139,7 @@
}
export async function isAllowlisted(api: ApiPromise, collectionId: number, address: string | CrossAccountId) {
- return (await api.rpc.nft.allowed(collectionId, normalizeAccountId(address))).toJSON();
+ return (await api.rpc.unique.allowed(collectionId, normalizeAccountId(address))).toJSON();
}
export async function addToAllowListExpectSuccess(sender: IKeyringPair, collectionId: number, address: string | AccountId | CrossAccountId) {
@@ -1147,7 +1147,7 @@
expect(await isAllowlisted(api, collectionId, normalizeAccountId(address))).to.be.false;
// Run the transaction
- const tx = api.tx.nft.addToAllowList(collectionId, normalizeAccountId(address));
+ const tx = api.tx.unique.addToAllowList(collectionId, normalizeAccountId(address));
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
expect(result.success).to.be.true;
@@ -1162,7 +1162,7 @@
expect(await isAllowlisted(api, collectionId, normalizeAccountId(address))).to.be.true;
// Run the transaction
- const tx = api.tx.nft.addToAllowList(collectionId, normalizeAccountId(address));
+ const tx = api.tx.unique.addToAllowList(collectionId, normalizeAccountId(address));
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
expect(result.success).to.be.true;
@@ -1175,7 +1175,7 @@
await usingApi(async (api) => {
// Run the transaction
- const tx = api.tx.nft.addToAllowList(collectionId, normalizeAccountId(address));
+ const tx = api.tx.unique.addToAllowList(collectionId, normalizeAccountId(address));
const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
const result = getGenericResult(events);
@@ -1188,7 +1188,7 @@
export async function removeFromAllowListExpectSuccess(sender: IKeyringPair, collectionId: number, address: CrossAccountId) {
await usingApi(async (api) => {
// Run the transaction
- const tx = api.tx.nft.removeFromAllowList(collectionId, normalizeAccountId(address));
+ const tx = api.tx.unique.removeFromAllowList(collectionId, normalizeAccountId(address));
const events = await submitTransactionAsync(sender, tx);
const result = getGenericResult(events);
@@ -1201,7 +1201,7 @@
export async function removeFromAllowListExpectFailure(sender: IKeyringPair, collectionId: number, address: CrossAccountId) {
await usingApi(async (api) => {
// Run the transaction
- const tx = api.tx.nft.removeFromAllowList(collectionId, normalizeAccountId(address));
+ const tx = api.tx.unique.removeFromAllowList(collectionId, normalizeAccountId(address));
const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
const result = getGenericResult(events);
@@ -1212,17 +1212,17 @@
}
export const getDetailedCollectionInfo = async (api: ApiPromise, collectionId: number)
- : Promise<NftDataStructsCollection | null> => {
- return (await api.rpc.nft.collectionById(collectionId)).unwrapOr(null);
+ : Promise<UpDataStructsCollection | null> => {
+ return (await api.rpc.unique.collectionById(collectionId)).unwrapOr(null);
};
export const getCreatedCollectionCount = async (api: ApiPromise): Promise<number> => {
// set global object - collectionsCount
- return (await api.rpc.nft.collectionStats()).created.toNumber();
+ return (await api.rpc.unique.collectionStats()).created.toNumber();
};
-export async function queryCollectionExpectSuccess(api: ApiPromise, collectionId: number): Promise<NftDataStructsCollection> {
- return (await api.rpc.nft.collectionById(collectionId)).unwrap();
+export async function queryCollectionExpectSuccess(api: ApiPromise, collectionId: number): Promise<UpDataStructsCollection> {
+ return (await api.rpc.unique.collectionById(collectionId)).unwrap();
}
export async function waitNewBlocks(blocksCount = 1): Promise<void> {