--- a/.env +++ b/.env @@ -1,6 +1,6 @@ RUST_TOOLCHAIN=nightly-2022-05-11 RUST_C=1.62.0-nightly -POLKA_VERSION=release-v0.9.22 +POLKA_VERSION=release-v0.9.23 UNIQUE_BRANCH=develop USER=*** PASS=*** --- a/Cargo.lock +++ b/Cargo.lock @@ -68,7 +68,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.6", + "getrandom 0.2.7", "once_cell", "version_check", ] @@ -99,9 +99,9 @@ [[package]] name = "anyhow" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" +checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" [[package]] name = "approx" @@ -188,9 +188,9 @@ [[package]] name = "async-global-executor" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd8b508d585e01084059b60f06ade4cb7415cd2e4084b71dd1cb44e7d3fb9880" +checksum = "5262ed948da60dd8956c6c5aca4d4163593dddb7b32d73267c93dab7b2e98940" dependencies = [ "async-channel", "async-executor", @@ -198,6 +198,7 @@ "async-lock", "blocking", "futures-lite", + "num_cpus", "once_cell", ] @@ -248,9 +249,9 @@ [[package]] name = "async-std" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52580991739c5cdb36cde8b2a516371c0a3b70dda36d916cc08b82372916808c" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" dependencies = [ "async-attributes", "async-channel", @@ -267,7 +268,6 @@ "kv-log-macro", "log", "memchr", - "num_cpus", "once_cell", "pin-project-lite 0.2.9", "pin-utils", @@ -371,7 +371,7 @@ checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" dependencies = [ "futures-core", - "getrandom 0.2.6", + "getrandom 0.2.7", "instant", "pin-project-lite 0.2.9", "rand 0.8.5", @@ -429,7 +429,7 @@ [[package]] name = "beefy-gadget" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "beefy-primitives", "fnv", @@ -437,7 +437,7 @@ "futures-timer", "hex", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "sc-chain-spec", "sc-client-api", @@ -463,14 +463,14 @@ [[package]] name = "beefy-gadget-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "beefy-gadget", "beefy-primitives", "futures 0.3.21", "jsonrpsee", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "sc-rpc", "sc-utils", @@ -483,14 +483,14 @@ [[package]] name = "beefy-merkle-tree" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" [[package]] name = "beefy-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-api", "sp-application-crypto", @@ -695,7 +695,7 @@ "bp-runtime", "finality-grandpa", "frame-support", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-core", @@ -711,7 +711,7 @@ dependencies = [ "bp-runtime", "frame-support", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-std", ] @@ -726,7 +726,7 @@ "frame-support", "frame-system", "impl-trait-for-tuples", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-core", @@ -742,7 +742,7 @@ "bp-runtime", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-api", "sp-core", @@ -760,7 +760,7 @@ "bp-polkadot-core", "bp-runtime", "frame-support", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "smallvec", "sp-api", "sp-runtime", @@ -776,7 +776,7 @@ "frame-support", "hash-db", "num-traits", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -794,7 +794,7 @@ "bp-header-chain", "ed25519-dalek", "finality-grandpa", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-application-crypto", "sp-finality-grandpa", "sp-runtime", @@ -810,7 +810,7 @@ "bp-polkadot-core", "bp-rococo", "bp-runtime", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-api", "sp-runtime", "sp-std", @@ -831,7 +831,7 @@ "pallet-bridge-grandpa", "pallet-bridge-messages", "pallet-transaction-payment", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-api", "sp-core", @@ -1067,16 +1067,16 @@ [[package]] name = "clap" -version = "3.1.18" +version = "3.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" +checksum = "d53da17d37dba964b9b3ecb5c5a1f193a2762c700e6829201e645b9381c99dc7" dependencies = [ "atty", "bitflags", "clap_derive", "clap_lex", "indexmap", - "lazy_static", + "once_cell", "strsim", "termcolor", "textwrap", @@ -1084,9 +1084,9 @@ [[package]] name = "clap_derive" -version = "3.1.18" +version = "3.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25320346e922cffe59c0bbc5410c8d8784509efb321488971081313cb1e1a33c" +checksum = "c11d40217d16aee8508cc8e5fde8b4ff24639758608e5374e731b53f85749fb9" dependencies = [ "heck 0.4.0", "proc-macro-error", @@ -1097,9 +1097,9 @@ [[package]] name = "clap_lex" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" +checksum = "5538cd660450ebeb4234cfecf8f2284b844ffc4c50531e66d584ad5b91293613" dependencies = [ "os_str_bytes", ] @@ -1297,9 +1297,9 @@ [[package]] name = "crossbeam-channel" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" +checksum = "4c02a4d71819009c192cf4872265391563fd6a84c81ff2c0f2a7026ca4c1d85c" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -1318,15 +1318,15 @@ [[package]] name = "crossbeam-epoch" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c" +checksum = "07db9d94cbd326813772c968ccd25999e5f8ae22f4f8d1b11effa37ef6ce281d" dependencies = [ "autocfg", "cfg-if 1.0.0", "crossbeam-utils", - "lazy_static", "memoffset", + "once_cell", "scopeguard", ] @@ -1342,12 +1342,12 @@ [[package]] name = "crossbeam-utils" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" +checksum = "8ff1f980957787286a554052d03c7aee98d99cc32e09f6d45f0a814133c87978" dependencies = [ "cfg-if 1.0.0", - "lazy_static", + "once_cell", ] [[package]] @@ -1431,7 +1431,7 @@ [[package]] name = "cumulus-client-cli" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "clap", "sc-cli", @@ -1442,14 +1442,14 @@ [[package]] name = "cumulus-client-collator" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "cumulus-client-consensus-common", "cumulus-client-network", "cumulus-primitives-core", "cumulus-relay-chain-interface", "futures 0.3.21", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -1466,13 +1466,13 @@ [[package]] name = "cumulus-client-consensus-aura" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "async-trait", "cumulus-client-consensus-common", "cumulus-primitives-core", "futures 0.3.21", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-client-api", "sc-consensus", "sc-consensus-aura", @@ -1495,13 +1495,13 @@ [[package]] name = "cumulus-client-consensus-common" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "async-trait", "cumulus-relay-chain-interface", "dyn-clone", "futures 0.3.21", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-primitives", "sc-client-api", "sc-consensus", @@ -1516,14 +1516,14 @@ [[package]] name = "cumulus-client-network" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "async-trait", "cumulus-relay-chain-interface", "derive_more", "futures 0.3.21", "futures-timer", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "polkadot-node-primitives", "polkadot-parachain", @@ -1541,13 +1541,13 @@ [[package]] name = "cumulus-client-pov-recovery" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "cumulus-primitives-core", "cumulus-relay-chain-interface", "futures 0.3.21", "futures-timer", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-overseer", @@ -1565,7 +1565,7 @@ [[package]] name = "cumulus-client-service" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "cumulus-client-cli", "cumulus-client-collator", @@ -1573,7 +1573,7 @@ "cumulus-client-pov-recovery", "cumulus-primitives-core", "cumulus-relay-chain-interface", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "polkadot-overseer", "polkadot-primitives", @@ -1595,13 +1595,13 @@ [[package]] name = "cumulus-pallet-aura-ext" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "frame-executive", "frame-support", "frame-system", "pallet-aura", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-application-crypto", @@ -1613,13 +1613,13 @@ [[package]] name = "cumulus-pallet-dmp-queue" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "cumulus-primitives-core", "frame-support", "frame-system", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-io", "sp-runtime", @@ -1631,7 +1631,7 @@ [[package]] name = "cumulus-pallet-parachain-system" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "cumulus-pallet-parachain-system-proc-macro", "cumulus-primitives-core", @@ -1642,7 +1642,7 @@ "impl-trait-for-tuples", "log", "pallet-balances", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-parachain", "scale-info", "serde", @@ -1661,7 +1661,7 @@ [[package]] name = "cumulus-pallet-parachain-system-proc-macro" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -1672,12 +1672,12 @@ [[package]] name = "cumulus-pallet-xcm" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "cumulus-primitives-core", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-io", @@ -1689,13 +1689,13 @@ [[package]] name = "cumulus-pallet-xcmp-queue" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "cumulus-primitives-core", "frame-support", "frame-system", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "rand_chacha 0.3.1", "scale-info", "sp-runtime", @@ -1707,10 +1707,10 @@ [[package]] name = "cumulus-primitives-core" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "frame-support", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-core-primitives", "polkadot-parachain", "polkadot-primitives", @@ -1723,13 +1723,13 @@ [[package]] name = "cumulus-primitives-parachain-inherent" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "async-trait", "cumulus-primitives-core", "cumulus-relay-chain-interface", "cumulus-test-relay-sproof-builder", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-client-api", "scale-info", "sp-api", @@ -1746,11 +1746,11 @@ [[package]] name = "cumulus-primitives-timestamp" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "cumulus-primitives-core", "futures 0.3.21", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-inherents", "sp-std", "sp-timestamp", @@ -1759,11 +1759,11 @@ [[package]] name = "cumulus-primitives-utility" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "cumulus-primitives-core", "frame-support", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-core-primitives", "polkadot-parachain", "polkadot-primitives", @@ -1776,7 +1776,7 @@ [[package]] name = "cumulus-relay-chain-inprocess-interface" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -1807,14 +1807,14 @@ [[package]] name = "cumulus-relay-chain-interface" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "async-trait", "cumulus-primitives-core", "derive_more", "futures 0.3.21", "jsonrpsee-core", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "polkadot-overseer", "polkadot-service", @@ -1831,7 +1831,7 @@ [[package]] name = "cumulus-relay-chain-rpc-interface" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "async-trait", "backoff", @@ -1840,7 +1840,7 @@ "futures 0.3.21", "futures-timer", "jsonrpsee", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "polkadot-service", "sc-client-api", @@ -1857,10 +1857,10 @@ [[package]] name = "cumulus-test-relay-sproof-builder" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "cumulus-primitives-core", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-primitives", "sp-runtime", "sp-state-machine", @@ -2115,9 +2115,9 @@ [[package]] name = "dyn-clone" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e50f3adc76d6a43f5ed73b698a87d0760ca74617f60f7c3b879003536fdd28" +checksum = "140206b78fb2bc3edbcfc9b5ccbd0b30699cfe8d348b8b31b330e47df5291a5a" [[package]] name = "ecdsa" @@ -2286,7 +2286,7 @@ "ethereum-types", "hash-db", "hash256-std-hasher", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "rlp", "rlp-derive", "scale-info", @@ -2329,7 +2329,7 @@ "evm-gasometer", "evm-runtime", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "primitive-types", "rlp", "scale-info", @@ -2368,7 +2368,7 @@ version = "0.35.0" source = "git+https://github.com/uniquenetwork/evm?branch=unique-polkadot-v0.9.23#e9252ed42dc26fc85b6703b1ba50660a08209e55" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "primitive-types", "scale-info", "serde", @@ -2504,7 +2504,7 @@ "fp-storage", "kvdb-rocksdb", "parity-db", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "sc-client-db", "sp-core", @@ -2546,8 +2546,8 @@ "jsonrpsee", "libsecp256k1", "log", - "lru 0.7.6", - "parity-scale-codec 3.1.2", + "lru 0.7.7", + "parity-scale-codec 3.1.5", "prometheus", "rand 0.8.5", "rlp", @@ -2623,7 +2623,7 @@ "futures-timer", "log", "num-traits", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.11.2", "scale-info", ] @@ -2682,9 +2682,9 @@ [[package]] name = "fork-tree" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", ] [[package]] @@ -2703,7 +2703,7 @@ source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.23#29adc958b0541466d564c781aa70fb7e3ef263a2" dependencies = [ "ethereum", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-core", "sp-runtime", "sp-std", @@ -2717,7 +2717,7 @@ "evm", "frame-support", "impl-trait-for-tuples", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "serde", "sp-core", "sp-std", @@ -2740,7 +2740,7 @@ "ethereum", "ethereum-types", "fp-evm", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-api", "sp-core", @@ -2756,7 +2756,7 @@ dependencies = [ "ethereum", "frame-support", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parity-util-mem", "scale-info", "serde", @@ -2770,19 +2770,19 @@ version = "2.0.0" source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.23#29adc958b0541466d564c781aa70fb7e3ef263a2" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", ] [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support", "frame-system", "linregress", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "paste", "scale-info", "serde", @@ -2798,7 +2798,7 @@ [[package]] name = "frame-benchmarking-cli" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "Inflector", "chrono", @@ -2816,7 +2816,7 @@ "linked-hash-map", "log", "memory-db", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "rand 0.8.5", "rand_pcg 0.3.1", "sc-block-builder", @@ -2848,7 +2848,7 @@ [[package]] name = "frame-election-provider-solution-type" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2859,12 +2859,12 @@ [[package]] name = "frame-election-provider-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-election-provider-solution-type", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-arithmetic", "sp-npos-elections", @@ -2875,11 +2875,11 @@ [[package]] name = "frame-executive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -2895,7 +2895,7 @@ checksum = "df6bb8542ef006ef0de09a5c4420787d79823c0ed7924225822362fd2bf2ff2d" dependencies = [ "cfg-if 1.0.0", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", ] @@ -2903,7 +2903,7 @@ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "bitflags", "frame-metadata", @@ -2912,7 +2912,7 @@ "k256", "log", "once_cell", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "paste", "scale-info", "serde", @@ -2933,7 +2933,7 @@ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "Inflector", "frame-support-procedural-tools", @@ -2945,7 +2945,7 @@ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -2957,7 +2957,7 @@ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "proc-macro2", "quote", @@ -2967,11 +2967,11 @@ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-core", @@ -2984,12 +2984,12 @@ [[package]] name = "frame-system-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-runtime", @@ -2999,16 +2999,16 @@ [[package]] name = "frame-system-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-api", ] [[package]] name = "frame-try-runtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support", "sp-api", @@ -3225,13 +3225,13 @@ [[package]] name = "getrandom" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi 0.10.0+wasi-snapshot-preview1", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] @@ -3263,9 +3263,9 @@ [[package]] name = "globset" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd" +checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a" dependencies = [ "aho-corasick", "bstr", @@ -3555,9 +3555,9 @@ [[package]] name = "if-watch" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8f4a3c3d4c89351ca83e120c1c00b27df945d38e05695668c9d4b4f7bc52f3" +checksum = "774d59367a3d26965d21ac70a86fcb697d83405d1c4312d1d8a6855296af0cf7" dependencies = [ "async-io", "core-foundation", @@ -3577,7 +3577,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", ] [[package]] @@ -3611,12 +3611,12 @@ [[package]] name = "indexmap" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6012d540c5baa3589337a98ce73408de9b5a25ec9fc2c6fd6be8f0d39e0ca5a" +checksum = "6c6392766afd7964e2531940894cffe4bd8d7d17dbc3c1c4857040fd4b33bdb3" dependencies = [ "autocfg", - "hashbrown 0.11.2", + "hashbrown 0.12.1", "serde", ] @@ -3706,9 +3706,9 @@ [[package]] name = "js-sys" -version = "0.3.57" +version = "0.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" +checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" dependencies = [ "wasm-bindgen", ] @@ -3927,7 +3927,7 @@ "pallet-vesting", "pallet-xcm", "pallet-xcm-benchmarks", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-primitives", "polkadot-runtime-common", "polkadot-runtime-parachains", @@ -4074,7 +4074,7 @@ "bytes 1.1.0", "futures 0.3.21", "futures-timer", - "getrandom 0.2.6", + "getrandom 0.2.7", "instant", "lazy_static", "libp2p-autonat", @@ -4245,7 +4245,7 @@ "libp2p-core", "libp2p-swarm", "log", - "lru 0.7.6", + "lru 0.7.7", "prost 0.9.0", "prost-build", "smallvec", @@ -4710,9 +4710,9 @@ [[package]] name = "lru" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8015d95cb7b2ddd3c0d32ca38283ceb1eea09b4713ee380bceb942d85a244228" +checksum = "c84e6fe5655adc6ce00787cf7dcaf8dc4f998a0565d23eafc207a8b08ca3349a" dependencies = [ "hashbrown 0.11.2", ] @@ -4899,9 +4899,9 @@ [[package]] name = "mio" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" dependencies = [ "libc", "log", @@ -5152,9 +5152,9 @@ [[package]] name = "num-complex" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fbc387afefefd5e9e39493299f3069e14a140dd34dc19b4c1c1a8fddb6a790" +checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19" dependencies = [ "num-traits", ] @@ -5250,7 +5250,7 @@ [[package]] name = "opal-runtime" -version = "0.9.22" +version = "0.9.23" dependencies = [ "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", @@ -5299,10 +5299,10 @@ "pallet-transaction-payment-rpc-runtime-api", "pallet-treasury", "pallet-unique", - "pallet-unq-scheduler", + "pallet-unique-scheduler", "pallet-xcm", "parachain-info", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-parachain", "rmrk-rpc", "scale-info", @@ -5393,7 +5393,7 @@ dependencies = [ "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-io", @@ -5419,12 +5419,12 @@ [[package]] name = "pallet-aura" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support", "frame-system", "pallet-timestamp", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-application-crypto", "sp-consensus-aura", @@ -5435,12 +5435,12 @@ [[package]] name = "pallet-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support", "frame-system", "pallet-session", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-application-crypto", "sp-authority-discovery", @@ -5451,12 +5451,12 @@ [[package]] name = "pallet-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support", "frame-system", "impl-trait-for-tuples", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-authorship", "sp-runtime", @@ -5466,7 +5466,7 @@ [[package]] name = "pallet-babe" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", @@ -5475,7 +5475,7 @@ "pallet-authorship", "pallet-session", "pallet-timestamp", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-application-crypto", "sp-consensus-babe", @@ -5490,7 +5490,7 @@ [[package]] name = "pallet-bags-list" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -5498,7 +5498,7 @@ "frame-system", "log", "pallet-balances", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -5510,13 +5510,13 @@ [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-runtime", "sp-std", @@ -5530,7 +5530,7 @@ "fp-evm", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-core", @@ -5540,13 +5540,13 @@ [[package]] name = "pallet-beefy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "beefy-primitives", "frame-support", "frame-system", "pallet-session", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-runtime", @@ -5556,7 +5556,7 @@ [[package]] name = "pallet-beefy-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "beefy-merkle-tree", "beefy-primitives", @@ -5567,7 +5567,7 @@ "pallet-beefy", "pallet-mmr", "pallet-session", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-core", @@ -5579,14 +5579,14 @@ [[package]] name = "pallet-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", "pallet-treasury", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -5604,7 +5604,7 @@ "frame-support", "frame-system", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-runtime", @@ -5624,7 +5624,7 @@ "frame-system", "log", "num-traits", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-finality-grandpa", @@ -5646,7 +5646,7 @@ "frame-system", "log", "num-traits", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-core", @@ -5657,7 +5657,7 @@ [[package]] name = "pallet-child-bounties" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", @@ -5665,7 +5665,7 @@ "log", "pallet-bounties", "pallet-treasury", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -5676,13 +5676,13 @@ [[package]] name = "pallet-collective" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -5702,7 +5702,7 @@ "frame-system", "pallet-evm", "pallet-evm-coder-substrate", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-core", @@ -5714,12 +5714,12 @@ [[package]] name = "pallet-democracy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-io", @@ -5730,14 +5730,14 @@ [[package]] name = "pallet-election-provider-multi-phase" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-election-provider-support", "frame-support", "frame-system", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "rand 0.7.3", "scale-info", "sp-arithmetic", @@ -5753,12 +5753,12 @@ [[package]] name = "pallet-election-provider-support-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-election-provider-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-npos-elections", "sp-runtime", ] @@ -5766,13 +5766,13 @@ [[package]] name = "pallet-elections-phragmen" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -5800,7 +5800,7 @@ "log", "pallet-evm", "pallet-timestamp", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "rlp", "scale-info", "serde", @@ -5825,7 +5825,7 @@ "impl-trait-for-tuples", "log", "pallet-timestamp", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "primitive-types", "rlp", "scale-info", @@ -5848,7 +5848,7 @@ "frame-system", "pallet-ethereum", "pallet-evm", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-std", @@ -5867,7 +5867,7 @@ "pallet-common", "pallet-evm", "pallet-evm-coder-substrate", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-runtime", @@ -5885,7 +5885,7 @@ "frame-support", "frame-system", "pallet-evm", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -5903,7 +5903,7 @@ "frame-system", "pallet-ethereum", "pallet-evm", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -5925,7 +5925,7 @@ "pallet-evm", "pallet-evm-coder-substrate", "pallet-structure", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-runtime", @@ -5936,12 +5936,12 @@ [[package]] name = "pallet-gilt" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-arithmetic", "sp-runtime", @@ -5951,7 +5951,7 @@ [[package]] name = "pallet-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", @@ -5959,7 +5959,7 @@ "log", "pallet-authorship", "pallet-session", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-application-crypto", "sp-core", @@ -5974,13 +5974,13 @@ [[package]] name = "pallet-identity" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "enumflags2", "frame-benchmarking", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-io", "sp-runtime", @@ -5990,14 +5990,14 @@ [[package]] name = "pallet-im-online" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", "pallet-authorship", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-application-crypto", "sp-core", @@ -6010,12 +6010,12 @@ [[package]] name = "pallet-indices" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -6034,7 +6034,7 @@ "pallet-balances", "pallet-randomness-collective-flip", "pallet-timestamp", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-core", @@ -6046,13 +6046,13 @@ [[package]] name = "pallet-membership" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -6063,13 +6063,13 @@ [[package]] name = "pallet-mmr" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "ckb-merkle-mountain-range", "frame-benchmarking", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -6081,10 +6081,10 @@ [[package]] name = "pallet-mmr-rpc" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "jsonrpsee", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "serde", "sp-api", "sp-blockchain", @@ -6096,12 +6096,12 @@ [[package]] name = "pallet-multisig" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-io", "sp-runtime", @@ -6111,11 +6111,11 @@ [[package]] name = "pallet-nicks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-io", "sp-runtime", @@ -6125,12 +6125,12 @@ [[package]] name = "pallet-nomination-pools" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support", "frame-system", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-runtime", @@ -6141,7 +6141,7 @@ [[package]] name = "pallet-nomination-pools-benchmarking" version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6150,7 +6150,7 @@ "pallet-bags-list", "pallet-nomination-pools", "pallet-staking", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-runtime", "sp-staking", @@ -6170,7 +6170,7 @@ "pallet-evm", "pallet-evm-coder-substrate", "pallet-structure", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-runtime", @@ -6182,13 +6182,13 @@ [[package]] name = "pallet-offences" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support", "frame-system", "log", "pallet-balances", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-runtime", @@ -6199,7 +6199,7 @@ [[package]] name = "pallet-offences-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6212,7 +6212,7 @@ "pallet-offences", "pallet-session", "pallet-staking", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-runtime", "sp-staking", @@ -6222,12 +6222,12 @@ [[package]] name = "pallet-preimage" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -6238,12 +6238,12 @@ [[package]] name = "pallet-proxy" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-io", "sp-runtime", @@ -6253,11 +6253,11 @@ [[package]] name = "pallet-randomness-collective-flip" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "safe-mix", "scale-info", "sp-runtime", @@ -6267,12 +6267,12 @@ [[package]] name = "pallet-recovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-io", "sp-runtime", @@ -6289,7 +6289,7 @@ "pallet-common", "pallet-evm", "pallet-structure", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-runtime", @@ -6310,7 +6310,7 @@ "pallet-evm", "pallet-nonfungible", "pallet-structure", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "rmrk-traits", "scale-info", "sp-core", @@ -6330,7 +6330,7 @@ "pallet-evm", "pallet-nonfungible", "pallet-rmrk-core", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "rmrk-traits", "scale-info", "sp-core", @@ -6342,13 +6342,13 @@ [[package]] name = "pallet-scheduler" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-io", "sp-runtime", @@ -6358,14 +6358,14 @@ [[package]] name = "pallet-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support", "frame-system", "impl-trait-for-tuples", "log", "pallet-timestamp", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -6379,7 +6379,7 @@ [[package]] name = "pallet-session-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", @@ -6395,11 +6395,11 @@ [[package]] name = "pallet-society" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "rand_chacha 0.2.2", "scale-info", "sp-runtime", @@ -6409,7 +6409,7 @@ [[package]] name = "pallet-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -6418,7 +6418,7 @@ "log", "pallet-authorship", "pallet-session", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "rand_chacha 0.2.2", "scale-info", "serde", @@ -6432,7 +6432,7 @@ [[package]] name = "pallet-staking-reward-curve" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6443,7 +6443,7 @@ [[package]] name = "pallet-staking-reward-fn" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "log", "sp-arithmetic", @@ -6458,7 +6458,7 @@ "frame-system", "pallet-common", "pallet-evm", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-std", "up-data-structs", @@ -6467,11 +6467,11 @@ [[package]] name = "pallet-sudo" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-io", "sp-runtime", @@ -6488,7 +6488,7 @@ "frame-system", "pallet-balances", "pallet-transaction-payment", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-core", @@ -6501,13 +6501,13 @@ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-inherents", "sp-io", @@ -6519,14 +6519,14 @@ [[package]] name = "pallet-tips" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", "pallet-treasury", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-core", @@ -6538,11 +6538,11 @@ [[package]] name = "pallet-transaction-payment" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-core", @@ -6554,11 +6554,11 @@ [[package]] name = "pallet-transaction-payment-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-api", "sp-blockchain", "sp-core", @@ -6569,10 +6569,10 @@ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "pallet-transaction-payment", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-api", "sp-runtime", ] @@ -6580,14 +6580,14 @@ [[package]] name = "pallet-treasury" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "impl-trait-for-tuples", "pallet-balances", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-runtime", @@ -6607,7 +6607,7 @@ "pallet-evm", "pallet-evm-coder-substrate", "pallet-nonfungible", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-core", @@ -6618,14 +6618,14 @@ ] [[package]] -name = "pallet-unq-scheduler" +name = "pallet-unique-scheduler" version = "0.1.0" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-core", @@ -6639,12 +6639,12 @@ [[package]] name = "pallet-utility" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -6655,13 +6655,13 @@ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-runtime", "sp-std", @@ -6675,7 +6675,7 @@ "frame-support", "frame-system", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-core", @@ -6694,7 +6694,7 @@ "frame-support", "frame-system", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-runtime", "sp-std", @@ -6705,12 +6705,12 @@ [[package]] name = "parachain-info" version = "0.1.0" -source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#e5889f1d71975a192c98fa43b1c18c94ffda3bbd" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.23#9c1470893c6bd5f33ad8eb104d159177c6847df5" dependencies = [ "cumulus-primitives-core", "frame-support", "frame-system", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", ] @@ -6750,15 +6750,15 @@ [[package]] name = "parity-scale-codec" -version = "3.1.2" +version = "3.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8b44461635bbb1a0300f100a841e571e7d919c81c73075ef5d152ffdb521066" +checksum = "9182e4a71cae089267ab03e67c99368db7cd877baf50f931e5d6d4b71e195ac0" dependencies = [ "arrayvec 0.7.2", "bitvec 1.0.0", "byte-slice-cast", "impl-trait-for-tuples", - "parity-scale-codec-derive 3.1.2", + "parity-scale-codec-derive 3.1.3", "serde", ] @@ -6776,9 +6776,9 @@ [[package]] name = "parity-scale-codec-derive" -version = "3.1.2" +version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c45ed1f39709f5a89338fab50e59816b2e8815f5bb58276e7ddf9afd495f73f8" +checksum = "9299338969a3d2f491d65f140b00ddec470858402f888af98e8642fb5e8965cd" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -6802,7 +6802,7 @@ "ethereum-types", "hashbrown 0.12.1", "impl-trait-for-tuples", - "lru 0.7.6", + "lru 0.7.7", "parity-util-mem-derive", "parking_lot 0.12.1", "primitive-types", @@ -7086,8 +7086,8 @@ "derive_more", "fatality", "futures 0.3.21", - "lru 0.7.6", - "parity-scale-codec 3.1.2", + "lru 0.7.7", + "parity-scale-codec 3.1.5", "polkadot-erasure-coding", "polkadot-node-network-protocol", "polkadot-node-primitives", @@ -7108,8 +7108,8 @@ dependencies = [ "fatality", "futures 0.3.21", - "lru 0.7.6", - "parity-scale-codec 3.1.2", + "lru 0.7.7", + "parity-scale-codec 3.1.5", "polkadot-erasure-coding", "polkadot-node-network-protocol", "polkadot-node-primitives", @@ -7213,7 +7213,7 @@ version = "0.9.23" source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parity-util-mem", "scale-info", "sp-core", @@ -7229,8 +7229,8 @@ "derive_more", "fatality", "futures 0.3.21", - "lru 0.7.6", - "parity-scale-codec 3.1.2", + "lru 0.7.7", + "parity-scale-codec 3.1.5", "polkadot-erasure-coding", "polkadot-node-network-protocol", "polkadot-node-primitives", @@ -7249,7 +7249,7 @@ version = "0.9.23" source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-node-primitives", "polkadot-primitives", "reed-solomon-novelpoly", @@ -7287,7 +7287,7 @@ "async-trait", "bytes 1.1.0", "futures 0.3.21", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "polkadot-node-network-protocol", "polkadot-node-subsystem", @@ -7305,7 +7305,7 @@ source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "futures 0.3.21", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-erasure-coding", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -7327,9 +7327,9 @@ "futures 0.3.21", "futures-timer", "kvdb", - "lru 0.7.6", + "lru 0.7.7", "merlin", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-node-jaeger", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -7355,7 +7355,7 @@ "futures 0.3.21", "futures-timer", "kvdb", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-erasure-coding", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -7407,7 +7407,7 @@ dependencies = [ "async-trait", "futures 0.3.21", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-node-core-pvf", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -7441,7 +7441,7 @@ "futures 0.3.21", "futures-timer", "kvdb", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", @@ -7458,8 +7458,8 @@ "fatality", "futures 0.3.21", "kvdb", - "lru 0.7.6", - "parity-scale-codec 3.1.2", + "lru 0.7.7", + "parity-scale-codec 3.1.5", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", @@ -7515,7 +7515,7 @@ "async-std", "futures 0.3.21", "futures-timer", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "pin-project 1.0.10", "polkadot-core-primitives", "polkadot-node-subsystem-util", @@ -7577,7 +7577,7 @@ "lazy_static", "log", "mick-jaeger", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "polkadot-node-primitives", "polkadot-primitives", @@ -7595,7 +7595,7 @@ "futures 0.3.21", "futures-timer", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-primitives", "prioritized-metered-channel", "sc-cli", @@ -7614,14 +7614,14 @@ "derive_more", "fatality", "futures 0.3.21", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-node-jaeger", "polkadot-node-primitives", "polkadot-primitives", "rand 0.8.5", "sc-authority-discovery", "sc-network", - "strum 0.24.0", + "strum 0.24.1", "thiserror", "tracing-gum", ] @@ -7633,7 +7633,7 @@ dependencies = [ "bounded-vec", "futures 0.3.21", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-parachain", "polkadot-primitives", "schnorrkel", @@ -7688,9 +7688,9 @@ "futures 0.3.21", "itertools", "kvdb", - "lru 0.7.6", + "lru 0.7.7", "parity-db", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parity-util-mem", "parking_lot 0.11.2", "pin-project 1.0.10", @@ -7717,7 +7717,7 @@ dependencies = [ "futures 0.3.21", "futures-timer", - "lru 0.7.6", + "lru 0.7.7", "orchestra", "parity-util-mem", "parking_lot 0.12.1", @@ -7739,7 +7739,7 @@ dependencies = [ "derive_more", "frame-support", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parity-util-mem", "polkadot-core-primitives", "scale-info", @@ -7772,7 +7772,7 @@ "bitvec 1.0.0", "frame-system", "hex-literal", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parity-util-mem", "polkadot-core-primitives", "polkadot-parachain", @@ -7879,7 +7879,7 @@ "pallet-utility", "pallet-vesting", "pallet-xcm", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-primitives", "polkadot-runtime-common", "polkadot-runtime-constants", @@ -7938,7 +7938,7 @@ "pallet-transaction-payment", "pallet-treasury", "pallet-vesting", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-primitives", "polkadot-runtime-parachains", "rustc-hex", @@ -7977,7 +7977,7 @@ source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "bs58", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-primitives", "sp-std", "sp-tracing", @@ -8003,7 +8003,7 @@ "pallet-staking", "pallet-timestamp", "pallet-vesting", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-primitives", "polkadot-runtime-metrics", "rand 0.8.5", @@ -8040,7 +8040,7 @@ "kusama-runtime", "kvdb", "kvdb-rocksdb", - "lru 0.7.6", + "lru 0.7.7", "pallet-babe", "pallet-im-online", "pallet-staking", @@ -8138,7 +8138,7 @@ "fatality", "futures 0.3.21", "indexmap", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-node-network-protocol", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -8155,7 +8155,7 @@ version = "0.9.23" source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-primitives", "sp-core", ] @@ -8190,7 +8190,7 @@ "pallet-transaction-payment-rpc-runtime-api", "pallet-vesting", "pallet-xcm", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-parachain", "polkadot-primitives", "polkadot-runtime-common", @@ -8383,9 +8383,9 @@ [[package]] name = "proc-macro2" -version = "1.0.39" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" +checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" dependencies = [ "unicode-ident", ] @@ -8514,7 +8514,7 @@ [[package]] name = "quartz-runtime" -version = "0.9.22" +version = "0.9.23" dependencies = [ "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", @@ -8528,11 +8528,14 @@ "fp-evm-mapping", "fp-rpc", "fp-self-contained", + "frame-benchmarking", "frame-executive", "frame-support", "frame-system", + "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", + "hex-literal", "log", "orml-vesting", "pallet-aura", @@ -8560,10 +8563,10 @@ "pallet-transaction-payment-rpc-runtime-api", "pallet-treasury", "pallet-unique", - "pallet-unq-scheduler", + "pallet-unique-scheduler", "pallet-xcm", "parachain-info", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-parachain", "rmrk-rpc", "scale-info", @@ -8610,9 +8613,9 @@ [[package]] name = "quote" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" dependencies = [ "proc-macro2", ] @@ -8689,7 +8692,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.6", + "getrandom 0.2.7", ] [[package]] @@ -8774,7 +8777,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.6", + "getrandom 0.2.7", "redox_syscall", "thiserror", ] @@ -8864,12 +8867,12 @@ [[package]] name = "remote-externalities" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "env_logger", "jsonrpsee", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "serde", "serde_json", "sp-core", @@ -8967,7 +8970,7 @@ name = "rmrk-traits" version = "0.1.0" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", ] @@ -9028,7 +9031,7 @@ "pallet-transaction-payment-rpc-runtime-api", "pallet-utility", "pallet-xcm", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-parachain", "polkadot-primitives", "polkadot-runtime-common", @@ -9181,9 +9184,9 @@ [[package]] name = "rustversion" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" +checksum = "a0a5f7c728f5d284929a1cccb5bc19884422bfe6ef4d6c409da2c41838983fcf" [[package]] name = "rw-stream-sink" @@ -9232,7 +9235,7 @@ [[package]] name = "sc-allocator" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "log", "sp-core", @@ -9243,7 +9246,7 @@ [[package]] name = "sc-authority-discovery" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", "futures 0.3.21", @@ -9251,7 +9254,7 @@ "ip_network", "libp2p", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "prost 0.10.4", "prost-build", "rand 0.7.3", @@ -9270,12 +9273,12 @@ [[package]] name = "sc-basic-authorship" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures 0.3.21", "futures-timer", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-block-builder", "sc-client-api", "sc-proposer-metrics", @@ -9293,9 +9296,9 @@ [[package]] name = "sc-block-builder" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-client-api", "sp-api", "sp-block-builder", @@ -9309,11 +9312,11 @@ [[package]] name = "sc-chain-spec" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "impl-trait-for-tuples", "memmap2 0.5.4", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-chain-spec-derive", "sc-network", "sc-telemetry", @@ -9326,7 +9329,7 @@ [[package]] name = "sc-chain-spec-derive" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -9337,7 +9340,7 @@ [[package]] name = "sc-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "chrono", "clap", @@ -9347,7 +9350,7 @@ "libp2p", "log", "names", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "rand 0.7.3", "regex", "rpassword", @@ -9376,13 +9379,13 @@ [[package]] name = "sc-client-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "fnv", "futures 0.3.21", "hash-db", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "sc-executor", "sc-transaction-pool-api", @@ -9404,7 +9407,7 @@ [[package]] name = "sc-client-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "hash-db", "kvdb", @@ -9413,7 +9416,7 @@ "linked-hash-map", "log", "parity-db", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "sc-client-api", "sc-state-db", @@ -9429,7 +9432,7 @@ [[package]] name = "sc-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", "futures 0.3.21", @@ -9453,12 +9456,12 @@ [[package]] name = "sc-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", "futures 0.3.21", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-block-builder", "sc-client-api", "sc-consensus", @@ -9482,7 +9485,7 @@ [[package]] name = "sc-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", "fork-tree", @@ -9492,7 +9495,7 @@ "num-bigint", "num-rational 0.2.4", "num-traits", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "rand 0.7.3", "retain_mut", @@ -9525,7 +9528,7 @@ [[package]] name = "sc-consensus-babe-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures 0.3.21", "jsonrpsee", @@ -9547,10 +9550,10 @@ [[package]] name = "sc-consensus-epochs" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "fork-tree", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-client-api", "sc-consensus", "sp-blockchain", @@ -9560,14 +9563,14 @@ [[package]] name = "sc-consensus-manual-seal" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "assert_matches", "async-trait", "futures 0.3.21", "jsonrpsee", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-client-api", "sc-consensus", "sc-consensus-aura", @@ -9594,13 +9597,13 @@ [[package]] name = "sc-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", "futures 0.3.21", "futures-timer", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-client-api", "sc-consensus", "sc-telemetry", @@ -9619,7 +9622,7 @@ [[package]] name = "sc-consensus-uncles" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "sc-client-api", "sp-authorship", @@ -9630,11 +9633,11 @@ [[package]] name = "sc-executor" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "lazy_static", - "lru 0.7.6", - "parity-scale-codec 3.1.2", + "lru 0.7.7", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "sc-executor-common", "sc-executor-wasmi", @@ -9657,10 +9660,10 @@ [[package]] name = "sc-executor-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "environmental", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-allocator", "sp-maybe-compressed-blob", "sp-sandbox", @@ -9674,10 +9677,10 @@ [[package]] name = "sc-executor-wasmi" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-allocator", "sc-executor-common", "sp-runtime-interface", @@ -9689,12 +9692,12 @@ [[package]] name = "sc-executor-wasmtime" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "cfg-if 1.0.0", "libc", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parity-wasm 0.42.2", "sc-allocator", "sc-executor-common", @@ -9707,7 +9710,7 @@ [[package]] name = "sc-finality-grandpa" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "ahash", "async-trait", @@ -9718,7 +9721,7 @@ "futures-timer", "hex", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "rand 0.8.5", "sc-block-builder", @@ -9747,13 +9750,13 @@ [[package]] name = "sc-finality-grandpa-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "finality-grandpa", "futures 0.3.21", "jsonrpsee", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-client-api", "sc-finality-grandpa", "sc-rpc", @@ -9768,7 +9771,7 @@ [[package]] name = "sc-informant" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "ansi_term", "futures 0.3.21", @@ -9785,7 +9788,7 @@ [[package]] name = "sc-keystore" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", "hex", @@ -9800,7 +9803,7 @@ [[package]] name = "sc-network" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", "asynchronous-codec", @@ -9818,8 +9821,8 @@ "linked-hash-map", "linked_hash_set", "log", - "lru 0.7.6", - "parity-scale-codec 3.1.2", + "lru 0.7.7", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "pin-project 1.0.10", "prost 0.10.4", @@ -9852,11 +9855,11 @@ [[package]] name = "sc-network-common" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures 0.3.21", "libp2p", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "prost-build", "sc-peerset", "smallvec", @@ -9865,14 +9868,14 @@ [[package]] name = "sc-network-gossip" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "ahash", "futures 0.3.21", "futures-timer", "libp2p", "log", - "lru 0.7.6", + "lru 0.7.7", "sc-network", "sp-runtime", "substrate-prometheus-endpoint", @@ -9882,12 +9885,12 @@ [[package]] name = "sc-network-light" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures 0.3.21", "libp2p", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "prost 0.10.4", "prost-build", "sc-client-api", @@ -9902,7 +9905,7 @@ [[package]] name = "sc-network-sync" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "bitflags", "either", @@ -9910,8 +9913,8 @@ "futures 0.3.21", "libp2p", "log", - "lru 0.7.6", - "parity-scale-codec 3.1.2", + "lru 0.7.7", + "parity-scale-codec 3.1.5", "prost 0.10.4", "prost-build", "sc-client-api", @@ -9931,7 +9934,7 @@ [[package]] name = "sc-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "bytes 1.1.0", "fnv", @@ -9942,7 +9945,7 @@ "hyper-rustls", "num_cpus", "once_cell", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "rand 0.7.3", "sc-client-api", @@ -9959,7 +9962,7 @@ [[package]] name = "sc-peerset" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures 0.3.21", "libp2p", @@ -9972,7 +9975,7 @@ [[package]] name = "sc-proposer-metrics" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -9981,13 +9984,13 @@ [[package]] name = "sc-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures 0.3.21", "hash-db", "jsonrpsee", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "sc-block-builder", "sc-chain-spec", @@ -10011,12 +10014,12 @@ [[package]] name = "sc-rpc-api" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures 0.3.21", "jsonrpsee", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "sc-chain-spec", "sc-transaction-pool-api", @@ -10034,7 +10037,7 @@ [[package]] name = "sc-rpc-server" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures 0.3.21", "jsonrpsee", @@ -10047,7 +10050,7 @@ [[package]] name = "sc-service" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", "directories", @@ -10057,7 +10060,7 @@ "hash-db", "jsonrpsee", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parity-util-mem", "parking_lot 0.12.1", "pin-project 1.0.10", @@ -10112,10 +10115,10 @@ [[package]] name = "sc-state-db" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parity-util-mem", "parity-util-mem-derive", "parking_lot 0.12.1", @@ -10126,10 +10129,10 @@ [[package]] name = "sc-sync-state-rpc" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "jsonrpsee", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-chain-spec", "sc-client-api", "sc-consensus-babe", @@ -10145,7 +10148,7 @@ [[package]] name = "sc-sysinfo" version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures 0.3.21", "libc", @@ -10164,7 +10167,7 @@ [[package]] name = "sc-telemetry" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "chrono", "futures 0.3.21", @@ -10182,7 +10185,7 @@ [[package]] name = "sc-tracing" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "ansi_term", "atty", @@ -10213,7 +10216,7 @@ [[package]] name = "sc-tracing-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -10224,13 +10227,13 @@ [[package]] name = "sc-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures 0.3.21", "futures-timer", "linked-hash-map", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parity-util-mem", "parking_lot 0.12.1", "retain_mut", @@ -10251,7 +10254,7 @@ [[package]] name = "sc-transaction-pool-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures 0.3.21", "log", @@ -10264,7 +10267,7 @@ [[package]] name = "sc-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures 0.3.21", "futures-timer", @@ -10283,7 +10286,7 @@ "bitvec 1.0.0", "cfg-if 1.0.0", "derive_more", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info-derive", "serde", ] @@ -10630,7 +10633,7 @@ source = "git+https://github.com/paritytech/polkadot?branch=release-v0.9.23#a7e188cd9665c735f4b9d5a58cdbc4dd1850eae0" dependencies = [ "enumn", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "paste", "sp-runtime", "sp-std", @@ -10703,11 +10706,11 @@ [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "hash-db", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-api-proc-macro", "sp-core", "sp-runtime", @@ -10720,7 +10723,7 @@ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "blake2", "proc-macro-crate", @@ -10732,9 +10735,9 @@ [[package]] name = "sp-application-crypto" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-core", @@ -10745,11 +10748,11 @@ [[package]] name = "sp-arithmetic" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "integer-sqrt", "num-traits", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-debug-derive", @@ -10760,9 +10763,9 @@ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-api", "sp-application-crypto", @@ -10773,10 +10776,10 @@ [[package]] name = "sp-authorship" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-inherents", "sp-runtime", "sp-std", @@ -10785,9 +10788,9 @@ [[package]] name = "sp-block-builder" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-api", "sp-inherents", "sp-runtime", @@ -10797,12 +10800,12 @@ [[package]] name = "sp-blockchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures 0.3.21", "log", - "lru 0.7.6", - "parity-scale-codec 3.1.2", + "lru 0.7.7", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "sp-api", "sp-consensus", @@ -10815,13 +10818,13 @@ [[package]] name = "sp-consensus" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", "futures 0.3.21", "futures-timer", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-core", "sp-inherents", "sp-runtime", @@ -10834,10 +10837,10 @@ [[package]] name = "sp-consensus-aura" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-api", "sp-application-crypto", @@ -10852,11 +10855,11 @@ [[package]] name = "sp-consensus-babe" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", "merlin", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-api", @@ -10875,9 +10878,9 @@ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-arithmetic", @@ -10889,9 +10892,9 @@ [[package]] name = "sp-consensus-vrf" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "schnorrkel", "sp-core", @@ -10902,7 +10905,7 @@ [[package]] name = "sp-core" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "base58", "bitflags", @@ -10920,7 +10923,7 @@ "log", "merlin", "num-traits", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parity-util-mem", "parking_lot 0.12.1", "primitive-types", @@ -10948,7 +10951,7 @@ [[package]] name = "sp-core-hashing" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "blake2", "byteorder", @@ -10962,7 +10965,7 @@ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "proc-macro2", "quote", @@ -10973,7 +10976,7 @@ [[package]] name = "sp-database" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "kvdb", "parking_lot 0.12.1", @@ -10982,7 +10985,7 @@ [[package]] name = "sp-debug-derive" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "proc-macro2", "quote", @@ -10992,10 +10995,10 @@ [[package]] name = "sp-externalities" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "environmental", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-std", "sp-storage", ] @@ -11003,11 +11006,11 @@ [[package]] name = "sp-finality-grandpa" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "finality-grandpa", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-api", @@ -11021,11 +11024,11 @@ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", "impl-trait-for-tuples", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-core", "sp-runtime", "sp-std", @@ -11035,13 +11038,13 @@ [[package]] name = "sp-io" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures 0.3.21", "hash-db", "libsecp256k1", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "secp256k1", "sp-core", @@ -11060,7 +11063,7 @@ [[package]] name = "sp-keyring" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "lazy_static", "sp-core", @@ -11071,12 +11074,12 @@ [[package]] name = "sp-keystore" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", "futures 0.3.21", "merlin", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "schnorrkel", "serde", @@ -11088,7 +11091,7 @@ [[package]] name = "sp-maybe-compressed-blob" version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "thiserror", "zstd", @@ -11097,10 +11100,10 @@ [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "serde", "sp-api", "sp-core", @@ -11112,9 +11115,9 @@ [[package]] name = "sp-npos-elections" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "serde", "sp-arithmetic", @@ -11126,7 +11129,7 @@ [[package]] name = "sp-offchain" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "sp-api", "sp-core", @@ -11136,7 +11139,7 @@ [[package]] name = "sp-panic-handler" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "backtrace", "lazy_static", @@ -11146,7 +11149,7 @@ [[package]] name = "sp-rpc" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "rustc-hash", "serde", @@ -11156,13 +11159,13 @@ [[package]] name = "sp-runtime" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "either", "hash256-std-hasher", "impl-trait-for-tuples", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parity-util-mem", "paste", "rand 0.7.3", @@ -11178,10 +11181,10 @@ [[package]] name = "sp-runtime-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "impl-trait-for-tuples", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "primitive-types", "sp-externalities", "sp-runtime-interface-proc-macro", @@ -11195,7 +11198,7 @@ [[package]] name = "sp-runtime-interface-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "Inflector", "proc-macro-crate", @@ -11207,10 +11210,10 @@ [[package]] name = "sp-sandbox" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-core", "sp-io", "sp-std", @@ -11221,7 +11224,7 @@ [[package]] name = "sp-serializer" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "serde", "serde_json", @@ -11230,9 +11233,9 @@ [[package]] name = "sp-session" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-api", "sp-core", @@ -11244,9 +11247,9 @@ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-runtime", "sp-std", @@ -11255,12 +11258,12 @@ [[package]] name = "sp-state-machine" version = "0.12.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "hash-db", "log", "num-traits", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.12.1", "rand 0.7.3", "smallvec", @@ -11277,15 +11280,15 @@ [[package]] name = "sp-std" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" [[package]] name = "sp-storage" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "impl-serde", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "ref-cast", "serde", "sp-debug-derive", @@ -11295,7 +11298,7 @@ [[package]] name = "sp-tasks" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "log", "sp-core", @@ -11308,12 +11311,12 @@ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", "futures-timer", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-api", "sp-inherents", "sp-runtime", @@ -11324,9 +11327,9 @@ [[package]] name = "sp-tracing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-std", "tracing", "tracing-core", @@ -11336,7 +11339,7 @@ [[package]] name = "sp-transaction-pool" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "sp-api", "sp-runtime", @@ -11345,11 +11348,11 @@ [[package]] name = "sp-transaction-storage-proof" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-inherents", @@ -11361,11 +11364,11 @@ [[package]] name = "sp-trie" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "hash-db", "memory-db", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-std", @@ -11377,10 +11380,10 @@ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "impl-serde", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parity-wasm 0.42.2", "scale-info", "serde", @@ -11394,9 +11397,9 @@ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "proc-macro2", "quote", "syn", @@ -11405,11 +11408,11 @@ [[package]] name = "sp-wasm-interface" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "impl-trait-for-tuples", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-std", "wasmi", "wasmtime", @@ -11511,9 +11514,9 @@ [[package]] name = "strum" -version = "0.24.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96acfc1b70604b8b2f1ffa4c57e59176c7dbb05d556c71ecd2f5498a1dee7f8" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ "strum_macros 0.24.0", ] @@ -11560,7 +11563,7 @@ [[package]] name = "substrate-build-script-utils" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "platforms", ] @@ -11568,13 +11571,13 @@ [[package]] name = "substrate-frame-rpc-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "frame-system-rpc-runtime-api", "futures 0.3.21", "jsonrpsee", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-client-api", "sc-rpc-api", "sc-transaction-pool-api", @@ -11589,7 +11592,7 @@ [[package]] name = "substrate-prometheus-endpoint" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures-util", "hyper", @@ -11602,11 +11605,11 @@ [[package]] name = "substrate-state-trie-migration-rpc" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "jsonrpsee", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-client-api", "sc-rpc-api", "scale-info", @@ -11623,12 +11626,12 @@ [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "async-trait", "futures 0.3.21", "hex", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sc-client-api", "sc-client-db", "sc-consensus", @@ -11649,7 +11652,7 @@ [[package]] name = "substrate-test-utils" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "futures 0.3.21", "substrate-test-utils-derive", @@ -11659,7 +11662,7 @@ [[package]] name = "substrate-test-utils-derive" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -11670,7 +11673,7 @@ [[package]] name = "substrate-wasm-builder" version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "ansi_term", "build-helper", @@ -11691,9 +11694,9 @@ [[package]] name = "syn" -version = "1.0.96" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0748dd251e24453cb8717f0354206b91557e4ec8703673a4b30208f2abaf1ebf" +checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" dependencies = [ "proc-macro2", "quote", @@ -11799,7 +11802,7 @@ "pallet-timestamp", "pallet-transaction-payment", "pallet-unique", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "sp-core", "sp-io", @@ -12028,9 +12031,9 @@ [[package]] name = "tower-service" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" @@ -12107,7 +12110,7 @@ "ahash", "lazy_static", "log", - "lru 0.7.6", + "lru 0.7.7", "tracing-core", ] @@ -12228,12 +12231,12 @@ [[package]] name = "try-runtime-cli" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#6cbe1772bf258793fa9845daa8f43ea0cadee596" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.23#76522d7937ba94ff1becef4e4e3ca78e3e1de341" dependencies = [ "clap", "jsonrpsee", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "remote-externalities", "sc-chain-spec", "sc-cli", @@ -12282,7 +12285,7 @@ "jsonrpsee", "pallet-common", "pallet-evm", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "rmrk-rpc", "sp-api", "sp-blockchain", @@ -12329,9 +12332,9 @@ [[package]] name = "unicode-ident" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" +checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" [[package]] name = "unicode-normalization" @@ -12362,7 +12365,7 @@ [[package]] name = "unique-node" -version = "0.9.22" +version = "0.9.23" dependencies = [ "clap", "cumulus-client-cli", @@ -12392,7 +12395,7 @@ "pallet-ethereum", "pallet-transaction-payment-rpc", "pallet-transaction-payment-rpc-runtime-api", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "parking_lot 0.11.2", "polkadot-cli", "polkadot-parachain", @@ -12499,7 +12502,7 @@ [[package]] name = "unique-runtime" -version = "0.9.22" +version = "0.9.23" dependencies = [ "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", @@ -12548,10 +12551,10 @@ "pallet-transaction-payment-rpc-runtime-api", "pallet-treasury", "pallet-unique", - "pallet-unq-scheduler", + "pallet-unique-scheduler", "pallet-xcm", "parachain-info", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-parachain", "rmrk-rpc", "scale-info", @@ -12581,7 +12584,7 @@ [[package]] name = "unique-runtime-common" -version = "0.9.22" +version = "0.9.23" dependencies = [ "evm-coder", "fp-rpc", @@ -12593,7 +12596,8 @@ "pallet-nonfungible", "pallet-refungible", "pallet-unique", - "parity-scale-codec 3.1.2", + "pallet-unique-scheduler", + "parity-scale-codec 3.1.5", "rmrk-rpc", "scale-info", "sp-consensus-aura", @@ -12640,7 +12644,7 @@ "frame-support", "frame-system", "pallet-evm", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "rmrk-traits", "scale-info", "serde", @@ -12656,7 +12660,7 @@ dependencies = [ "pallet-common", "pallet-evm", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-api", "sp-core", "sp-runtime", @@ -12765,9 +12769,9 @@ [[package]] name = "wasm-bindgen" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" +checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -12775,9 +12779,9 @@ [[package]] name = "wasm-bindgen-backend" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" +checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" dependencies = [ "bumpalo", "lazy_static", @@ -12790,9 +12794,9 @@ [[package]] name = "wasm-bindgen-futures" -version = "0.4.30" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" +checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -12802,9 +12806,9 @@ [[package]] name = "wasm-bindgen-macro" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" +checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -12812,9 +12816,9 @@ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" +checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" dependencies = [ "proc-macro2", "quote", @@ -12825,9 +12829,9 @@ [[package]] name = "wasm-bindgen-shared" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" +checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" [[package]] name = "wasm-gc-api" @@ -13065,9 +13069,9 @@ [[package]] name = "web-sys" -version = "0.3.57" +version = "0.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" +checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" dependencies = [ "js-sys", "wasm-bindgen", @@ -13157,7 +13161,7 @@ "pallet-vesting", "pallet-xcm", "pallet-xcm-benchmarks", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-parachain", "polkadot-primitives", "polkadot-runtime-common", @@ -13252,15 +13256,15 @@ [[package]] name = "windows" -version = "0.29.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac7fef12f4b59cd0a29339406cc9203ab44e440ddff6b3f5a41455349fa9cf3" +checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f" dependencies = [ - "windows_aarch64_msvc 0.29.0", - "windows_i686_gnu 0.29.0", - "windows_i686_msvc 0.29.0", - "windows_x86_64_gnu 0.29.0", - "windows_x86_64_msvc 0.29.0", + "windows_aarch64_msvc 0.34.0", + "windows_i686_gnu 0.34.0", + "windows_i686_msvc 0.34.0", + "windows_x86_64_gnu 0.34.0", + "windows_x86_64_msvc 0.34.0", ] [[package]] @@ -13278,9 +13282,9 @@ [[package]] name = "windows_aarch64_msvc" -version = "0.29.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d027175d00b01e0cbeb97d6ab6ebe03b12330a35786cbaca5252b1c4bf5d9b" +checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" [[package]] name = "windows_aarch64_msvc" @@ -13290,9 +13294,9 @@ [[package]] name = "windows_i686_gnu" -version = "0.29.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8793f59f7b8e8b01eda1a652b2697d87b93097198ae85f823b969ca5b89bba58" +checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" [[package]] name = "windows_i686_gnu" @@ -13302,9 +13306,9 @@ [[package]] name = "windows_i686_msvc" -version = "0.29.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8602f6c418b67024be2996c512f5f995de3ba417f4c75af68401ab8756796ae4" +checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" [[package]] name = "windows_i686_msvc" @@ -13314,9 +13318,9 @@ [[package]] name = "windows_x86_64_gnu" -version = "0.29.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d615f419543e0bd7d2b3323af0d86ff19cbc4f816e6453f36a2c2ce889c354" +checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" [[package]] name = "windows_x86_64_gnu" @@ -13326,9 +13330,9 @@ [[package]] name = "windows_x86_64_msvc" -version = "0.29.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d95421d9ed3672c280884da53201a5c46b7b2765ca6faf34b0d71cf34a3561" +checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" [[package]] name = "windows_x86_64_msvc" @@ -13379,7 +13383,7 @@ "derivative", "impl-trait-for-tuples", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "scale-info", "xcm-procedural", ] @@ -13393,7 +13397,7 @@ "frame-system", "log", "pallet-transaction-payment", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "polkadot-parachain", "scale-info", "sp-arithmetic", @@ -13413,7 +13417,7 @@ "frame-support", "impl-trait-for-tuples", "log", - "parity-scale-codec 3.1.2", + "parity-scale-codec 3.1.5", "sp-arithmetic", "sp-core", "sp-io", --- a/Makefile +++ b/Makefile @@ -59,11 +59,11 @@ .PHONY: _bench _bench: - cargo run --release --features runtime-benchmarks,unique-runtime -- \ - benchmark pallet --pallet pallet-$(PALLET) \ + cargo run --release --features runtime-benchmarks,$(RUNTIME) -- \ + benchmark pallet --pallet pallet-$(if $(PALLET),$(PALLET),$(error Must set PALLET)) \ --wasm-execution compiled --extrinsic '*' \ - --template .maintain/frame-weight-template.hbs --steps=50 --repeat=200 --heap-pages=4096 \ - --output=./pallets/$(PALLET)/src/weights.rs + --template .maintain/frame-weight-template.hbs --steps=50 --repeat=80 --heap-pages=4096 \ + --output=./pallets/$(if $(PALLET_DIR),$(PALLET_DIR),$(PALLET))/src/weights.rs .PHONY: bench-evm-migration bench-evm-migration: @@ -93,9 +93,17 @@ bench-structure: make _bench PALLET=structure +.PHONY: bench-scheduler +bench-scheduler: + make _bench PALLET=unique-scheduler PALLET_DIR=scheduler + .PHONY: bench-rmrk-core bench-rmrk-core: make _bench PALLET=proxy-rmrk-core +.PHONY: bench-rmrk-equip +bench-rmrk-equip: + make _bench PALLET=proxy-rmrk-equip + .PHONY: bench -bench: bench-evm-migration bench-unique bench-structure bench-fungible bench-refungible bench-nonfungible bench-rmrk-core +bench: bench-evm-migration bench-unique bench-structure bench-fungible bench-refungible bench-nonfungible bench-scheduler bench-rmrk-core bench-rmrk-equip --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -291,7 +291,7 @@ license = 'GPLv3' name = 'unique-node' repository = 'https://github.com/UniqueNetwork/unique-chain' -version = '0.9.22' +version = '0.9.23' [[bin]] name = 'unique-collator' @@ -323,7 +323,9 @@ [features] default = [] runtime-benchmarks = [ - 'unique-runtime/runtime-benchmarks', + 'unique-runtime?/runtime-benchmarks', + 'quartz-runtime?/runtime-benchmarks', + 'opal-runtime/runtime-benchmarks', 'polkadot-service/runtime-benchmarks', ] try-runtime = [] --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -26,13 +26,13 @@ use unique_runtime_common::types::*; #[cfg(feature = "unique-runtime")] -use unique_runtime as default_runtime; +pub use unique_runtime as default_runtime; #[cfg(all(not(feature = "unique-runtime"), feature = "quartz-runtime"))] -use quartz_runtime as default_runtime; +pub use quartz_runtime as default_runtime; #[cfg(all(not(feature = "unique-runtime"), not(feature = "quartz-runtime")))] -use opal_runtime as default_runtime; +pub use opal_runtime as default_runtime; /// The `ChainSpec` parameterized for the unique runtime. #[cfg(feature = "unique-runtime")] --- a/node/cli/src/command.rs +++ b/node/cli/src/command.rs @@ -33,7 +33,9 @@ // limitations under the License. use crate::{ - chain_spec::{self, RuntimeId, RuntimeIdentification, ServiceId, ServiceIdentification}, + chain_spec::{ + self, RuntimeId, RuntimeIdentification, ServiceId, ServiceIdentification, default_runtime, + }, cli::{Cli, RelayChainCli, Subcommand}, service::{new_partial, start_node, start_dev_node}, }; @@ -44,7 +46,7 @@ #[cfg(feature = "quartz-runtime")] use crate::service::QuartzRuntimeExecutor; -use crate::service::OpalRuntimeExecutor; +use crate::service::{OpalRuntimeExecutor, DefaultRuntimeExecutor}; use codec::Encode; use cumulus_primitives_core::ParaId; @@ -371,7 +373,6 @@ Ok(()) } - #[cfg(feature = "unique-runtime")] Some(Subcommand::Benchmark(cmd)) => { use frame_benchmarking_cli::{BenchmarkCmd, SUBSTRATE_REFERENCE_HARDWARE}; let runner = cli.create_runner(cmd)?; @@ -379,7 +380,7 @@ match cmd { BenchmarkCmd::Pallet(cmd) => { if cfg!(feature = "runtime-benchmarks") { - runner.sync_run(|config| cmd.run::(config)) + runner.sync_run(|config| cmd.run::(config)) } else { Err("Benchmarking wasn't enabled when building the node. \ You can enable it with `--features runtime-benchmarks`." @@ -388,16 +389,16 @@ } BenchmarkCmd::Block(cmd) => runner.sync_run(|config| { let partials = new_partial::< - unique_runtime::RuntimeApi, - UniqueRuntimeExecutor, + default_runtime::RuntimeApi, + DefaultRuntimeExecutor, _, >(&config, crate::service::parachain_build_import_queue)?; cmd.run(partials.client) }), BenchmarkCmd::Storage(cmd) => runner.sync_run(|config| { let partials = new_partial::< - unique_runtime::RuntimeApi, - UniqueRuntimeExecutor, + default_runtime::RuntimeApi, + DefaultRuntimeExecutor, _, >(&config, crate::service::parachain_build_import_queue)?; let db = partials.backend.expose_db(); @@ -410,10 +411,6 @@ } BenchmarkCmd::Overhead(_) => Err("Unsupported benchmarking command".into()), } - } - #[cfg(not(feature = "unique-runtime"))] - Some(Subcommand::Benchmark(..)) => { - Err("benchmarking is only available with unique runtime enabled".into()) } Some(Subcommand::TryRuntime(cmd)) => { if cfg!(feature = "try-runtime") { --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -77,13 +77,21 @@ #[cfg(feature = "quartz-runtime")] /// Quartz native executor instance. - pub struct QuartzRuntimeExecutor; /// Opal native executor instance. pub struct OpalRuntimeExecutor; #[cfg(feature = "unique-runtime")] +pub type DefaultRuntimeExecutor = UniqueRuntimeExecutor; + +#[cfg(all(not(feature = "unique-runtime"), feature = "quartz-runtime"))] +pub type DefaultRuntimeExecutor = QuartzRuntimeExecutor; + +#[cfg(all(not(feature = "unique-runtime"), not(feature = "quartz-runtime")))] +pub type DefaultRuntimeExecutor = OpalRuntimeExecutor; + +#[cfg(feature = "unique-runtime")] impl NativeExecutionDispatch for UniqueRuntimeExecutor { type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; --- a/node/rpc/Cargo.toml +++ b/node/rpc/Cargo.toml @@ -63,3 +63,4 @@ [features] default = [] std = [] +unique-runtime = [] --- a/node/rpc/src/lib.rs +++ b/node/rpc/src/lib.rs @@ -169,7 +169,11 @@ Eth, EthApiServer, EthDevSigner, EthFilter, EthFilterApiServer, EthPubSub, EthPubSubApiServer, EthSigner, Net, NetApiServer, Web3, Web3ApiServer, }; - use uc_rpc::{UniqueApiServer, Unique, RmrkApiServer, Rmrk}; + use uc_rpc::{UniqueApiServer, Unique}; + + #[cfg(not(feature = "unique-runtime"))] + use uc_rpc::{RmrkApiServer, Rmrk}; + // use pallet_contracts_rpc::{Contracts, ContractsApi}; use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; use substrate_frame_rpc_system::{System, SystemApiServer}; @@ -223,6 +227,8 @@ )?; io.merge(Unique::new(client.clone()).into_rpc())?; + + #[cfg(not(feature = "unique-runtime"))] io.merge(Rmrk::new(client.clone()).into_rpc())?; if let Some(filter_pool) = filter_pool { --- a/pallets/common/src/benchmarking.rs +++ b/pallets/common/src/benchmarking.rs @@ -96,10 +96,11 @@ permissions: Some(CollectionPermissions { nesting: Some(NestingPermissions { token_owner: false, - admin: false, + collection_admin: false, restricted: None, permissive: true, }), + mint_mode: Some(true), ..Default::default() }), ..Default::default() --- a/pallets/common/src/erc.rs +++ b/pallets/common/src/erc.rs @@ -22,7 +22,9 @@ pub use pallet_evm::{PrecompileOutput, PrecompileResult, PrecompileHandle, account::CrossAccountId}; use pallet_evm_coder_substrate::dispatch_to_evm; use sp_std::vec::Vec; -use up_data_structs::{Property, SponsoringRateLimit, OwnerRestrictedSet, AccessMode}; +use up_data_structs::{ + Property, SponsoringRateLimit, OwnerRestrictedSet, AccessMode, CollectionPermissions, +}; use alloc::format; use crate::{Pallet, CollectionHandle, Config, CollectionProperties}; @@ -47,10 +49,15 @@ #[solidity_interface(name = "Collection")] impl CollectionHandle -// where -// T::AccountId: From +where + T::AccountId: From<[u8; 32]>, { - fn set_collection_property(&mut self, caller: caller, key: string, value: bytes) -> Result<()> { + fn set_collection_property( + &mut self, + caller: caller, + key: string, + value: bytes, + ) -> Result { let caller = T::CrossAccountId::from_eth(caller); let key = >::from(key) .try_into() @@ -83,7 +90,7 @@ } fn set_collection_sponsor(&mut self, caller: caller, sponsor: address) -> Result { - check_is_owner(caller, self)?; + check_is_owner_or_admin(caller, self)?; let sponsor = T::CrossAccountId::from_eth(sponsor); self.set_sponsor(sponsor.as_sub().clone()) @@ -97,14 +104,14 @@ .confirm_sponsorship(caller.as_sub()) .map_err(dispatch_to_evm::)? { - return Err(Error::Revert("Caller is not set as sponsor".into())); + return Err("caller is not set as sponsor".into()); } save(self) } #[solidity(rename_selector = "setCollectionLimit")] fn set_int_limit(&mut self, caller: caller, limit: string, value: uint32) -> Result { - check_is_owner(caller, self)?; + check_is_owner_or_admin(caller, self)?; let mut limits = self.limits.clone(); match limit.as_str() { @@ -128,7 +135,7 @@ } _ => { return Err(Error::Revert(format!( - "Unknown integer limit \"{}\"", + "unknown integer limit \"{}\"", limit ))) } @@ -140,7 +147,7 @@ #[solidity(rename_selector = "setCollectionLimit")] fn set_bool_limit(&mut self, caller: caller, limit: string, value: bool) -> Result { - check_is_owner(caller, self)?; + check_is_owner_or_admin(caller, self)?; let mut limits = self.limits.clone(); match limit.as_str() { @@ -155,7 +162,7 @@ } _ => { return Err(Error::Revert(format!( - "Unknown boolean limit \"{}\"", + "unknown boolean limit \"{}\"", limit ))) } @@ -169,52 +176,48 @@ Ok(crate::eth::collection_id_to_address(self.id)) } - // fn add_admin_substrate(&self, caller: caller, new_admin: uint256) -> Result { - // let mut new_admin_h256 = H256::default(); - // new_admin.to_little_endian(&mut new_admin_h256.0); - // let account_id = T::AccountId::from(new_admin_h256); - // let caller = T::CrossAccountId::from_eth(caller); - // let new_admin = T::CrossAccountId::from_sub(account_id); - // >::toggle_admin(&self, &caller, &new_admin, true) - // .map_err(dispatch_to_evm::)?; - // Ok(()) - // } + fn add_collection_admin_substrate(&self, caller: caller, new_admin: uint256) -> Result { + let caller = T::CrossAccountId::from_eth(caller); + let mut new_admin_arr: [u8; 32] = Default::default(); + new_admin.to_big_endian(&mut new_admin_arr); + let account_id = T::AccountId::from(new_admin_arr); + let new_admin = T::CrossAccountId::from_sub(account_id); + >::toggle_admin(self, &caller, &new_admin, true).map_err(dispatch_to_evm::)?; + Ok(()) + } - // fn remove_admin_substrate(&self, caller: caller, new_admin: uint256) -> Result { - // let mut new_admin_h256 = H256::default(); - // new_admin.to_little_endian(&mut new_admin_h256.0); - // let account_id = T::AccountId::from(new_admin_h256); - // let caller = T::CrossAccountId::from_eth(caller); - // let new_admin = T::CrossAccountId::from_sub(account_id); - // >::toggle_admin(&self, &caller, &new_admin, false) - // .map_err(dispatch_to_evm::)?; - // Ok(()) - // } + fn remove_collection_admin_substrate( + &self, + caller: caller, + new_admin: uint256, + ) -> Result { + let caller = T::CrossAccountId::from_eth(caller); + let mut new_admin_arr: [u8; 32] = Default::default(); + new_admin.to_big_endian(&mut new_admin_arr); + let account_id = T::AccountId::from(new_admin_arr); + let new_admin = T::CrossAccountId::from_sub(account_id); + >::toggle_admin(self, &caller, &new_admin, false) + .map_err(dispatch_to_evm::)?; + Ok(()) + } fn add_collection_admin(&self, caller: caller, new_admin: address) -> Result { let caller = T::CrossAccountId::from_eth(caller); - self.check_is_owner_or_admin(&caller) - .map_err(dispatch_to_evm::)?; let new_admin = T::CrossAccountId::from_eth(new_admin); - >::toggle_admin(&self, &caller, &new_admin, true) - .map_err(dispatch_to_evm::)?; + >::toggle_admin(self, &caller, &new_admin, true).map_err(dispatch_to_evm::)?; Ok(()) } fn remove_collection_admin(&self, caller: caller, admin: address) -> Result { let caller = T::CrossAccountId::from_eth(caller); - self.check_is_owner_or_admin(&caller) - .map_err(dispatch_to_evm::)?; let admin = T::CrossAccountId::from_eth(admin); - >::toggle_admin(&self, &caller, &admin, false).map_err(dispatch_to_evm::)?; + >::toggle_admin(self, &caller, &admin, false).map_err(dispatch_to_evm::)?; Ok(()) } #[solidity(rename_selector = "setCollectionNesting")] fn set_nesting_bool(&mut self, caller: caller, enable: bool) -> Result { - let caller = T::CrossAccountId::from_eth(caller); - self.check_is_owner_or_admin(&caller) - .map_err(dispatch_to_evm::)?; + check_is_owner_or_admin(caller, self)?; let mut permissions = self.collection.permissions.clone(); let mut nesting = permissions.nesting().clone(); @@ -240,11 +243,9 @@ collections: Vec
, ) -> Result { if collections.is_empty() { - return Err("No addresses provided".into()); + return Err("no addresses provided".into()); } - let caller = T::CrossAccountId::from_eth(caller); - self.check_is_owner_or_admin(&caller) - .map_err(dispatch_to_evm::)?; + check_is_owner_or_admin(caller, self)?; let mut permissions = self.collection.permissions.clone(); match enable { @@ -280,27 +281,34 @@ } fn set_collection_access(&mut self, caller: caller, mode: uint8) -> Result { - let caller = T::CrossAccountId::from_eth(caller); - self.check_is_owner_or_admin(&caller) - .map_err(dispatch_to_evm::)?; - self.collection.permissions.access = Some(match mode { - 0 => AccessMode::Normal, - 1 => AccessMode::AllowList, - _ => return Err("Not supported access mode".into()), - }); - save(self)?; - Ok(()) + check_is_owner_or_admin(caller, self)?; + let permissions = CollectionPermissions { + access: Some(match mode { + 0 => AccessMode::Normal, + 1 => AccessMode::AllowList, + _ => return Err("not supported access mode".into()), + }), + ..Default::default() + }; + self.collection.permissions = >::clamp_permissions( + self.collection.mode.clone(), + &self.collection.permissions, + permissions, + ) + .map_err(dispatch_to_evm::)?; + + save(self) } fn add_to_collection_allow_list(&self, caller: caller, user: address) -> Result { - let caller = check_is_owner_or_admin(caller, self)?; + let caller = T::CrossAccountId::from_eth(caller); let user = T::CrossAccountId::from_eth(user); >::toggle_allowlist(self, &caller, &user, true).map_err(dispatch_to_evm::)?; Ok(()) } fn remove_from_collection_allow_list(&self, caller: caller, user: address) -> Result { - let caller = check_is_owner_or_admin(caller, self)?; + let caller = T::CrossAccountId::from_eth(caller); let user = T::CrossAccountId::from_eth(user); >::toggle_allowlist(self, &caller, &user, false).map_err(dispatch_to_evm::)?; Ok(()) @@ -308,18 +316,19 @@ fn set_collection_mint_mode(&mut self, caller: caller, mode: bool) -> Result { check_is_owner_or_admin(caller, self)?; - self.collection.permissions.mint_mode = Some(mode); - save(self)?; - Ok(()) - } -} + let permissions = CollectionPermissions { + mint_mode: Some(mode), + ..Default::default() + }; + self.collection.permissions = >::clamp_permissions( + self.collection.mode.clone(), + &self.collection.permissions, + permissions, + ) + .map_err(dispatch_to_evm::)?; -fn check_is_owner(caller: caller, collection: &CollectionHandle) -> Result { - let caller = T::CrossAccountId::from_eth(caller); - collection - .check_is_owner(&caller) - .map_err(pallet_evm_coder_substrate::dispatch_to_evm::)?; - Ok(()) + save(self) + } } fn check_is_owner_or_admin( --- a/pallets/common/src/lib.rs +++ b/pallets/common/src/lib.rs @@ -74,7 +74,7 @@ RmrkPropertyInfo, RmrkBaseInfo, RmrkPartType, - RmrkTheme, + RmrkBoundedTheme, RmrkNftChild, CollectionPermissions, SchemaVersion, @@ -148,7 +148,7 @@ .saturating_mul(writes), )) } - pub fn save(self) -> Result<(), DispatchError> { + pub fn save(self) -> DispatchResult { >::insert(self.id, self.collection); Ok(()) } @@ -543,7 +543,7 @@ RmrkPropertyInfo, RmrkBaseInfo, RmrkPartType, - RmrkTheme, + RmrkBoundedTheme, RmrkNftChild, )>, ), @@ -1019,7 +1019,7 @@ } #[transactional] - pub fn set_property_permissions( + pub fn set_token_property_permissions( collection: &CollectionHandle, sender: &T::CrossAccountId, property_permissions: Vec, @@ -1164,6 +1164,7 @@ old_limit: &CollectionLimits, mut new_limit: CollectionLimits, ) -> Result { + let limits = old_limit; limit_default!(old_limit, new_limit, account_token_ownership_limit => ensure!( new_limit <= MAX_TOKEN_OWNERSHIP, @@ -1190,6 +1191,7 @@ ), sponsor_approve_timeout => {}, owner_can_transfer => ensure!( + !limits.owner_can_transfer_instaled() || old_limit || !new_limit, >::OwnerPermissionsCantBeReverted, ), @@ -1210,11 +1212,14 @@ limit_default_clone!(old_limit, new_limit, access => {}, mint_mode => {}, - nesting => ensure!( - // Permissive is only allowed for tests and internal usage of chain for now - old_limit.permissive || !new_limit.permissive, - >::NoPermission, - ), + nesting => { + #[cfg(not(feature = "runtime-benchmarks"))] + ensure!( + // Permissive is only allowed for tests and internal usage of chain for now + old_limit.permissive || !new_limit.permissive, + >::NoPermission, + ) + }, ); Ok(new_limit) } @@ -1237,7 +1242,7 @@ fn delete_collection_properties(amount: u32) -> Weight; fn set_token_properties(amount: u32) -> Weight; fn delete_token_properties(amount: u32) -> Weight; - fn set_property_permissions(amount: u32) -> Weight; + fn set_token_property_permissions(amount: u32) -> Weight; fn transfer() -> Weight; fn approve() -> Weight; fn transfer_from() -> Weight; @@ -1316,7 +1321,7 @@ token_id: TokenId, property_keys: Vec, ) -> DispatchResultWithPostInfo; - fn set_property_permissions( + fn set_token_property_permissions( &self, sender: &T::CrossAccountId, property_permissions: Vec, --- a/pallets/evm-migration/src/weights.rs +++ b/pallets/evm-migration/src/weights.rs @@ -3,12 +3,13 @@ //! Autogenerated weights for pallet_evm_migration //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-03-01, STEPS: `50`, REPEAT: 200, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2022-06-15, STEPS: `50`, REPEAT: 200, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: // target/release/unique-collator // benchmark +// pallet // --pallet // pallet-evm-migration // --wasm-execution @@ -44,23 +45,23 @@ // Storage: System Account (r:1 w:0) // Storage: EVM AccountCodes (r:1 w:0) fn begin() -> Weight { - (6_441_000 as Weight) + (6_914_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } // Storage: EvmMigration MigrationPending (r:1 w:0) // Storage: EVM AccountStorages (r:0 w:1) fn set_data(b: u32, ) -> Weight { - (3_424_000 as Weight) + (2_875_000 as Weight) // Standard Error: 0 - .saturating_add((973_000 as Weight).saturating_mul(b as Weight)) + .saturating_add((794_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).saturating_mul(b as Weight))) } // Storage: EvmMigration MigrationPending (r:1 w:1) // Storage: EVM AccountCodes (r:0 w:1) fn finish(b: u32, ) -> Weight { - (4_702_000 as Weight) + (6_320_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)) @@ -74,23 +75,23 @@ // Storage: System Account (r:1 w:0) // Storage: EVM AccountCodes (r:1 w:0) fn begin() -> Weight { - (6_441_000 as Weight) + (6_914_000 as Weight) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } // Storage: EvmMigration MigrationPending (r:1 w:0) // Storage: EVM AccountStorages (r:0 w:1) fn set_data(b: u32, ) -> Weight { - (3_424_000 as Weight) + (2_875_000 as Weight) // Standard Error: 0 - .saturating_add((973_000 as Weight).saturating_mul(b as Weight)) + .saturating_add((794_000 as Weight).saturating_mul(b as Weight)) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(b as Weight))) } // Storage: EvmMigration MigrationPending (r:1 w:1) // Storage: EVM AccountCodes (r:0 w:1) fn finish(b: u32, ) -> Weight { - (4_702_000 as Weight) + (6_320_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)) --- a/pallets/fungible/src/common.rs +++ b/pallets/fungible/src/common.rs @@ -72,7 +72,7 @@ 0 } - fn set_property_permissions(_amount: u32) -> Weight { + fn set_token_property_permissions(_amount: u32) -> Weight { // Error 0 } @@ -302,7 +302,7 @@ fail!(>::SettingPropertiesNotAllowed) } - fn set_property_permissions( + fn set_token_property_permissions( &self, _sender: &T::CrossAccountId, _property_permissions: Vec, --- a/pallets/fungible/src/erc.rs +++ b/pallets/fungible/src/erc.rs @@ -152,12 +152,15 @@ via("CollectionHandle", common_mut, Collection) ) )] -impl FungibleHandle {} +impl FungibleHandle where T::AccountId: From<[u8; 32]> {} generate_stubgen!(gen_impl, UniqueFungibleCall<()>, true); generate_stubgen!(gen_iface, UniqueFungibleCall<()>, false); -impl CommonEvmHandler for FungibleHandle { +impl CommonEvmHandler for FungibleHandle +where + T::AccountId: From<[u8; 32]>, +{ const CODE: &'static [u8] = include_bytes!("./stubs/UniqueFungible.raw"); fn call(self, handle: &mut impl PrecompileHandle) -> Option { --- a/pallets/fungible/src/weights.rs +++ b/pallets/fungible/src/weights.rs @@ -3,12 +3,13 @@ //! Autogenerated weights for pallet_fungible //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-03-01, STEPS: `50`, REPEAT: 200, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2022-06-15, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: // target/release/unique-collator // benchmark +// pallet // --pallet // pallet-fungible // --wasm-execution @@ -18,7 +19,7 @@ // --template // .maintain/frame-weight-template.hbs // --steps=50 -// --repeat=200 +// --repeat=80 // --heap-pages=4096 // --output=./pallets/fungible/src/weights.rs @@ -47,16 +48,16 @@ // Storage: Fungible TotalSupply (r:1 w:1) // Storage: Fungible Balance (r:1 w:1) fn create_item() -> Weight { - (14_407_000 as Weight) + (17_828_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } // Storage: Fungible TotalSupply (r:1 w:1) // Storage: Fungible Balance (r:4 w:4) fn create_multiple_items_ex(b: u32, ) -> Weight { - (13_030_000 as Weight) - // Standard Error: 1_000 - .saturating_add((3_779_000 as Weight).saturating_mul(b as Weight)) + (17_574_000 as Weight) + // Standard Error: 3_000 + .saturating_add((4_288_000 as Weight).saturating_mul(b as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(b as Weight))) .saturating_add(T::DbWeight::get().writes(1 as Weight)) @@ -65,28 +66,27 @@ // Storage: Fungible TotalSupply (r:1 w:1) // Storage: Fungible Balance (r:1 w:1) fn burn_item() -> Weight { - (15_565_000 as Weight) + (18_417_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } - // Storage: Fungible Balance (r:2 w:2) fn transfer() -> Weight { - (17_713_000 as Weight) + (20_090_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } // Storage: Fungible Balance (r:1 w:0) // Storage: Fungible Allowance (r:0 w:1) fn approve() -> Weight { - (14_834_000 as Weight) + (17_532_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } // Storage: Fungible Allowance (r:1 w:1) // Storage: Fungible Balance (r:2 w:2) fn transfer_from() -> Weight { - (25_189_000 as Weight) + (29_869_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } @@ -94,7 +94,7 @@ // Storage: Fungible TotalSupply (r:1 w:1) // Storage: Fungible Balance (r:1 w:1) fn burn_from() -> Weight { - (24_065_000 as Weight) + (27_835_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } @@ -105,16 +105,16 @@ // Storage: Fungible TotalSupply (r:1 w:1) // Storage: Fungible Balance (r:1 w:1) fn create_item() -> Weight { - (14_407_000 as Weight) + (17_828_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } // Storage: Fungible TotalSupply (r:1 w:1) // Storage: Fungible Balance (r:4 w:4) fn create_multiple_items_ex(b: u32, ) -> Weight { - (13_030_000 as Weight) - // Standard Error: 1_000 - .saturating_add((3_779_000 as Weight).saturating_mul(b as Weight)) + (17_574_000 as Weight) + // Standard Error: 3_000 + .saturating_add((4_288_000 as Weight).saturating_mul(b as Weight)) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(b as Weight))) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) @@ -123,28 +123,27 @@ // Storage: Fungible TotalSupply (r:1 w:1) // Storage: Fungible Balance (r:1 w:1) fn burn_item() -> Weight { - (15_565_000 as Weight) + (18_417_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } - // Storage: Fungible Balance (r:2 w:2) fn transfer() -> Weight { - (17_713_000 as Weight) + (20_090_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } // Storage: Fungible Balance (r:1 w:0) // Storage: Fungible Allowance (r:0 w:1) fn approve() -> Weight { - (14_834_000 as Weight) + (17_532_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } // Storage: Fungible Allowance (r:1 w:1) // Storage: Fungible Balance (r:2 w:2) fn transfer_from() -> Weight { - (25_189_000 as Weight) + (29_869_000 as Weight) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(3 as Weight)) } @@ -152,7 +151,7 @@ // Storage: Fungible TotalSupply (r:1 w:1) // Storage: Fungible Balance (r:1 w:1) fn burn_from() -> Weight { - (24_065_000 as Weight) + (27_835_000 as Weight) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(3 as Weight)) } --- a/pallets/nonfungible/src/benchmarking.rs +++ b/pallets/nonfungible/src/benchmarking.rs @@ -147,7 +147,7 @@ >::set_allowance(&collection, &sender, item, Some(&burner))?; }: {>::burn_from(&collection, &burner, &sender, item, &Unlimited)?} - set_property_permissions { + set_token_property_permissions { let b in 0..MAX_PROPERTIES_PER_ITEM; bench_init!{ owner: sub; collection: collection(owner); @@ -161,7 +161,7 @@ token_owner: false, }, }).collect::>(); - }: {>::set_property_permissions(&collection, &owner, perms)?} + }: {>::set_token_property_permissions(&collection, &owner, perms)?} set_token_properties { let b in 0..MAX_PROPERTIES_PER_ITEM; @@ -177,7 +177,7 @@ token_owner: true, }, }).collect::>(); - >::set_property_permissions(&collection, &owner, perms)?; + >::set_token_property_permissions(&collection, &owner, perms)?; let props = (0..b).map(|k| Property { key: property_key(k as usize), value: property_value(), @@ -199,7 +199,7 @@ token_owner: true, }, }).collect::>(); - >::set_property_permissions(&collection, &owner, perms)?; + >::set_token_property_permissions(&collection, &owner, perms)?; let props = (0..b).map(|k| Property { key: property_key(k as usize), value: property_value(), --- a/pallets/nonfungible/src/common.rs +++ b/pallets/nonfungible/src/common.rs @@ -89,8 +89,8 @@ >::delete_token_properties(amount) } - fn set_property_permissions(amount: u32) -> Weight { - >::set_property_permissions(amount) + fn set_token_property_permissions(amount: u32) -> Weight { + >::set_token_property_permissions(amount) } fn transfer() -> Weight { @@ -242,16 +242,16 @@ ) } - fn set_property_permissions( + fn set_token_property_permissions( &self, sender: &T::CrossAccountId, property_permissions: Vec, ) -> DispatchResultWithPostInfo { let weight = - >::set_property_permissions(property_permissions.len() as u32); + >::set_token_property_permissions(property_permissions.len() as u32); with_weight( - >::set_property_permissions(self, sender, property_permissions), + >::set_token_property_permissions(self, sender, property_permissions), weight, ) } --- a/pallets/nonfungible/src/erc.rs +++ b/pallets/nonfungible/src/erc.rs @@ -583,13 +583,16 @@ TokenProperties, ) )] -impl NonfungibleHandle {} +impl NonfungibleHandle where T::AccountId: From<[u8; 32]> {} // Not a tests, but code generators generate_stubgen!(gen_impl, UniqueNFTCall<()>, true); generate_stubgen!(gen_iface, UniqueNFTCall<()>, false); -impl CommonEvmHandler for NonfungibleHandle { +impl CommonEvmHandler for NonfungibleHandle +where + T::AccountId: From<[u8; 32]>, +{ const CODE: &'static [u8] = include_bytes!("./stubs/UniqueNFT.raw"); fn call(self, handle: &mut impl PrecompileHandle) -> Option { --- a/pallets/nonfungible/src/lib.rs +++ b/pallets/nonfungible/src/lib.rs @@ -28,7 +28,7 @@ use up_data_structs::{ AccessMode, CollectionId, CustomDataLimit, TokenId, CreateCollectionData, CreateNftExData, mapping::TokenAddressMapping, budget::Budget, Property, PropertyPermission, PropertyKey, - PropertyKeyPermission, Properties, PropertyScope, TrySetProperty, TokenChild, + PropertyKeyPermission, Properties, PropertyScope, TrySetProperty, TokenChild, AuxPropertyValue, }; use pallet_evm::{account::CrossAccountId, Pallet as PalletEvm}; use pallet_common::{ @@ -124,6 +124,19 @@ OnEmpty = up_data_structs::TokenProperties, >; + #[pallet::storage] + #[pallet::getter(fn token_aux_property)] + pub type TokenAuxProperties = StorageNMap< + Key = ( + Key, + Key, + Key, + Key, + ), + Value = AuxPropertyValue, + QueryKind = OptionQuery, + >; + /// Used to enumerate tokens owned by account #[pallet::storage] pub type Owned = StorageNMap< @@ -294,6 +307,33 @@ Ok(()) } + pub fn try_mutate_token_aux_property( + collection_id: CollectionId, + token_id: TokenId, + scope: PropertyScope, + key: PropertyKey, + f: impl FnOnce(&mut Option) -> Result, + ) -> Result { + >::try_mutate((collection_id, token_id, scope, key), f) + } + + pub fn remove_token_aux_property( + collection_id: CollectionId, + token_id: TokenId, + scope: PropertyScope, + key: PropertyKey, + ) { + >::remove((collection_id, token_id, scope, key)); + } + + pub fn iterate_token_aux_properties( + collection_id: CollectionId, + token_id: TokenId, + scope: PropertyScope, + ) -> impl Iterator { + >::iter_prefix((collection_id, token_id, scope)) + } + pub fn current_token_id(collection_id: CollectionId) -> TokenId { TokenId(>::get(collection_id)) } @@ -375,6 +415,7 @@ >::insert(collection.id, burnt); >::remove((collection.id, token)); >::remove((collection.id, token)); + >::remove_prefix((collection.id, token), None); let old_spender = >::take((collection.id, token)); if let Some(old_spender) = old_spender { @@ -594,12 +635,12 @@ >::delete_collection_properties(collection, sender, property_keys) } - pub fn set_property_permissions( + pub fn set_token_property_permissions( collection: &CollectionHandle, sender: &T::CrossAccountId, property_permissions: Vec, ) -> DispatchResult { - >::set_property_permissions(collection, sender, property_permissions) + >::set_token_property_permissions(collection, sender, property_permissions) } pub fn set_property_permission( @@ -1008,7 +1049,7 @@ nesting_budget, )? { // Pass - } else if nesting.admin && handle.is_owner_or_admin(&sender) { + } else if nesting.collection_admin && handle.is_owner_or_admin(&sender) { // Pass } else { fail!(>::UserIsNotAllowedToNest); --- a/pallets/nonfungible/src/stubs/UniqueNFT.sol +++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol @@ -297,7 +297,40 @@ } } -// Selector: 6aea9834 +// Selector: 780e9d63 +contract ERC721Enumerable is Dummy, ERC165 { + // Selector: tokenByIndex(uint256) 4f6ccce7 + function tokenByIndex(uint256 index) public view returns (uint256) { + require(false, stub_error); + index; + dummy; + return 0; + } + + // Not implemented + // + // Selector: tokenOfOwnerByIndex(address,uint256) 2f745c59 + function tokenOfOwnerByIndex(address owner, uint256 index) + public + view + returns (uint256) + { + require(false, stub_error); + owner; + index; + dummy; + return 0; + } + + // Selector: totalSupply() 18160ddd + function totalSupply() public view returns (uint256) { + require(false, stub_error); + dummy; + return 0; + } +} + +// Selector: 7d9262e6 contract Collection is Dummy, ERC165 { // Selector: setCollectionProperty(string,bytes) 2f073f66 function setCollectionProperty(string memory key, bytes memory value) @@ -366,6 +399,20 @@ return 0x0000000000000000000000000000000000000000; } + // Selector: addCollectionAdminSubstrate(uint256) 5730062b + function addCollectionAdminSubstrate(uint256 newAdmin) public view { + require(false, stub_error); + newAdmin; + dummy; + } + + // Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9 + function removeCollectionAdminSubstrate(uint256 newAdmin) public view { + require(false, stub_error); + newAdmin; + dummy; + } + // Selector: addCollectionAdmin(address) 92e462c7 function addCollectionAdmin(address newAdmin) public view { require(false, stub_error); @@ -423,39 +470,6 @@ require(false, stub_error); mode; dummy = 0; - } -} - -// Selector: 780e9d63 -contract ERC721Enumerable is Dummy, ERC165 { - // Selector: tokenByIndex(uint256) 4f6ccce7 - function tokenByIndex(uint256 index) public view returns (uint256) { - require(false, stub_error); - index; - dummy; - return 0; - } - - // Not implemented - // - // Selector: tokenOfOwnerByIndex(address,uint256) 2f745c59 - function tokenOfOwnerByIndex(address owner, uint256 index) - public - view - returns (uint256) - { - require(false, stub_error); - owner; - index; - dummy; - return 0; - } - - // Selector: totalSupply() 18160ddd - function totalSupply() public view returns (uint256) { - require(false, stub_error); - dummy; - return 0; } } --- a/pallets/nonfungible/src/weights.rs +++ b/pallets/nonfungible/src/weights.rs @@ -3,12 +3,13 @@ //! Autogenerated weights for pallet_nonfungible //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-03-01, STEPS: `50`, REPEAT: 200, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2022-06-15, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: // target/release/unique-collator // benchmark +// pallet // --pallet // pallet-nonfungible // --wasm-execution @@ -18,7 +19,7 @@ // --template // .maintain/frame-weight-template.hbs // --steps=50 -// --repeat=200 +// --repeat=80 // --heap-pages=4096 // --output=./pallets/nonfungible/src/weights.rs @@ -42,9 +43,9 @@ fn approve() -> Weight; fn transfer_from() -> Weight; fn burn_from() -> Weight; - fn set_property_permissions(b: u32) -> Weight; - fn set_token_properties(b: u32) -> Weight; - fn delete_token_properties(b: u32) -> Weight; + fn set_token_property_permissions(b: u32, ) -> Weight; + fn set_token_properties(b: u32, ) -> Weight; + fn delete_token_properties(b: u32, ) -> Weight; } /// Weights for pallet_nonfungible using the Substrate node and recommended hardware. @@ -55,7 +56,7 @@ // Storage: Nonfungible TokenData (r:0 w:1) // Storage: Nonfungible Owned (r:0 w:1) fn create_item() -> Weight { - (18_450_000 as Weight) + (24_135_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } @@ -64,9 +65,9 @@ // Storage: Nonfungible TokenData (r:0 w:4) // Storage: Nonfungible Owned (r:0 w:4) fn create_multiple_items(b: u32, ) -> Weight { - (10_228_000 as Weight) - // Standard Error: 1_000 - .saturating_add((4_392_000 as Weight).saturating_mul(b as Weight)) + (21_952_000 as Weight) + // Standard Error: 5_000 + .saturating_add((4_727_000 as Weight).saturating_mul(b as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(b as Weight))) @@ -76,23 +77,25 @@ // Storage: Nonfungible TokenData (r:0 w:4) // Storage: Nonfungible Owned (r:0 w:4) fn create_multiple_items_ex(b: u32, ) -> Weight { - (6_543_000 as Weight) - // Standard Error: 2_000 - .saturating_add((7_175_000 as Weight).saturating_mul(b as Weight)) + (10_432_000 as Weight) + // Standard Error: 6_000 + .saturating_add((7_383_000 as Weight).saturating_mul(b as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(b as Weight))) .saturating_add(T::DbWeight::get().writes(1 as Weight)) .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(b as Weight))) } // Storage: Nonfungible TokenData (r:1 w:1) + // Storage: Nonfungible TokenChildren (r:1 w:0) // Storage: Nonfungible TokensBurnt (r:1 w:1) // Storage: Nonfungible AccountBalance (r:1 w:1) // Storage: Nonfungible Allowance (r:1 w:0) // Storage: Nonfungible Owned (r:0 w:1) + // Storage: Nonfungible TokenProperties (r:0 w:1) fn burn_item() -> Weight { - (24_554_000 as Weight) - .saturating_add(T::DbWeight::get().reads(4 as Weight)) - .saturating_add(T::DbWeight::get().writes(4 as Weight)) + (29_798_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) } // Storage: Nonfungible TokenChildren (r:1 w:0) // Storage: Nonfungible TokenData (r:1 w:1) @@ -102,7 +105,7 @@ // Storage: Nonfungible Owned (r:0 w:1) // Storage: Nonfungible TokenProperties (r:0 w:1) fn burn_recursively_self_raw() -> Weight { - (86_136_000 as Weight) + (37_955_000 as Weight) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(5 as Weight)) } @@ -116,11 +119,11 @@ // Storage: Common CollectionById (r:1 w:0) fn burn_recursively_breadth_plus_self_plus_self_per_each_raw(b: u32, ) -> Weight { (0 as Weight) - // Standard Error: 42_828_000 - .saturating_add((381_478_000 as Weight).saturating_mul(b as Weight)) - .saturating_add(T::DbWeight::get().reads(6 as Weight)) + // Standard Error: 1_349_000 + .saturating_add((275_145_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) .saturating_add(T::DbWeight::get().reads((4 as Weight).saturating_mul(b as Weight))) - .saturating_add(T::DbWeight::get().writes(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) .saturating_add(T::DbWeight::get().writes((4 as Weight).saturating_mul(b as Weight))) } // Storage: Nonfungible TokenData (r:1 w:1) @@ -128,14 +131,14 @@ // Storage: Nonfungible Allowance (r:1 w:0) // Storage: Nonfungible Owned (r:0 w:2) fn transfer() -> Weight { - (28_339_000 as Weight) + (27_867_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(5 as Weight)) } // Storage: Nonfungible TokenData (r:1 w:0) // Storage: Nonfungible Allowance (r:1 w:1) fn approve() -> Weight { - (17_616_000 as Weight) + (18_824_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } @@ -144,25 +147,27 @@ // Storage: Nonfungible AccountBalance (r:2 w:2) // Storage: Nonfungible Owned (r:0 w:2) fn transfer_from() -> Weight { - (32_196_000 as Weight) + (32_879_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(6 as Weight)) } // Storage: Nonfungible Allowance (r:1 w:1) // Storage: Nonfungible TokenData (r:1 w:1) + // Storage: Nonfungible TokenChildren (r:1 w:0) // Storage: Nonfungible TokensBurnt (r:1 w:1) // Storage: Nonfungible AccountBalance (r:1 w:1) // Storage: Nonfungible Owned (r:0 w:1) + // Storage: Nonfungible TokenProperties (r:0 w:1) fn burn_from() -> Weight { - (27_580_000 as Weight) - .saturating_add(T::DbWeight::get().reads(4 as Weight)) - .saturating_add(T::DbWeight::get().writes(5 as Weight)) + (37_061_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) } // Storage: Common CollectionPropertyPermissions (r:1 w:1) - fn set_property_permissions(b: u32, ) -> Weight { + fn set_token_property_permissions(b: u32, ) -> Weight { (0 as Weight) - // Standard Error: 3_432_000 - .saturating_add((126_888_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 57_000 + .saturating_add((15_149_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)) } @@ -171,8 +176,8 @@ // Storage: Nonfungible TokenProperties (r:1 w:1) fn set_token_properties(b: u32, ) -> Weight { (0 as Weight) - // Standard Error: 158_583_000 - .saturating_add((4_707_700_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 2_278_000 + .saturating_add((409_613_000 as Weight).saturating_mul(b as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } @@ -181,8 +186,8 @@ // Storage: Nonfungible TokenProperties (r:1 w:1) fn delete_token_properties(b: u32, ) -> Weight { (0 as Weight) - // Standard Error: 169_018_000 - .saturating_add((4_783_967_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 2_234_000 + .saturating_add((408_185_000 as Weight).saturating_mul(b as Weight)) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } @@ -195,7 +200,7 @@ // Storage: Nonfungible TokenData (r:0 w:1) // Storage: Nonfungible Owned (r:0 w:1) fn create_item() -> Weight { - (18_450_000 as Weight) + (24_135_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } @@ -204,9 +209,9 @@ // Storage: Nonfungible TokenData (r:0 w:4) // Storage: Nonfungible Owned (r:0 w:4) fn create_multiple_items(b: u32, ) -> Weight { - (10_228_000 as Weight) - // Standard Error: 1_000 - .saturating_add((4_392_000 as Weight).saturating_mul(b as Weight)) + (21_952_000 as Weight) + // Standard Error: 5_000 + .saturating_add((4_727_000 as Weight).saturating_mul(b as Weight)) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) .saturating_add(RocksDbWeight::get().writes((2 as Weight).saturating_mul(b as Weight))) @@ -216,23 +221,25 @@ // Storage: Nonfungible TokenData (r:0 w:4) // Storage: Nonfungible Owned (r:0 w:4) fn create_multiple_items_ex(b: u32, ) -> Weight { - (6_543_000 as Weight) - // Standard Error: 2_000 - .saturating_add((7_175_000 as Weight).saturating_mul(b as Weight)) + (10_432_000 as Weight) + // Standard Error: 6_000 + .saturating_add((7_383_000 as Weight).saturating_mul(b as Weight)) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(b as Weight))) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) .saturating_add(RocksDbWeight::get().writes((3 as Weight).saturating_mul(b as Weight))) } // Storage: Nonfungible TokenData (r:1 w:1) + // Storage: Nonfungible TokenChildren (r:1 w:0) // Storage: Nonfungible TokensBurnt (r:1 w:1) // Storage: Nonfungible AccountBalance (r:1 w:1) // Storage: Nonfungible Allowance (r:1 w:0) // Storage: Nonfungible Owned (r:0 w:1) + // Storage: Nonfungible TokenProperties (r:0 w:1) fn burn_item() -> Weight { - (24_554_000 as Weight) - .saturating_add(RocksDbWeight::get().reads(4 as Weight)) - .saturating_add(RocksDbWeight::get().writes(4 as Weight)) + (29_798_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(5 as Weight)) + .saturating_add(RocksDbWeight::get().writes(5 as Weight)) } // Storage: Nonfungible TokenChildren (r:1 w:0) // Storage: Nonfungible TokenData (r:1 w:1) @@ -242,7 +249,7 @@ // Storage: Nonfungible Owned (r:0 w:1) // Storage: Nonfungible TokenProperties (r:0 w:1) fn burn_recursively_self_raw() -> Weight { - (86_136_000 as Weight) + (37_955_000 as Weight) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) .saturating_add(RocksDbWeight::get().writes(5 as Weight)) } @@ -256,11 +263,11 @@ // Storage: Common CollectionById (r:1 w:0) fn burn_recursively_breadth_plus_self_plus_self_per_each_raw(b: u32, ) -> Weight { (0 as Weight) - // Standard Error: 42_828_000 - .saturating_add((381_478_000 as Weight).saturating_mul(b as Weight)) - .saturating_add(RocksDbWeight::get().reads(6 as Weight)) + // Standard Error: 1_349_000 + .saturating_add((275_145_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(RocksDbWeight::get().reads(7 as Weight)) .saturating_add(RocksDbWeight::get().reads((4 as Weight).saturating_mul(b as Weight))) - .saturating_add(RocksDbWeight::get().writes(5 as Weight)) + .saturating_add(RocksDbWeight::get().writes(6 as Weight)) .saturating_add(RocksDbWeight::get().writes((4 as Weight).saturating_mul(b as Weight))) } // Storage: Nonfungible TokenData (r:1 w:1) @@ -268,14 +275,14 @@ // Storage: Nonfungible Allowance (r:1 w:0) // Storage: Nonfungible Owned (r:0 w:2) fn transfer() -> Weight { - (28_339_000 as Weight) + (27_867_000 as Weight) .saturating_add(RocksDbWeight::get().reads(4 as Weight)) .saturating_add(RocksDbWeight::get().writes(5 as Weight)) } // Storage: Nonfungible TokenData (r:1 w:0) // Storage: Nonfungible Allowance (r:1 w:1) fn approve() -> Weight { - (17_616_000 as Weight) + (18_824_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } @@ -284,25 +291,27 @@ // Storage: Nonfungible AccountBalance (r:2 w:2) // Storage: Nonfungible Owned (r:0 w:2) fn transfer_from() -> Weight { - (32_196_000 as Weight) + (32_879_000 as Weight) .saturating_add(RocksDbWeight::get().reads(4 as Weight)) .saturating_add(RocksDbWeight::get().writes(6 as Weight)) } // Storage: Nonfungible Allowance (r:1 w:1) // Storage: Nonfungible TokenData (r:1 w:1) + // Storage: Nonfungible TokenChildren (r:1 w:0) // Storage: Nonfungible TokensBurnt (r:1 w:1) // Storage: Nonfungible AccountBalance (r:1 w:1) // Storage: Nonfungible Owned (r:0 w:1) + // Storage: Nonfungible TokenProperties (r:0 w:1) fn burn_from() -> Weight { - (27_580_000 as Weight) - .saturating_add(RocksDbWeight::get().reads(4 as Weight)) - .saturating_add(RocksDbWeight::get().writes(5 as Weight)) + (37_061_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(5 as Weight)) + .saturating_add(RocksDbWeight::get().writes(6 as Weight)) } // Storage: Common CollectionPropertyPermissions (r:1 w:1) - fn set_property_permissions(b: u32, ) -> Weight { + fn set_token_property_permissions(b: u32, ) -> Weight { (0 as Weight) - // Standard Error: 3_432_000 - .saturating_add((126_888_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 57_000 + .saturating_add((15_149_000 as Weight).saturating_mul(b as Weight)) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } @@ -311,8 +320,8 @@ // Storage: Nonfungible TokenProperties (r:1 w:1) fn set_token_properties(b: u32, ) -> Weight { (0 as Weight) - // Standard Error: 158_583_000 - .saturating_add((4_707_700_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 2_278_000 + .saturating_add((409_613_000 as Weight).saturating_mul(b as Weight)) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } @@ -321,8 +330,8 @@ // Storage: Nonfungible TokenProperties (r:1 w:1) fn delete_token_properties(b: u32, ) -> Weight { (0 as Weight) - // Standard Error: 169_018_000 - .saturating_add((4_783_967_000 as Weight).saturating_mul(b as Weight)) + // Standard Error: 2_234_000 + .saturating_add((408_185_000 as Weight).saturating_mul(b as Weight)) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } --- a/pallets/proxy-rmrk-core/src/benchmarking.rs +++ b/pallets/proxy-rmrk-core/src/benchmarking.rs @@ -6,21 +6,523 @@ traits::{Currency, Get}, BoundedVec, }; +use sp_runtime::Permill; + +use up_data_structs::*; -use crate::{Config, Pallet, Call}; +use super::*; const SEED: u32 = 1; fn create_data>() -> BoundedVec { + vec![b'A'; S::get() as usize].try_into().expect("size == S") +} + +fn create_u32_array>() -> BoundedVec { vec![0; S::get() as usize].try_into().expect("size == S") } +fn create_basic_resource() -> RmrkBasicResource { + RmrkBasicResource { + src: Some(create_data()), + metadata: Some(create_data()), + license: Some(create_data()), + thumb: Some(create_data()), + } +} + +fn create_composable_resource() -> RmrkComposableResource { + RmrkComposableResource { + parts: create_u32_array(), + base: 100, + src: Some(create_data()), + metadata: Some(create_data()), + license: Some(create_data()), + thumb: Some(create_data()), + } +} + +fn create_slot_resource() -> RmrkSlotResource { + RmrkSlotResource { + base: 100, + slot: 200, + src: Some(create_data()), + metadata: Some(create_data()), + license: Some(create_data()), + thumb: Some(create_data()), + } +} + +fn create_max_resource_types_array>(num: usize) -> BoundedVec { + vec![RmrkResourceTypes::Composable(create_composable_resource()); num] + .try_into() + .expect("num <= S") +} + +fn create_max_collection(owner: &T::AccountId) -> DispatchResult { + ::Currency::deposit_creating( + owner, + T::CollectionCreationPrice::get(), + ); + + let metadata = create_data(); + let max = None; + let symbol = create_data(); + + >::create_collection( + RawOrigin::Signed(owner.clone()).into(), + metadata, + max, + symbol, + ) +} + +fn create_nft(owner: &T::AccountId, collection_id: RmrkCollectionId) -> DispatchResult { + let royalty_recipient = Some(owner.clone()); + let royalty_amount = Some(Permill::from_percent(25)); + let metadata = create_data(); + let transferable = true; + + >::mint_nft( + RawOrigin::Signed(owner.clone()).into(), + None, + collection_id, + royalty_recipient, + royalty_amount, + metadata, + transferable, + None, + ) +} + +struct NftBuilder { + collection_id: RmrkCollectionId, + current_nft_id: RmrkNftId, +} + +impl NftBuilder { + fn new(collection_id: RmrkCollectionId) -> Self { + Self { + collection_id, + current_nft_id: 0, + } + } + + fn build(&mut self, owner: &T::AccountId) -> Result { + create_nft::(owner, self.collection_id)?; + self.current_nft_id += 1; + + Ok(self.current_nft_id) + } + + fn build_tower( + &mut self, + owner: &T::AccountId, + height: u32, + ) -> Result<(RmrkNftId, RmrkNftId), DispatchError> { + self.build::(owner)?; + + let root_nft_id = self.current_nft_id; + let mut prev_nft_id = root_nft_id; + + for _ in 0..height { + self.build::(owner)?; + + let new_owner = + >::CollectionAndNftTuple( + self.collection_id, + prev_nft_id, + ); + + >::send( + RawOrigin::Signed(owner.clone()).into(), + self.collection_id, + self.current_nft_id, + new_owner, + )?; + + prev_nft_id = self.current_nft_id; + } + + let deepest_nft_id = self.current_nft_id; + + Ok((root_nft_id, deepest_nft_id)) + } + + fn build_wide_tree( + &mut self, + owner: &T::AccountId, + width: u32, + ) -> Result { + self.build::(owner)?; + + let root_nft_id = self.current_nft_id; + + let root_owner = >::CollectionAndNftTuple( + self.collection_id, + root_nft_id, + ); + + for _ in 0..width { + self.build::(owner)?; + + >::send( + RawOrigin::Signed(owner.clone()).into(), + self.collection_id, + self.current_nft_id, + root_owner.clone(), + )?; + } + + Ok(root_nft_id) + } +} + benchmarks! { create_collection { let caller = account("caller", 0, SEED); ::Currency::deposit_creating(&caller, T::CollectionCreationPrice::get()); let metadata = create_data(); - // TODO: Fix CollectionTokenPrefixLimitExceeded with create_data - let symbol = vec![].try_into().expect("0 <= x"); - }: _(RawOrigin::Signed(caller), metadata, None, symbol) + let max = None; + let symbol = create_data(); + }: _(RawOrigin::Signed(caller), metadata, max, symbol) + + destroy_collection { + let caller = account("caller", 0, SEED); + + create_max_collection::(&caller)?; + let collection_id = 0; + }: _(RawOrigin::Signed(caller), collection_id) + + change_collection_issuer { + let caller: T::AccountId = account("caller", 0, SEED); + + create_max_collection::(&caller)?; + let collection_id = 0; + + let new_owner: T::AccountId = account("new_owner", 0, SEED); + + let new_owner_source = T::Lookup::unlookup(new_owner); + }: _(RawOrigin::Signed(caller), collection_id, new_owner_source) + + lock_collection { + let caller: T::AccountId = account("caller", 0, SEED); + + create_max_collection::(&caller)?; + let collection_id = 0; + }: _(RawOrigin::Signed(caller), collection_id) + + mint_nft { + let b in 0..100; + + let caller: T::AccountId = account("caller", 0, SEED); + + create_max_collection::(&caller)?; + let collection_id = 0; + let owner = caller.clone(); + + let royalty_recipient = Some(caller.clone()); + let royalty_amount = Some(Permill::from_percent(25)); + let metadata = create_data(); + let transferable = true; + }: _( + RawOrigin::Signed(caller), + None, + collection_id, + royalty_recipient, + royalty_amount, + metadata, + transferable, + Some(create_max_resource_types_array(b as usize)) + ) + + burn_nft { + let b in 0..200; + + let caller: T::AccountId = account("caller", 0, SEED); + create_max_collection::(&caller)?; + let collection_id = 0; + + let mut nft_builder = NftBuilder::new(collection_id); + let root_nft_id = nft_builder.build_wide_tree::(&caller, b)?; + let max_burns = b + 1; + }: _( + RawOrigin::Signed(caller), + collection_id, + root_nft_id, + max_burns + ) + + send { + let caller: T::AccountId = account("caller", 0, SEED); + create_max_collection::(&caller)?; + let collection_id = 0; + + let mut nft_builder = NftBuilder::new(collection_id); + let src_nft_id = nft_builder.build::(&caller)?; + let (_, target_nft_id) = nft_builder.build_tower::(&caller, NESTING_BUDGET - 2)?; + }: _( + RawOrigin::Signed(caller), + collection_id, + src_nft_id, + >::CollectionAndNftTuple(collection_id, target_nft_id) + ) + + accept_nft { + let caller: T::AccountId = account("caller", 0, SEED); + let sender: T::AccountId = account("sender", 0, SEED); + + create_max_collection::(&sender)?; + let src_collection_id = 0; + + create_max_collection::(&caller)?; + let target_collection_id = 1; + + let mut src_nft_builder = NftBuilder::new(src_collection_id); + let src_nft_id = src_nft_builder.build::(&sender)?; + + let mut target_nft_builder = NftBuilder::new(target_collection_id); + let fake_target_nft_id = target_nft_builder.build::(&caller)?; + let (_, target_nft_id) = target_nft_builder.build_tower::(&caller, NESTING_BUDGET - 1)?; + + let new_owner = >::CollectionAndNftTuple( + target_collection_id, + fake_target_nft_id + ); + + let actual_new_owner = >::CollectionAndNftTuple( + target_collection_id, + target_nft_id + ); + + >::send( + RawOrigin::Signed(sender.clone()).into(), + src_collection_id, + src_nft_id, + new_owner, + )?; + }: _( + RawOrigin::Signed(caller), + src_collection_id, + src_nft_id, + actual_new_owner + ) + + reject_nft { + let caller: T::AccountId = account("caller", 0, SEED); + let sender: T::AccountId = account("sender", 0, SEED); + + create_max_collection::(&sender)?; + let src_collection_id = 0; + + create_max_collection::(&caller)?; + let target_collection_id = 1; + + let mut src_nft_builder = NftBuilder::new(src_collection_id); + let (src_root_nft_id, _) = src_nft_builder.build_tower::(&sender, NESTING_BUDGET - 1)?; + + let mut target_nft_builder = NftBuilder::new(target_collection_id); + let target_nft_id = target_nft_builder.build::(&caller)?; + + let new_owner = >::CollectionAndNftTuple( + target_collection_id, + target_nft_id + ); + + >::send( + RawOrigin::Signed(sender.clone()).into(), + src_collection_id, + src_root_nft_id, + new_owner, + )?; + }: _( + RawOrigin::Signed(caller), + src_collection_id, + src_root_nft_id + ) + + set_property { + let caller: T::AccountId = account("caller", 0, SEED); + create_max_collection::(&caller)?; + let collection_id = 0; + + let mut nft_builder = NftBuilder::new(collection_id); + let (_, nft_id) = nft_builder.build_tower::(&caller, NESTING_BUDGET - 1)?; + + let key = create_data(); + let value = create_data(); + }: _( + RawOrigin::Signed(caller), + collection_id, + Some(nft_id), + key, + value + ) + + set_priority { + let caller: T::AccountId = account("caller", 0, SEED); + create_max_collection::(&caller)?; + let collection_id = 0; + + let mut nft_builder = NftBuilder::new(collection_id); + let (_, nft_id) = nft_builder.build_tower::(&caller, NESTING_BUDGET - 1)?; + let priorities = create_u32_array(); + }: _( + RawOrigin::Signed(caller), + collection_id, + nft_id, + priorities + ) + + add_basic_resource { + let caller: T::AccountId = account("caller", 0, SEED); + + create_max_collection::(&caller)?; + let collection_id = 0; + + let mut nft_builder = NftBuilder::new(collection_id); + let (_, nft_id) = nft_builder.build_tower::(&caller, NESTING_BUDGET - 1)?; + let resource = create_basic_resource(); + }: _( + RawOrigin::Signed(caller), + collection_id, + nft_id, + resource + ) + + add_composable_resource { + let caller: T::AccountId = account("caller", 0, SEED); + + create_max_collection::(&caller)?; + let collection_id = 0; + + let mut nft_builder = NftBuilder::new(collection_id); + let (_, nft_id) = nft_builder.build_tower::(&caller, NESTING_BUDGET - 1)?; + let resource = create_composable_resource(); + }: _( + RawOrigin::Signed(caller), + collection_id, + nft_id, + resource + ) + + add_slot_resource { + let caller: T::AccountId = account("caller", 0, SEED); + + create_max_collection::(&caller)?; + let collection_id = 0; + + let mut nft_builder = NftBuilder::new(collection_id); + let (_, nft_id) = nft_builder.build_tower::(&caller, NESTING_BUDGET - 1)?; + let resource = create_slot_resource(); + }: _( + RawOrigin::Signed(caller), + collection_id, + nft_id, + resource + ) + + remove_resource { + let caller: T::AccountId = account("caller", 0, SEED); + + create_max_collection::(&caller)?; + let collection_id = 0; + + let mut nft_builder = NftBuilder::new(collection_id); + let (_, nft_id) = nft_builder.build_tower::(&caller, NESTING_BUDGET - 1)?; + let resource = create_basic_resource(); + + >::add_basic_resource( + RawOrigin::Signed(caller.clone()).into(), + collection_id, + nft_id, + resource + )?; + + let resource_id = 0; + }: _( + RawOrigin::Signed(caller), + collection_id, + nft_id, + resource_id + ) + + accept_resource { + let caller: T::AccountId = account("caller", 0, SEED); + let admin: T::AccountId = account("admin", 0, SEED); + + create_max_collection::(&admin)?; + let collection_id = 0; + + let mut nft_builder = NftBuilder::new(collection_id); + let root_nft_id = 1; + let (_, nested_nft_id) = nft_builder.build_tower::(&admin, NESTING_BUDGET - 1)?; + let resource = create_basic_resource(); + + let new_owner = >::AccountId(caller.clone()); + + >::send( + RawOrigin::Signed(admin.clone()).into(), + collection_id, + root_nft_id, + new_owner, + )?; + + >::add_basic_resource( + RawOrigin::Signed(admin.clone()).into(), + collection_id, + nested_nft_id, + resource + )?; + + let resource_id = 0; + }: _( + RawOrigin::Signed(caller), + collection_id, + nested_nft_id, + resource_id + ) + + accept_resource_removal { + let caller: T::AccountId = account("caller", 0, SEED); + let admin: T::AccountId = account("admin", 0, SEED); + + create_max_collection::(&admin)?; + let collection_id = 0; + + let mut nft_builder = NftBuilder::new(collection_id); + let root_nft_id = 1; + let (_, nested_nft_id) = nft_builder.build_tower::(&admin, NESTING_BUDGET - 1)?; + let resource = create_basic_resource(); + + >::add_basic_resource( + RawOrigin::Signed(admin.clone()).into(), + collection_id, + nested_nft_id, + resource + )?; + + let resource_id = 0; + + let new_owner = >::AccountId(caller.clone()); + + >::send( + RawOrigin::Signed(admin.clone()).into(), + collection_id, + root_nft_id, + new_owner, + )?; + + >::remove_resource( + RawOrigin::Signed(admin).into(), + collection_id, + nested_nft_id, + resource_id + )?; + }: _( + RawOrigin::Signed(caller), + collection_id, + nested_nft_id, + resource_id + ) } --- a/pallets/proxy-rmrk-core/src/lib.rs +++ b/pallets/proxy-rmrk-core/src/lib.rs @@ -35,6 +35,7 @@ pub mod benchmarking; pub mod misc; pub mod property; +pub mod rpc; pub mod weights; pub type SelfWeightOf = ::WeightInfo; @@ -45,7 +46,7 @@ use RmrkProperty::*; -const NESTING_BUDGET: u32 = 5; +pub const NESTING_BUDGET: u32 = 5; #[frame_support::pallet] pub mod pallet { @@ -67,10 +68,6 @@ #[pallet::storage] pub type UniqueCollectionId = StorageMap<_, Twox64Concat, RmrkCollectionId, CollectionId, ValueQuery>; - - #[pallet::storage] - pub type RmrkInernalCollectionId = - StorageMap<_, Twox64Concat, CollectionId, RmrkCollectionId, ValueQuery>; #[pallet::pallet] #[pallet::generate_store(pub(super) trait Store)] @@ -158,6 +155,8 @@ NftTypeEncodeError, RmrkPropertyKeyIsTooLong, RmrkPropertyValueIsTooLong, + RmrkPropertyIsNotFound, + UnableToDecodeRmrkData, /* RMRK compatible events */ CollectionNotEmpty, @@ -171,7 +170,9 @@ CannotSendToDescendentOrSelf, CannotAcceptNonOwnedNft, CannotRejectNonOwnedNft, + CannotRejectNonPendingNft, ResourceNotPending, + NoAvailableResourceId, } #[pallet::call] @@ -202,7 +203,7 @@ permissions: Some(CollectionPermissions { nesting: Some(NestingPermissions { token_owner: true, - admin: false, + collection_admin: false, restricted: None, permissive: false, @@ -224,8 +225,13 @@ let rmrk_collection_id = >::get(); >::insert(rmrk_collection_id, unique_collection_id); - >::insert(unique_collection_id, rmrk_collection_id); + >::set_scoped_collection_property( + unique_collection_id, + PropertyScope::Rmrk, + Self::rmrk_property(RmrkInternalCollectionId, &rmrk_collection_id)?, + )?; + >::mutate(|n| *n += 1); Self::deposit_event(Event::CollectionCreated { @@ -237,8 +243,8 @@ } /// destroy collection - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::destroy_collection())] pub fn destroy_collection( origin: OriginFor, collection_id: RmrkCollectionId, @@ -269,8 +275,8 @@ /// - `origin`: sender of the transaction /// - `collection_id`: collection id of the nft to change issuer of /// - `new_issuer`: Collection's new issuer - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::change_collection_issuer())] pub fn change_collection_issuer( origin: OriginFor, collection_id: RmrkCollectionId, @@ -300,8 +306,8 @@ } /// lock collection - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::lock_collection())] pub fn lock_collection( origin: OriginFor, collection_id: RmrkCollectionId, @@ -341,19 +347,22 @@ /// - `royalty`: Permillage reward from each trade for the Recipient /// - `metadata`: Arbitrary data about an nft, e.g. IPFS hash /// - `transferable`: Ability to transfer this NFT - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::mint_nft(resources.as_ref().map(|r| r.len() as u32).unwrap_or(0)))] pub fn mint_nft( origin: OriginFor, - owner: T::AccountId, + owner: Option, collection_id: RmrkCollectionId, recipient: Option, royalty_amount: Option, metadata: RmrkString, transferable: bool, + resources: Option>, ) -> DispatchResult { let sender = ensure_signed(origin)?; - let sender = T::CrossAccountId::from_sub(sender); + let cross_sender = T::CrossAccountId::from_sub(sender.clone()); + + let owner = owner.unwrap_or(sender.clone()); let cross_owner = T::CrossAccountId::from_sub(owner.clone()); let collection = Self::get_typed_nft_collection( @@ -368,7 +377,7 @@ }); let nft_id = Self::create_nft( - &sender, + &cross_sender, &cross_owner, &collection, [ @@ -378,21 +387,8 @@ Self::rmrk_property(RoyaltyInfo, &royalty_info)?, Self::rmrk_property(Metadata, &metadata)?, Self::rmrk_property(Equipped, &false)?, - Self::rmrk_property( - ResourceCollection, - &Self::init_collection( - sender.clone(), - CreateCollectionData { - ..Default::default() - }, - [Self::rmrk_property( - CollectionType, - &misc::CollectionType::Resource, - )?] - .into_iter(), - )?, - )?, // todo possibly add limits to the collection if rmrk warrants them Self::rmrk_property(ResourcePriorities, &>::new())?, + Self::rmrk_property(NextResourceId, &(0 as RmrkResourceId))?, ] .into_iter(), ) @@ -401,6 +397,12 @@ err => Self::map_unique_err_to_proxy(err), })?; + if let Some(resources) = resources { + for resource in resources { + Self::resource_add(sender.clone(), collection.id, nft_id, resource)?; + } + } + Self::deposit_event(Event::NftMinted { owner, collection_id, @@ -411,12 +413,13 @@ } /// burn nft - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::burn_nft(*max_burns))] pub fn burn_nft( origin: OriginFor, collection_id: RmrkCollectionId, nft_id: RmrkNftId, + max_burns: u32, ) -> DispatchResult { let sender = ensure_signed(origin)?; let cross_sender = T::CrossAccountId::from_sub(sender.clone()); @@ -431,8 +434,10 @@ cross_sender, Self::unique_collection_id(collection_id)?, nft_id.into(), + max_burns, + >::NoPermission, ) - .map_err(Self::map_unique_err_to_proxy)?; + .map_err(|err| Self::map_unique_err_to_proxy(err.error))?; Self::deposit_event(Event::NFTBurned { owner: sender, @@ -449,8 +454,8 @@ /// - `rmrk_collection_id`: collection id of the nft to be transferred /// - `rmrk_nft_id`: nft id of the nft to be transferred /// - `new_owner`: new owner of the nft which can be either an account or a NFT - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::send())] pub fn send( origin: OriginFor, rmrk_collection_id: RmrkCollectionId, @@ -561,8 +566,8 @@ /// - `rmrk_nft_id`: nft id of the nft to be accepted /// - `new_owner`: either origin's account ID or origin-owned NFT, whichever the NFT was /// sent to - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::accept_nft())] pub fn accept_nft( origin: OriginFor, rmrk_collection_id: RmrkCollectionId, @@ -636,8 +641,8 @@ /// - `origin`: sender of the transaction /// - `rmrk_collection_id`: collection id of the nft to be accepted /// - `rmrk_nft_id`: nft id of the nft to be accepted - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::reject_nft())] pub fn reject_nft( origin: OriginFor, rmrk_collection_id: RmrkCollectionId, @@ -653,15 +658,28 @@ Self::get_typed_nft_collection(collection_id, misc::CollectionType::Regular)?; collection.check_is_external()?; - Self::destroy_nft(cross_sender, collection_id, nft_id).map_err(|err| { - if err == >::NoPermission.into() - || err == >::ApprovedValueTooLow.into() - { - >::CannotRejectNonOwnedNft.into() - } else { - Self::map_unique_err_to_proxy(err) - } - })?; + ensure!( + >::get((collection_id, nft_id)).is_some(), + >::NoAvailableNftId + ); + + ensure!( + Self::get_nft_property_decoded( + collection_id, + nft_id, + RmrkProperty::PendingNftAccept + )?, + >::CannotRejectNonPendingNft + ); + + Self::destroy_nft( + cross_sender, + collection_id, + nft_id, + NESTING_BUDGET, + >::CannotRejectNonOwnedNft, + ) + .map_err(|err| Self::map_unique_err_to_proxy(err.error))?; Self::deposit_event(Event::NFTRejected { sender, @@ -673,13 +691,13 @@ } /// accept the addition of a new resource to an existing NFT - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::accept_resource())] pub fn accept_resource( origin: OriginFor, rmrk_collection_id: RmrkCollectionId, rmrk_nft_id: RmrkNftId, - rmrk_resource_id: RmrkResourceId, + resource_id: RmrkResourceId, ) -> DispatchResult { let sender = ensure_signed(origin)?; let cross_sender = T::CrossAccountId::from_sub(sender); @@ -691,7 +709,6 @@ collection.check_is_external()?; let nft_id = rmrk_nft_id.into(); - let resource_id = rmrk_resource_id.into(); let budget = budget::Value::new(NESTING_BUDGET); @@ -699,44 +716,31 @@ >::find_topmost_owner(collection_id, nft_id, &budget) .map_err(|_| >::ResourceDoesntExist)?; - let resource_collection_id: CollectionId = - Self::get_nft_property_decoded(collection_id, nft_id, ResourceCollection) - .map_err(|_| >::ResourceDoesntExist)?; - - let is_pending: bool = Self::get_nft_property_decoded( - resource_collection_id, - resource_id, - PendingResourceAccept, - ) - .map_err(|_| >::ResourceDoesntExist)?; - - ensure!(is_pending, >::ResourceNotPending); + Self::try_mutate_resource_info(collection_id, nft_id, resource_id, |res| { + ensure!(res.pending, >::ResourceNotPending); + ensure!(cross_sender == nft_owner, >::NoPermission); - ensure!(cross_sender == nft_owner, >::NoPermission); + res.pending = false; - >::set_scoped_token_property( - resource_collection_id, - rmrk_resource_id.into(), - PropertyScope::Rmrk, - Self::rmrk_property(PendingResourceAccept, &false)?, - )?; + Ok(()) + })?; Self::deposit_event(Event::::ResourceAccepted { nft_id: rmrk_nft_id, - resource_id: rmrk_resource_id, + resource_id, }); Ok(()) } /// accept the removal of a resource of an existing NFT - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::accept_resource_removal())] pub fn accept_resource_removal( origin: OriginFor, rmrk_collection_id: RmrkCollectionId, rmrk_nft_id: RmrkNftId, - rmrk_resource_id: RmrkResourceId, + resource_id: RmrkResourceId, ) -> DispatchResult { let sender = ensure_signed(origin)?; let cross_sender = T::CrossAccountId::from_sub(sender); @@ -748,7 +752,6 @@ collection.check_is_external()?; let nft_id = rmrk_nft_id.into(); - let resource_id = rmrk_resource_id.into(); let budget = budget::Value::new(NESTING_BUDGET); @@ -758,38 +761,41 @@ ensure!(cross_sender == nft_owner, >::NoPermission); - let resource_collection_id: CollectionId = - Self::get_nft_property_decoded(collection_id, nft_id, ResourceCollection) - .map_err(|_| >::ResourceDoesntExist)?; + let resource_id_key = Self::rmrk_property_key(ResourceId(resource_id))?; - let is_pending: bool = Self::get_nft_property_decoded( - resource_collection_id, - resource_id, - PendingResourceRemoval, - ) - .map_err(|_| >::ResourceDoesntExist)?; + let resource_info = >::token_aux_property(( + collection_id, + nft_id, + PropertyScope::Rmrk, + resource_id_key.clone(), + )) + .ok_or(>::ResourceDoesntExist)?; - ensure!(is_pending, >::ResourceNotPending); + let resource_info: RmrkResourceInfo = Self::decode_property(&resource_info)?; - let resource_collection = Self::get_typed_nft_collection( - resource_collection_id, - misc::CollectionType::Resource, - )?; + ensure!( + resource_info.pending_removal, + >::ResourceNotPending + ); - >::burn(&resource_collection, &cross_sender, rmrk_resource_id.into()) - .map_err(Self::map_unique_err_to_proxy)?; + >::remove_token_aux_property( + collection_id, + nft_id, + PropertyScope::Rmrk, + resource_id_key, + ); Self::deposit_event(Event::::ResourceRemovalAccepted { nft_id: rmrk_nft_id, - resource_id: rmrk_resource_id, + resource_id, }); Ok(()) } /// set a custom value on an NFT - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::set_property())] pub fn set_property( origin: OriginFor, #[pallet::compact] rmrk_collection_id: RmrkCollectionId, @@ -848,8 +854,8 @@ } /// set a different order of resource priority - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::set_priority())] pub fn set_priority( origin: OriginFor, rmrk_collection_id: RmrkCollectionId, @@ -887,8 +893,8 @@ } /// Create basic resource - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::add_basic_resource())] pub fn add_basic_resource( origin: OriginFor, rmrk_collection_id: RmrkCollectionId, @@ -906,15 +912,7 @@ sender, collection_id, nft_id.into(), - [ - Self::rmrk_property(TokenType, &NftType::Resource)?, - Self::rmrk_property(ResourceType, &misc::ResourceType::Basic)?, - Self::rmrk_property(Src, &resource.src)?, - Self::rmrk_property(Metadata, &resource.metadata)?, - Self::rmrk_property(License, &resource.license)?, - Self::rmrk_property(Thumb, &resource.thumb)?, - ] - .into_iter(), + RmrkResourceTypes::Basic(resource), )?; Self::deposit_event(Event::ResourceAdded { @@ -925,13 +923,12 @@ } /// Create composable resource - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::add_composable_resource())] pub fn add_composable_resource( origin: OriginFor, rmrk_collection_id: RmrkCollectionId, nft_id: RmrkNftId, - _resource_id: RmrkBoundedResource, resource: RmrkComposableResource, ) -> DispatchResult { let sender = ensure_signed(origin.clone())?; @@ -945,17 +942,7 @@ sender, collection_id, nft_id.into(), - [ - Self::rmrk_property(TokenType, &NftType::Resource)?, - Self::rmrk_property(ResourceType, &misc::ResourceType::Composable)?, - Self::rmrk_property(Parts, &resource.parts)?, - Self::rmrk_property(Base, &resource.base)?, - Self::rmrk_property(Src, &resource.src)?, - Self::rmrk_property(Metadata, &resource.metadata)?, - Self::rmrk_property(License, &resource.license)?, - Self::rmrk_property(Thumb, &resource.thumb)?, - ] - .into_iter(), + RmrkResourceTypes::Composable(resource), )?; Self::deposit_event(Event::ResourceAdded { @@ -966,8 +953,8 @@ } /// Create slot resource - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::add_slot_resource())] pub fn add_slot_resource( origin: OriginFor, rmrk_collection_id: RmrkCollectionId, @@ -985,17 +972,7 @@ sender, collection_id, nft_id.into(), - [ - Self::rmrk_property(TokenType, &NftType::Resource)?, - Self::rmrk_property(ResourceType, &misc::ResourceType::Slot)?, - Self::rmrk_property(Base, &resource.base)?, - Self::rmrk_property(Src, &resource.src)?, - Self::rmrk_property(Metadata, &resource.metadata)?, - Self::rmrk_property(Slot, &resource.slot)?, - Self::rmrk_property(License, &resource.license)?, - Self::rmrk_property(Thumb, &resource.thumb)?, - ] - .into_iter(), + RmrkResourceTypes::Slot(resource), )?; Self::deposit_event(Event::ResourceAdded { @@ -1006,8 +983,8 @@ } /// remove resource - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::remove_resource())] pub fn remove_resource( origin: OriginFor, rmrk_collection_id: RmrkCollectionId, @@ -1021,7 +998,7 @@ Self::get_typed_nft_collection(collection_id, misc::CollectionType::Regular)?; collection.check_is_external()?; - Self::resource_remove(sender, collection_id, nft_id.into(), resource_id.into())?; + Self::resource_remove(sender, collection_id, nft_id.into(), resource_id)?; Self::deposit_event(Event::ResourceRemoval { nft_id, @@ -1050,19 +1027,29 @@ ) -> Result { let key = rmrk_key.to_key::()?; + let value = Self::encode_property(value)?; + + let property = Property { key, value }; + + Ok(property) + } + + pub fn encode_property>( + value: &E, + ) -> Result, DispatchError> { let value = value .encode() .try_into() .map_err(|_| >::RmrkPropertyValueIsTooLong)?; - let property = Property { key, value }; - - Ok(property) + Ok(value) } - pub fn decode_property(vec: PropertyValue) -> Result { + pub fn decode_property>( + vec: &BoundedBytes, + ) -> Result { vec.decode() - .map_err(|_| >::RmrkPropertyValueIsTooLong.into()) + .map_err(|_| >::UnableToDecodeRmrkData.into()) } pub fn rebind(vec: &BoundedVec) -> Result, DispatchError> @@ -1124,7 +1111,9 @@ sender: T::CrossAccountId, collection_id: CollectionId, token_id: TokenId, - ) -> DispatchResult { + max_burns: u32, + error_if_not_owned: Error, + ) -> DispatchResultWithPostInfo { let collection = Self::get_typed_nft_collection(collection_id, misc::CollectionType::Regular)?; @@ -1133,16 +1122,57 @@ let from = token_data.owner; - let budget = budget::Value::new(NESTING_BUDGET); + let owner_check_budget = budget::Value::new(NESTING_BUDGET); - >::burn_from(&collection, &sender, &from, token_id, &budget) + ensure!( + >::check_indirectly_owned( + sender.clone(), + collection_id, + token_id, + None, + &owner_check_budget + )?, + error_if_not_owned, + ); + + let burns_budget = budget::Value::new(max_burns); + let breadth_budget = budget::Value::new(max_burns); + + >::burn_recursively( + &collection, + &from, + token_id, + &burns_budget, + &breadth_budget, + ) } + fn acquire_next_resource_id( + collection_id: CollectionId, + nft_id: TokenId, + ) -> Result { + let resource_id: RmrkResourceId = + Self::get_nft_property_decoded(collection_id, nft_id, NextResourceId)?; + + let next_id = resource_id + .checked_add(1) + .ok_or(>::NoAvailableResourceId)?; + + >::set_scoped_token_property( + collection_id, + nft_id, + PropertyScope::Rmrk, + Self::rmrk_property(NextResourceId, &next_id)?, + )?; + + Ok(resource_id) + } + fn resource_add( sender: T::AccountId, collection_id: CollectionId, - token_id: TokenId, - resource_properties: impl Iterator, + nft_id: TokenId, + resource: RmrkResourceTypes, ) -> Result { let collection = Self::get_typed_nft_collection(collection_id, misc::CollectionType::Regular)?; @@ -1151,77 +1181,108 @@ let sender = T::CrossAccountId::from_sub(sender); let budget = budget::Value::new(NESTING_BUDGET); - let nft_owner = >::find_topmost_owner(collection_id, token_id, &budget) + let nft_owner = >::find_topmost_owner(collection_id, nft_id, &budget) .map_err(Self::map_unique_err_to_proxy)?; let pending = sender != nft_owner; - let resource_collection_id: CollectionId = - Self::get_nft_property_decoded(collection_id, token_id, ResourceCollection)?; - let resource_collection = - Self::get_typed_nft_collection(resource_collection_id, misc::CollectionType::Resource)?; + let id = Self::acquire_next_resource_id(collection_id, nft_id)?; - // todo probably add extra connections to bases, slots, etc., when RMRK starts to use them + let resource_info = RmrkResourceInfo { + id, + resource, + pending, + pending_removal: false, + }; - let resource_id = Self::create_nft( - &sender, - &nft_owner, - &resource_collection, - resource_properties.chain( - [ - Self::rmrk_property(PendingResourceAccept, &pending)?, - Self::rmrk_property(PendingResourceRemoval, &false)?, - ] - .into_iter(), - ), - ) - .map_err(|err| match err { - DispatchError::Arithmetic(_) => >::NoAvailableNftId.into(), - err => Self::map_unique_err_to_proxy(err), - })?; + >::try_mutate_token_aux_property( + collection_id, + nft_id, + PropertyScope::Rmrk, + Self::rmrk_property_key(ResourceId(id))?, + |value| -> DispatchResult { + *value = Some(Self::encode_property(&resource_info)?); - Ok(resource_id.0) + Ok(()) + }, + )?; + + Ok(id) } fn resource_remove( sender: T::AccountId, collection_id: CollectionId, nft_id: TokenId, - resource_id: TokenId, + resource_id: RmrkResourceId, ) -> DispatchResult { let collection = Self::get_typed_nft_collection(collection_id, misc::CollectionType::Regular)?; ensure!(collection.owner == sender, Error::::NoPermission); - let resource_collection_id: CollectionId = - Self::get_nft_property_decoded(collection_id, nft_id, ResourceCollection)?; - let resource_collection = - Self::get_typed_nft_collection(resource_collection_id, misc::CollectionType::Resource)?; + let resource_id_key = Self::rmrk_property_key(ResourceId(resource_id))?; + let scope = PropertyScope::Rmrk; + ensure!( - >::token_exists(&resource_collection, resource_id), - Error::::ResourceDoesntExist + >::token_aux_property(( + collection_id, + nft_id, + scope, + resource_id_key.clone() + )) + .is_some(), + >::ResourceDoesntExist ); - let budget = up_data_structs::budget::Value::new(10); + let budget = up_data_structs::budget::Value::new(NESTING_BUDGET); let topmost_owner = >::find_topmost_owner(collection_id, nft_id, &budget)?; let sender = T::CrossAccountId::from_sub(sender); if topmost_owner == sender { - >::burn(&resource_collection, &sender, resource_id) - .map_err(Self::map_unique_err_to_proxy)?; + >::remove_token_aux_property( + collection_id, + nft_id, + PropertyScope::Rmrk, + Self::rmrk_property_key(ResourceId(resource_id))?, + ); } else { - >::set_scoped_token_property( - resource_collection_id, - resource_id, - PropertyScope::Rmrk, - Self::rmrk_property(PendingResourceRemoval, &true)?, - )?; + Self::try_mutate_resource_info(collection_id, nft_id, resource_id, |res| { + res.pending_removal = true; + + Ok(()) + })?; } Ok(()) } + fn try_mutate_resource_info( + collection_id: CollectionId, + nft_id: TokenId, + resource_id: RmrkResourceId, + f: impl FnOnce(&mut RmrkResourceInfo) -> DispatchResult, + ) -> DispatchResult { + >::try_mutate_token_aux_property( + collection_id, + nft_id, + PropertyScope::Rmrk, + Self::rmrk_property_key(ResourceId(resource_id))?, + |value| match value { + Some(value) => { + let mut resource_info: RmrkResourceInfo = Self::decode_property(value)?; + + f(&mut resource_info)?; + + *value = Self::encode_property(&resource_info)?; + + Ok(()) + } + None => Err(>::ResourceDoesntExist.into()), + }, + ) + } + fn change_collection_owner( collection_id: CollectionId, collection_type: misc::CollectionType, @@ -1237,7 +1298,7 @@ collection.save() } - fn check_collection_owner( + pub fn check_collection_owner( collection: &NonfungibleHandle, account: &T::CrossAccountId, ) -> DispatchResult { @@ -1260,8 +1321,7 @@ pub fn rmrk_collection_id( unique_collection_id: CollectionId, ) -> Result { - >::try_get(unique_collection_id) - .map_err(|_| >::CollectionUnknown.into()) + Self::get_collection_property_decoded(unique_collection_id, RmrkInternalCollectionId) } pub fn get_nft_collection( @@ -1296,14 +1356,19 @@ collection_id: CollectionId, key: RmrkProperty, ) -> Result { - Self::decode_property(Self::get_collection_property(collection_id, key)?) + Self::decode_property(&Self::get_collection_property(collection_id, key)?) } pub fn get_collection_type( collection_id: CollectionId, ) -> Result { - Self::get_collection_property_decoded(collection_id, CollectionType) - .map_err(|_| >::CorruptedCollectionType.into()) + Self::get_collection_property_decoded(collection_id, CollectionType).map_err(|err| { + if err != >::CollectionUnknown.into() { + >::CorruptedCollectionType.into() + } else { + err + } + }) } pub fn ensure_collection_type( @@ -1349,7 +1414,7 @@ ) -> Result { let nft_property = >::token_properties((collection_id, nft_id)) .get(&Self::rmrk_property_key(key)?) - .ok_or(>::NoAvailableNftId)? // todo replace with better error? + .ok_or(>::RmrkPropertyIsNotFound)? .clone(); Ok(nft_property) @@ -1360,7 +1425,7 @@ nft_id: TokenId, key: RmrkProperty, ) -> Result { - Self::decode_property(Self::get_nft_property(collection_id, nft_id, key)?) + Self::decode_property(&Self::get_nft_property(collection_id, nft_id, key)?) } pub fn nft_exists(collection_id: CollectionId, nft_id: TokenId) -> bool { --- a/pallets/proxy-rmrk-core/src/misc.rs +++ b/pallets/proxy-rmrk-core/src/misc.rs @@ -61,22 +61,13 @@ #[derive(Encode, Decode, PartialEq, Eq)] pub enum CollectionType { Regular, - Resource, Base, } #[derive(Encode, Decode, PartialEq, Eq)] pub enum NftType { Regular, - Resource, FixedPart, SlotPart, Theme, -} - -#[derive(Encode, Decode, PartialEq, Eq)] -pub enum ResourceType { - Basic, - Composable, - Slot, } --- a/pallets/proxy-rmrk-core/src/property.rs +++ b/pallets/proxy-rmrk-core/src/property.rs @@ -17,25 +17,23 @@ use super::*; use core::convert::AsRef; +const RESOURCE_ID_PREFIX: &str = "rsid-"; + pub enum RmrkProperty<'r> { Metadata, CollectionType, + RmrkInternalCollectionId, TokenType, Transferable, RoyaltyInfo, Equipped, - ResourceCollection, ResourcePriorities, - ResourceType, + NextResourceId, + ResourceId(RmrkResourceId), PendingNftAccept, - PendingResourceAccept, - PendingResourceRemoval, Parts, Base, Src, - Slot, - License, - Thumb, EquippedNft, BaseType, ExternalPartId, @@ -66,22 +64,18 @@ match self { Self::Metadata => key!("metadata"), Self::CollectionType => key!("collection-type"), + Self::RmrkInternalCollectionId => key!("internal-id"), Self::TokenType => key!("token-type"), Self::Transferable => key!("transferable"), Self::RoyaltyInfo => key!("royalty-info"), Self::Equipped => key!("equipped"), - Self::ResourceCollection => key!("resource-collection"), Self::ResourcePriorities => key!("resource-priorities"), - Self::ResourceType => key!("resource-type"), + Self::NextResourceId => key!("next-resource-id"), + Self::ResourceId(id) => key!(RESOURCE_ID_PREFIX, id.to_le_bytes()), Self::PendingNftAccept => key!("pending-nft-accept"), - Self::PendingResourceAccept => key!("pending-resource-accept"), - Self::PendingResourceRemoval => key!("pending-resource-removal"), Self::Parts => key!("parts"), Self::Base => key!("base"), Self::Src => key!("src"), - Self::Slot => key!("slot"), - Self::License => key!("license"), - Self::Thumb => key!("thumb"), Self::EquippedNft => key!("equipped-nft"), Self::BaseType => key!("base-type"), Self::ExternalPartId => key!("ext-part-id"), --- /dev/null +++ b/pallets/proxy-rmrk-core/src/rpc.rs @@ -0,0 +1,265 @@ +use super::*; + +pub fn last_collection_idx() -> Result { + Ok(>::last_collection_idx()) +} + +pub fn collection_by_id( + collection_id: RmrkCollectionId, +) -> Result>, DispatchError> { + let (collection, collection_id) = match >::get_typed_nft_collection_mapped( + collection_id, + misc::CollectionType::Regular, + ) { + Ok(c) => c, + Err(_) => return Ok(None), + }; + + let nfts_count = collection.total_supply(); + + Ok(Some(RmrkCollectionInfo { + issuer: collection.owner.clone(), + metadata: >::get_collection_property_decoded( + collection_id, + RmrkProperty::Metadata, + )?, + max: collection.limits.token_limit, + symbol: >::rebind(&collection.token_prefix)?, + nfts_count, + })) +} + +pub fn nft_by_id( + collection_id: RmrkCollectionId, + nft_by_id: RmrkNftId, +) -> Result>, DispatchError> { + let (collection, collection_id) = match >::get_typed_nft_collection_mapped( + collection_id, + misc::CollectionType::Regular, + ) { + Ok(c) => c, + Err(_) => return Ok(None), + }; + + let nft_id = TokenId(nft_by_id); + if !>::nft_exists(collection_id, nft_id) { + return Ok(None); + } + + let owner = match collection.token_owner(nft_id) { + Some(owner) => match T::CrossTokenAddressMapping::address_to_token(&owner) { + Some((col, tok)) => { + let rmrk_collection = >::rmrk_collection_id(col)?; + + RmrkAccountIdOrCollectionNftTuple::CollectionAndNftTuple(rmrk_collection, tok.0) + } + None => RmrkAccountIdOrCollectionNftTuple::AccountId(owner.as_sub().clone()), + }, + None => return Ok(None), + }; + + Ok(Some(RmrkInstanceInfo { + owner: owner, + royalty: >::get_nft_property_decoded( + collection_id, + nft_id, + RmrkProperty::RoyaltyInfo, + )?, + metadata: >::get_nft_property_decoded( + collection_id, + nft_id, + RmrkProperty::Metadata, + )?, + equipped: >::get_nft_property_decoded( + collection_id, + nft_id, + RmrkProperty::Equipped, + )?, + pending: >::get_nft_property_decoded( + collection_id, + nft_id, + RmrkProperty::PendingNftAccept, + )?, + })) +} + +pub fn account_tokens( + account_id: T::AccountId, + collection_id: RmrkCollectionId, +) -> Result, DispatchError> { + let cross_account_id = CrossAccountId::from_sub(account_id); + + let (collection, collection_id) = match >::get_typed_nft_collection_mapped( + collection_id, + misc::CollectionType::Regular, + ) { + Ok(c) => c, + Err(_) => return Ok(Vec::new()), + }; + + let tokens = collection + .account_tokens(cross_account_id) + .into_iter() + .filter(|token| { + let is_pending = >::get_nft_property_decoded( + collection_id, + *token, + RmrkProperty::PendingNftAccept, + ) + .unwrap_or(true); + + !is_pending + }) + .map(|token| token.0) + .collect(); + + Ok(tokens) +} + +pub fn nft_children( + collection_id: RmrkCollectionId, + nft_id: RmrkNftId, +) -> Result, DispatchError> { + let collection_id = match >::unique_collection_id(collection_id) { + Ok(id) => id, + Err(_) => return Ok(Vec::new()), + }; + let nft_id = TokenId(nft_id); + if !>::nft_exists(collection_id, nft_id) { + return Ok(Vec::new()); + } + + Ok( + pallet_nonfungible::TokenChildren::::iter_prefix((collection_id, nft_id)) + .filter_map(|((child_collection, child_token), _)| { + let is_pending = >::get_nft_property_decoded( + child_collection, + child_token, + RmrkProperty::PendingNftAccept, + ) + .ok()?; + + if is_pending { + return None; + } + + let rmrk_child_collection = + >::rmrk_collection_id(child_collection).ok()?; + + Some(RmrkNftChild { + collection_id: rmrk_child_collection, + nft_id: child_token.0, + }) + }) + .collect(), + ) +} + +pub fn collection_properties( + collection_id: RmrkCollectionId, + filter_keys: Option>, +) -> Result, DispatchError> { + let collection_id = match >::unique_collection_id(collection_id) { + Ok(id) => id, + Err(_) => return Ok(Vec::new()), + }; + if >::ensure_collection_type(collection_id, misc::CollectionType::Regular).is_err() { + return Ok(Vec::new()); + } + + let properties = >::filter_user_properties( + collection_id, + /* token_id = */ None, + filter_keys, + |key, value| RmrkPropertyInfo { key, value }, + )?; + + Ok(properties) +} + +pub fn nft_properties( + collection_id: RmrkCollectionId, + nft_id: RmrkNftId, + filter_keys: Option>, +) -> Result, DispatchError> { + let collection_id = match >::unique_collection_id(collection_id) { + Ok(id) => id, + Err(_) => return Ok(Vec::new()), + }; + let token_id = TokenId(nft_id); + + if >::ensure_nft_type(collection_id, token_id, NftType::Regular).is_err() { + return Ok(Vec::new()); + } + + let properties = >::filter_user_properties( + collection_id, + Some(token_id), + filter_keys, + |key, value| RmrkPropertyInfo { key, value }, + )?; + + Ok(properties) +} + +pub fn nft_resources( + collection_id: RmrkCollectionId, + nft_id: RmrkNftId, +) -> Result, DispatchError> { + let collection_id = match >::unique_collection_id(collection_id) { + Ok(id) => id, + Err(_) => return Ok(Vec::new()), + }; + if >::ensure_collection_type(collection_id, misc::CollectionType::Regular).is_err() { + return Ok(Vec::new()); + } + + let nft_id = TokenId(nft_id); + if >::ensure_nft_type(collection_id, nft_id, NftType::Regular).is_err() { + return Ok(Vec::new()); + } + + let resources = >::iterate_token_aux_properties( + collection_id, + nft_id, + PropertyScope::Rmrk, + ) + .filter_map(|(_, value)| { + let resource_info: RmrkResourceInfo = >::decode_property(&value).ok()?; + + Some(resource_info) + }) + .collect(); + + Ok(resources) +} + +pub fn nft_resource_priority( + collection_id: RmrkCollectionId, + nft_id: RmrkNftId, + resource_id: RmrkResourceId, +) -> Result, DispatchError> { + let collection_id = match >::unique_collection_id(collection_id) { + Ok(id) => id, + Err(_) => return Ok(None), + }; + if >::ensure_collection_type(collection_id, misc::CollectionType::Regular).is_err() { + return Ok(None); + } + + let nft_id = TokenId(nft_id); + if >::ensure_nft_type(collection_id, nft_id, NftType::Regular).is_err() { + return Ok(None); + } + + let priorities: Vec<_> = >::get_nft_property_decoded( + collection_id, + nft_id, + RmrkProperty::ResourcePriorities, + )?; + Ok(priorities + .into_iter() + .enumerate() + .find(|(_, id)| *id == resource_id) + .map(|(priority, _): (usize, RmrkResourceId)| priority as u32)) +} --- a/pallets/proxy-rmrk-core/src/weights.rs +++ b/pallets/proxy-rmrk-core/src/weights.rs @@ -3,7 +3,7 @@ //! Autogenerated weights for pallet_proxy_rmrk_core //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-06-09, STEPS: `50`, REPEAT: 200, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2022-06-17, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: @@ -19,7 +19,7 @@ // --template // .maintain/frame-weight-template.hbs // --steps=50 -// --repeat=200 +// --repeat=80 // --heap-pages=4096 // --output=./pallets/proxy-rmrk-core/src/weights.rs @@ -34,6 +34,22 @@ /// Weight functions needed for pallet_proxy_rmrk_core. pub trait WeightInfo { fn create_collection() -> Weight; + fn destroy_collection() -> Weight; + fn change_collection_issuer() -> Weight; + fn lock_collection() -> Weight; + fn mint_nft(b: u32, ) -> Weight; + fn burn_nft(b: u32, ) -> Weight; + fn send() -> Weight; + fn accept_nft() -> Weight; + fn reject_nft() -> Weight; + fn set_property() -> Weight; + fn set_priority() -> Weight; + fn add_basic_resource() -> Weight; + fn add_composable_resource() -> Weight; + fn add_slot_resource() -> Weight; + fn remove_resource() -> Weight; + fn accept_resource() -> Weight; + fn accept_resource_removal() -> Weight; } /// Weights for pallet_proxy_rmrk_core using the Substrate node and recommended hardware. @@ -47,11 +63,204 @@ // Storage: Common CollectionProperties (r:0 w:1) // Storage: Common CollectionById (r:0 w:1) // Storage: RmrkCore UniqueCollectionId (r:0 w:1) - // Storage: RmrkCore RmrkInernalCollectionId (r:0 w:1) fn create_collection() -> Weight { - (76_647_000 as Weight) + (42_359_000 as Weight) .saturating_add(T::DbWeight::get().reads(5 as Weight)) - .saturating_add(T::DbWeight::get().writes(9 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:1) + // Storage: Common CollectionById (r:1 w:1) + // Storage: Nonfungible TokenData (r:1 w:0) + // Storage: Common DestroyedCollectionCount (r:1 w:1) + // Storage: Nonfungible TokensMinted (r:0 w:1) + // Storage: Nonfungible TokensBurnt (r:0 w:1) + // Storage: Common AdminAmount (r:0 w:1) + fn destroy_collection() -> Weight { + (45_375_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionById (r:1 w:1) + // Storage: Common CollectionProperties (r:1 w:0) + fn change_collection_issuer() -> Weight { + (22_753_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:1) + // Storage: Nonfungible TokensMinted (r:1 w:0) + // Storage: Nonfungible TokensBurnt (r:1 w:0) + fn lock_collection() -> Weight { + (24_356_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokensMinted (r:1 w:1) + // Storage: Nonfungible AccountBalance (r:1 w:1) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenData (r:0 w:1) + // Storage: Nonfungible Owned (r:0 w:1) + // Storage: Nonfungible TokenAuxProperties (r:2 w:2) + fn mint_nft(b: u32, ) -> Weight { + (44_853_000 as Weight) + // Standard Error: 2_000 + .saturating_add((10_721_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(b as Weight))) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(b as Weight))) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:1 w:1) + // Storage: Nonfungible TokenChildren (r:1 w:0) + // Storage: Nonfungible TokensBurnt (r:1 w:1) + // Storage: Nonfungible AccountBalance (r:1 w:1) + // Storage: Nonfungible Allowance (r:1 w:0) + // Storage: Nonfungible Owned (r:0 w:1) + // Storage: Nonfungible TokenProperties (r:0 w:1) + fn burn_nft(b: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 1_590_000 + .saturating_add((319_825_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().reads(9 as Weight)) + .saturating_add(T::DbWeight::get().reads((4 as Weight).saturating_mul(b as Weight))) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + .saturating_add(T::DbWeight::get().writes((4 as Weight).saturating_mul(b as Weight))) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:5 w:1) + // Storage: Nonfungible TokenProperties (r:1 w:0) + // Storage: Nonfungible AccountBalance (r:2 w:2) + // Storage: Nonfungible Allowance (r:1 w:0) + // Storage: Nonfungible TokenChildren (r:0 w:1) + // Storage: Nonfungible Owned (r:0 w:2) + fn send() -> Weight { + (72_576_000 as Weight) + .saturating_add(T::DbWeight::get().reads(12 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:2 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:2 w:0) + // Storage: Nonfungible TokenData (r:6 w:1) + // Storage: Nonfungible AccountBalance (r:2 w:2) + // Storage: Nonfungible Allowance (r:1 w:0) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenChildren (r:0 w:1) + // Storage: Nonfungible Owned (r:0 w:2) + fn accept_nft() -> Weight { + (79_670_000 as Weight) + .saturating_add(T::DbWeight::get().reads(15 as Weight)) + .saturating_add(T::DbWeight::get().writes(7 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:5 w:5) + // Storage: Nonfungible TokenProperties (r:1 w:5) + // Storage: Nonfungible TokenChildren (r:9 w:4) + // Storage: Nonfungible TokensBurnt (r:1 w:1) + // Storage: Nonfungible AccountBalance (r:5 w:5) + // Storage: Nonfungible Allowance (r:5 w:0) + // Storage: Nonfungible Owned (r:0 w:5) + fn reject_nft() -> Weight { + (254_989_000 as Weight) + .saturating_add(T::DbWeight::get().reads(29 as Weight)) + .saturating_add(T::DbWeight::get().writes(25 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenData (r:5 w:0) + fn set_property() -> Weight { + (48_651_000 as Weight) + .saturating_add(T::DbWeight::get().reads(9 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenData (r:5 w:0) + fn set_priority() -> Weight { + (47_579_000 as Weight) + .saturating_add(T::DbWeight::get().reads(9 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:5 w:0) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenAuxProperties (r:1 w:1) + fn add_basic_resource() -> Weight { + (55_013_000 as Weight) + .saturating_add(T::DbWeight::get().reads(10 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:5 w:0) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenAuxProperties (r:1 w:1) + fn add_composable_resource() -> Weight { + (55_184_000 as Weight) + .saturating_add(T::DbWeight::get().reads(10 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:5 w:0) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenAuxProperties (r:1 w:1) + fn add_slot_resource() -> Weight { + (54_792_000 as Weight) + .saturating_add(T::DbWeight::get().reads(10 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenAuxProperties (r:1 w:1) + // Storage: Nonfungible TokenData (r:5 w:0) + fn remove_resource() -> Weight { + (46_447_000 as Weight) + .saturating_add(T::DbWeight::get().reads(9 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:5 w:0) + // Storage: Nonfungible TokenAuxProperties (r:1 w:1) + fn accept_resource() -> Weight { + (45_096_000 as Weight) + .saturating_add(T::DbWeight::get().reads(9 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:5 w:0) + // Storage: Nonfungible TokenAuxProperties (r:1 w:1) + fn accept_resource_removal() -> Weight { + (45_445_000 as Weight) + .saturating_add(T::DbWeight::get().reads(9 as Weight)) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) } } @@ -65,10 +274,203 @@ // Storage: Common CollectionProperties (r:0 w:1) // Storage: Common CollectionById (r:0 w:1) // Storage: RmrkCore UniqueCollectionId (r:0 w:1) - // Storage: RmrkCore RmrkInernalCollectionId (r:0 w:1) fn create_collection() -> Weight { - (76_647_000 as Weight) + (42_359_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(5 as Weight)) + .saturating_add(RocksDbWeight::get().writes(8 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:1) + // Storage: Common CollectionById (r:1 w:1) + // Storage: Nonfungible TokenData (r:1 w:0) + // Storage: Common DestroyedCollectionCount (r:1 w:1) + // Storage: Nonfungible TokensMinted (r:0 w:1) + // Storage: Nonfungible TokensBurnt (r:0 w:1) + // Storage: Common AdminAmount (r:0 w:1) + fn destroy_collection() -> Weight { + (45_375_000 as Weight) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) - .saturating_add(RocksDbWeight::get().writes(9 as Weight)) + .saturating_add(RocksDbWeight::get().writes(6 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionById (r:1 w:1) + // Storage: Common CollectionProperties (r:1 w:0) + fn change_collection_issuer() -> Weight { + (22_753_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(3 as Weight)) + .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:1) + // Storage: Nonfungible TokensMinted (r:1 w:0) + // Storage: Nonfungible TokensBurnt (r:1 w:0) + fn lock_collection() -> Weight { + (24_356_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(5 as Weight)) + .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokensMinted (r:1 w:1) + // Storage: Nonfungible AccountBalance (r:1 w:1) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenData (r:0 w:1) + // Storage: Nonfungible Owned (r:0 w:1) + // Storage: Nonfungible TokenAuxProperties (r:2 w:2) + fn mint_nft(b: u32, ) -> Weight { + (44_853_000 as Weight) + // Standard Error: 2_000 + .saturating_add((10_721_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(RocksDbWeight::get().reads(6 as Weight)) + .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(b as Weight))) + .saturating_add(RocksDbWeight::get().writes(5 as Weight)) + .saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(b as Weight))) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:1 w:1) + // Storage: Nonfungible TokenChildren (r:1 w:0) + // Storage: Nonfungible TokensBurnt (r:1 w:1) + // Storage: Nonfungible AccountBalance (r:1 w:1) + // Storage: Nonfungible Allowance (r:1 w:0) + // Storage: Nonfungible Owned (r:0 w:1) + // Storage: Nonfungible TokenProperties (r:0 w:1) + fn burn_nft(b: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 1_590_000 + .saturating_add((319_825_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(RocksDbWeight::get().reads(9 as Weight)) + .saturating_add(RocksDbWeight::get().reads((4 as Weight).saturating_mul(b as Weight))) + .saturating_add(RocksDbWeight::get().writes(6 as Weight)) + .saturating_add(RocksDbWeight::get().writes((4 as Weight).saturating_mul(b as Weight))) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:5 w:1) + // Storage: Nonfungible TokenProperties (r:1 w:0) + // Storage: Nonfungible AccountBalance (r:2 w:2) + // Storage: Nonfungible Allowance (r:1 w:0) + // Storage: Nonfungible TokenChildren (r:0 w:1) + // Storage: Nonfungible Owned (r:0 w:2) + fn send() -> Weight { + (72_576_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(12 as Weight)) + .saturating_add(RocksDbWeight::get().writes(6 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:2 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:2 w:0) + // Storage: Nonfungible TokenData (r:6 w:1) + // Storage: Nonfungible AccountBalance (r:2 w:2) + // Storage: Nonfungible Allowance (r:1 w:0) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenChildren (r:0 w:1) + // Storage: Nonfungible Owned (r:0 w:2) + fn accept_nft() -> Weight { + (79_670_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(15 as Weight)) + .saturating_add(RocksDbWeight::get().writes(7 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:5 w:5) + // Storage: Nonfungible TokenProperties (r:1 w:5) + // Storage: Nonfungible TokenChildren (r:9 w:4) + // Storage: Nonfungible TokensBurnt (r:1 w:1) + // Storage: Nonfungible AccountBalance (r:5 w:5) + // Storage: Nonfungible Allowance (r:5 w:0) + // Storage: Nonfungible Owned (r:0 w:5) + fn reject_nft() -> Weight { + (254_989_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(29 as Weight)) + .saturating_add(RocksDbWeight::get().writes(25 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenData (r:5 w:0) + fn set_property() -> Weight { + (48_651_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(9 as Weight)) + .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenData (r:5 w:0) + fn set_priority() -> Weight { + (47_579_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(9 as Weight)) + .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:5 w:0) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenAuxProperties (r:1 w:1) + fn add_basic_resource() -> Weight { + (55_013_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(10 as Weight)) + .saturating_add(RocksDbWeight::get().writes(2 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:5 w:0) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenAuxProperties (r:1 w:1) + fn add_composable_resource() -> Weight { + (55_184_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(10 as Weight)) + .saturating_add(RocksDbWeight::get().writes(2 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:5 w:0) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenAuxProperties (r:1 w:1) + fn add_slot_resource() -> Weight { + (54_792_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(10 as Weight)) + .saturating_add(RocksDbWeight::get().writes(2 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenAuxProperties (r:1 w:1) + // Storage: Nonfungible TokenData (r:5 w:0) + fn remove_resource() -> Weight { + (46_447_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(9 as Weight)) + .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:5 w:0) + // Storage: Nonfungible TokenAuxProperties (r:1 w:1) + fn accept_resource() -> Weight { + (45_096_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(9 as Weight)) + .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + } + // Storage: RmrkCore UniqueCollectionId (r:1 w:0) + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: Nonfungible TokenData (r:5 w:0) + // Storage: Nonfungible TokenAuxProperties (r:1 w:1) + fn accept_resource_removal() -> Weight { + (45_445_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(9 as Weight)) + .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } } --- /dev/null +++ b/pallets/proxy-rmrk-equip/src/benchmarking.rs @@ -0,0 +1,120 @@ +use sp_std::vec; + +use frame_benchmarking::{benchmarks, account}; +use frame_system::RawOrigin; +use frame_support::{ + traits::{Currency, Get}, + BoundedVec, +}; + +use up_data_structs::*; + +use super::*; + +const SEED: u32 = 1; + +fn create_data>() -> BoundedVec { + vec![b'A'; S::get() as usize].try_into().expect("size == S") +} + +fn create_u32_array>() -> BoundedVec { + vec![0; S::get() as usize].try_into().expect("size == S") +} + +fn create_max_part(id: RmrkSlotId) -> RmrkPartType { + RmrkPartType::SlotPart(RmrkSlotPart { + id, + equippable: RmrkEquippableList::Custom(create_u32_array()), + src: create_data(), + z: 1, + }) +} + +fn create_parts_array>(num: u32) -> BoundedVec { + let mut parts: BoundedVec = vec![].try_into().expect("0 <= S"); + + for i in 0..num { + parts.try_push(create_max_part(i)).expect("num <= S"); + } + + parts +} + +fn create_max_theme_property() -> RmrkThemeProperty { + RmrkThemeProperty { + key: create_data(), + value: create_data(), + } +} + +fn create_theme_properties_array>(num: u32) -> BoundedVec { + vec![create_max_theme_property(); num as usize] + .try_into() + .expect("num <= S") +} + +fn create_max_theme(name: RmrkString, props_num: u32) -> RmrkBoundedTheme { + RmrkBoundedTheme { + name, + properties: create_theme_properties_array(props_num), + inherit: false, + } +} + +benchmarks! { + create_base { + let b in 0..RmrkPartsLimit::get(); + + let caller = account("caller", 0, SEED); + ::Currency::deposit_creating(&caller, T::CollectionCreationPrice::get()); + + let base_type = create_data(); + let symbol = create_data(); + let parts = create_parts_array(b); + }: _(RawOrigin::Signed(caller), base_type, symbol, parts) + + theme_add { + let b in 0..MaxPropertiesPerTheme::get(); + + let caller = account("caller", 0, SEED); + ::Currency::deposit_creating(&caller, T::CollectionCreationPrice::get()); + + let base_type = create_data(); + let symbol = create_data(); + let parts = create_parts_array(0); + + >::create_base(RawOrigin::Signed(caller.clone()).into(), base_type, symbol, parts)?; + let base_id = 1; + + + let default_theme_name = b"default".to_vec().try_into().expect("default is a valid name; qed"); + let default_theme = create_max_theme(default_theme_name, 0); + + >::theme_add(RawOrigin::Signed(caller.clone()).into(), base_id, default_theme)?; + + let theme = create_max_theme(create_data(), b); + }: _(RawOrigin::Signed(caller), base_id, theme) + + equippable { + let caller = account("caller", 0, SEED); + ::Currency::deposit_creating(&caller, T::CollectionCreationPrice::get()); + + let base_id = 1; + let slot_id = 42; + + let base_type = create_data(); + let symbol = create_data(); + let parts = vec! { + RmrkPartType::SlotPart(RmrkSlotPart { + id: slot_id, + equippable: RmrkEquippableList::All, + src: create_data(), + z: 1, + }) + }.try_into().expect("1 <= RmrkPartsLimit"); + + >::create_base(RawOrigin::Signed(caller.clone()).into(), base_type, symbol, parts)?; + + let equippables = RmrkEquippableList::Custom(create_u32_array()); + }: _(RawOrigin::Signed(caller), base_id, slot_id, equippables) +} --- a/pallets/proxy-rmrk-equip/src/lib.rs +++ b/pallets/proxy-rmrk-equip/src/lib.rs @@ -22,15 +22,23 @@ use up_data_structs::*; use pallet_common::{Pallet as PalletCommon, Error as CommonError}; use pallet_rmrk_core::{ - Pallet as PalletCore, + Pallet as PalletCore, Error as CoreError, misc::{self, *}, property::RmrkProperty::*, }; use pallet_nonfungible::{Pallet as PalletNft, NonfungibleHandle}; use pallet_evm::account::CrossAccountId; +use weights::WeightInfo; pub use pallet::*; +#[cfg(feature = "runtime-benchmarks")] +pub mod benchmarking; +pub mod rpc; +pub mod weights; + +pub type SelfWeightOf = ::WeightInfo; + #[frame_support::pallet] pub mod pallet { use super::*; @@ -38,6 +46,7 @@ #[pallet::config] pub trait Config: frame_system::Config + pallet_rmrk_core::Config { type Event: From> + IsType<::Event>; + type WeightInfo: WeightInfo; } #[pallet::storage] @@ -61,6 +70,10 @@ issuer: T::AccountId, base_id: RmrkBaseId, }, + EquippablesUpdated { + base_id: RmrkBaseId, + slot_id: RmrkSlotId, + }, } #[pallet::error] @@ -70,6 +83,8 @@ NoAvailablePartId, BaseDoesntExist, NeedsDefaultThemeFirst, + PartDoesntExist, + NoEquippableOnFixedPart, } #[pallet::call] @@ -83,12 +98,12 @@ /// - symbol: arbitrary client-chosen symbol /// - parts: array of Fixed and Slot parts composing the base, confined in length by /// RmrkPartsLimit - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::create_base(parts.len() as u32))] pub fn create_base( origin: OriginFor, base_type: RmrkString, - symbol: RmrkString, + symbol: RmrkBaseSymbol, parts: BoundedVec, ) -> DispatchResult { let sender = ensure_signed(origin)?; @@ -125,17 +140,7 @@ let collection = >::get_nft_collection(collection_id)?; for part in parts { - let part_id = part.id(); - let part_token_id = Self::create_part(&cross_sender, &collection, part)?; - - >::insert(collection_id, part_id, part_token_id); - - >::set_scoped_token_property( - collection_id, - part_token_id, - PropertyScope::Rmrk, - >::rmrk_property(ExternalPartId, &part_id)?, - )?; + Self::create_part(&cross_sender, &collection, part)?; } Self::deposit_event(Event::BaseCreated { @@ -159,12 +164,12 @@ /// - key: arbitrary BoundedString, defined by client /// - value: arbitrary BoundedString, defined by client /// - inherit: optional bool - #[pallet::weight(10_000 + T::DbWeight::get().reads_writes(1,1))] #[transactional] + #[pallet::weight(>::theme_add(theme.properties.len() as u32))] pub fn theme_add( origin: OriginFor, base_id: RmrkBaseId, - theme: RmrkTheme, + theme: RmrkBoundedTheme, ) -> DispatchResult { let sender = ensure_signed(origin)?; @@ -173,12 +178,7 @@ let collection_id: CollectionId = base_id.into(); - let collection = >::get_typed_nft_collection( - collection_id, - misc::CollectionType::Base, - ) - .map_err(|_| >::BaseDoesntExist)?; - collection.check_is_external()?; + let collection = Self::get_base(collection_id)?; if theme.name.as_slice() == b"default" { >::insert(collection_id, true); @@ -213,6 +213,55 @@ Ok(()) } + + #[transactional] + #[pallet::weight(>::equippable())] + pub fn equippable( + origin: OriginFor, + base_id: RmrkBaseId, + slot_id: RmrkSlotId, + equippables: RmrkEquippableList, + ) -> DispatchResult { + let sender = ensure_signed(origin)?; + + let base_collection_id = base_id.into(); + let collection = Self::get_base(base_collection_id)?; + + >::check_collection_owner( + &collection, + &T::CrossAccountId::from_sub(sender), + ) + .map_err(|err| { + if err == >::NoPermission.into() { + >::PermissionError.into() + } else { + err + } + })?; + + let part_id = Self::internal_part_id(base_collection_id, slot_id) + .ok_or(>::PartDoesntExist)?; + + let nft_type = >::get_nft_type(base_collection_id, part_id) + .map_err(|_| >::PartDoesntExist)?; + + match nft_type { + NftType::Regular | NftType::Theme => return Err(>::PermissionError.into()), + NftType::FixedPart => return Err(>::NoEquippableOnFixedPart.into()), + NftType::SlotPart => { + >::set_scoped_token_property( + base_collection_id, + part_id, + PropertyScope::Rmrk, + >::rmrk_property(EquippableList, &equippables)?, + )?; + } + } + + Self::deposit_event(Event::EquippablesUpdated { base_id, slot_id }); + + Ok(()) + } } } @@ -221,9 +270,10 @@ sender: &T::CrossAccountId, collection: &NonfungibleHandle, part: RmrkPartType, - ) -> Result { + ) -> DispatchResult { let owner = sender; + let part_id = part.id(); let src = part.src(); let z_index = part.z_index(); @@ -232,21 +282,40 @@ RmrkPartType::SlotPart(_) => NftType::SlotPart, }; - let token_id = >::create_nft( - sender, - owner, - collection, + let token_id = match Self::internal_part_id(collection.id, part_id) { + Some(token_id) => token_id, + None => { + let token_id = + >::create_nft(sender, owner, collection, [].into_iter()) + .map_err(|err| match err { + DispatchError::Arithmetic(_) => >::NoAvailablePartId.into(), + err => err, + })?; + + >::insert(collection.id, part_id, token_id); + + >::set_scoped_token_property( + collection.id, + token_id, + PropertyScope::Rmrk, + >::rmrk_property(ExternalPartId, &part_id)?, + )?; + + token_id + } + }; + + >::set_scoped_token_properties( + collection.id, + token_id, + PropertyScope::Rmrk, [ >::rmrk_property(TokenType, &nft_type)?, >::rmrk_property(Src, &src)?, >::rmrk_property(ZIndex, &z_index)?, ] .into_iter(), - ) - .map_err(|err| match err { - DispatchError::Arithmetic(_) => >::NoAvailablePartId.into(), - err => err, - })?; + )?; if let RmrkPartType::SlotPart(part) = part { >::set_scoped_token_property( @@ -257,6 +326,21 @@ )?; } - Ok(token_id) + Ok(()) + } + + fn get_base(base_id: CollectionId) -> Result, DispatchError> { + let collection = + >::get_typed_nft_collection(base_id, misc::CollectionType::Base) + .map_err(|err| { + if err == >::CollectionUnknown.into() { + >::BaseDoesntExist.into() + } else { + err + } + })?; + collection.check_is_external()?; + + Ok(collection) } } --- /dev/null +++ b/pallets/proxy-rmrk-equip/src/rpc.rs @@ -0,0 +1,186 @@ +use super::*; +use pallet_rmrk_core::{misc, property::*}; +use sp_std::vec::Vec; + +pub fn base( + base_id: RmrkBaseId, +) -> Result>, DispatchError> { + let (collection, collection_id) = + match >::get_typed_nft_collection_mapped(base_id, misc::CollectionType::Base) + { + Ok(c) => c, + Err(_) => return Ok(None), + }; + + Ok(Some(RmrkBaseInfo { + issuer: collection.owner.clone(), + base_type: >::get_collection_property_decoded( + collection_id, + RmrkProperty::BaseType, + )?, + symbol: >::rebind(&collection.token_prefix)?, + })) +} + +pub fn base_parts(base_id: RmrkBaseId) -> Result, DispatchError> { + use pallet_common::CommonCollectionOperations; + + let (collection, collection_id) = + match >::get_typed_nft_collection_mapped(base_id, misc::CollectionType::Base) + { + Ok(c) => c, + Err(_) => return Ok(Vec::new()), + }; + + let parts = collection + .collection_tokens() + .into_iter() + .filter_map(|token_id| { + let nft_type = >::get_nft_type(collection_id, token_id).ok()?; + + match nft_type { + NftType::FixedPart => Some(RmrkPartType::FixedPart(RmrkFixedPart { + id: >::get_nft_property_decoded( + collection_id, + token_id, + RmrkProperty::ExternalPartId, + ) + .ok()?, + src: >::get_nft_property_decoded( + collection_id, + token_id, + RmrkProperty::Src, + ) + .ok()?, + z: >::get_nft_property_decoded( + collection_id, + token_id, + RmrkProperty::ZIndex, + ) + .ok()?, + })), + NftType::SlotPart => Some(RmrkPartType::SlotPart(RmrkSlotPart { + id: >::get_nft_property_decoded( + collection_id, + token_id, + RmrkProperty::ExternalPartId, + ) + .ok()?, + src: >::get_nft_property_decoded( + collection_id, + token_id, + RmrkProperty::Src, + ) + .ok()?, + z: >::get_nft_property_decoded( + collection_id, + token_id, + RmrkProperty::ZIndex, + ) + .ok()?, + equippable: >::get_nft_property_decoded( + collection_id, + token_id, + RmrkProperty::EquippableList, + ) + .ok()?, + })), + _ => None, + } + }) + .collect(); + + Ok(parts) +} + +pub fn theme_names(base_id: RmrkBaseId) -> Result, DispatchError> { + use pallet_common::CommonCollectionOperations; + + let (collection, collection_id) = + match >::get_typed_nft_collection_mapped(base_id, misc::CollectionType::Base) + { + Ok(c) => c, + Err(_) => return Ok(Vec::new()), + }; + + let theme_names = collection + .collection_tokens() + .iter() + .filter_map(|token_id| { + let nft_type = >::get_nft_type(collection_id, *token_id).ok()?; + + match nft_type { + NftType::Theme => >::get_nft_property_decoded( + collection_id, + *token_id, + RmrkProperty::ThemeName, + ) + .ok(), + _ => None, + } + }) + .collect(); + + Ok(theme_names) +} + +pub fn theme( + base_id: RmrkBaseId, + theme_name: RmrkThemeName, + filter_keys: Option>, +) -> Result, DispatchError> { + use pallet_common::CommonCollectionOperations; + + let (collection, collection_id) = + match >::get_typed_nft_collection_mapped(base_id, misc::CollectionType::Base) + { + Ok(c) => c, + Err(_) => return Ok(None), + }; + + let theme_info = collection + .collection_tokens() + .into_iter() + .find_map(|token_id| { + >::ensure_nft_type(collection_id, token_id, NftType::Theme).ok()?; + + let name: RmrkString = >::get_nft_property_decoded( + collection_id, + token_id, + RmrkProperty::ThemeName, + ) + .ok()?; + + if name == theme_name { + Some((name, token_id)) + } else { + None + } + }); + + let (name, theme_id) = match theme_info { + Some((name, theme_id)) => (name, theme_id), + None => return Ok(None), + }; + + let properties = >::filter_user_properties( + collection_id, + Some(theme_id), + filter_keys, + |key, value| RmrkThemeProperty { key, value }, + )?; + + let inherit = >::get_nft_property_decoded( + collection_id, + theme_id, + RmrkProperty::ThemeInherit, + )?; + + let theme = RmrkTheme { + name, + properties, + inherit, + }; + + Ok(Some(theme)) +} --- /dev/null +++ b/pallets/proxy-rmrk-equip/src/weights.rs @@ -0,0 +1,138 @@ +// Template adopted from https://github.com/paritytech/substrate/blob/master/.maintain/frame-weight-template.hbs + +//! Autogenerated weights for pallet_proxy_rmrk_equip +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2022-06-20, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 + +// Executed Command: +// target/release/unique-collator +// benchmark +// pallet +// --pallet +// pallet-proxy-rmrk-equip +// --wasm-execution +// compiled +// --extrinsic +// * +// --template +// .maintain/frame-weight-template.hbs +// --steps=50 +// --repeat=80 +// --heap-pages=4096 +// --output=./pallets/proxy-rmrk-equip/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_proxy_rmrk_equip. +pub trait WeightInfo { + fn create_base(b: u32, ) -> Weight; + fn theme_add(b: u32, ) -> Weight; + fn equippable() -> Weight; +} + +/// Weights for pallet_proxy_rmrk_equip using the Substrate node and recommended hardware. +pub struct SubstrateWeight(PhantomData); +impl WeightInfo for SubstrateWeight { + // Storage: Common CreatedCollectionCount (r:1 w:1) + // Storage: Common DestroyedCollectionCount (r:1 w:0) + // Storage: System Account (r:2 w:2) + // Storage: Common CollectionPropertyPermissions (r:0 w:1) + // Storage: Common CollectionProperties (r:0 w:1) + // Storage: Common CollectionById (r:0 w:1) + // Storage: RmrkEquip InernalPartId (r:1 w:1) + // Storage: Nonfungible TokensMinted (r:1 w:1) + // Storage: Nonfungible AccountBalance (r:1 w:1) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenData (r:0 w:1) + // Storage: Nonfungible Owned (r:0 w:1) + fn create_base(b: u32, ) -> Weight { + (44_927_000 as Weight) + // Standard Error: 9_000 + .saturating_add((18_896_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(b as Weight))) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) + .saturating_add(T::DbWeight::get().writes((4 as Weight).saturating_mul(b as Weight))) + } + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: RmrkEquip BaseHasDefaultTheme (r:1 w:0) + // Storage: Nonfungible TokensMinted (r:1 w:1) + // Storage: Nonfungible AccountBalance (r:1 w:1) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenData (r:0 w:1) + // Storage: Nonfungible Owned (r:0 w:1) + fn theme_add(b: u32, ) -> Weight { + (39_120_000 as Weight) + // Standard Error: 11_000 + .saturating_add((2_367_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) + } + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: RmrkEquip InernalPartId (r:1 w:0) + // Storage: Nonfungible TokenProperties (r:1 w:1) + fn equippable() -> Weight { + (27_172_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 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 CollectionPropertyPermissions (r:0 w:1) + // Storage: Common CollectionProperties (r:0 w:1) + // Storage: Common CollectionById (r:0 w:1) + // Storage: RmrkEquip InernalPartId (r:1 w:1) + // Storage: Nonfungible TokensMinted (r:1 w:1) + // Storage: Nonfungible AccountBalance (r:1 w:1) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenData (r:0 w:1) + // Storage: Nonfungible Owned (r:0 w:1) + fn create_base(b: u32, ) -> Weight { + (44_927_000 as Weight) + // Standard Error: 9_000 + .saturating_add((18_896_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(RocksDbWeight::get().reads(6 as Weight)) + .saturating_add(RocksDbWeight::get().reads((2 as Weight).saturating_mul(b as Weight))) + .saturating_add(RocksDbWeight::get().writes(8 as Weight)) + .saturating_add(RocksDbWeight::get().writes((4 as Weight).saturating_mul(b as Weight))) + } + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: RmrkEquip BaseHasDefaultTheme (r:1 w:0) + // Storage: Nonfungible TokensMinted (r:1 w:1) + // Storage: Nonfungible AccountBalance (r:1 w:1) + // Storage: Nonfungible TokenProperties (r:1 w:1) + // Storage: Nonfungible TokenData (r:0 w:1) + // Storage: Nonfungible Owned (r:0 w:1) + fn theme_add(b: u32, ) -> Weight { + (39_120_000 as Weight) + // Standard Error: 11_000 + .saturating_add((2_367_000 as Weight).saturating_mul(b as Weight)) + .saturating_add(RocksDbWeight::get().reads(6 as Weight)) + .saturating_add(RocksDbWeight::get().writes(5 as Weight)) + } + // Storage: Common CollectionProperties (r:1 w:0) + // Storage: Common CollectionById (r:1 w:0) + // Storage: RmrkEquip InernalPartId (r:1 w:0) + // Storage: Nonfungible TokenProperties (r:1 w:1) + fn equippable() -> Weight { + (27_172_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(4 as Weight)) + .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + } +} --- a/pallets/refungible/src/common.rs +++ b/pallets/refungible/src/common.rs @@ -77,16 +77,19 @@ 0 } - fn set_token_properties(amount: u32) -> Weight { - >::set_token_properties(amount) + fn set_token_properties(_amount: u32) -> Weight { + // Error + 0 } - fn delete_token_properties(amount: u32) -> Weight { - >::delete_token_properties(amount) + fn delete_token_properties(_amount: u32) -> Weight { + // Error + 0 } - fn set_property_permissions(amount: u32) -> Weight { - >::set_property_permissions(amount) + fn set_token_property_permissions(_amount: u32) -> Weight { + // Error + 0 } fn transfer() -> Weight { @@ -315,7 +318,7 @@ fail!(>::SettingPropertiesNotAllowed) } - fn set_property_permissions( + fn set_token_property_permissions( &self, _sender: &T::CrossAccountId, _property_permissions: Vec, --- a/pallets/refungible/src/weights.rs +++ b/pallets/refungible/src/weights.rs @@ -3,12 +3,13 @@ //! Autogenerated weights for pallet_refungible //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-03-01, STEPS: `50`, REPEAT: 200, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2022-06-15, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: // target/release/unique-collator // benchmark +// pallet // --pallet // pallet-refungible // --wasm-execution @@ -18,7 +19,7 @@ // --template // .maintain/frame-weight-template.hbs // --steps=50 -// --repeat=200 +// --repeat=80 // --heap-pages=4096 // --output=./pallets/refungible/src/weights.rs @@ -38,9 +39,6 @@ fn create_multiple_items_ex_multiple_owners(b: u32, ) -> Weight; fn burn_item_partial() -> Weight; fn burn_item_fully() -> Weight; - fn set_token_properties(amount: u32) -> Weight; - fn delete_token_properties(amount: u32) -> Weight; - fn set_property_permissions(amount: u32) -> Weight; fn transfer_normal() -> Weight; fn transfer_creating() -> Weight; fn transfer_removing() -> Weight; @@ -63,7 +61,7 @@ // Storage: Refungible TokenData (r:0 w:1) // Storage: Refungible Owned (r:0 w:1) fn create_item() -> Weight { - (21_255_000 as Weight) + (21_321_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(6 as Weight)) } @@ -74,9 +72,9 @@ // Storage: Refungible TokenData (r:0 w:4) // Storage: Refungible Owned (r:0 w:4) fn create_multiple_items(b: u32, ) -> Weight { - (18_052_000 as Weight) - // Standard Error: 1_000 - .saturating_add((5_549_000 as Weight).saturating_mul(b as Weight)) + (16_313_000 as Weight) + // Standard Error: 4_000 + .saturating_add((5_464_000 as Weight).saturating_mul(b as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) .saturating_add(T::DbWeight::get().writes((4 as Weight).saturating_mul(b as Weight))) @@ -88,9 +86,9 @@ // Storage: Refungible TokenData (r:0 w:4) // Storage: Refungible Owned (r:0 w:4) fn create_multiple_items_ex_multiple_items(b: u32, ) -> Weight { - (15_766_000 as Weight) - // Standard Error: 2_000 - .saturating_add((8_187_000 as Weight).saturating_mul(b as Weight)) + (15_631_000 as Weight) + // Standard Error: 5_000 + .saturating_add((8_141_000 as Weight).saturating_mul(b as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(b as Weight))) .saturating_add(T::DbWeight::get().writes(1 as Weight)) @@ -103,9 +101,9 @@ // Storage: Refungible Balance (r:0 w:4) // Storage: Refungible Owned (r:0 w:4) fn create_multiple_items_ex_multiple_owners(b: u32, ) -> Weight { - (5_675_000 as Weight) - // Standard Error: 2_000 - .saturating_add((6_315_000 as Weight).saturating_mul(b as Weight)) + (11_191_000 as Weight) + // Standard Error: 4_000 + .saturating_add((6_321_000 as Weight).saturating_mul(b as Weight)) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(b as Weight))) .saturating_add(T::DbWeight::get().writes(3 as Weight)) @@ -116,7 +114,7 @@ // Storage: Refungible AccountBalance (r:1 w:1) // Storage: Refungible Owned (r:0 w:1) fn burn_item_partial() -> Weight { - (23_518_000 as Weight) + (24_421_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } @@ -127,29 +125,13 @@ // Storage: Refungible TokenData (r:0 w:1) // Storage: Refungible Owned (r:0 w:1) fn burn_item_fully() -> Weight { - (32_489_000 as Weight) + (32_900_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(6 as Weight)) } - - fn set_token_properties(_amount: u32) -> Weight { - // Error - 0 - } - - fn delete_token_properties(_amount: u32) -> Weight { - // Error - 0 - } - - fn set_property_permissions(_amount: u32) -> Weight { - // Error - 0 - } - // Storage: Refungible Balance (r:2 w:2) fn transfer_normal() -> Weight { - (19_766_000 as Weight) + (20_215_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } @@ -157,7 +139,7 @@ // Storage: Refungible AccountBalance (r:1 w:1) // Storage: Refungible Owned (r:0 w:1) fn transfer_creating() -> Weight { - (23_360_000 as Weight) + (24_809_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } @@ -165,7 +147,7 @@ // Storage: Refungible AccountBalance (r:1 w:1) // Storage: Refungible Owned (r:0 w:1) fn transfer_removing() -> Weight { - (25_344_000 as Weight) + (26_704_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } @@ -173,21 +155,21 @@ // Storage: Refungible AccountBalance (r:2 w:2) // Storage: Refungible Owned (r:0 w:2) fn transfer_creating_removing() -> Weight { - (28_553_000 as Weight) + (28_728_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(6 as Weight)) } // Storage: Refungible Balance (r:1 w:0) // Storage: Refungible Allowance (r:0 w:1) fn approve() -> Weight { - (15_356_000 as Weight) + (16_107_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } // Storage: Refungible Allowance (r:1 w:1) // Storage: Refungible Balance (r:2 w:2) fn transfer_from_normal() -> Weight { - (28_832_000 as Weight) + (28_765_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) } @@ -196,7 +178,7 @@ // Storage: Refungible AccountBalance (r:1 w:1) // Storage: Refungible Owned (r:0 w:1) fn transfer_from_creating() -> Weight { - (32_132_000 as Weight) + (32_788_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(5 as Weight)) } @@ -205,7 +187,7 @@ // Storage: Refungible AccountBalance (r:1 w:1) // Storage: Refungible Owned (r:0 w:1) fn transfer_from_removing() -> Weight { - (33_237_000 as Weight) + (34_523_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(5 as Weight)) } @@ -214,7 +196,7 @@ // Storage: Refungible AccountBalance (r:2 w:2) // Storage: Refungible Owned (r:0 w:2) fn transfer_from_creating_removing() -> Weight { - (36_399_000 as Weight) + (36_749_000 as Weight) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(7 as Weight)) } @@ -226,7 +208,7 @@ // Storage: Refungible TokenData (r:0 w:1) // Storage: Refungible Owned (r:0 w:1) fn burn_from() -> Weight { - (42_043_000 as Weight) + (42_259_000 as Weight) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(7 as Weight)) } @@ -241,7 +223,7 @@ // Storage: Refungible TokenData (r:0 w:1) // Storage: Refungible Owned (r:0 w:1) fn create_item() -> Weight { - (21_255_000 as Weight) + (21_321_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(6 as Weight)) } @@ -252,9 +234,9 @@ // Storage: Refungible TokenData (r:0 w:4) // Storage: Refungible Owned (r:0 w:4) fn create_multiple_items(b: u32, ) -> Weight { - (18_052_000 as Weight) - // Standard Error: 1_000 - .saturating_add((5_549_000 as Weight).saturating_mul(b as Weight)) + (16_313_000 as Weight) + // Standard Error: 4_000 + .saturating_add((5_464_000 as Weight).saturating_mul(b as Weight)) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) .saturating_add(RocksDbWeight::get().writes((4 as Weight).saturating_mul(b as Weight))) @@ -266,9 +248,9 @@ // Storage: Refungible TokenData (r:0 w:4) // Storage: Refungible Owned (r:0 w:4) fn create_multiple_items_ex_multiple_items(b: u32, ) -> Weight { - (15_766_000 as Weight) - // Standard Error: 2_000 - .saturating_add((8_187_000 as Weight).saturating_mul(b as Weight)) + (15_631_000 as Weight) + // Standard Error: 5_000 + .saturating_add((8_141_000 as Weight).saturating_mul(b as Weight)) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(b as Weight))) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) @@ -281,9 +263,9 @@ // Storage: Refungible Balance (r:0 w:4) // Storage: Refungible Owned (r:0 w:4) fn create_multiple_items_ex_multiple_owners(b: u32, ) -> Weight { - (5_675_000 as Weight) - // Standard Error: 2_000 - .saturating_add((6_315_000 as Weight).saturating_mul(b as Weight)) + (11_191_000 as Weight) + // Standard Error: 4_000 + .saturating_add((6_321_000 as Weight).saturating_mul(b as Weight)) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(b as Weight))) .saturating_add(RocksDbWeight::get().writes(3 as Weight)) @@ -294,7 +276,7 @@ // Storage: Refungible AccountBalance (r:1 w:1) // Storage: Refungible Owned (r:0 w:1) fn burn_item_partial() -> Weight { - (23_518_000 as Weight) + (24_421_000 as Weight) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } @@ -305,29 +287,13 @@ // Storage: Refungible TokenData (r:0 w:1) // Storage: Refungible Owned (r:0 w:1) fn burn_item_fully() -> Weight { - (32_489_000 as Weight) + (32_900_000 as Weight) .saturating_add(RocksDbWeight::get().reads(4 as Weight)) .saturating_add(RocksDbWeight::get().writes(6 as Weight)) - } - - fn set_token_properties(_amount: u32) -> Weight { - // Error - 0 - } - - fn delete_token_properties(_amount: u32) -> Weight { - // Error - 0 - } - - fn set_property_permissions(_amount: u32) -> Weight { - // Error - 0 } - // Storage: Refungible Balance (r:2 w:2) fn transfer_normal() -> Weight { - (19_766_000 as Weight) + (20_215_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } @@ -335,7 +301,7 @@ // Storage: Refungible AccountBalance (r:1 w:1) // Storage: Refungible Owned (r:0 w:1) fn transfer_creating() -> Weight { - (23_360_000 as Weight) + (24_809_000 as Weight) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } @@ -343,7 +309,7 @@ // Storage: Refungible AccountBalance (r:1 w:1) // Storage: Refungible Owned (r:0 w:1) fn transfer_removing() -> Weight { - (25_344_000 as Weight) + (26_704_000 as Weight) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } @@ -351,21 +317,21 @@ // Storage: Refungible AccountBalance (r:2 w:2) // Storage: Refungible Owned (r:0 w:2) fn transfer_creating_removing() -> Weight { - (28_553_000 as Weight) + (28_728_000 as Weight) .saturating_add(RocksDbWeight::get().reads(4 as Weight)) .saturating_add(RocksDbWeight::get().writes(6 as Weight)) } // Storage: Refungible Balance (r:1 w:0) // Storage: Refungible Allowance (r:0 w:1) fn approve() -> Weight { - (15_356_000 as Weight) + (16_107_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } // Storage: Refungible Allowance (r:1 w:1) // Storage: Refungible Balance (r:2 w:2) fn transfer_from_normal() -> Weight { - (28_832_000 as Weight) + (28_765_000 as Weight) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(3 as Weight)) } @@ -374,7 +340,7 @@ // Storage: Refungible AccountBalance (r:1 w:1) // Storage: Refungible Owned (r:0 w:1) fn transfer_from_creating() -> Weight { - (32_132_000 as Weight) + (32_788_000 as Weight) .saturating_add(RocksDbWeight::get().reads(4 as Weight)) .saturating_add(RocksDbWeight::get().writes(5 as Weight)) } @@ -383,7 +349,7 @@ // Storage: Refungible AccountBalance (r:1 w:1) // Storage: Refungible Owned (r:0 w:1) fn transfer_from_removing() -> Weight { - (33_237_000 as Weight) + (34_523_000 as Weight) .saturating_add(RocksDbWeight::get().reads(4 as Weight)) .saturating_add(RocksDbWeight::get().writes(5 as Weight)) } @@ -392,7 +358,7 @@ // Storage: Refungible AccountBalance (r:2 w:2) // Storage: Refungible Owned (r:0 w:2) fn transfer_from_creating_removing() -> Weight { - (36_399_000 as Weight) + (36_749_000 as Weight) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) .saturating_add(RocksDbWeight::get().writes(7 as Weight)) } @@ -404,7 +370,7 @@ // Storage: Refungible TokenData (r:0 w:1) // Storage: Refungible Owned (r:0 w:1) fn burn_from() -> Weight { - (42_043_000 as Weight) + (42_259_000 as Weight) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) .saturating_add(RocksDbWeight::get().writes(7 as Weight)) } --- a/pallets/scheduler/Cargo.toml +++ b/pallets/scheduler/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "pallet-unq-scheduler" +name = "pallet-unique-scheduler" version = "0.1.0" authors = ["Unique Network "] edition = "2021" --- a/pallets/scheduler/src/benchmarking.rs +++ b/pallets/scheduler/src/benchmarking.rs @@ -34,35 +34,57 @@ //! Scheduler pallet benchmarking. -#![cfg(feature = "runtime-benchmarks")] - use super::*; -use sp_std::{vec, prelude::*}; +use frame_benchmarking::{benchmarks, account}; +use frame_support::{ + ensure, + traits::{OnInitialize}, +}; use frame_system::RawOrigin; -use frame_support::{ensure, traits::OnInitialize}; -use frame_benchmarking::{benchmarks, impl_benchmark_test_suite}; +use sp_runtime::traits::Hash; +use sp_std::{prelude::*, vec}; -use crate::Module as Scheduler; +use crate::Pallet as Scheduler; use frame_system::Pallet as System; +use frame_support::traits::Currency; const BLOCK_NUMBER: u32 = 2; -// Add `n` named items to the schedule -fn fill_schedule(when: T::BlockNumber, n: u32) -> Result<(), &'static str> { - // Essentially a no-op call. - let call = frame_system::Call::set_storage { items: vec![] }; +/// Add `n` named items to the schedule. +/// +/// For `resolved`: +/// - `None`: aborted (hash without preimage) +/// - `Some(true)`: hash resolves into call if possible, plain call otherwise +/// - `Some(false)`: plain call +fn fill_schedule( + when: T::BlockNumber, + n: u32, + periodic: bool, + resolved: Option, +) -> Result<(), &'static str> { + let t = DispatchTime::At(when); + let caller = account("user", 0, 1); + + // Give the sender account max funds for transfer (their account will never reasonably be killed). + T::Currency::make_free_balance_be(&caller, T::Currency::minimum_balance()); + for i in 0..n { - // Named schedule is strictly heavier than anonymous - Scheduler::::do_schedule_named( - i.encode(), - DispatchTime::At(when), - // Add periodicity - Some((T::BlockNumber::one(), 100)), - // HARD_DEADLINE priority means it gets executed no matter what - 0, - frame_system::RawOrigin::Root.into(), - call.clone().into(), - )?; + let (call, hash) = call_and_hash::(i); + let call_or_hash = match resolved { + Some(_) => call.into(), + None => CallOrHashOf::::Hash(hash), + }; + let period = match periodic { + true => Some(((i + 100).into(), 100)), + false => None, + }; + + let slice_id: [u8; 4] = i.encode().try_into().unwrap(); + let mut id: [u8; 16] = [0; 16]; + id[..4].clone_from_slice(&slice_id); + + let origin = frame_system::RawOrigin::Signed(caller.clone()).into(); + Scheduler::::do_schedule_named(id, t, period, 0, origin, call_or_hash)?; } ensure!( Agenda::::get(when).len() == n as usize, @@ -71,54 +93,121 @@ Ok(()) } +fn call_and_hash(i: u32) -> (::Call, T::Hash) { + // Essentially a no-op call. + let call: ::Call = frame_system::Call::remark { remark: i.encode() }.into(); + let hash = T::Hashing::hash_of(&call); + (call, hash) +} + benchmarks! { - schedule { - let s in 0 .. T::MaxScheduledPerBlock::get(); + on_initialize_periodic_named_resolved { + let s in 1 .. T::MaxScheduledPerBlock::get(); let when = BLOCK_NUMBER.into(); - let periodic = Some((T::BlockNumber::one(), 100)); - let priority = 0; - // Essentially a no-op call. - let call = Box::new(frame_system::Call::set_storage { items: vec![] }.into()); + fill_schedule::(when, s, true, Some(true))?; + }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } + verify { + assert_eq!(System::::event_count(), s); + for i in 0..s { + assert_eq!(Agenda::::get(when + (i + 100).into()).len(), 1 as usize); + } + } - fill_schedule::(when, s)?; - }: _(RawOrigin::Root, when, periodic, priority, call) + on_initialize_named_resolved { + let s in 1 .. T::MaxScheduledPerBlock::get(); + let when = BLOCK_NUMBER.into(); + fill_schedule::(when, s, false, Some(true))?; + }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } verify { - ensure!( - Agenda::::get(when).len() == (s + 1) as usize, - "didn't add to schedule" - ); + assert_eq!(System::::event_count(), s); + assert!(Agenda::::iter().count() == 0); } - cancel { + on_initialize_periodic { let s in 1 .. T::MaxScheduledPerBlock::get(); let when = BLOCK_NUMBER.into(); + fill_schedule::(when, s, true, Some(false))?; + }: { Scheduler::::on_initialize(when); } + verify { + assert_eq!(System::::event_count(), s); + for i in 0..s { + assert_eq!(Agenda::::get(when + (i + 100).into()).len(), 1 as usize); + } + } - fill_schedule::(when, s)?; - assert_eq!(Agenda::::get(when).len(), s as usize); - }: _(RawOrigin::Root, when, 0) + on_initialize_periodic_resolved { + let s in 1 .. T::MaxScheduledPerBlock::get(); + let when = BLOCK_NUMBER.into(); + fill_schedule::(when, s, true, Some(true))?; + }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } verify { - ensure!( - Lookup::::get(0.encode()).is_none(), - "didn't remove from lookup" - ); - // Removed schedule is NONE - ensure!( - Agenda::::get(when)[0].is_none(), - "didn't remove from schedule" - ); + assert_eq!(System::::event_count(), s ); + for i in 0..s { + assert_eq!(Agenda::::get(when + (i + 100).into()).len(), 1 as usize); + } } + on_initialize_aborted { + let s in 1 .. T::MaxScheduledPerBlock::get(); + let when = BLOCK_NUMBER.into(); + fill_schedule::(when, s, false, None)?; + }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } + verify { + assert_eq!(System::::event_count(), 0); + } + + on_initialize_named_aborted { + let s in 1 .. T::MaxScheduledPerBlock::get(); + let when = BLOCK_NUMBER.into(); + fill_schedule::(when, s, false, Some(false))?; + }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } + verify { + } + + on_initialize_named { + let s in 1 .. T::MaxScheduledPerBlock::get(); + let when = BLOCK_NUMBER.into(); + fill_schedule::(when, s, false, None)?; + }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } + verify { + assert_eq!(System::::event_count(), 0); + } + + on_initialize { + let s in 1 .. T::MaxScheduledPerBlock::get(); + let when = BLOCK_NUMBER.into(); + fill_schedule::(when, s, false, Some(false))?; + }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } + verify { + assert_eq!(System::::event_count(), s); + assert!(Agenda::::iter().count() == 0); + } + + on_initialize_resolved { + let s in 1 .. T::MaxScheduledPerBlock::get(); + let when = BLOCK_NUMBER.into(); + fill_schedule::(when, s, false, Some(true))?; + }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } + verify { + assert_eq!(System::::event_count(), s); + assert!(Agenda::::iter().count() == 0); + } + schedule_named { + let caller: T::AccountId = account("user", 0, 1); + let origin: RawOrigin = frame_system::RawOrigin::Signed(caller.clone()); let s in 0 .. T::MaxScheduledPerBlock::get(); - let id = s.encode(); + let slice_id: [u8; 4] = s.encode().try_into().unwrap(); + let mut id: [u8; 16] = [0; 16]; + id[..4].clone_from_slice(&slice_id); let when = BLOCK_NUMBER.into(); let periodic = Some((T::BlockNumber::one(), 100)); let priority = 0; // Essentially a no-op call. - let call = Box::new(frame_system::Call::set_storage { items: vec![] }.into()); - - fill_schedule::(when, s)?; - }: _(RawOrigin::Root, id, when, periodic, priority, call) + let inner_call = frame_system::Call::set_storage { items: vec![] }.into(); + let call = Box::new(CallOrHashOf::::Value(inner_call)); + fill_schedule::(when, s, true, Some(false))?; + }: _(origin, id, when, periodic, priority, call) verify { ensure!( Agenda::::get(when).len() == (s + 1) as usize, @@ -127,14 +216,16 @@ } cancel_named { + let caller: T::AccountId = account("user", 0, 1); + let origin: RawOrigin = frame_system::RawOrigin::Signed(caller.clone()); let s in 1 .. T::MaxScheduledPerBlock::get(); let when = BLOCK_NUMBER.into(); - - fill_schedule::(when, s)?; - }: _(RawOrigin::Root, 0.encode()) + let id = 0.encode().try_into().unwrap_or([0; MAX_TASK_ID_LENGTH_IN_BYTES as usize]); + fill_schedule::(when, s, true, Some(false))?; + }: _(origin, id) verify { ensure!( - Lookup::::get(0.encode()).is_none(), + Lookup::::get(id).is_none(), "didn't remove from lookup" ); // Removed schedule is NONE @@ -144,21 +235,5 @@ ); } - // TODO [#7141]: Make this more complex and flexible so it can be used in automation. - #[extra] - on_initialize { - let s in 0 .. T::MaxScheduledPerBlock::get(); - let when = BLOCK_NUMBER.into(); - fill_schedule::(when, s)?; - }: { Scheduler::::on_initialize(BLOCK_NUMBER.into()); } - verify { - assert_eq!(System::::event_count(), s); - // Next block should have all the schedules again - ensure!( - Agenda::::get(when + T::BlockNumber::one()).len() == s as usize, - "didn't append schedule" - ); - } + impl_benchmark_test_suite!(Scheduler, crate::mock::new_test_ext(), crate::mock::Test); } - -impl_benchmark_test_suite!(Scheduler, crate::tests::new_test_ext(), crate::tests::Test,); --- a/pallets/scheduler/src/lib.rs +++ b/pallets/scheduler/src/lib.rs @@ -60,9 +60,8 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] -// FIXME -// #[cfg(feature = "runtime-benchmarks")] -// mod benchmarking; +#[cfg(feature = "runtime-benchmarks")] +mod benchmarking; pub mod weights; @@ -159,11 +158,10 @@ Self::on_initialize_periodic(2) - Self::on_initialize_periodic(1) } (true, true, Some(false)) => { - Self::on_initialize_periodic_named(2) - Self::on_initialize_periodic_named(1) - } - (false, false, Some(true)) => { - Self::on_initialize_resolved(2) - Self::on_initialize_resolved(1) + Self::on_initialize_periodic_named_resolved(2) + - Self::on_initialize_periodic_named_resolved(1) } + (false, false, Some(true)) => Self::on_initialize(2) - Self::on_initialize(1), (false, true, Some(true)) => { Self::on_initialize_named_resolved(2) - Self::on_initialize_named_resolved(1) } @@ -608,97 +606,8 @@ } Ok(when) - } - - fn do_schedule( - when: DispatchTime, - maybe_periodic: Option>, - priority: schedule::Priority, - origin: T::PalletsOrigin, - call: CallOrHashOf, - ) -> Result, DispatchError> { - let when = Self::resolve_time(when)?; - call.ensure_requested::(); - - // sanitize maybe_periodic - let maybe_periodic = maybe_periodic - .filter(|p| p.1 > 1 && !p.0.is_zero()) - // Remove one from the number of repetitions since we will schedule one now. - .map(|(p, c)| (p, c - 1)); - let s = Some(Scheduled { - maybe_id: None, - priority, - call, - maybe_periodic, - origin, - _phantom: PhantomData::::default(), - }); - Agenda::::append(when, s); - let index = Agenda::::decode_len(when).unwrap_or(1) as u32 - 1; - Self::deposit_event(Event::Scheduled { when, index }); - - Ok((when, index)) } - fn do_cancel( - origin: Option, - (when, index): TaskAddress, - ) -> Result<(), DispatchError> { - let scheduled = Agenda::::try_mutate(when, |agenda| { - agenda.get_mut(index as usize).map_or( - Ok(None), - |s| -> Result>, DispatchError> { - if let (Some(ref o), Some(ref s)) = (origin, s.borrow()) { - if matches!( - T::OriginPrivilegeCmp::cmp_privilege(o, &s.origin), - Some(Ordering::Less) | None - ) { - return Err(BadOrigin.into()); - } - }; - Ok(s.take()) - }, - ) - })?; - if let Some(s) = scheduled { - s.call.ensure_unrequested::(); - if let Some(id) = s.maybe_id { - Lookup::::remove(id); - } - Self::deposit_event(Event::Canceled { when, index }); - Ok(()) - } else { - Err(Error::::NotFound)? - } - } - - fn do_reschedule( - (when, index): TaskAddress, - new_time: DispatchTime, - ) -> Result, DispatchError> { - let new_time = Self::resolve_time(new_time)?; - - if new_time == when { - return Err(Error::::RescheduleNoChange.into()); - } - - Agenda::::try_mutate(when, |agenda| -> DispatchResult { - let task = agenda.get_mut(index as usize).ok_or(Error::::NotFound)?; - let task = task.take().ok_or(Error::::NotFound)?; - Agenda::::append(new_time, Some(task)); - Ok(()) - })?; - - let new_index = Agenda::::decode_len(new_time).unwrap_or(1) as u32 - 1; - Self::deposit_event(Event::Canceled { when, index }); - Self::deposit_event(Event::Scheduled { - when: new_time, - index: new_index, - }); - - Ok((new_time, new_index)) - } - fn do_schedule_named( id: ScheduledId, when: DispatchTime, @@ -789,125 +698,5 @@ Err(Error::::NotFound)? } }) - } - - fn do_reschedule_named( - id: ScheduledId, - new_time: DispatchTime, - ) -> Result, DispatchError> { - let new_time = Self::resolve_time(new_time)?; - - Lookup::::try_mutate_exists( - id, - |lookup| -> Result, DispatchError> { - let (when, index) = lookup.ok_or(Error::::NotFound)?; - - if new_time == when { - return Err(Error::::RescheduleNoChange.into()); - } - - Agenda::::try_mutate(when, |agenda| -> DispatchResult { - let task = agenda.get_mut(index as usize).ok_or(Error::::NotFound)?; - let task = task.take().ok_or(Error::::NotFound)?; - Agenda::::append(new_time, Some(task)); - - Ok(()) - })?; - - let new_index = Agenda::::decode_len(new_time).unwrap_or(1) as u32 - 1; - Self::deposit_event(Event::Canceled { when, index }); - Self::deposit_event(Event::Scheduled { - when: new_time, - index: new_index, - }); - - *lookup = Some((new_time, new_index)); - - Ok((new_time, new_index)) - }, - ) - } -} - -impl schedule::v2::Anon::Call, T::PalletsOrigin> - for Pallet -{ - type Address = TaskAddress; - type Hash = T::Hash; - - fn schedule( - when: DispatchTime, - maybe_periodic: Option>, - priority: schedule::Priority, - origin: T::PalletsOrigin, - call: CallOrHashOf, - ) -> Result { - Self::do_schedule(when, maybe_periodic, priority, origin, call) - } - - fn cancel((when, index): Self::Address) -> Result<(), ()> { - Self::do_cancel(None, (when, index)).map_err(|_| ()) - } - - fn reschedule( - address: Self::Address, - when: DispatchTime, - ) -> Result { - Self::do_reschedule(address, when) - } - - fn next_dispatch_time((when, index): Self::Address) -> Result { - Agenda::::get(when) - .get(index as usize) - .ok_or(()) - .map(|_| when) - } -} - -impl schedule::v2::Named::Call, T::PalletsOrigin> - for Pallet -{ - type Address = TaskAddress; - type Hash = T::Hash; - - fn schedule_named( - id: Vec, - when: DispatchTime, - maybe_periodic: Option>, - priority: schedule::Priority, - origin: T::PalletsOrigin, - call: CallOrHashOf, - ) -> Result { - let inner_id: ScheduledId = id - .try_into() - .unwrap_or([0; MAX_TASK_ID_LENGTH_IN_BYTES as usize]); - Self::do_schedule_named(inner_id, when, maybe_periodic, priority, origin, call) - .map_err(|_| ()) - } - - fn cancel_named(id: Vec) -> Result<(), ()> { - let inner_id: ScheduledId = id - .try_into() - .unwrap_or([0; MAX_TASK_ID_LENGTH_IN_BYTES as usize]); - Self::do_cancel_named(None, inner_id).map_err(|_| ()) - } - - fn reschedule_named( - id: Vec, - when: DispatchTime, - ) -> Result { - let inner_id: ScheduledId = id - .try_into() - .unwrap_or([0; MAX_TASK_ID_LENGTH_IN_BYTES as usize]); - Self::do_reschedule_named(inner_id, when) - } - - fn next_dispatch_time(id: Vec) -> Result { - let inner_id: ScheduledId = id - .try_into() - .unwrap_or([0; MAX_TASK_ID_LENGTH_IN_BYTES as usize]); - Lookup::::get(inner_id) - .and_then(|(when, index)| Agenda::::get(when).get(index as usize).map(|_| when)) - .ok_or(()) } } --- a/pallets/scheduler/src/weights.rs +++ b/pallets/scheduler/src/weights.rs @@ -1,213 +1,183 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Template adopted from https://github.com/paritytech/substrate/blob/master/.maintain/frame-weight-template.hbs -//! Autogenerated weights for pallet_scheduler +//! Autogenerated weights for pallet_unique_scheduler //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-01-31, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! DATE: 2022-06-15, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: -// ./target/production/substrate +// target/release/unique-collator // benchmark -// --chain=dev +// pallet +// --pallet +// pallet-unique-scheduler +// --wasm-execution +// compiled +// --extrinsic +// * +// --template +// .maintain/frame-weight-template.hbs // --steps=50 -// --repeat=20 -// --pallet=pallet_scheduler -// --extrinsic=* -// --execution=wasm -// --wasm-execution=compiled +// --repeat=80 // --heap-pages=4096 -// --output=./frame/scheduler/src/weights.rs -// --template=.maintain/frame-weight-template.hbs -// --header=HEADER-APACHE2 -// --raw +// --output=./pallets/scheduler/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_scheduler. +/// Weight functions needed for pallet_unique_scheduler. pub trait WeightInfo { fn on_initialize_periodic_named_resolved(s: u32, ) -> Weight; fn on_initialize_named_resolved(s: u32, ) -> Weight; + fn on_initialize_periodic(s: u32, ) -> Weight; fn on_initialize_periodic_resolved(s: u32, ) -> Weight; - fn on_initialize_resolved(s: u32, ) -> Weight; + fn on_initialize_aborted(s: u32, ) -> Weight; fn on_initialize_named_aborted(s: u32, ) -> Weight; - fn on_initialize_aborted(s: u32, ) -> Weight; - fn on_initialize_periodic_named(s: u32, ) -> Weight; - fn on_initialize_periodic(s: u32, ) -> Weight; fn on_initialize_named(s: u32, ) -> Weight; fn on_initialize(s: u32, ) -> Weight; - fn schedule(s: u32, ) -> Weight; - fn cancel(s: u32, ) -> Weight; + fn on_initialize_resolved(s: u32, ) -> Weight; fn schedule_named(s: u32, ) -> Weight; fn cancel_named(s: u32, ) -> Weight; } -/// Weights for pallet_scheduler using the Substrate node and recommended hardware. +/// Weights for pallet_unique_scheduler using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { // Storage: Scheduler Agenda (r:2 w:2) - // Storage: Preimage PreimageFor (r:1 w:1) - // Storage: Preimage StatusFor (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: System AllExtrinsicsLen (r:1 w:1) + // Storage: System BlockWeight (r:1 w:1) // Storage: Scheduler Lookup (r:0 w:1) fn on_initialize_periodic_named_resolved(s: u32, ) -> Weight { - (11_587_000 as Weight) - // Standard Error: 17_000 - .saturating_add((17_428_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(s as Weight))) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) - .saturating_add(T::DbWeight::get().writes((4 as Weight).saturating_mul(s as Weight))) + (27_374_000 as Weight) + // Standard Error: 7_000 + .saturating_add((9_673_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(s as Weight))) } // Storage: Scheduler Agenda (r:1 w:1) - // Storage: Preimage PreimageFor (r:1 w:1) - // Storage: Preimage StatusFor (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: System AllExtrinsicsLen (r:1 w:1) + // Storage: System BlockWeight (r:1 w:1) // Storage: Scheduler Lookup (r:0 w:1) fn on_initialize_named_resolved(s: u32, ) -> Weight { - (8_965_000 as Weight) - // Standard Error: 11_000 - .saturating_add((13_410_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(s as Weight))) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) - .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(s as Weight))) + (25_967_000 as Weight) + // Standard Error: 6_000 + .saturating_add((5_916_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } // Storage: Scheduler Agenda (r:2 w:2) - // Storage: Preimage PreimageFor (r:1 w:1) - // Storage: Preimage StatusFor (r:1 w:1) - fn on_initialize_periodic_resolved(s: u32, ) -> Weight { - (8_654_000 as Weight) - // Standard Error: 17_000 - .saturating_add((14_990_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(s as Weight))) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) - .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(s as Weight))) - } - // Storage: Scheduler Agenda (r:1 w:1) - // Storage: Preimage PreimageFor (r:1 w:1) - // Storage: Preimage StatusFor (r:1 w:1) - fn on_initialize_resolved(s: u32, ) -> Weight { - (9_303_000 as Weight) - // Standard Error: 10_000 - .saturating_add((12_244_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().reads((2 as Weight).saturating_mul(s as Weight))) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + // Storage: System Account (r:1 w:1) + // Storage: System AllExtrinsicsLen (r:1 w:1) + // Storage: System BlockWeight (r:1 w:1) + // Storage: Scheduler Lookup (r:0 w:1) + fn on_initialize_periodic(s: u32, ) -> Weight { + (27_097_000 as Weight) + // Standard Error: 5_000 + .saturating_add((9_652_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(s as Weight))) } // Storage: Scheduler Agenda (r:2 w:2) - // Storage: Preimage PreimageFor (r:1 w:0) + // Storage: System Account (r:1 w:1) + // Storage: System AllExtrinsicsLen (r:1 w:1) + // Storage: System BlockWeight (r:1 w:1) // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize_named_aborted(s: u32, ) -> Weight { - (7_506_000 as Weight) - // Standard Error: 3_000 - .saturating_add((5_208_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(2 as Weight)) + fn on_initialize_periodic_resolved(s: u32, ) -> Weight { + (43_116_000 as Weight) + // Standard Error: 18_000 + .saturating_add((8_352_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) - .saturating_add(T::DbWeight::get().writes(2 as Weight)) - .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(s as Weight))) } // Storage: Scheduler Agenda (r:2 w:2) - // Storage: Preimage PreimageFor (r:1 w:0) + // Storage: Scheduler Lookup (r:0 w:1) fn on_initialize_aborted(s: u32, ) -> Weight { - (8_046_000 as Weight) - // Standard Error: 3_000 - .saturating_add((2_914_000 as Weight).saturating_mul(s as Weight)) + (4_921_000 as Weight) + // Standard Error: 4_000 + .saturating_add((2_249_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) - .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) .saturating_add(T::DbWeight::get().writes(2 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } - // Storage: Scheduler Agenda (r:2 w:2) + // Storage: Scheduler Agenda (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: System AllExtrinsicsLen (r:1 w:1) + // Storage: System BlockWeight (r:1 w:1) // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize_periodic_named(s: u32, ) -> Weight { - (13_704_000 as Weight) - // Standard Error: 4_000 - .saturating_add((8_186_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) - .saturating_add(T::DbWeight::get().writes((2 as Weight).saturating_mul(s as Weight))) - } - // Storage: Scheduler Agenda (r:2 w:2) - fn on_initialize_periodic(s: u32, ) -> Weight { - (12_668_000 as Weight) - // Standard Error: 5_000 - .saturating_add((5_868_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + fn on_initialize_named_aborted(s: u32, ) -> Weight { + (26_934_000 as Weight) + // Standard Error: 7_000 + .saturating_add((5_819_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } - // Storage: Scheduler Agenda (r:1 w:1) + // Storage: Scheduler Agenda (r:2 w:2) // Storage: Scheduler Lookup (r:0 w:1) fn on_initialize_named(s: u32, ) -> Weight { - (13_946_000 as Weight) - // Standard Error: 4_000 - .saturating_add((4_367_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + (6_423_000 as Weight) + // Standard Error: 1_000 + .saturating_add((2_141_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } // Storage: Scheduler Agenda (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: System AllExtrinsicsLen (r:1 w:1) + // Storage: System BlockWeight (r:1 w:1) + // Storage: Scheduler Lookup (r:0 w:1) fn on_initialize(s: u32, ) -> Weight { - (13_151_000 as Weight) - // Standard Error: 4_000 - .saturating_add((3_455_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) + (27_586_000 as Weight) + // Standard Error: 11_000 + .saturating_add((5_264_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } // Storage: Scheduler Agenda (r:1 w:1) - fn schedule(s: u32, ) -> Weight { - (14_040_000 as Weight) - // Standard Error: 1_000 - .saturating_add((89_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) - } - // Storage: Scheduler Agenda (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: System AllExtrinsicsLen (r:1 w:1) + // Storage: System BlockWeight (r:1 w:1) // Storage: Scheduler Lookup (r:0 w:1) - fn cancel(s: u32, ) -> Weight { - (14_376_000 as Weight) - // Standard Error: 1_000 - .saturating_add((576_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().writes(2 as Weight)) + fn on_initialize_resolved(s: u32, ) -> Weight { + (24_356_000 as Weight) + // Standard Error: 4_000 + .saturating_add((5_301_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } // Storage: Scheduler Lookup (r:1 w:1) // Storage: Scheduler Agenda (r:1 w:1) fn schedule_named(s: u32, ) -> Weight { - (16_806_000 as Weight) + (14_871_000 as Weight) // Standard Error: 1_000 - .saturating_add((102_000 as Weight).saturating_mul(s as Weight)) + .saturating_add((183_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } // Storage: Scheduler Lookup (r:1 w:1) // Storage: Scheduler Agenda (r:1 w:1) fn cancel_named(s: u32, ) -> Weight { - (15_852_000 as Weight) - // Standard Error: 2_000 - .saturating_add((590_000 as Weight).saturating_mul(s as Weight)) + (16_676_000 as Weight) + // Standard Error: 1_000 + .saturating_add((500_000 as Weight).saturating_mul(s as Weight)) .saturating_add(T::DbWeight::get().reads(2 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } @@ -216,148 +186,134 @@ // For backwards compatibility and tests impl WeightInfo for () { // Storage: Scheduler Agenda (r:2 w:2) - // Storage: Preimage PreimageFor (r:1 w:1) - // Storage: Preimage StatusFor (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: System AllExtrinsicsLen (r:1 w:1) + // Storage: System BlockWeight (r:1 w:1) // Storage: Scheduler Lookup (r:0 w:1) fn on_initialize_periodic_named_resolved(s: u32, ) -> Weight { - (11_587_000 as Weight) - // Standard Error: 17_000 - .saturating_add((17_428_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(RocksDbWeight::get().reads(1 as Weight)) - .saturating_add(RocksDbWeight::get().reads((3 as Weight).saturating_mul(s as Weight))) - .saturating_add(RocksDbWeight::get().writes(1 as Weight)) - .saturating_add(RocksDbWeight::get().writes((4 as Weight).saturating_mul(s as Weight))) + (27_374_000 as Weight) + // Standard Error: 7_000 + .saturating_add((9_673_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(RocksDbWeight::get().reads(4 as Weight)) + .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) + .saturating_add(RocksDbWeight::get().writes(4 as Weight)) + .saturating_add(RocksDbWeight::get().writes((2 as Weight).saturating_mul(s as Weight))) } // Storage: Scheduler Agenda (r:1 w:1) - // Storage: Preimage PreimageFor (r:1 w:1) - // Storage: Preimage StatusFor (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: System AllExtrinsicsLen (r:1 w:1) + // Storage: System BlockWeight (r:1 w:1) // Storage: Scheduler Lookup (r:0 w:1) fn on_initialize_named_resolved(s: u32, ) -> Weight { - (8_965_000 as Weight) - // Standard Error: 11_000 - .saturating_add((13_410_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(RocksDbWeight::get().reads(1 as Weight)) - .saturating_add(RocksDbWeight::get().reads((2 as Weight).saturating_mul(s as Weight))) - .saturating_add(RocksDbWeight::get().writes(1 as Weight)) - .saturating_add(RocksDbWeight::get().writes((3 as Weight).saturating_mul(s as Weight))) + (25_967_000 as Weight) + // Standard Error: 6_000 + .saturating_add((5_916_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(RocksDbWeight::get().reads(4 as Weight)) + .saturating_add(RocksDbWeight::get().writes(4 as Weight)) + .saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } // Storage: Scheduler Agenda (r:2 w:2) - // Storage: Preimage PreimageFor (r:1 w:1) - // Storage: Preimage StatusFor (r:1 w:1) - fn on_initialize_periodic_resolved(s: u32, ) -> Weight { - (8_654_000 as Weight) - // Standard Error: 17_000 - .saturating_add((14_990_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(RocksDbWeight::get().reads(1 as Weight)) - .saturating_add(RocksDbWeight::get().reads((3 as Weight).saturating_mul(s as Weight))) - .saturating_add(RocksDbWeight::get().writes(1 as Weight)) - .saturating_add(RocksDbWeight::get().writes((3 as Weight).saturating_mul(s as Weight))) - } - // Storage: Scheduler Agenda (r:1 w:1) - // Storage: Preimage PreimageFor (r:1 w:1) - // Storage: Preimage StatusFor (r:1 w:1) - fn on_initialize_resolved(s: u32, ) -> Weight { - (9_303_000 as Weight) - // Standard Error: 10_000 - .saturating_add((12_244_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(RocksDbWeight::get().reads(1 as Weight)) - .saturating_add(RocksDbWeight::get().reads((2 as Weight).saturating_mul(s as Weight))) - .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + // Storage: System Account (r:1 w:1) + // Storage: System AllExtrinsicsLen (r:1 w:1) + // Storage: System BlockWeight (r:1 w:1) + // Storage: Scheduler Lookup (r:0 w:1) + fn on_initialize_periodic(s: u32, ) -> Weight { + (27_097_000 as Weight) + // Standard Error: 5_000 + .saturating_add((9_652_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(RocksDbWeight::get().reads(4 as Weight)) + .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) + .saturating_add(RocksDbWeight::get().writes(4 as Weight)) .saturating_add(RocksDbWeight::get().writes((2 as Weight).saturating_mul(s as Weight))) } // Storage: Scheduler Agenda (r:2 w:2) - // Storage: Preimage PreimageFor (r:1 w:0) + // Storage: System Account (r:1 w:1) + // Storage: System AllExtrinsicsLen (r:1 w:1) + // Storage: System BlockWeight (r:1 w:1) // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize_named_aborted(s: u32, ) -> Weight { - (7_506_000 as Weight) - // Standard Error: 3_000 - .saturating_add((5_208_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(RocksDbWeight::get().reads(2 as Weight)) + fn on_initialize_periodic_resolved(s: u32, ) -> Weight { + (43_116_000 as Weight) + // Standard Error: 18_000 + .saturating_add((8_352_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(RocksDbWeight::get().reads(4 as Weight)) .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) - .saturating_add(RocksDbWeight::get().writes(2 as Weight)) - .saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) + .saturating_add(RocksDbWeight::get().writes(4 as Weight)) + .saturating_add(RocksDbWeight::get().writes((2 as Weight).saturating_mul(s as Weight))) } // Storage: Scheduler Agenda (r:2 w:2) - // Storage: Preimage PreimageFor (r:1 w:0) + // Storage: Scheduler Lookup (r:0 w:1) fn on_initialize_aborted(s: u32, ) -> Weight { - (8_046_000 as Weight) - // Standard Error: 3_000 - .saturating_add((2_914_000 as Weight).saturating_mul(s as Weight)) + (4_921_000 as Weight) + // Standard Error: 4_000 + .saturating_add((2_249_000 as Weight).saturating_mul(s as Weight)) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) - .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) + .saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } - // Storage: Scheduler Agenda (r:2 w:2) + // Storage: Scheduler Agenda (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: System AllExtrinsicsLen (r:1 w:1) + // Storage: System BlockWeight (r:1 w:1) // Storage: Scheduler Lookup (r:0 w:1) - fn on_initialize_periodic_named(s: u32, ) -> Weight { - (13_704_000 as Weight) - // Standard Error: 4_000 - .saturating_add((8_186_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(RocksDbWeight::get().reads(1 as Weight)) - .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) - .saturating_add(RocksDbWeight::get().writes(1 as Weight)) - .saturating_add(RocksDbWeight::get().writes((2 as Weight).saturating_mul(s as Weight))) - } - // Storage: Scheduler Agenda (r:2 w:2) - fn on_initialize_periodic(s: u32, ) -> Weight { - (12_668_000 as Weight) - // Standard Error: 5_000 - .saturating_add((5_868_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(RocksDbWeight::get().reads(1 as Weight)) - .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(s as Weight))) - .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + fn on_initialize_named_aborted(s: u32, ) -> Weight { + (26_934_000 as Weight) + // Standard Error: 7_000 + .saturating_add((5_819_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(RocksDbWeight::get().reads(4 as Weight)) + .saturating_add(RocksDbWeight::get().writes(4 as Weight)) .saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } - // Storage: Scheduler Agenda (r:1 w:1) + // Storage: Scheduler Agenda (r:2 w:2) // Storage: Scheduler Lookup (r:0 w:1) fn on_initialize_named(s: u32, ) -> Weight { - (13_946_000 as Weight) - // Standard Error: 4_000 - .saturating_add((4_367_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(RocksDbWeight::get().reads(1 as Weight)) - .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + (6_423_000 as Weight) + // Standard Error: 1_000 + .saturating_add((2_141_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(RocksDbWeight::get().reads(2 as Weight)) + .saturating_add(RocksDbWeight::get().writes(2 as Weight)) .saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } // Storage: Scheduler Agenda (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: System AllExtrinsicsLen (r:1 w:1) + // Storage: System BlockWeight (r:1 w:1) + // Storage: Scheduler Lookup (r:0 w:1) fn on_initialize(s: u32, ) -> Weight { - (13_151_000 as Weight) - // Standard Error: 4_000 - .saturating_add((3_455_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(RocksDbWeight::get().reads(1 as Weight)) - .saturating_add(RocksDbWeight::get().writes(1 as Weight)) + (27_586_000 as Weight) + // Standard Error: 11_000 + .saturating_add((5_264_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(RocksDbWeight::get().reads(4 as Weight)) + .saturating_add(RocksDbWeight::get().writes(4 as Weight)) + .saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } // Storage: Scheduler Agenda (r:1 w:1) - fn schedule(s: u32, ) -> Weight { - (14_040_000 as Weight) - // Standard Error: 1_000 - .saturating_add((89_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(RocksDbWeight::get().reads(1 as Weight)) - .saturating_add(RocksDbWeight::get().writes(1 as Weight)) - } - // Storage: Scheduler Agenda (r:1 w:1) + // Storage: System Account (r:1 w:1) + // Storage: System AllExtrinsicsLen (r:1 w:1) + // Storage: System BlockWeight (r:1 w:1) // Storage: Scheduler Lookup (r:0 w:1) - fn cancel(s: u32, ) -> Weight { - (14_376_000 as Weight) - // Standard Error: 1_000 - .saturating_add((576_000 as Weight).saturating_mul(s as Weight)) - .saturating_add(RocksDbWeight::get().reads(1 as Weight)) - .saturating_add(RocksDbWeight::get().writes(2 as Weight)) + fn on_initialize_resolved(s: u32, ) -> Weight { + (24_356_000 as Weight) + // Standard Error: 4_000 + .saturating_add((5_301_000 as Weight).saturating_mul(s as Weight)) + .saturating_add(RocksDbWeight::get().reads(4 as Weight)) + .saturating_add(RocksDbWeight::get().writes(4 as Weight)) + .saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(s as Weight))) } // Storage: Scheduler Lookup (r:1 w:1) // Storage: Scheduler Agenda (r:1 w:1) fn schedule_named(s: u32, ) -> Weight { - (16_806_000 as Weight) + (14_871_000 as Weight) // Standard Error: 1_000 - .saturating_add((102_000 as Weight).saturating_mul(s as Weight)) + .saturating_add((183_000 as Weight).saturating_mul(s as Weight)) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } // Storage: Scheduler Lookup (r:1 w:1) // Storage: Scheduler Agenda (r:1 w:1) fn cancel_named(s: u32, ) -> Weight { - (15_852_000 as Weight) - // Standard Error: 2_000 - .saturating_add((590_000 as Weight).saturating_mul(s as Weight)) + (16_676_000 as Weight) + // Standard Error: 1_000 + .saturating_add((500_000 as Weight).saturating_mul(s as Weight)) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } --- a/pallets/structure/src/weights.rs +++ b/pallets/structure/src/weights.rs @@ -3,12 +3,13 @@ //! Autogenerated weights for pallet_structure //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-03-24, STEPS: `50`, REPEAT: 200, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2022-06-15, STEPS: `50`, REPEAT: 200, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: // target/release/unique-collator // benchmark +// pallet // --pallet // pallet-structure // --wasm-execution @@ -41,7 +42,7 @@ // Storage: Common CollectionById (r:1 w:0) // Storage: Nonfungible TokenData (r:1 w:0) fn find_parent() -> Weight { - (6_302_000 as Weight) + (7_013_000 as Weight) .saturating_add(T::DbWeight::get().reads(2 as Weight)) } } @@ -51,7 +52,7 @@ // Storage: Common CollectionById (r:1 w:0) // Storage: Nonfungible TokenData (r:1 w:0) fn find_parent() -> Weight { - (6_302_000 as Weight) + (7_013_000 as Weight) .saturating_add(RocksDbWeight::get().reads(2 as Weight)) } } --- a/pallets/unique/src/lib.rs +++ b/pallets/unique/src/lib.rs @@ -491,7 +491,7 @@ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?); let mut target_collection = >::try_get(collection_id)?; - target_collection.check_is_owner(&sender)?; + target_collection.check_is_owner_or_admin(&sender)?; target_collection.check_is_internal()?; target_collection.set_sponsor(new_sponsor.clone())?; @@ -670,9 +670,9 @@ dispatch_tx::(collection_id, |d| d.delete_token_properties(sender, token_id, property_keys)) } - #[weight = T::CommonWeightInfo::set_property_permissions(property_permissions.len() as u32)] + #[weight = T::CommonWeightInfo::set_token_property_permissions(property_permissions.len() as u32)] #[transactional] - pub fn set_property_permissions( + pub fn set_token_property_permissions( origin, collection_id: CollectionId, property_permissions: Vec, @@ -681,7 +681,7 @@ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?); - dispatch_tx::(collection_id, |d| d.set_property_permissions(&sender, property_permissions)) + dispatch_tx::(collection_id, |d| d.set_token_property_permissions(&sender, property_permissions)) } #[weight = T::CommonWeightInfo::create_multiple_items_ex(&data)] @@ -865,7 +865,7 @@ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?); let mut target_collection = >::try_get(collection_id)?; target_collection.check_is_internal()?; - target_collection.check_is_owner(&sender)?; + target_collection.check_is_owner_or_admin(&sender)?; let old_limit = &target_collection.limits; target_collection.limits = >::clamp_limits(target_collection.mode.clone(), &old_limit, new_limit)?; @@ -887,7 +887,7 @@ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?); let mut target_collection = >::try_get(collection_id)?; target_collection.check_is_internal()?; - target_collection.check_is_owner(&sender)?; + target_collection.check_is_owner_or_admin(&sender)?; let old_limit = &target_collection.permissions; target_collection.permissions = >::clamp_permissions(target_collection.mode.clone(), &old_limit, new_limit)?; --- a/pallets/unique/src/weights.rs +++ b/pallets/unique/src/weights.rs @@ -3,12 +3,13 @@ //! Autogenerated weights for pallet_unique //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-03-01, STEPS: `50`, REPEAT: 200, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2022-06-15, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 // Executed Command: // target/release/unique-collator // benchmark +// pallet // --pallet // pallet-unique // --wasm-execution @@ -18,7 +19,7 @@ // --template // .maintain/frame-weight-template.hbs // --steps=50 -// --repeat=200 +// --repeat=80 // --heap-pages=4096 // --output=./pallets/unique/src/weights.rs @@ -36,8 +37,6 @@ 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; @@ -45,9 +44,6 @@ 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_schema_version() -> Weight; fn set_collection_limits() -> Weight; } @@ -57,51 +53,43 @@ // Storage: Common CreatedCollectionCount (r:1 w:1) // Storage: Common DestroyedCollectionCount (r:1 w:0) // Storage: System Account (r:2 w:2) + // Storage: Common CollectionPropertyPermissions (r:0 w:1) + // Storage: Common CollectionProperties (r:0 w:1) // Storage: Common CollectionById (r:0 w:1) fn create_collection() -> Weight { - (28_929_000 as Weight) + (39_427_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) - .saturating_add(T::DbWeight::get().writes(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) } // Storage: Common CollectionById (r:1 w:1) + // Storage: Nonfungible TokenData (r:1 w:0) // Storage: Common DestroyedCollectionCount (r:1 w:1) // Storage: Nonfungible TokensMinted (r:0 w:1) // Storage: Nonfungible TokensBurnt (r:0 w:1) // Storage: Common AdminAmount (r:0 w:1) + // Storage: Common CollectionProperties (r:0 w:1) fn destroy_collection() -> Weight { - (40_303_000 as Weight) - .saturating_add(T::DbWeight::get().reads(2 as Weight)) - .saturating_add(T::DbWeight::get().writes(5 as Weight)) + (48_339_000 as Weight) + .saturating_add(T::DbWeight::get().reads(3 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) } // Storage: Common CollectionById (r:1 w:0) // Storage: Common Allowlist (r:0 w:1) fn add_to_allow_list() -> Weight { - (15_989_000 as Weight) + (17_379_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 { - (15_582_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 { - (14_846_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 { - (14_534_000 as Weight) + (17_490_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 { - (14_990_000 as Weight) + (17_701_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } @@ -109,7 +97,7 @@ // Storage: Common IsAdmin (r:1 w:1) // Storage: Common AdminAmount (r:1 w:1) fn add_collection_admin() -> Weight { - (19_957_000 as Weight) + (23_301_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } @@ -117,55 +105,37 @@ // Storage: Common IsAdmin (r:1 w:1) // Storage: Common AdminAmount (r:1 w:1) fn remove_collection_admin() -> Weight { - (21_209_000 as Weight) + (24_859_000 as Weight) .saturating_add(T::DbWeight::get().reads(3 as Weight)) .saturating_add(T::DbWeight::get().writes(2 as Weight)) } // Storage: Common CollectionById (r:1 w:1) fn set_collection_sponsor() -> Weight { - (14_963_000 as Weight) + (17_795_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 { - (14_478_000 as Weight) + (17_297_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 { - (14_393_000 as Weight) + (17_079_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 { - (7_309_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 { - (15_220_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 { - (14_984_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_schema_version() -> Weight { - (14_596_000 as Weight) + (9_734_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 { - (15_339_000 as Weight) + (17_998_000 as Weight) .saturating_add(T::DbWeight::get().reads(1 as Weight)) .saturating_add(T::DbWeight::get().writes(1 as Weight)) } @@ -176,51 +146,43 @@ // Storage: Common CreatedCollectionCount (r:1 w:1) // Storage: Common DestroyedCollectionCount (r:1 w:0) // Storage: System Account (r:2 w:2) + // Storage: Common CollectionPropertyPermissions (r:0 w:1) + // Storage: Common CollectionProperties (r:0 w:1) // Storage: Common CollectionById (r:0 w:1) fn create_collection() -> Weight { - (28_929_000 as Weight) + (39_427_000 as Weight) .saturating_add(RocksDbWeight::get().reads(4 as Weight)) - .saturating_add(RocksDbWeight::get().writes(4 as Weight)) + .saturating_add(RocksDbWeight::get().writes(6 as Weight)) } // Storage: Common CollectionById (r:1 w:1) + // Storage: Nonfungible TokenData (r:1 w:0) // Storage: Common DestroyedCollectionCount (r:1 w:1) // Storage: Nonfungible TokensMinted (r:0 w:1) // Storage: Nonfungible TokensBurnt (r:0 w:1) // Storage: Common AdminAmount (r:0 w:1) + // Storage: Common CollectionProperties (r:0 w:1) fn destroy_collection() -> Weight { - (40_303_000 as Weight) - .saturating_add(RocksDbWeight::get().reads(2 as Weight)) - .saturating_add(RocksDbWeight::get().writes(5 as Weight)) + (48_339_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(3 as Weight)) + .saturating_add(RocksDbWeight::get().writes(6 as Weight)) } // Storage: Common CollectionById (r:1 w:0) // Storage: Common Allowlist (r:0 w:1) fn add_to_allow_list() -> Weight { - (15_989_000 as Weight) + (17_379_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 { - (15_582_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 { - (14_846_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 { - (14_534_000 as Weight) + (17_490_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 { - (14_990_000 as Weight) + (17_701_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } @@ -228,7 +190,7 @@ // Storage: Common IsAdmin (r:1 w:1) // Storage: Common AdminAmount (r:1 w:1) fn add_collection_admin() -> Weight { - (19_957_000 as Weight) + (23_301_000 as Weight) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } @@ -236,55 +198,37 @@ // Storage: Common IsAdmin (r:1 w:1) // Storage: Common AdminAmount (r:1 w:1) fn remove_collection_admin() -> Weight { - (21_209_000 as Weight) + (24_859_000 as Weight) .saturating_add(RocksDbWeight::get().reads(3 as Weight)) .saturating_add(RocksDbWeight::get().writes(2 as Weight)) } // Storage: Common CollectionById (r:1 w:1) fn set_collection_sponsor() -> Weight { - (14_963_000 as Weight) + (17_795_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 { - (14_478_000 as Weight) + (17_297_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 { - (14_393_000 as Weight) + (17_079_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 { - (7_309_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 { - (15_220_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 { - (14_984_000 as Weight) + (9_734_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_schema_version() -> Weight { - (14_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_collection_limits() -> Weight { - (15_339_000 as Weight) + (17_998_000 as Weight) .saturating_add(RocksDbWeight::get().reads(1 as Weight)) .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } --- a/primitives/data-structs/src/lib.rs +++ b/primitives/data-structs/src/lib.rs @@ -39,15 +39,15 @@ // RMRK use rmrk_traits::{ CollectionInfo, NftInfo, ResourceInfo, PropertyInfo, BaseInfo, PartType, Theme, ThemeProperty, - ResourceTypes, BasicResource, ComposableResource, SlotResource, + ResourceTypes, BasicResource, ComposableResource, SlotResource, EquippableList, }; pub use rmrk_traits::{ primitives::{ CollectionId as RmrkCollectionId, NftId as RmrkNftId, BaseId as RmrkBaseId, - PartId as RmrkPartId, ResourceId as RmrkResourceId, + SlotId as RmrkSlotId, PartId as RmrkPartId, ResourceId as RmrkResourceId, }, NftChild as RmrkNftChild, AccountIdOrCollectionNftTuple as RmrkAccountIdOrCollectionNftTuple, - FixedPart as RmrkFixedPart, SlotPart as RmrkSlotPart, EquippableList as RmrkEquippableList, + FixedPart as RmrkFixedPart, SlotPart as RmrkSlotPart, }; mod bounded; @@ -104,15 +104,10 @@ pub const MAX_PROPERTY_VALUE_LENGTH: u32 = 32768; pub const MAX_PROPERTIES_PER_ITEM: u32 = 64; +pub const MAX_AUX_PROPERTY_VALUE_LENGTH: u32 = 2048; + pub const MAX_COLLECTION_PROPERTIES_SIZE: u32 = 40960; pub const MAX_TOKEN_PROPERTIES_SIZE: u32 = 32768; - -// RMRK constants -pub const RMRK_STRING_LIMIT: u32 = 128; -pub const RMRK_COLLECTION_SYMBOL_LIMIT: u32 = 100; -pub const RMRK_RESOURCE_SYMBOL_LIMIT: u32 = 10; -pub const RMRK_KEY_LIMIT: u32 = 32; -pub const RMRK_VALUE_LIMIT: u32 = 256; /// How much items can be created per single /// create_many call @@ -416,8 +411,11 @@ .min(MAX_SPONSOR_TIMEOUT) } pub fn owner_can_transfer(&self) -> bool { - self.owner_can_transfer.unwrap_or(true) + self.owner_can_transfer.unwrap_or(false) } + pub fn owner_can_transfer_instaled(&self) -> bool { + self.owner_can_transfer.is_some() + } pub fn owner_can_destroy(&self) -> bool { self.owner_can_destroy.unwrap_or(true) } @@ -454,7 +452,7 @@ pub fn nesting(&self) -> &NestingPermissions { static DEFAULT: NestingPermissions = NestingPermissions { token_owner: false, - admin: false, + collection_admin: false, restricted: None, permissive: false, @@ -497,7 +495,7 @@ /// Owner of token can nest tokens under it pub token_owner: bool, /// Admin of token collection can nest tokens under token - pub admin: bool, + pub collection_admin: bool, /// If set - only tokens from specified collections can be nested pub restricted: Option, @@ -658,8 +656,12 @@ } } -pub type PropertyKey = BoundedVec>; -pub type PropertyValue = BoundedVec>; +pub type BoundedBytes = BoundedVec; + +pub type AuxPropertyValue = BoundedBytes>; + +pub type PropertyKey = BoundedBytes>; +pub type PropertyValue = BoundedBytes>; #[derive(Encode, Decode, TypeInfo, Debug, MaxEncodedLen, PartialEq, Clone)] #[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] @@ -719,7 +721,7 @@ EmptyPropertyKey, } -#[derive(Clone, Copy)] +#[derive(Encode, Decode, MaxEncodedLen, TypeInfo, PartialEq, Clone, Copy)] pub enum PropertyScope { None, Rmrk, @@ -812,7 +814,7 @@ for byte in key.as_slice().iter() { let byte = *byte; - if !byte.is_ascii_alphanumeric() && byte != b'_' && byte != b'-' { + if !byte.is_ascii_alphanumeric() && byte != b'_' && byte != b'-' && byte != b'.' { return Err(PropertiesError::InvalidCharacterInPropertyKey); } } @@ -946,19 +948,25 @@ #[derive(PartialEq, TypeInfo)] pub const RmrkStringLimit: u32 = 128; #[derive(PartialEq)] - pub const RmrkCollectionSymbolLimit: u32 = 100; + pub const RmrkCollectionSymbolLimit: u32 = MAX_TOKEN_PREFIX_LENGTH; #[derive(PartialEq)] pub const RmrkResourceSymbolLimit: u32 = 10; #[derive(PartialEq)] + pub const RmrkBaseSymbolLimit: u32 = MAX_TOKEN_PREFIX_LENGTH; + #[derive(PartialEq)] pub const RmrkKeyLimit: u32 = 32; #[derive(PartialEq)] pub const RmrkValueLimit: u32 = 256; #[derive(PartialEq)] pub const RmrkMaxCollectionsEquippablePerPart: u32 = 100; #[derive(PartialEq)] - pub const RmrkPartsLimit: u32 = 3; + pub const MaxPropertiesPerTheme: u32 = 5; + #[derive(PartialEq)] + pub const RmrkPartsLimit: u32 = 25; #[derive(PartialEq)] - pub const RmrkMaxPriorities: u32 = 3; + pub const RmrkMaxPriorities: u32 = 25; + #[derive(PartialEq)] + pub const MaxResourcesOnMint: u32 = 100; } impl From for CollectionId { @@ -979,10 +987,13 @@ pub type RmrkResourceInfo = ResourceInfo; pub type RmrkPropertyInfo = PropertyInfo; pub type RmrkBaseInfo = BaseInfo; -pub type RmrkPartType = - PartType>; +pub type BoundedEquippableCollectionIds = + BoundedVec; +pub type RmrkPartType = PartType; +pub type RmrkEquippableList = EquippableList; pub type RmrkThemeProperty = ThemeProperty; pub type RmrkTheme = Theme>; +pub type RmrkBoundedTheme = Theme>; pub type RmrkResourceTypes = ResourceTypes; pub type RmrkBasicResource = BasicResource; @@ -991,6 +1002,7 @@ pub type RmrkString = BoundedVec; pub type RmrkCollectionSymbol = BoundedVec; +pub type RmrkBaseSymbol = BoundedVec; pub type RmrkKeyString = BoundedVec; pub type RmrkValueString = BoundedVec; pub type RmrkBoundedResource = BoundedVec; --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -6,7 +6,7 @@ license = 'All Rights Reserved' name = 'unique-runtime-common' repository = 'https://github.com/UniqueNetwork/unique-chain' -version = '0.9.22' +version = '0.9.23' [features] default = ['std'] @@ -89,6 +89,10 @@ default-features = false path = "../../pallets/refungible" +[dependencies.pallet-unique-scheduler] +default-features = false +path = "../../pallets/scheduler" + [dependencies.up-data-structs] default-features = false path = "../../primitives/data-structs" --- a/runtime/common/src/constants.rs +++ b/runtime/common/src/constants.rs @@ -38,7 +38,7 @@ pub const WEIGHT_TO_FEE_COEFF: u32 = 142_688_000; // Targeting 0.15 UNQ per transfer -pub const MIN_GAS_PRICE: u64 = 1_018_751_825_264; +pub const MIN_GAS_PRICE: u64 = 1_019_493_469_850; /// We assume that ~10% of the block weight is consumed by `on_initalize` handlers. /// This is used to limit the maximal weight of a single extrinsic. --- a/runtime/common/src/dispatch.rs +++ b/runtime/common/src/dispatch.rs @@ -112,6 +112,7 @@ + pallet_fungible::Config + pallet_nonfungible::Config + pallet_refungible::Config, + T::AccountId: From<[u8; 32]>, { fn is_reserved(target: &H160) -> bool { map_eth_to_id(target).is_some() --- a/runtime/common/src/runtime_apis.rs +++ b/runtime/common/src/runtime_apis.rs @@ -144,396 +144,6 @@ } } - impl rmrk_rpc::RmrkApi< - Block, - AccountId, - RmrkCollectionInfo, - RmrkInstanceInfo, - RmrkResourceInfo, - RmrkPropertyInfo, - RmrkBaseInfo, - RmrkPartType, - RmrkTheme - > for Runtime { - fn last_collection_idx() -> Result { - Ok(RmrkCore::last_collection_idx()) - } - - fn collection_by_id(collection_id: RmrkCollectionId) -> Result>, DispatchError> { - use pallet_proxy_rmrk_core::{RmrkProperty, misc::CollectionType}; - use pallet_common::CommonCollectionOperations; - - let (collection, collection_id) = match RmrkCore::get_typed_nft_collection_mapped(collection_id, CollectionType::Regular) { - Ok(c) => c, - Err(_) => return Ok(None), - }; - - let nfts_count = collection.total_supply(); - - Ok(Some(RmrkCollectionInfo { - issuer: collection.owner.clone(), - metadata: RmrkCore::get_collection_property_decoded(collection_id, RmrkProperty::Metadata)?, - max: collection.limits.token_limit, - symbol: RmrkCore::rebind(&collection.token_prefix)?, - nfts_count - })) - } - - fn nft_by_id(collection_id: RmrkCollectionId, nft_by_id: RmrkNftId) -> Result>, DispatchError> { - use up_data_structs::mapping::TokenAddressMapping; - use pallet_proxy_rmrk_core::{RmrkProperty, misc::CollectionType}; - use pallet_common::CommonCollectionOperations; - - let (collection, collection_id) = match RmrkCore::get_typed_nft_collection_mapped(collection_id, CollectionType::Regular) { - Ok(c) => c, - Err(_) => return Ok(None), - }; - - let nft_id = TokenId(nft_by_id); - if !RmrkCore::nft_exists(collection_id, nft_id) { return Ok(None); } - - let owner = match collection.token_owner(nft_id) { - Some(owner) => match ::CrossTokenAddressMapping::address_to_token(&owner) { - Some((col, tok)) => { - let rmrk_collection = RmrkCore::rmrk_collection_id(col)?; - - RmrkAccountIdOrCollectionNftTuple::CollectionAndNftTuple(rmrk_collection, tok.0) - } - None => RmrkAccountIdOrCollectionNftTuple::AccountId(owner.as_sub().clone()) - }, - None => return Ok(None) - }; - - Ok(Some(RmrkInstanceInfo { - owner: owner, - royalty: RmrkCore::get_nft_property_decoded(collection_id, nft_id, RmrkProperty::RoyaltyInfo)?, - metadata: RmrkCore::get_nft_property_decoded(collection_id, nft_id, RmrkProperty::Metadata)?, - equipped: RmrkCore::get_nft_property_decoded(collection_id, nft_id, RmrkProperty::Equipped)?, - pending: RmrkCore::get_nft_property_decoded(collection_id, nft_id, RmrkProperty::PendingNftAccept)?, - })) - } - - fn account_tokens(account_id: AccountId, collection_id: RmrkCollectionId) -> Result, DispatchError> { - use pallet_proxy_rmrk_core::{RmrkProperty, misc::CollectionType}; - use pallet_common::CommonCollectionOperations; - - let cross_account_id = CrossAccountId::from_sub(account_id); - - let (collection, collection_id) = match RmrkCore::get_typed_nft_collection_mapped(collection_id, CollectionType::Regular) { - Ok(c) => c, - Err(_) => return Ok(Vec::new()), - }; - - let tokens = collection.account_tokens(cross_account_id) - .into_iter() - .filter(|token| { - let is_pending = RmrkCore::get_nft_property_decoded( - collection_id, - *token, - RmrkProperty::PendingNftAccept - ).unwrap_or(true); - - !is_pending - }) - .map(|token| token.0) - .collect(); - - Ok(tokens) - } - - fn nft_children(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Result, DispatchError> { - use pallet_proxy_rmrk_core::RmrkProperty; - - let collection_id = match RmrkCore::unique_collection_id(collection_id) { - Ok(id) => id, - Err(_) => return Ok(Vec::new()) - }; - let nft_id = TokenId(nft_id); - if !RmrkCore::nft_exists(collection_id, nft_id) { return Ok(Vec::new()); } - - Ok( - pallet_nonfungible::TokenChildren::::iter_prefix((collection_id, nft_id)) - .filter_map(|((child_collection, child_token), _)| { - let is_pending = RmrkCore::get_nft_property_decoded( - child_collection, - child_token, - RmrkProperty::PendingNftAccept - ).ok()?; - - if is_pending { - return None; - } - - let rmrk_child_collection = RmrkCore::rmrk_collection_id( - child_collection - ).ok()?; - - Some(RmrkNftChild { - collection_id: rmrk_child_collection, - nft_id: child_token.0, - }) - }).collect() - ) - } - - fn collection_properties(collection_id: RmrkCollectionId, filter_keys: Option>) -> Result, DispatchError> { - use pallet_proxy_rmrk_core::misc::CollectionType; - - let collection_id = match RmrkCore::unique_collection_id(collection_id) { - Ok(id) => id, - Err(_) => return Ok(Vec::new()) - }; - if RmrkCore::ensure_collection_type(collection_id, CollectionType::Regular).is_err() { - return Ok(Vec::new()); - } - - let properties = RmrkCore::filter_user_properties( - collection_id, - /* token_id = */ None, - filter_keys, - |key, value| RmrkPropertyInfo { - key, - value - } - )?; - - Ok(properties) - } - - fn nft_properties(collection_id: RmrkCollectionId, nft_id: RmrkNftId, filter_keys: Option>) -> Result, DispatchError> { - use pallet_proxy_rmrk_core::misc::NftType; - - let collection_id = match RmrkCore::unique_collection_id(collection_id) { - Ok(id) => id, - Err(_) => return Ok(Vec::new()) - }; - let token_id = TokenId(nft_id); - - if RmrkCore::ensure_nft_type(collection_id, token_id, NftType::Regular).is_err() { - return Ok(Vec::new()); - } - - let properties = RmrkCore::filter_user_properties( - collection_id, - Some(token_id), - filter_keys, - |key, value| RmrkPropertyInfo { - key, - value - } - )?; - - Ok(properties) - } - - fn nft_resources(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Result, DispatchError> { - use pallet_proxy_rmrk_core::{RmrkProperty, misc::{CollectionType, NftType, ResourceType}}; - use pallet_common::CommonCollectionOperations; - - let collection_id = match RmrkCore::unique_collection_id(collection_id) { - Ok(id) => id, - Err(_) => return Ok(Vec::new()) - }; - if RmrkCore::ensure_collection_type(collection_id, CollectionType::Regular).is_err() { return Ok(Vec::new()); } - - let nft_id = TokenId(nft_id); - if RmrkCore::ensure_nft_type(collection_id, nft_id, NftType::Regular).is_err() { return Ok(Vec::new()); } - - let res_collection_id: CollectionId = RmrkCore::get_nft_property_decoded(collection_id, nft_id, RmrkProperty::ResourceCollection)?; - let resource_collection = RmrkCore::get_typed_nft_collection(res_collection_id, CollectionType::Resource)?; - - let resources = resource_collection - .collection_tokens() - .iter() - .filter_map(|(res_id)| Some(RmrkResourceInfo { - id: res_id.0, - pending: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::PendingResourceAccept).ok()?, - pending_removal: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::PendingResourceRemoval).ok()?, - resource: match RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::ResourceType).ok()? { - ResourceType::Basic => RmrkResourceTypes::Basic(RmrkBasicResource { - src: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::Src).ok()?, - metadata: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::Metadata).ok()?, - license: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::License).ok()?, - thumb: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::Thumb).ok()?, - }), - ResourceType::Composable => RmrkResourceTypes::Composable(RmrkComposableResource { - parts: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::Parts).ok()?, - base: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::Base).ok()?, - src: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::Src).ok()?, - metadata: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::Metadata).ok()?, - license: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::License).ok()?, - thumb: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::Thumb).ok()?, - }), - ResourceType::Slot => RmrkResourceTypes::Slot(RmrkSlotResource { - base: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::Base).ok()?, - src: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::Src).ok()?, - metadata: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::Metadata).ok()?, - slot: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::Slot).ok()?, - license: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::License).ok()?, - thumb: RmrkCore::get_nft_property_decoded(res_collection_id, *res_id, RmrkProperty::Thumb).ok()?, - }), - }, - })) - .collect(); - - Ok(resources) - } - - fn nft_resource_priority(collection_id: RmrkCollectionId, nft_id: RmrkNftId, resource_id: RmrkResourceId) -> Result, DispatchError> { - use pallet_proxy_rmrk_core::{RmrkProperty, misc::{CollectionType, NftType}}; - - let collection_id = match RmrkCore::unique_collection_id(collection_id) { - Ok(id) => id, - Err(_) => return Ok(None) - }; - if RmrkCore::ensure_collection_type(collection_id, CollectionType::Regular).is_err() { return Ok(None); } - - let nft_id = TokenId(nft_id); - if RmrkCore::ensure_nft_type(collection_id, nft_id, NftType::Regular).is_err() { return Ok(None); } - - let priorities: Vec<_> = RmrkCore::get_nft_property_decoded(collection_id, nft_id, RmrkProperty::ResourcePriorities)?; - Ok( - priorities.into_iter() - .enumerate() - .find(|(_, id)| *id == resource_id) - .map(|(priority, _): (usize, RmrkResourceId)| priority as u32) - ) - } - - fn base(base_id: RmrkBaseId) -> Result>, DispatchError> { - use pallet_proxy_rmrk_core::{ - RmrkProperty, misc::{CollectionType}, - }; - - let (collection, collection_id) = match RmrkCore::get_typed_nft_collection_mapped(base_id, CollectionType::Base) { - Ok(c) => c, - Err(_) => return Ok(None), - }; - - Ok(Some(RmrkBaseInfo { - issuer: collection.owner.clone(), - base_type: RmrkCore::get_collection_property_decoded(collection_id, RmrkProperty::BaseType)?, - symbol: RmrkCore::rebind(&collection.token_prefix)?, - })) - } - - fn base_parts(base_id: RmrkBaseId) -> Result, DispatchError> { - use pallet_proxy_rmrk_core::{RmrkProperty, misc::{CollectionType, NftType}}; - use pallet_common::CommonCollectionOperations; - - let (collection, collection_id) = match RmrkCore::get_typed_nft_collection_mapped(base_id, CollectionType::Base) { - Ok(c) => c, - Err(_) => return Ok(Vec::new()), - }; - - let parts = collection.collection_tokens() - .into_iter() - .filter_map(|token_id| { - let nft_type = RmrkCore::get_nft_type(collection_id, token_id).ok()?; - - match nft_type { - NftType::FixedPart => Some(RmrkPartType::FixedPart(RmrkFixedPart { - id: RmrkCore::get_nft_property_decoded(collection_id, token_id, RmrkProperty::ExternalPartId).ok()?, - src: RmrkCore::get_nft_property_decoded(collection_id, token_id, RmrkProperty::Src).ok()?, - z: RmrkCore::get_nft_property_decoded(collection_id, token_id, RmrkProperty::ZIndex).ok()?, - })), - NftType::SlotPart => Some(RmrkPartType::SlotPart(RmrkSlotPart { - id: RmrkCore::get_nft_property_decoded(collection_id, token_id, RmrkProperty::ExternalPartId).ok()?, - src: RmrkCore::get_nft_property_decoded(collection_id, token_id, RmrkProperty::Src).ok()?, - z: RmrkCore::get_nft_property_decoded(collection_id, token_id, RmrkProperty::ZIndex).ok()?, - equippable: RmrkCore::get_nft_property_decoded(collection_id, token_id, RmrkProperty::EquippableList).ok()?, - })), - _ => None - } - }) - .collect(); - - Ok(parts) - } - - fn theme_names(base_id: RmrkBaseId) -> Result, DispatchError> { - use pallet_proxy_rmrk_core::{RmrkProperty, misc::CollectionType}; - use pallet_common::CommonCollectionOperations; - - let (collection, collection_id) = match RmrkCore::get_typed_nft_collection_mapped(base_id, CollectionType::Base) { - Ok(c) => c, - Err(_) => return Ok(Vec::new()), - }; - - let theme_names = collection.collection_tokens() - .iter() - .filter_map(|token_id| { - let nft_type = RmrkCore::get_nft_type(collection_id, *token_id).ok()?; - - match nft_type { - Theme => RmrkCore::get_nft_property_decoded(collection_id, *token_id, RmrkProperty::ThemeName).ok(), - _ => None - } - }) - .collect(); - - Ok(theme_names) - } - - fn theme(base_id: RmrkBaseId, theme_name: RmrkThemeName, filter_keys: Option>) -> Result, DispatchError> { - use pallet_proxy_rmrk_core::{ - RmrkProperty, - misc::{CollectionType, NftType} - }; - use pallet_common::CommonCollectionOperations; - - let (collection, collection_id) = match RmrkCore::get_typed_nft_collection_mapped(base_id, CollectionType::Base) { - Ok(c) => c, - Err(_) => return Ok(None), - }; - - let theme_info = collection.collection_tokens() - .into_iter() - .find_map(|token_id| { - RmrkCore::ensure_nft_type(collection_id, token_id, NftType::Theme).ok()?; - - let name: RmrkString = RmrkCore::get_nft_property_decoded( - collection_id, token_id, RmrkProperty::ThemeName - ).ok()?; - - if name == theme_name { - Some((name, token_id)) - } else { - None - } - }); - - let (name, theme_id) = match theme_info { - Some((name, theme_id)) => (name, theme_id), - None => return Ok(None) - }; - - let properties = RmrkCore::filter_user_properties( - collection_id, - Some(theme_id), - filter_keys, - |key, value| RmrkThemeProperty { - key, - value - } - )?; - - let inherit = RmrkCore::get_nft_property_decoded( - collection_id, - theme_id, - RmrkProperty::ThemeInherit - )?; - - let theme = RmrkTheme { - name, - properties, - inherit, - }; - - Ok(Some(theme)) - } - } - impl sp_api::Core for Runtime { fn version() -> RuntimeVersion { VERSION @@ -843,7 +453,14 @@ list_benchmark!(list, extra, pallet_fungible, Fungible); list_benchmark!(list, extra, pallet_refungible, Refungible); list_benchmark!(list, extra, pallet_nonfungible, Nonfungible); + list_benchmark!(list, extra, pallet_unique_scheduler, Scheduler); + + #[cfg(not(feature = "unique-runtime"))] list_benchmark!(list, extra, pallet_proxy_rmrk_core, RmrkCore); + + #[cfg(not(feature = "unique-runtime"))] + list_benchmark!(list, extra, pallet_proxy_rmrk_equip, RmrkEquip); + // list_benchmark!(list, extra, pallet_evm_coder_substrate, EvmCoderSubstrate); let storage_info = AllPalletsReversedWithSystemFirst::storage_info(); @@ -887,7 +504,14 @@ add_benchmark!(params, batches, pallet_fungible, Fungible); add_benchmark!(params, batches, pallet_refungible, Refungible); add_benchmark!(params, batches, pallet_nonfungible, Nonfungible); + add_benchmark!(params, batches, pallet_unique_scheduler, Scheduler); + + #[cfg(not(feature = "unique-runtime"))] add_benchmark!(params, batches, pallet_proxy_rmrk_core, RmrkCore); + + #[cfg(not(feature = "unique-runtime"))] + add_benchmark!(params, batches, pallet_proxy_rmrk_equip, RmrkEquip); + // add_benchmark!(params, batches, pallet_evm_coder_substrate, EvmCoderSubstrate); if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } --- a/runtime/common/src/weights.rs +++ b/runtime/common/src/weights.rs @@ -70,8 +70,8 @@ dispatch_weight::() + max_weight_of!(delete_token_properties(amount)) } - fn set_property_permissions(amount: u32) -> Weight { - dispatch_weight::() + max_weight_of!(set_property_permissions(amount)) + fn set_token_property_permissions(amount: u32) -> Weight { + dispatch_weight::() + max_weight_of!(set_token_property_permissions(amount)) } fn transfer() -> Weight { --- a/runtime/opal/Cargo.toml +++ b/runtime/opal/Cargo.toml @@ -10,7 +10,7 @@ license = 'GPLv3' name = 'opal-runtime' repository = 'https://github.com/UniqueNetwork/unique-chain' -version = '0.9.22' +version = '0.9.23' [package.metadata.docs.rs] targets = ['x86_64-unknown-linux-gnu'] @@ -34,8 +34,10 @@ 'pallet-refungible/runtime-benchmarks', 'pallet-nonfungible/runtime-benchmarks', 'pallet-proxy-rmrk-core/runtime-benchmarks', + 'pallet-proxy-rmrk-equip/runtime-benchmarks', 'pallet-unique/runtime-benchmarks', 'pallet-inflation/runtime-benchmarks', + 'pallet-unique-scheduler/runtime-benchmarks', 'pallet-xcm/runtime-benchmarks', 'sp-runtime/runtime-benchmarks', 'xcm-builder/runtime-benchmarks', @@ -93,7 +95,7 @@ 'pallet-proxy-rmrk-core/std', 'pallet-proxy-rmrk-equip/std', 'pallet-unique/std', - 'pallet-unq-scheduler/std', + 'pallet-unique-scheduler/std', 'pallet-charge-transaction/std', 'up-data-structs/std', 'sp-api/std', @@ -412,7 +414,7 @@ pallet-nonfungible = { default-features = false, path = "../../pallets/nonfungible" } pallet-proxy-rmrk-core = { default-features = false, path = "../../pallets/proxy-rmrk-core", package = "pallet-rmrk-core" } pallet-proxy-rmrk-equip = { default-features = false, path = "../../pallets/proxy-rmrk-equip", package = "pallet-rmrk-equip" } -pallet-unq-scheduler = { path = '../../pallets/scheduler', default-features = false } +pallet-unique-scheduler = { path = '../../pallets/scheduler', default-features = false } # pallet-contract-helpers = { path = '../pallets/contract-helpers', default-features = false, version = '0.1.0' } pallet-charge-transaction = { git = "https://github.com/uniquenetwork/pallet-sponsoring", branch = "polkadot-v0.9.23", package = "pallet-template-transaction-payment", default-features = false, version = "3.0.0" } pallet-evm-migration = { path = '../../pallets/evm-migration', default-features = false } --- a/runtime/opal/src/lib.rs +++ b/runtime/opal/src/lib.rs @@ -69,16 +69,14 @@ WeightToFee, }, }; -use pallet_unq_scheduler::DispatchCall; +use pallet_unique_scheduler::DispatchCall; use up_data_structs::{ CollectionId, TokenId, TokenData, Property, PropertyKeyPermission, CollectionLimits, CollectionStats, RpcCollection, mapping::{EvmTokenAddressMapping, CrossTokenAddressMapping}, TokenChild, RmrkCollectionInfo, RmrkInstanceInfo, RmrkResourceInfo, RmrkPropertyInfo, - RmrkBaseInfo, RmrkPartType, RmrkTheme, RmrkThemeName, RmrkThemeProperty, RmrkCollectionId, - RmrkNftId, RmrkAccountIdOrCollectionNftTuple, RmrkNftChild, RmrkPropertyKey, RmrkResourceTypes, - RmrkBasicResource, RmrkComposableResource, RmrkSlotResource, RmrkResourceId, RmrkBaseId, - RmrkFixedPart, RmrkSlotPart, RmrkString, + RmrkBaseInfo, RmrkPartType, RmrkTheme, RmrkThemeName, RmrkCollectionId, RmrkNftId, + RmrkNftChild, RmrkPropertyKey, RmrkResourceId, RmrkBaseId, }; // use pallet_contracts::weights::WeightInfo; @@ -194,7 +192,7 @@ spec_name: create_runtime_str!(RUNTIME_NAME), impl_name: create_runtime_str!(RUNTIME_NAME), authoring_version: 1, - spec_version: 922000, + spec_version: 923000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, @@ -920,6 +918,7 @@ } impl pallet_proxy_rmrk_equip::Config for Runtime { + type WeightInfo = pallet_proxy_rmrk_equip::weights::SubstrateWeight; type Event = Event; } @@ -965,7 +964,7 @@ } pub struct SchedulerPaymentExecutor; -impl +impl DispatchCall for SchedulerPaymentExecutor where ::Call: Member @@ -975,13 +974,13 @@ + From>, SelfContainedSignedInfo: Send + Sync + 'static, Call: From<::Call> - + From<::Call> + + From<::Call> + SelfContainedCall, sp_runtime::AccountId32: From<::AccountId>, { fn dispatch_call( signer: ::AccountId, - call: ::Call, + call: ::Call, ) -> Result< Result>, TransactionValidityError, @@ -1007,7 +1006,7 @@ fn reserve_balance( id: [u8; 16], sponsor: ::AccountId, - call: ::Call, + call: ::Call, count: u32, ) -> Result<(), DispatchError> { let dispatch_info = call.get_dispatch_info(); @@ -1024,7 +1023,7 @@ fn pay_for_call( id: [u8; 16], sponsor: ::AccountId, - call: ::Call, + call: ::Call, ) -> Result { let dispatch_info = call.get_dispatch_info(); let weight: Balance = ChargeTransactionPayment::traditional_fee(0, &dispatch_info, 0); @@ -1065,7 +1064,7 @@ } } -impl pallet_unq_scheduler::Config for Runtime { +impl pallet_unique_scheduler::Config for Runtime { type Event = Event; type Origin = Origin; type Currency = Balances; @@ -1154,7 +1153,7 @@ // Unique Pallets Inflation: pallet_inflation::{Pallet, Call, Storage} = 60, Unique: pallet_unique::{Pallet, Call, Storage, Event} = 61, - Scheduler: pallet_unq_scheduler::{Pallet, Call, Storage, Event} = 62, + Scheduler: pallet_unique_scheduler::{Pallet, Call, Storage, Event} = 62, // free = 63 Charging: pallet_charge_transaction::{Pallet, Call, Storage } = 64, // ContractHelpers: pallet_contract_helpers::{Pallet, Call, Storage} = 65, @@ -1311,7 +1310,73 @@ }}; } -impl_common_runtime_apis!(); +impl_common_runtime_apis! { + #![custom_apis] + + impl rmrk_rpc::RmrkApi< + Block, + AccountId, + RmrkCollectionInfo, + RmrkInstanceInfo, + RmrkResourceInfo, + RmrkPropertyInfo, + RmrkBaseInfo, + RmrkPartType, + RmrkTheme + > for Runtime { + fn last_collection_idx() -> Result { + pallet_proxy_rmrk_core::rpc::last_collection_idx::() + } + + fn collection_by_id(collection_id: RmrkCollectionId) -> Result>, DispatchError> { + pallet_proxy_rmrk_core::rpc::collection_by_id::(collection_id) + } + + fn nft_by_id(collection_id: RmrkCollectionId, nft_by_id: RmrkNftId) -> Result>, DispatchError> { + pallet_proxy_rmrk_core::rpc::nft_by_id::(collection_id, nft_by_id) + } + + fn account_tokens(account_id: AccountId, collection_id: RmrkCollectionId) -> Result, DispatchError> { + pallet_proxy_rmrk_core::rpc::account_tokens::(account_id, collection_id) + } + + fn nft_children(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Result, DispatchError> { + pallet_proxy_rmrk_core::rpc::nft_children::(collection_id, nft_id) + } + + fn collection_properties(collection_id: RmrkCollectionId, filter_keys: Option>) -> Result, DispatchError> { + pallet_proxy_rmrk_core::rpc::collection_properties::(collection_id, filter_keys) + } + + fn nft_properties(collection_id: RmrkCollectionId, nft_id: RmrkNftId, filter_keys: Option>) -> Result, DispatchError> { + pallet_proxy_rmrk_core::rpc::nft_properties::(collection_id, nft_id, filter_keys) + } + + fn nft_resources(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Result, DispatchError> { + pallet_proxy_rmrk_core::rpc::nft_resources::(collection_id, nft_id) + } + + fn nft_resource_priority(collection_id: RmrkCollectionId, nft_id: RmrkNftId, resource_id: RmrkResourceId) -> Result, DispatchError> { + pallet_proxy_rmrk_core::rpc::nft_resource_priority::(collection_id, nft_id, resource_id) + } + + fn base(base_id: RmrkBaseId) -> Result>, DispatchError> { + pallet_proxy_rmrk_equip::rpc::base::(base_id) + } + + fn base_parts(base_id: RmrkBaseId) -> Result, DispatchError> { + pallet_proxy_rmrk_equip::rpc::base_parts::(base_id) + } + + fn theme_names(base_id: RmrkBaseId) -> Result, DispatchError> { + pallet_proxy_rmrk_equip::rpc::theme_names::(base_id) + } + + fn theme(base_id: RmrkBaseId, theme_name: RmrkThemeName, filter_keys: Option>) -> Result, DispatchError> { + pallet_proxy_rmrk_equip::rpc::theme::(base_id, theme_name, filter_keys) + } + } +} struct CheckInherents; --- a/runtime/quartz/Cargo.toml +++ b/runtime/quartz/Cargo.toml @@ -10,7 +10,7 @@ license = 'GPLv3' name = 'quartz-runtime' repository = 'https://github.com/UniqueNetwork/unique-chain' -version = '0.9.22' +version = '0.9.23' [package.metadata.docs.rs] targets = ['x86_64-unknown-linux-gnu'] @@ -37,6 +37,7 @@ 'pallet-proxy-rmrk-equip/runtime-benchmarks', 'pallet-unique/runtime-benchmarks', 'pallet-inflation/runtime-benchmarks', + 'pallet-unique-scheduler/runtime-benchmarks', 'pallet-xcm/runtime-benchmarks', 'sp-runtime/runtime-benchmarks', 'xcm-builder/runtime-benchmarks', @@ -94,7 +95,7 @@ 'pallet-proxy-rmrk-core/std', 'pallet-proxy-rmrk-equip/std', 'pallet-unique/std', - 'pallet-unq-scheduler/std', + 'pallet-unique-scheduler/std', 'pallet-charge-transaction/std', 'up-data-structs/std', 'sp-api/std', @@ -419,7 +420,7 @@ pallet-nonfungible = { default-features = false, path = "../../pallets/nonfungible" } pallet-proxy-rmrk-core = { default-features = false, path = "../../pallets/proxy-rmrk-core", package = "pallet-rmrk-core" } pallet-proxy-rmrk-equip = { default-features = false, path = "../../pallets/proxy-rmrk-equip", package = "pallet-rmrk-equip" } -pallet-unq-scheduler = { path = '../../pallets/scheduler', default-features = false } +pallet-unique-scheduler = { path = '../../pallets/scheduler', default-features = false } # pallet-contract-helpers = { path = '../pallets/contract-helpers', default-features = false, version = '0.1.0' } pallet-charge-transaction = { git = "https://github.com/uniquenetwork/pallet-sponsoring", branch = "polkadot-v0.9.23", package = "pallet-template-transaction-payment", default-features = false, version = "3.0.0" } pallet-evm-migration = { path = '../../pallets/evm-migration', default-features = false } --- a/runtime/quartz/src/lib.rs +++ b/runtime/quartz/src/lib.rs @@ -69,16 +69,14 @@ WeightToFee, }, }; -use pallet_unq_scheduler::DispatchCall; +use pallet_unique_scheduler::DispatchCall; use up_data_structs::{ CollectionId, TokenId, TokenData, Property, PropertyKeyPermission, CollectionLimits, CollectionStats, RpcCollection, mapping::{EvmTokenAddressMapping, CrossTokenAddressMapping}, TokenChild, RmrkCollectionInfo, RmrkInstanceInfo, RmrkResourceInfo, RmrkPropertyInfo, - RmrkBaseInfo, RmrkPartType, RmrkTheme, RmrkThemeName, RmrkThemeProperty, RmrkCollectionId, - RmrkNftId, RmrkAccountIdOrCollectionNftTuple, RmrkNftChild, RmrkPropertyKey, RmrkResourceTypes, - RmrkBasicResource, RmrkComposableResource, RmrkSlotResource, RmrkResourceId, RmrkBaseId, - RmrkFixedPart, RmrkSlotPart, RmrkString, + RmrkBaseInfo, RmrkPartType, RmrkTheme, RmrkThemeName, RmrkCollectionId, RmrkNftId, + RmrkNftChild, RmrkPropertyKey, RmrkResourceId, RmrkBaseId, }; // use pallet_contracts::weights::WeightInfo; @@ -193,7 +191,7 @@ spec_name: create_runtime_str!(RUNTIME_NAME), impl_name: create_runtime_str!(RUNTIME_NAME), authoring_version: 1, - spec_version: 922000, + spec_version: 923000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, @@ -924,6 +922,7 @@ } impl pallet_proxy_rmrk_equip::Config for Runtime { + type WeightInfo = pallet_proxy_rmrk_equip::weights::SubstrateWeight; type Event = Event; } @@ -969,7 +968,7 @@ } pub struct SchedulerPaymentExecutor; -impl +impl DispatchCall for SchedulerPaymentExecutor where ::Call: Member @@ -979,13 +978,13 @@ + From>, SelfContainedSignedInfo: Send + Sync + 'static, Call: From<::Call> - + From<::Call> + + From<::Call> + SelfContainedCall, sp_runtime::AccountId32: From<::AccountId>, { fn dispatch_call( signer: ::AccountId, - call: ::Call, + call: ::Call, ) -> Result< Result>, TransactionValidityError, @@ -1011,7 +1010,7 @@ fn reserve_balance( id: [u8; 16], sponsor: ::AccountId, - call: ::Call, + call: ::Call, count: u32, ) -> Result<(), DispatchError> { let dispatch_info = call.get_dispatch_info(); @@ -1028,7 +1027,7 @@ fn pay_for_call( id: [u8; 16], sponsor: ::AccountId, - call: ::Call, + call: ::Call, ) -> Result { let dispatch_info = call.get_dispatch_info(); let weight: Balance = ChargeTransactionPayment::traditional_fee(0, &dispatch_info, 0); @@ -1069,7 +1068,7 @@ } } -impl pallet_unq_scheduler::Config for Runtime { +impl pallet_unique_scheduler::Config for Runtime { type Event = Event; type Origin = Origin; type Currency = Balances; @@ -1157,7 +1156,7 @@ // Unique Pallets Inflation: pallet_inflation::{Pallet, Call, Storage} = 60, Unique: pallet_unique::{Pallet, Call, Storage, Event} = 61, - Scheduler: pallet_unq_scheduler::{Pallet, Call, Storage, Event} = 62, + Scheduler: pallet_unique_scheduler::{Pallet, Call, Storage, Event} = 62, // free = 63 Charging: pallet_charge_transaction::{Pallet, Call, Storage } = 64, // ContractHelpers: pallet_contract_helpers::{Pallet, Call, Storage} = 65, @@ -1316,7 +1315,73 @@ }}; } -impl_common_runtime_apis!(); +impl_common_runtime_apis! { + #![custom_apis] + + impl rmrk_rpc::RmrkApi< + Block, + AccountId, + RmrkCollectionInfo, + RmrkInstanceInfo, + RmrkResourceInfo, + RmrkPropertyInfo, + RmrkBaseInfo, + RmrkPartType, + RmrkTheme + > for Runtime { + fn last_collection_idx() -> Result { + pallet_proxy_rmrk_core::rpc::last_collection_idx::() + } + + fn collection_by_id(collection_id: RmrkCollectionId) -> Result>, DispatchError> { + pallet_proxy_rmrk_core::rpc::collection_by_id::(collection_id) + } + + fn nft_by_id(collection_id: RmrkCollectionId, nft_by_id: RmrkNftId) -> Result>, DispatchError> { + pallet_proxy_rmrk_core::rpc::nft_by_id::(collection_id, nft_by_id) + } + + fn account_tokens(account_id: AccountId, collection_id: RmrkCollectionId) -> Result, DispatchError> { + pallet_proxy_rmrk_core::rpc::account_tokens::(account_id, collection_id) + } + + fn nft_children(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Result, DispatchError> { + pallet_proxy_rmrk_core::rpc::nft_children::(collection_id, nft_id) + } + + fn collection_properties(collection_id: RmrkCollectionId, filter_keys: Option>) -> Result, DispatchError> { + pallet_proxy_rmrk_core::rpc::collection_properties::(collection_id, filter_keys) + } + + fn nft_properties(collection_id: RmrkCollectionId, nft_id: RmrkNftId, filter_keys: Option>) -> Result, DispatchError> { + pallet_proxy_rmrk_core::rpc::nft_properties::(collection_id, nft_id, filter_keys) + } + + fn nft_resources(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Result, DispatchError> { + pallet_proxy_rmrk_core::rpc::nft_resources::(collection_id, nft_id) + } + + fn nft_resource_priority(collection_id: RmrkCollectionId, nft_id: RmrkNftId, resource_id: RmrkResourceId) -> Result, DispatchError> { + pallet_proxy_rmrk_core::rpc::nft_resource_priority::(collection_id, nft_id, resource_id) + } + + fn base(base_id: RmrkBaseId) -> Result>, DispatchError> { + pallet_proxy_rmrk_equip::rpc::base::(base_id) + } + + fn base_parts(base_id: RmrkBaseId) -> Result, DispatchError> { + pallet_proxy_rmrk_equip::rpc::base_parts::(base_id) + } + + fn theme_names(base_id: RmrkBaseId) -> Result, DispatchError> { + pallet_proxy_rmrk_equip::rpc::theme_names::(base_id) + } + + fn theme(base_id: RmrkBaseId, theme_name: RmrkThemeName, filter_keys: Option>) -> Result, DispatchError> { + pallet_proxy_rmrk_equip::rpc::theme::(base_id, theme_name, filter_keys) + } + } +} struct CheckInherents; --- a/runtime/tests/src/tests.rs +++ b/runtime/tests/src/tests.rs @@ -1264,7 +1264,6 @@ let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1)); let origin1 = Origin::signed(1); - let origin2 = Origin::signed(2); // Add collection admins 2 and 3 assert_ok!(Unique::add_collection_admin( @@ -1273,7 +1272,7 @@ account(2) )); assert_ok!(Unique::add_collection_admin( - origin1, + origin1.clone(), collection1_id, account(3) )); @@ -1289,7 +1288,7 @@ // remove admin 3 assert_ok!(Unique::remove_collection_admin( - origin2, + origin1, CollectionId(1), account(3) )); --- a/runtime/unique/Cargo.toml +++ b/runtime/unique/Cargo.toml @@ -10,13 +10,13 @@ license = 'GPLv3' name = 'unique-runtime' repository = 'https://github.com/UniqueNetwork/unique-chain' -version = '0.9.22' +version = '0.9.23' [package.metadata.docs.rs] targets = ['x86_64-unknown-linux-gnu'] [features] -default = ['std'] +default = ['std', 'unique-runtime'] runtime-benchmarks = [ 'hex-literal', 'frame-benchmarking', @@ -37,6 +37,7 @@ 'pallet-proxy-rmrk-equip/runtime-benchmarks', 'pallet-unique/runtime-benchmarks', 'pallet-inflation/runtime-benchmarks', + 'pallet-unique-scheduler/runtime-benchmarks', 'pallet-xcm/runtime-benchmarks', 'sp-runtime/runtime-benchmarks', 'xcm-builder/runtime-benchmarks', @@ -95,7 +96,7 @@ 'pallet-proxy-rmrk-core/std', 'pallet-proxy-rmrk-equip/std', 'pallet-unique/std', - 'pallet-unq-scheduler/std', + 'pallet-unique-scheduler/std', 'pallet-charge-transaction/std', 'up-data-structs/std', 'sp-api/std', @@ -118,6 +119,7 @@ "orml-vesting/std", ] limit-testing = ['pallet-unique/limit-testing', 'up-data-structs/limit-testing'] +unique-runtime = [] ################################################################################ # Substrate Dependencies @@ -412,7 +414,7 @@ pallet-nonfungible = { default-features = false, path = "../../pallets/nonfungible" } pallet-proxy-rmrk-core = { default-features = false, path = "../../pallets/proxy-rmrk-core", package = "pallet-rmrk-core" } pallet-proxy-rmrk-equip = { default-features = false, path = "../../pallets/proxy-rmrk-equip", package = "pallet-rmrk-equip" } -pallet-unq-scheduler = { path = '../../pallets/scheduler', default-features = false } +pallet-unique-scheduler = { path = '../../pallets/scheduler', default-features = false } # pallet-contract-helpers = { path = '../pallets/contract-helpers', default-features = false, version = '0.1.0' } pallet-charge-transaction = { git = "https://github.com/uniquenetwork/pallet-sponsoring", branch = "polkadot-v0.9.23", package = "pallet-template-transaction-payment", default-features = false, version = "3.0.0" } pallet-evm-migration = { path = '../../pallets/evm-migration', default-features = false } --- a/runtime/unique/src/lib.rs +++ b/runtime/unique/src/lib.rs @@ -69,16 +69,14 @@ WeightToFee, }, }; -use pallet_unq_scheduler::DispatchCall; +use pallet_unique_scheduler::DispatchCall; use up_data_structs::{ CollectionId, TokenId, TokenData, Property, PropertyKeyPermission, CollectionLimits, CollectionStats, RpcCollection, mapping::{EvmTokenAddressMapping, CrossTokenAddressMapping}, TokenChild, RmrkCollectionInfo, RmrkInstanceInfo, RmrkResourceInfo, RmrkPropertyInfo, - RmrkBaseInfo, RmrkPartType, RmrkTheme, RmrkThemeName, RmrkThemeProperty, RmrkCollectionId, - RmrkNftId, RmrkAccountIdOrCollectionNftTuple, RmrkNftChild, RmrkPropertyKey, RmrkResourceTypes, - RmrkBasicResource, RmrkComposableResource, RmrkSlotResource, RmrkResourceId, RmrkBaseId, - RmrkFixedPart, RmrkSlotPart, RmrkString, + RmrkBaseInfo, RmrkPartType, RmrkTheme, RmrkThemeName, RmrkCollectionId, RmrkNftId, + RmrkNftChild, RmrkPropertyKey, RmrkResourceId, RmrkBaseId, }; // use pallet_contracts::weights::WeightInfo; @@ -192,7 +190,7 @@ spec_name: create_runtime_str!(RUNTIME_NAME), impl_name: create_runtime_str!(RUNTIME_NAME), authoring_version: 1, - spec_version: 922000, + spec_version: 923000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, @@ -915,17 +913,8 @@ } impl pallet_nonfungible::Config for Runtime { type WeightInfo = pallet_nonfungible::weights::SubstrateWeight; -} - -impl pallet_proxy_rmrk_core::Config for Runtime { - type WeightInfo = pallet_proxy_rmrk_core::weights::SubstrateWeight; - type Event = Event; } -impl pallet_proxy_rmrk_equip::Config for Runtime { - type Event = Event; -} - impl pallet_unique::Config for Runtime { type Event = Event; type WeightInfo = pallet_unique::weights::SubstrateWeight; @@ -968,7 +957,7 @@ } pub struct SchedulerPaymentExecutor; -impl +impl DispatchCall for SchedulerPaymentExecutor where ::Call: Member @@ -978,13 +967,13 @@ + From>, SelfContainedSignedInfo: Send + Sync + 'static, Call: From<::Call> - + From<::Call> + + From<::Call> + SelfContainedCall, sp_runtime::AccountId32: From<::AccountId>, { fn dispatch_call( signer: ::AccountId, - call: ::Call, + call: ::Call, ) -> Result< Result>, TransactionValidityError, @@ -1010,7 +999,7 @@ fn reserve_balance( id: [u8; 16], sponsor: ::AccountId, - call: ::Call, + call: ::Call, count: u32, ) -> Result<(), DispatchError> { let dispatch_info = call.get_dispatch_info(); @@ -1027,7 +1016,7 @@ fn pay_for_call( id: [u8; 16], sponsor: ::AccountId, - call: ::Call, + call: ::Call, ) -> Result { let dispatch_info = call.get_dispatch_info(); let weight: Balance = ChargeTransactionPayment::traditional_fee(0, &dispatch_info, 0); @@ -1068,7 +1057,7 @@ } } -impl pallet_unq_scheduler::Config for Runtime { +impl pallet_unique_scheduler::Config for Runtime { type Event = Event; type Origin = Origin; type Currency = Balances; @@ -1156,7 +1145,7 @@ // Unique Pallets Inflation: pallet_inflation::{Pallet, Call, Storage} = 60, Unique: pallet_unique::{Pallet, Call, Storage, Event} = 61, - Scheduler: pallet_unq_scheduler::{Pallet, Call, Storage, Event} = 62, + Scheduler: pallet_unique_scheduler::{Pallet, Call, Storage, Event} = 62, // free = 63 Charging: pallet_charge_transaction::{Pallet, Call, Storage } = 64, // ContractHelpers: pallet_contract_helpers::{Pallet, Call, Storage} = 65, @@ -1165,8 +1154,6 @@ Refungible: pallet_refungible::{Pallet, Storage} = 68, Nonfungible: pallet_nonfungible::{Pallet, Storage} = 69, Structure: pallet_structure::{Pallet, Call, Storage, Event} = 70, - RmrkCore: pallet_proxy_rmrk_core::{Pallet, Call, Storage, Event} = 71, - RmrkEquip: pallet_proxy_rmrk_equip::{Pallet, Call, Storage, Event} = 72, // Frontier EVM: pallet_evm::{Pallet, Config, Call, Storage, Event} = 100, @@ -1314,7 +1301,73 @@ }}; } -impl_common_runtime_apis!(); +impl_common_runtime_apis! { + #![custom_apis] + + impl rmrk_rpc::RmrkApi< + Block, + AccountId, + RmrkCollectionInfo, + RmrkInstanceInfo, + RmrkResourceInfo, + RmrkPropertyInfo, + RmrkBaseInfo, + RmrkPartType, + RmrkTheme + > for Runtime { + fn last_collection_idx() -> Result { + Ok(Default::default()) + } + + fn collection_by_id(_collection_id: RmrkCollectionId) -> Result>, DispatchError> { + Ok(Default::default()) + } + + fn nft_by_id(_collection_id: RmrkCollectionId, _nft_by_id: RmrkNftId) -> Result>, DispatchError> { + Ok(Default::default()) + } + + fn account_tokens(_account_id: AccountId, _collection_id: RmrkCollectionId) -> Result, DispatchError> { + Ok(Default::default()) + } + + fn nft_children(_collection_id: RmrkCollectionId, _nft_id: RmrkNftId) -> Result, DispatchError> { + Ok(Default::default()) + } + + fn collection_properties(_collection_id: RmrkCollectionId, _filter_keys: Option>) -> Result, DispatchError> { + Ok(Default::default()) + } + + fn nft_properties(_collection_id: RmrkCollectionId, _nft_id: RmrkNftId, _filter_keys: Option>) -> Result, DispatchError> { + Ok(Default::default()) + } + + fn nft_resources(_collection_id: RmrkCollectionId, _nft_id: RmrkNftId) -> Result, DispatchError> { + Ok(Default::default()) + } + + fn nft_resource_priority(_collection_id: RmrkCollectionId, _nft_id: RmrkNftId, _resource_id: RmrkResourceId) -> Result, DispatchError> { + Ok(Default::default()) + } + + fn base(_base_id: RmrkBaseId) -> Result>, DispatchError> { + Ok(Default::default()) + } + + fn base_parts(_base_id: RmrkBaseId) -> Result, DispatchError> { + Ok(Default::default()) + } + + fn theme_names(_base_id: RmrkBaseId) -> Result, DispatchError> { + Ok(Default::default()) + } + + fn theme(_base_id: RmrkBaseId, _theme_name: RmrkThemeName, _filter_keys: Option>) -> Result, DispatchError> { + Ok(Default::default()) + } + } +} struct CheckInherents; --- a/tests/package.json +++ b/tests/package.json @@ -28,6 +28,7 @@ "test": "mocha --timeout 9999999 -r ts-node/register './src/**/*.test.ts'", "testEth": "mocha --timeout 9999999 -r ts-node/register './**/eth/**/*.test.ts'", "testEthMarketplace": "mocha --timeout 9999999 -r ts-node/register './**/eth/marketplace/**/*.test.ts'", + "testEthNesting": "mocha --timeout 9999999 -r ts-node/register './**/eth/nesting/**/*.test.ts'", "load": "mocha --timeout 9999999 -r ts-node/register './**/*.load.ts'", "loadTransfer": "ts-node src/transfer.nload.ts", "testCollision": "mocha --timeout 9999999 -r ts-node/register ./src/collision-tests/*.test.ts", --- a/tests/src/approve.test.ts +++ b/tests/src/approve.test.ts @@ -28,7 +28,7 @@ setCollectionLimitsExpectSuccess, transferExpectSuccess, addCollectionAdminExpectSuccess, - adminApproveFromExpectSuccess, + adminApproveFromExpectFail, getCreatedCollectionCount, transferFromExpectSuccess, transferFromExpectFail, @@ -84,11 +84,11 @@ await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, alice, bob.address, 0); }); - it('can be called by collection owner on non-owned item when OwnerCanTransfer == true', async () => { + it('can`t be called by collection owner on non-owned item when OwnerCanTransfer == false', async () => { const collectionId = await createCollectionExpectSuccess(); const itemId = await createItemExpectSuccess(alice, collectionId, 'NFT', bob.address); - await adminApproveFromExpectSuccess(collectionId, itemId, alice, bob.address, charlie.address); + await adminApproveFromExpectFail(collectionId, itemId, alice, bob.address, charlie.address); }); }); @@ -292,7 +292,7 @@ }); }); -describe('Administrator and collection owner do not need approval in order to execute TransferFrom:', () => { +describe('Administrator and collection owner do not need approval in order to execute TransferFrom (with owner_can_transfer_flag = true):', () => { let alice: IKeyringPair; let bob: IKeyringPair; let charlie: IKeyringPair; @@ -309,6 +309,7 @@ it('NFT', async () => { const collectionId = await createCollectionExpectSuccess(); + await setCollectionLimitsExpectSuccess(alice, collectionId, {ownerCanTransfer: true}); const itemId = await createItemExpectSuccess(alice, collectionId, 'NFT', charlie.address); await transferFromExpectSuccess(collectionId, itemId, alice, charlie, dave, 1, 'NFT'); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); @@ -317,6 +318,7 @@ it('Fungible up to an approved amount', async () => { const collectionId = await createCollectionExpectSuccess({mode:{type: 'Fungible', decimalPoints: 0}}); + await setCollectionLimitsExpectSuccess(alice, collectionId, {ownerCanTransfer: true}); const itemId = await createItemExpectSuccess(alice, collectionId, 'Fungible', charlie.address); await transferFromExpectSuccess(collectionId, itemId, alice, charlie, dave, 1, 'Fungible'); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); @@ -325,6 +327,7 @@ it('ReFungible up to an approved amount', async () => { const collectionId = await createCollectionExpectSuccess({mode:{type: 'ReFungible'}}); + await setCollectionLimitsExpectSuccess(alice, collectionId, {ownerCanTransfer: true}); const itemId = await createItemExpectSuccess(alice, collectionId, 'ReFungible', charlie.address); await transferFromExpectSuccess(collectionId, itemId, alice, charlie, dave, 1, 'ReFungible'); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); @@ -402,7 +405,7 @@ const itemId = await createItemExpectSuccess(alice, collectionId, 'NFT', alice.address); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); - await adminApproveFromExpectSuccess(collectionId, itemId, bob, alice.address, charlie.address); + await adminApproveFromExpectFail(collectionId, itemId, bob, alice.address, charlie.address); }); }); --- a/tests/src/burnItem.test.ts +++ b/tests/src/burnItem.test.ts @@ -23,6 +23,7 @@ normalizeAccountId, addCollectionAdminExpectSuccess, getBalance, + setCollectionLimitsExpectSuccess, isTokenExists, } from './util/helpers'; @@ -149,6 +150,7 @@ it('Burn item in NFT collection', async () => { const createMode = 'NFT'; const collectionId = await createCollectionExpectSuccess({mode: {type: createMode}}); + await setCollectionLimitsExpectSuccess(alice, collectionId, {ownerCanTransfer: true}); const tokenId = await createItemExpectSuccess(alice, collectionId, createMode); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); @@ -167,6 +169,7 @@ it('Burn item in Fungible collection', async () => { const createMode = 'Fungible'; const collectionId = await createCollectionExpectSuccess({mode: {type: createMode, decimalPoints: 0}}); + await setCollectionLimitsExpectSuccess(alice, collectionId, {ownerCanTransfer: true}); const tokenId = await createItemExpectSuccess(alice, collectionId, createMode); // Helper creates 10 fungible tokens await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); @@ -189,6 +192,7 @@ it('Burn item in ReFungible collection', async () => { const createMode = 'ReFungible'; const collectionId = await createCollectionExpectSuccess({mode: {type: createMode}}); + await setCollectionLimitsExpectSuccess(alice, collectionId, {ownerCanTransfer: true}); const tokenId = await createItemExpectSuccess(alice, collectionId, createMode); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); --- a/tests/src/createMultipleItems.test.ts +++ b/tests/src/createMultipleItems.test.ts @@ -48,7 +48,7 @@ const alice = privateKeyWrapper('//Alice'); await submitTransactionAsync( alice, - api.tx.unique.setPropertyPermissions(collectionId, [{key: 'data', permission: {tokenOwner: true}}]), + api.tx.unique.setTokenPropertyPermissions(collectionId, [{key: 'data', permission: {tokenOwner: true}}]), ); const args = [ @@ -470,7 +470,7 @@ const collectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); - const tx1 = api.tx.unique.setPropertyPermissions(collectionId, propPerms); + const tx1 = api.tx.unique.setTokenPropertyPermissions(collectionId, propPerms); await expect(executeTransaction(api, alice, tx1)).to.be.rejectedWith(/common\.PropertyLimitReached/); const itemsListIndexBefore = await getLastTokenId(api, collectionId); --- a/tests/src/createMultipleItemsEx.test.ts +++ b/tests/src/createMultipleItemsEx.test.ts @@ -222,7 +222,7 @@ const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); await usingApi(async (api, privateKeyWrapper) => { const alice = privateKeyWrapper('//Alice'); - await expect(executeTransaction(api, alice, api.tx.unique.setPropertyPermissions(collection, propPerms))).to.be.rejectedWith(/common\.PropertyLimitReached/); + await expect(executeTransaction(api, alice, api.tx.unique.setTokenPropertyPermissions(collection, propPerms))).to.be.rejectedWith(/common\.PropertyLimitReached/); }); }); --- a/tests/src/eth/api/UniqueNFT.sol +++ b/tests/src/eth/api/UniqueNFT.sol @@ -174,7 +174,24 @@ function finishMinting() external returns (bool); } -// Selector: 6aea9834 +// Selector: 780e9d63 +interface ERC721Enumerable is Dummy, ERC165 { + // Selector: tokenByIndex(uint256) 4f6ccce7 + function tokenByIndex(uint256 index) external view returns (uint256); + + // Not implemented + // + // Selector: tokenOfOwnerByIndex(address,uint256) 2f745c59 + function tokenOfOwnerByIndex(address owner, uint256 index) + external + view + returns (uint256); + + // Selector: totalSupply() 18160ddd + function totalSupply() external view returns (uint256); +} + +// Selector: 7d9262e6 interface Collection is Dummy, ERC165 { // Selector: setCollectionProperty(string,bytes) 2f073f66 function setCollectionProperty(string memory key, bytes memory value) @@ -206,6 +223,12 @@ // Selector: contractAddress() f6b4dfb4 function contractAddress() external view returns (address); + // Selector: addCollectionAdminSubstrate(uint256) 5730062b + function addCollectionAdminSubstrate(uint256 newAdmin) external view; + + // Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9 + function removeCollectionAdminSubstrate(uint256 newAdmin) external view; + // Selector: addCollectionAdmin(address) 92e462c7 function addCollectionAdmin(address newAdmin) external view; @@ -230,23 +253,6 @@ // Selector: setCollectionMintMode(bool) 00018e84 function setCollectionMintMode(bool mode) external; -} - -// Selector: 780e9d63 -interface ERC721Enumerable is Dummy, ERC165 { - // Selector: tokenByIndex(uint256) 4f6ccce7 - function tokenByIndex(uint256 index) external view returns (uint256); - - // Not implemented - // - // Selector: tokenOfOwnerByIndex(address,uint256) 2f745c59 - function tokenOfOwnerByIndex(address owner, uint256 index) - external - view - returns (uint256); - - // Selector: totalSupply() 18160ddd - function totalSupply() external view returns (uint256); } // Selector: d74d154f --- /dev/null +++ b/tests/src/eth/collectionAdmin.test.ts @@ -0,0 +1,296 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +import {expect} from 'chai'; +import privateKey from '../substrate/privateKey'; +import { + createEthAccount, + createEthAccountWithBalance, + evmCollection, + evmCollectionHelpers, + getCollectionAddressFromResult, + itWeb3, +} from './util/helpers'; + +describe('Add collection admins', () => { + itWeb3('Add admin by owner', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const newAdmin = await createEthAccount(web3); + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + await collectionEvm.methods.addCollectionAdmin(newAdmin).send(); + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList[0].asEthereum.toString().toLocaleLowerCase()) + .to.be.eq(newAdmin.toLocaleLowerCase()); + }); + + itWeb3('Add substrate admin by owner', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const newAdmin = privateKeyWrapper('//Alice'); + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + await collectionEvm.methods.addCollectionAdminSubstrate(newAdmin.addressRaw).send(); + + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList[0].asSubstrate.toString().toLocaleLowerCase()) + .to.be.eq(newAdmin.address.toLocaleLowerCase()); + }); + + itWeb3('(!negative tests!) Add admin by ADMIN is not allowed', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const admin = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + await collectionEvm.methods.addCollectionAdmin(admin).send(); + + const user = await createEthAccount(web3); + await expect(collectionEvm.methods.addCollectionAdmin(user).call({from: admin})) + .to.be.rejectedWith('NoPermission'); + + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList.length).to.be.eq(1); + expect(adminList[0].asEthereum.toString().toLocaleLowerCase()) + .to.be.eq(admin.toLocaleLowerCase()); + }); + + itWeb3('(!negative tests!) Add admin by USER is not allowed', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const notAdmin = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + + const user = await createEthAccount(web3); + await expect(collectionEvm.methods.addCollectionAdmin(user).call({from: notAdmin})) + .to.be.rejectedWith('NoPermission'); + + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList.length).to.be.eq(0); + }); + + itWeb3('(!negative tests!) Add substrate admin by ADMIN is not allowed', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const admin = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + await collectionEvm.methods.addCollectionAdmin(admin).send(); + + const notAdmin = privateKey('//Alice'); + await expect(collectionEvm.methods.addCollectionAdminSubstrate(notAdmin.addressRaw).call({from: admin})) + .to.be.rejectedWith('NoPermission'); + + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList.length).to.be.eq(1); + expect(adminList[0].asEthereum.toString().toLocaleLowerCase()) + .to.be.eq(admin.toLocaleLowerCase()); + }); + + itWeb3('(!negative tests!) Add substrate admin by USER is not allowed', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const notAdmin0 = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + const notAdmin1 = privateKey('//Alice'); + await expect(collectionEvm.methods.addCollectionAdminSubstrate(notAdmin1.addressRaw).call({from: notAdmin0})) + .to.be.rejectedWith('NoPermission'); + + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList.length).to.be.eq(0); + }); +}); + +describe('Remove collection admins', () => { + itWeb3('Remove admin by owner', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const newAdmin = await createEthAccount(web3); + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + await collectionEvm.methods.addCollectionAdmin(newAdmin).send(); + { + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList.length).to.be.eq(1); + expect(adminList[0].asEthereum.toString().toLocaleLowerCase()) + .to.be.eq(newAdmin.toLocaleLowerCase()); + } + + await collectionEvm.methods.removeCollectionAdmin(newAdmin).send(); + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList.length).to.be.eq(0); + }); + + itWeb3('Remove substrate admin by owner', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const newAdmin = privateKeyWrapper('//Alice'); + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + await collectionEvm.methods.addCollectionAdminSubstrate(newAdmin.addressRaw).send(); + { + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList[0].asSubstrate.toString().toLocaleLowerCase()) + .to.be.eq(newAdmin.address.toLocaleLowerCase()); + } + + await collectionEvm.methods.removeCollectionAdminSubstrate(newAdmin.addressRaw).send(); + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList.length).to.be.eq(0); + }); + + itWeb3('(!negative tests!) Remove admin by ADMIN is not allowed', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + + const admin0 = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + await collectionEvm.methods.addCollectionAdmin(admin0).send(); + const admin1 = await createEthAccount(web3); + await collectionEvm.methods.addCollectionAdmin(admin1).send(); + + await expect(collectionEvm.methods.removeCollectionAdmin(admin1).call({from: admin0})) + .to.be.rejectedWith('NoPermission'); + { + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList.length).to.be.eq(2); + expect(adminList.toString().toLocaleLowerCase()) + .to.be.deep.contains(admin0.toLocaleLowerCase()) + .to.be.deep.contains(admin1.toLocaleLowerCase()); + } + }); + + itWeb3('(!negative tests!) Remove admin by USER is not allowed', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + + const admin = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + await collectionEvm.methods.addCollectionAdmin(admin).send(); + const notAdmin = await createEthAccount(web3); + + await expect(collectionEvm.methods.removeCollectionAdmin(admin).call({from: notAdmin})) + .to.be.rejectedWith('NoPermission'); + { + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList[0].asEthereum.toString().toLocaleLowerCase()) + .to.be.eq(admin.toLocaleLowerCase()); + expect(adminList.length).to.be.eq(1); + } + }); + + itWeb3('(!negative tests!) Remove substrate admin by ADMIN is not allowed', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const adminSub = privateKeyWrapper('//Alice'); + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + await collectionEvm.methods.addCollectionAdminSubstrate(adminSub.addressRaw).send(); + const adminEth = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + await collectionEvm.methods.addCollectionAdmin(adminEth).send(); + + await expect(collectionEvm.methods.removeCollectionAdminSubstrate(adminSub.addressRaw).call({from: adminEth})) + .to.be.rejectedWith('NoPermission'); + + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList.length).to.be.eq(2); + expect(adminList.toString().toLocaleLowerCase()) + .to.be.deep.contains(adminSub.address.toLocaleLowerCase()) + .to.be.deep.contains(adminEth.toLocaleLowerCase()); + }); + + itWeb3('(!negative tests!) Remove substrate admin by USER is not allowed', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const adminSub = privateKeyWrapper('//Alice'); + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + await collectionEvm.methods.addCollectionAdminSubstrate(adminSub.addressRaw).send(); + const notAdminEth = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + + await expect(collectionEvm.methods.removeCollectionAdminSubstrate(adminSub.addressRaw).call({from: notAdminEth})) + .to.be.rejectedWith('NoPermission'); + + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList.length).to.be.eq(1); + expect(adminList[0].asSubstrate.toString().toLocaleLowerCase()) + .to.be.eq(adminSub.address.toLocaleLowerCase()); + }); +}); \ No newline at end of file --- a/tests/src/eth/contractSponsoring.test.ts +++ b/tests/src/eth/contractSponsoring.test.ts @@ -233,7 +233,7 @@ const ss58Format = (api.registry.getChainProperties())!.toJSON().ss58Format; expect(collectionSub.sponsorship.isUnconfirmed).to.be.true; expect(collectionSub.sponsorship.asUnconfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format))); - await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('Caller is not set as sponsor'); + await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor'); await collectionEvm.methods.confirmCollectionSponsorship().send({from: sponsor}); collectionSub = (await getDetailedCollectionInfo(api, collectionId))!; @@ -241,14 +241,13 @@ expect(collectionSub.sponsorship.asConfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format))); const user = createEthAccount(web3); - let nextTokenId = await collectionEvm.methods.nextTokenId().call(); + const nextTokenId = await collectionEvm.methods.nextTokenId().call(); expect(nextTokenId).to.be.equal('1'); const oldPermissions = (await getDetailedCollectionInfo(api, collectionId))!.permissions.toHuman(); expect(oldPermissions.mintMode).to.be.false; expect(oldPermissions.access).to.be.equal('Normal'); - //TODO: change value, when enum generated await collectionEvm.methods.setCollectionAccess(1 /*'AllowList'*/).send({from: owner}); await collectionEvm.methods.addToCollectionAllowList(user).send({from: owner}); await collectionEvm.methods.setCollectionMintMode(true).send({from: owner}); @@ -260,34 +259,35 @@ const ownerBalanceBefore = await ethBalanceViaSub(api, owner); const sponsorBalanceBefore = await ethBalanceViaSub(api, sponsor); - nextTokenId = await collectionEvm.methods.nextTokenId().call({from: user}); - expect(nextTokenId).to.be.equal('1'); - result = await collectionEvm.methods.mintWithTokenURI( - user, - nextTokenId, - 'Test URI', - ).send({from: user}); - const events = normalizeEvents(result.events); - events[0].address = events[0].address.toLocaleLowerCase(); + { + const nextTokenId = await collectionEvm.methods.nextTokenId().call(); + expect(nextTokenId).to.be.equal('1'); + const result = await collectionEvm.methods.mintWithTokenURI( + user, + nextTokenId, + 'Test URI', + ).send({from: user}); + const events = normalizeEvents(result.events); - expect(events).to.be.deep.equal([ - { - address: collectionIdAddress.toLocaleLowerCase(), - event: 'Transfer', - args: { - from: '0x0000000000000000000000000000000000000000', - to: user, - tokenId: nextTokenId, + expect(events).to.be.deep.equal([ + { + address: collectionIdAddress, + event: 'Transfer', + args: { + from: '0x0000000000000000000000000000000000000000', + to: user, + tokenId: nextTokenId, + }, }, - }, - ]); + ]); - expect(await collectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI'); + const ownerBalanceAfter = await ethBalanceViaSub(api, owner); + const sponsorBalanceAfter = await ethBalanceViaSub(api, sponsor); - const ownerBalanceAfter = await ethBalanceViaSub(api, owner); - expect(ownerBalanceAfter).to.be.eq(ownerBalanceBefore); - const sponsorBalanceAfter = await ethBalanceViaSub(api, sponsor); - expect(sponsorBalanceAfter < sponsorBalanceBefore).to.be.true; + expect(await collectionEvm.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI'); + expect(ownerBalanceBefore).to.be.eq(ownerBalanceAfter); + expect(sponsorBalanceBefore > sponsorBalanceAfter).to.be.true; + } }); itWeb3('Check that transaction via EVM spend money from sponsor address', async ({api, web3, privateKeyWrapper}) => { @@ -302,7 +302,7 @@ const ss58Format = (api.registry.getChainProperties())!.toJSON().ss58Format; expect(collectionSub.sponsorship.isUnconfirmed).to.be.true; expect(collectionSub.sponsorship.asUnconfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format))); - await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('Caller is not set as sponsor'); + await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor'); const sponsorCollection = evmCollection(web3, sponsor, collectionIdAddress); await sponsorCollection.methods.confirmCollectionSponsorship().send(); collectionSub = (await getDetailedCollectionInfo(api, collectionId))!; @@ -314,6 +314,7 @@ const ownerBalanceBefore = await ethBalanceViaSub(api, owner); const sponsorBalanceBefore = await ethBalanceViaSub(api, sponsor); + const userCollectionEvm = evmCollection(web3, user, collectionIdAddress); const nextTokenId = await userCollectionEvm.methods.nextTokenId().call(); --- a/tests/src/eth/createCollection.test.ts +++ b/tests/src/eth/createCollection.test.ts @@ -80,7 +80,7 @@ expect(collectionSub.sponsorship.isUnconfirmed).to.be.true; const ss58Format = (api.registry.getChainProperties())!.toJSON().ss58Format; expect(collectionSub.sponsorship.asUnconfirmed.toHuman()).to.be.eq(evmToAddress(sponsor, Number(ss58Format))); - await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('Caller is not set as sponsor'); + await expect(collectionEvm.methods.confirmCollectionSponsorship().call()).to.be.rejectedWith('caller is not set as sponsor'); const sponsorCollection = evmCollection(web3, sponsor, collectionIdAddress); await sponsorCollection.methods.confirmCollectionSponsorship().send(); collectionSub = (await getDetailedCollectionInfo(api, collectionId))!; @@ -208,7 +208,7 @@ const sponsorCollection = evmCollection(web3, sponsor, collectionIdAddress); await expect(sponsorCollection.methods .confirmCollectionSponsorship() - .call()).to.be.rejectedWith('Caller is not set as sponsor'); + .call()).to.be.rejectedWith('caller is not set as sponsor'); } { await expect(contractEvmFromNotOwner.methods @@ -225,6 +225,6 @@ const collectionEvm = evmCollection(web3, owner, collectionIdAddress); await expect(collectionEvm.methods .setCollectionLimit('badLimit', 'true') - .call()).to.be.rejectedWith('Unknown boolean limit "badLimit"'); + .call()).to.be.rejectedWith('unknown boolean limit "badLimit"'); }); }); \ No newline at end of file --- a/tests/src/eth/crossTransfer.test.ts +++ b/tests/src/eth/crossTransfer.test.ts @@ -18,6 +18,7 @@ createFungibleItemExpectSuccess, transferExpectSuccess, transferFromExpectSuccess, + setCollectionLimitsExpectSuccess, createItemExpectSuccess} from '../util/helpers'; import {collectionIdToAddress, createEthAccountWithBalance, @@ -35,6 +36,7 @@ const alice = privateKeyWrapper('//Alice'); const bob = privateKeyWrapper('//Bob'); const charlie = privateKeyWrapper('//Charlie'); + await setCollectionLimitsExpectSuccess(alice, collection, {ownerCanTransfer: true}); await createFungibleItemExpectSuccess(alice, collection, {Value: 200n}, {Substrate: alice.address}); await transferExpectSuccess(collection, 0, alice, {Ethereum: subToEth(charlie.address)} , 200, 'Fungible'); await transferFromExpectSuccess(collection, 0, alice, {Ethereum: subToEth(charlie.address)}, charlie, 50, 'Fungible'); @@ -48,6 +50,7 @@ }); const alice = privateKeyWrapper('//Alice'); const bob = privateKeyWrapper('//Bob'); + await setCollectionLimitsExpectSuccess(alice, collection, {ownerCanTransfer: true}); const bobProxy = await createEthAccountWithBalance(api, web3, privateKeyWrapper); const aliceProxy = await createEthAccountWithBalance(api, web3, privateKeyWrapper); @@ -71,6 +74,7 @@ const alice = privateKeyWrapper('//Alice'); const bob = privateKeyWrapper('//Bob'); const charlie = privateKeyWrapper('//Charlie'); + await setCollectionLimitsExpectSuccess(alice, collection, {ownerCanTransfer: true}); const tokenId = await createItemExpectSuccess(alice, collection, 'NFT', {Substrate: alice.address}); await transferExpectSuccess(collection, tokenId, alice, {Ethereum: subToEth(charlie.address)}, 1, 'NFT'); await transferFromExpectSuccess(collection, tokenId, alice, {Ethereum: subToEth(charlie.address)}, charlie, 1, 'NFT'); @@ -85,6 +89,7 @@ const alice = privateKeyWrapper('//Alice'); const bob = privateKeyWrapper('//Bob'); const charlie = privateKeyWrapper('//Charlie'); + await setCollectionLimitsExpectSuccess(alice, collection, {ownerCanTransfer: true}); const bobProxy = await createEthAccountWithBalance(api, web3, privateKeyWrapper); const aliceProxy = await createEthAccountWithBalance(api, web3, privateKeyWrapper); const tokenId = await createItemExpectSuccess(alice, collection, 'NFT', {Substrate: alice.address}); --- /dev/null +++ b/tests/src/eth/nesting/nest.test.ts @@ -0,0 +1,217 @@ +import {ApiPromise} from '@polkadot/api'; +import {Contract} from 'web3-eth-contract'; +import {expect} from 'chai'; +import Web3 from 'web3'; +import {createEthAccountWithBalance, evmCollectionHelpers, GAS_ARGS, getCollectionAddressFromResult, itWeb3, tokenIdToAddress} from '../../eth/util/helpers'; +import nonFungibleAbi from '../nonFungibleAbi.json'; + +const createNestingCollection = async ( + api: ApiPromise, + web3: Web3, + owner: string, +): Promise<{ collectionId: number, collectionAddress: string, contract: Contract }> => { + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress: collectionAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const contract = new web3.eth.Contract(nonFungibleAbi as any, collectionAddress, {from: owner, ...GAS_ARGS}); + await contract.methods.setCollectionNesting(true).send({from: owner}); + + return {collectionId, collectionAddress, contract}; +}; + +describe('Integration Test: EVM Nesting', () => { + itWeb3('NFT: allows an Owner to nest/unnest their token', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const {collectionId, contract} = await createNestingCollection(api, web3, owner); + + // Create a token to be nested + const targetNFTTokenId = await contract.methods.nextTokenId().call(); + await contract.methods.mint( + owner, + targetNFTTokenId, + ).send({from: owner}); + + const targetNftTokenAddress = tokenIdToAddress(collectionId, targetNFTTokenId); + + // Create a nested token + const firstTokenId = await contract.methods.nextTokenId().call(); + await contract.methods.mint( + targetNftTokenAddress, + firstTokenId, + ).send({from: owner}); + + expect(await contract.methods.ownerOf(firstTokenId).call()).to.be.equal(targetNftTokenAddress); + + // Create a token to be nested and nest + const secondTokenId = await contract.methods.nextTokenId().call(); + await contract.methods.mint( + owner, + secondTokenId, + ).send({from: owner}); + + await contract.methods.transfer(targetNftTokenAddress, secondTokenId).send({from: owner}); + + expect(await contract.methods.ownerOf(secondTokenId).call()).to.be.equal(targetNftTokenAddress); + + // Unnest token back + await contract.methods.transferFrom(targetNftTokenAddress, owner, secondTokenId).send({from: owner}); + expect(await contract.methods.ownerOf(secondTokenId).call()).to.be.equal(owner); + }); + + itWeb3('NFT: allows an Owner to nest/unnest their token (Restricted nesting)', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + + const {collectionId: collectionIdA, collectionAddress: collectionAddressA, contract: contractA} = await createNestingCollection(api, web3, owner); + const {collectionAddress: collectionAddressB, contract: contractB} = await createNestingCollection(api, web3, owner); + await contractA.methods.setCollectionNesting(true, [collectionAddressA, collectionAddressB]).send({from: owner}); + + // Create a token to nest into + const targetNftTokenId = await contractA.methods.nextTokenId().call(); + await contractA.methods.mint( + owner, + targetNftTokenId, + ).send({from: owner}); + const nftTokenAddressA1 = tokenIdToAddress(collectionIdA, targetNftTokenId); + + // Create a token for nesting in the same collection as the target + const nftTokenIdA = await contractA.methods.nextTokenId().call(); + await contractA.methods.mint( + owner, + nftTokenIdA, + ).send({from: owner}); + + // Create a token for nesting in a different collection + const nftTokenIdB = await contractB.methods.nextTokenId().call(); + await contractB.methods.mint( + owner, + nftTokenIdB, + ).send({from: owner}); + + // Nest + await contractA.methods.transfer(nftTokenAddressA1, nftTokenIdA).send({from: owner}); + expect(await contractA.methods.ownerOf(nftTokenIdA).call()).to.be.equal(nftTokenAddressA1); + + await contractB.methods.transfer(nftTokenAddressA1, nftTokenIdB).send({from: owner}); + expect(await contractB.methods.ownerOf(nftTokenIdB).call()).to.be.equal(nftTokenAddressA1); + }); +}); + +describe('Negative Test: EVM Nesting', async() => { + itWeb3('NFT: disallows to nest token if nesting is disabled', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + + const {collectionId, contract} = await createNestingCollection(api, web3, owner); + await contract.methods.setCollectionNesting(false).send({from: owner}); + + // Create a token to nest into + const targetNftTokenId = await contract.methods.nextTokenId().call(); + await contract.methods.mint( + owner, + targetNftTokenId, + ).send({from: owner}); + + const targetNftTokenAddress = tokenIdToAddress(collectionId, targetNftTokenId); + + // Create a token to nest + const nftTokenId = await contract.methods.nextTokenId().call(); + await contract.methods.mint( + owner, + nftTokenId, + ).send({from: owner}); + + // Try to nest + await expect(contract.methods + .transfer(targetNftTokenAddress, nftTokenId) + .call({from: owner})).to.be.rejectedWith('UserIsNotAllowedToNest'); + }); + + itWeb3('NFT: disallows a non-Owner to nest someone else\'s token', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const malignant = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + + const {collectionId, contract} = await createNestingCollection(api, web3, owner); + + // Mint a token + const targetTokenId = await contract.methods.nextTokenId().call(); + await contract.methods.mint( + owner, + targetTokenId, + ).send({from: owner}); + const targetTokenAddress = tokenIdToAddress(collectionId, targetTokenId); + + // Mint a token belonging to a different account + const tokenId = await contract.methods.nextTokenId().call(); + await contract.methods.mint( + malignant, + tokenId, + ).send({from: owner}); + + // Try to nest one token in another as a non-owner account + await expect(contract.methods + .transfer(targetTokenAddress, tokenId) + .call({from: malignant})).to.be.rejectedWith('UserIsNotAllowedToNest'); + }); + + itWeb3('NFT: disallows a non-Owner to nest someone else\'s token (Restricted nesting)', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + const malignant = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + + const {collectionId: collectionIdA, collectionAddress: collectionAddressA, contract: contractA} = await createNestingCollection(api, web3, owner); + const {collectionAddress: collectionAddressB, contract: contractB} = await createNestingCollection(api, web3, owner); + + await contractA.methods.setCollectionNesting(true, [collectionAddressA, collectionAddressB]).send({from: owner}); + + // Create a token in one collection + const nftTokenIdA = await contractA.methods.nextTokenId().call(); + await contractA.methods.mint( + owner, + nftTokenIdA, + ).send({from: owner}); + const nftTokenAddressA = tokenIdToAddress(collectionIdA, nftTokenIdA); + + // Create a token in another collection belonging to someone else + const nftTokenIdB = await contractB.methods.nextTokenId().call(); + await contractB.methods.mint( + malignant, + nftTokenIdB, + ).send({from: owner}); + + // Try to drag someone else's token into the other collection and nest + await expect(contractB.methods + .transfer(nftTokenAddressA, nftTokenIdB) + .call({from: malignant})).to.be.rejectedWith('UserIsNotAllowedToNest'); + }); + + itWeb3('NFT: disallows to nest token in an unlisted collection', async ({api, web3, privateKeyWrapper}) => { + const owner = await createEthAccountWithBalance(api, web3, privateKeyWrapper); + + const {collectionId: collectionIdA, collectionAddress: collectionAddressA, contract: contractA} = await createNestingCollection(api, web3, owner); + const {contract: contractB} = await createNestingCollection(api, web3, owner); + + await contractA.methods.setCollectionNesting(true, [collectionAddressA]).send({from: owner}); + + // Create a token in one collection + const nftTokenIdA = await contractA.methods.nextTokenId().call(); + await contractA.methods.mint( + owner, + nftTokenIdA, + ).send({from: owner}); + const nftTokenAddressA = tokenIdToAddress(collectionIdA, nftTokenIdA); + + // Create a token in another collection + const nftTokenIdB = await contractB.methods.nextTokenId().call(); + await contractB.methods.mint( + owner, + nftTokenIdB, + ).send({from: owner}); + + // Try to nest into a token in the other collection, disallowed in the first + await expect(contractB.methods + .transfer(nftTokenAddressA, nftTokenIdB) + .call()).to.be.rejectedWith('SourceCollectionIsNotAllowedToNest'); + }); +}); --- a/tests/src/eth/nonFungibleAbi.json +++ b/tests/src/eth/nonFungibleAbi.json @@ -91,6 +91,15 @@ }, { "inputs": [ + { "internalType": "uint256", "name": "newAdmin", "type": "uint256" } + ], + "name": "addCollectionAdminSubstrate", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", "name": "user", "type": "address" } ], "name": "addToCollectionAllowList", @@ -300,6 +309,15 @@ }, { "inputs": [ + { "internalType": "uint256", "name": "newAdmin", "type": "uint256" } + ], + "name": "removeCollectionAdminSubstrate", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", "name": "user", "type": "address" } ], "name": "removeFromCollectionAllowList", --- a/tests/src/eth/tokenProperties.test.ts +++ b/tests/src/eth/tokenProperties.test.ts @@ -29,7 +29,7 @@ const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); const token = await createItemExpectSuccess(alice, collection, 'NFT'); - await executeTransaction(api, alice, api.tx.unique.setPropertyPermissions(collection, [{ + await executeTransaction(api, alice, api.tx.unique.setTokenPropertyPermissions(collection, [{ key: 'testKey', permission: { collectionAdmin: true, @@ -52,7 +52,7 @@ const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); const token = await createItemExpectSuccess(alice, collection, 'NFT'); - await executeTransaction(api, alice, api.tx.unique.setPropertyPermissions(collection, [{ + await executeTransaction(api, alice, api.tx.unique.setTokenPropertyPermissions(collection, [{ key: 'testKey', permission: { mutable: true, @@ -77,7 +77,7 @@ const collection = await createCollectionExpectSuccess({mode: {type:'NFT'}}); const token = await createItemExpectSuccess(alice, collection, 'NFT'); - await executeTransaction(api, alice, api.tx.unique.setPropertyPermissions(collection, [{ + await executeTransaction(api, alice, api.tx.unique.setTokenPropertyPermissions(collection, [{ key: 'testKey', permission: { collectionAdmin: true, --- a/tests/src/interfaces/augment-api-errors.ts +++ b/tests/src/interfaces/augment-api-errors.ts @@ -458,6 +458,7 @@ ResourceNotPending: AugmentedError; RmrkPropertyKeyIsTooLong: AugmentedError; RmrkPropertyValueIsTooLong: AugmentedError; + UnableToDecodeRmrkData: AugmentedError; /** * Generic error **/ --- a/tests/src/interfaces/augment-api-query.ts +++ b/tests/src/interfaces/augment-api-query.ts @@ -5,7 +5,7 @@ import type { BTreeMap, Bytes, Option, U256, U8aFixed, Vec, bool, u128, u16, u32, u64 } from '@polkadot/types-codec'; import type { AnyNumber, ITuple } from '@polkadot/types-codec/types'; import type { AccountId32, H160, H256 } from '@polkadot/types/interfaces/runtime'; -import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueQueueConfigData, EthereumBlock, EthereumLog, EthereumReceiptReceiptV3, EthereumTransactionTransactionV2, FpRpcTransactionStatus, FrameSupportWeightsPerDispatchClassU64, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmContractHelpersSponsoringModeT, PalletNonfungibleItemData, PalletRefungibleItemData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PalletUnqSchedulerScheduledV3, PhantomTypeUpDataStructs, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, SpRuntimeDigest, SpTrieStorageProof, UpDataStructsCollection, UpDataStructsCollectionStats, UpDataStructsProperties, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsPropertyPermission, UpDataStructsTokenChild } from '@polkadot/types/lookup'; +import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueQueueConfigData, EthereumBlock, EthereumLog, EthereumReceiptReceiptV3, EthereumTransactionTransactionV2, FpRpcTransactionStatus, FrameSupportWeightsPerDispatchClassU64, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmContractHelpersSponsoringModeT, PalletNonfungibleItemData, PalletRefungibleItemData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PalletUniqueSchedulerScheduledV3, PhantomTypeUpDataStructs, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, SpRuntimeDigest, SpTrieStorageProof, UpDataStructsCollection, UpDataStructsCollectionStats, UpDataStructsProperties, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsPropertyPermission, UpDataStructsTokenChild } from '@polkadot/types/lookup'; import type { Observable } from '@polkadot/types/types'; declare module '@polkadot/api-base/types/storage' { @@ -417,7 +417,6 @@ }; rmrkCore: { collectionIndex: AugmentedQuery Observable, []> & QueryableStorageEntry; - rmrkInernalCollectionId: AugmentedQuery Observable, [u32]> & QueryableStorageEntry; uniqueCollectionId: AugmentedQuery Observable, [u32]> & QueryableStorageEntry; /** * Generic query @@ -436,7 +435,7 @@ /** * Items to be executed, indexed by the block number that they should be executed on. **/ - agenda: AugmentedQuery Observable>>, [u32]> & QueryableStorageEntry; + agenda: AugmentedQuery Observable>>, [u32]> & QueryableStorageEntry; /** * Lookup from identity to the block number and index of the task. **/ --- a/tests/src/interfaces/augment-api-tx.ts +++ b/tests/src/interfaces/augment-api-tx.ts @@ -5,7 +5,7 @@ import type { Bytes, Compact, Option, U256, U8aFixed, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec'; import type { AnyNumber, IMethod, ITuple } from '@polkadot/types-codec/types'; import type { AccountId32, Call, H160, H256, MultiAddress, Perbill, Permill } from '@polkadot/types/interfaces/runtime'; -import type { CumulusPrimitivesParachainInherentParachainInherentData, EthereumTransactionTransactionV2, FrameSupportScheduleMaybeHashed, OrmlVestingVestingSchedule, PalletEvmAccountBasicCrossAccountIdRepr, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsPartPartType, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCreateCollectionData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, XcmV1MultiLocation, XcmV2WeightLimit, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup'; +import type { CumulusPrimitivesParachainInherentParachainInherentData, EthereumTransactionTransactionV2, FrameSupportScheduleMaybeHashed, OrmlVestingVestingSchedule, PalletEvmAccountBasicCrossAccountIdRepr, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsPartPartType, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCreateCollectionData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, XcmV1MultiLocation, XcmV2WeightLimit, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup'; declare module '@polkadot/api-base/types/submittable' { export interface AugmentedSubmittables { @@ -373,7 +373,7 @@ /** * Create composable resource **/ - addComposableResource: AugmentedSubmittable<(rmrkCollectionId: u32 | AnyNumber | Uint8Array, nftId: u32 | AnyNumber | Uint8Array, resourceId: Bytes | string | Uint8Array, resource: RmrkTraitsResourceComposableResource | { parts?: any; base?: any; src?: any; metadata?: any; license?: any; thumb?: any } | string | Uint8Array) => SubmittableExtrinsic, [u32, u32, Bytes, RmrkTraitsResourceComposableResource]>; + addComposableResource: AugmentedSubmittable<(rmrkCollectionId: u32 | AnyNumber | Uint8Array, nftId: u32 | AnyNumber | Uint8Array, resource: RmrkTraitsResourceComposableResource | { parts?: any; base?: any; src?: any; metadata?: any; license?: any; thumb?: any } | string | Uint8Array) => SubmittableExtrinsic, [u32, u32, RmrkTraitsResourceComposableResource]>; /** * Create slot resource **/ @@ -381,7 +381,7 @@ /** * burn nft **/ - burnNft: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, nftId: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u32, u32]>; + burnNft: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, nftId: u32 | AnyNumber | Uint8Array, maxBurns: u32 | AnyNumber | Uint8Array) => SubmittableExtrinsic, [u32, u32, u32]>; /** * Change the issuer of a collection * @@ -415,7 +415,7 @@ * - `metadata`: Arbitrary data about an nft, e.g. IPFS hash * - `transferable`: Ability to transfer this NFT **/ - mintNft: AugmentedSubmittable<(owner: AccountId32 | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, recipient: Option | null | object | string | Uint8Array, royaltyAmount: Option | null | object | string | Uint8Array, metadata: Bytes | string | Uint8Array, transferable: bool | boolean | Uint8Array) => SubmittableExtrinsic, [AccountId32, u32, Option, Option, Bytes, bool]>; + mintNft: AugmentedSubmittable<(owner: AccountId32 | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, recipient: Option | null | object | string | Uint8Array, royaltyAmount: Option | null | object | string | Uint8Array, metadata: Bytes | string | Uint8Array, transferable: bool | boolean | Uint8Array, resources: Option> | null | object | string | Uint8Array) => SubmittableExtrinsic, [AccountId32, u32, Option, Option, Bytes, bool, Option>]>; /** * Rejects an NFT sent from another account to self or owned NFT * @@ -974,8 +974,8 @@ * * new_sponsor. **/ setCollectionSponsor: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newSponsor: AccountId32 | string | Uint8Array) => SubmittableExtrinsic, [u32, AccountId32]>; - setPropertyPermissions: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, propertyPermissions: Vec | (UpDataStructsPropertyKeyPermission | { key?: any; permission?: any } | string | Uint8Array)[]) => SubmittableExtrinsic, [u32, Vec]>; setTokenProperties: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, properties: Vec | (UpDataStructsProperty | { key?: any; value?: any } | string | Uint8Array)[]) => SubmittableExtrinsic, [u32, u32, Vec]>; + setTokenPropertyPermissions: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, propertyPermissions: Vec | (UpDataStructsPropertyKeyPermission | { key?: any; permission?: any } | string | Uint8Array)[]) => SubmittableExtrinsic, [u32, Vec]>; /** * Set transfers_enabled value for particular collection * --- a/tests/src/interfaces/augment-types.ts +++ b/tests/src/interfaces/augment-types.ts @@ -1,7 +1,7 @@ // Auto-generated via `yarn polkadot-types-from-defs`, do not edit /* eslint-disable */ -import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSupportWeightsWeightToFeeCoefficient, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUnqSchedulerCall, PalletUnqSchedulerError, PalletUnqSchedulerEvent, PalletUnqSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExData, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipState, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './default'; +import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSupportWeightsWeightToFeeCoefficient, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUniqueSchedulerCall, PalletUniqueSchedulerError, PalletUniqueSchedulerEvent, PalletUniqueSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExData, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipState, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './default'; import type { Data, StorageKey } from '@polkadot/types'; import type { BitVec, Bool, Bytes, I128, I16, I256, I32, I64, I8, Json, Null, OptionBool, Raw, 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-codec'; import type { AssetApproval, AssetApprovalKey, AssetBalance, AssetDestroyWitness, AssetDetails, AssetMetadata, TAssetBalance, TAssetDepositBalance } from '@polkadot/types/interfaces/assets'; @@ -819,10 +819,10 @@ PalletUniqueCall: PalletUniqueCall; PalletUniqueError: PalletUniqueError; PalletUniqueRawEvent: PalletUniqueRawEvent; - PalletUnqSchedulerCall: PalletUnqSchedulerCall; - PalletUnqSchedulerError: PalletUnqSchedulerError; - PalletUnqSchedulerEvent: PalletUnqSchedulerEvent; - PalletUnqSchedulerScheduledV3: PalletUnqSchedulerScheduledV3; + PalletUniqueSchedulerCall: PalletUniqueSchedulerCall; + PalletUniqueSchedulerError: PalletUniqueSchedulerError; + PalletUniqueSchedulerEvent: PalletUniqueSchedulerEvent; + PalletUniqueSchedulerScheduledV3: PalletUniqueSchedulerScheduledV3; PalletVersion: PalletVersion; PalletXcmCall: PalletXcmCall; PalletXcmError: PalletXcmError; --- a/tests/src/interfaces/default/types.ts +++ b/tests/src/interfaces/default/types.ts @@ -1214,11 +1214,13 @@ readonly royaltyAmount: Option; readonly metadata: Bytes; readonly transferable: bool; + readonly resources: Option>; } & Struct; readonly isBurnNft: boolean; readonly asBurnNft: { readonly collectionId: u32; readonly nftId: u32; + readonly maxBurns: u32; } & Struct; readonly isSend: boolean; readonly asSend: { @@ -1272,7 +1274,6 @@ readonly asAddComposableResource: { readonly rmrkCollectionId: u32; readonly nftId: u32; - readonly resourceId: Bytes; readonly resource: RmrkTraitsResourceComposableResource; } & Struct; readonly isAddSlotResource: boolean; @@ -1296,6 +1297,7 @@ readonly isNftTypeEncodeError: boolean; readonly isRmrkPropertyKeyIsTooLong: boolean; readonly isRmrkPropertyValueIsTooLong: boolean; + readonly isUnableToDecodeRmrkData: boolean; readonly isCollectionNotEmpty: boolean; readonly isNoAvailableCollectionId: boolean; readonly isNoAvailableNftId: boolean; @@ -1308,7 +1310,7 @@ readonly isCannotAcceptNonOwnedNft: boolean; readonly isCannotRejectNonOwnedNft: boolean; readonly isResourceNotPending: boolean; - readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'ResourceNotPending'; + readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'ResourceNotPending'; } /** @name PalletRmrkCoreEvent */ @@ -1688,8 +1690,8 @@ readonly tokenId: u32; readonly propertyKeys: Vec; } & Struct; - readonly isSetPropertyPermissions: boolean; - readonly asSetPropertyPermissions: { + readonly isSetTokenPropertyPermissions: boolean; + readonly asSetTokenPropertyPermissions: { readonly collectionId: u32; readonly propertyPermissions: Vec; } & Struct; @@ -1748,7 +1750,7 @@ readonly collectionId: u32; readonly newLimit: UpDataStructsCollectionPermissions; } & Struct; - readonly type: 'CreateCollection' | 'CreateCollectionEx' | 'DestroyCollection' | 'AddToAllowList' | 'RemoveFromAllowList' | 'ChangeCollectionOwner' | 'AddCollectionAdmin' | 'RemoveCollectionAdmin' | 'SetCollectionSponsor' | 'ConfirmSponsorship' | 'RemoveCollectionSponsor' | 'CreateItem' | 'CreateMultipleItems' | 'SetCollectionProperties' | 'DeleteCollectionProperties' | 'SetTokenProperties' | 'DeleteTokenProperties' | 'SetPropertyPermissions' | 'CreateMultipleItemsEx' | 'SetTransfersEnabledFlag' | 'BurnItem' | 'BurnFrom' | 'Transfer' | 'Approve' | 'TransferFrom' | 'SetCollectionLimits' | 'SetCollectionPermissions'; + readonly type: 'CreateCollection' | 'CreateCollectionEx' | 'DestroyCollection' | 'AddToAllowList' | 'RemoveFromAllowList' | 'ChangeCollectionOwner' | 'AddCollectionAdmin' | 'RemoveCollectionAdmin' | 'SetCollectionSponsor' | 'ConfirmSponsorship' | 'RemoveCollectionSponsor' | 'CreateItem' | 'CreateMultipleItems' | 'SetCollectionProperties' | 'DeleteCollectionProperties' | 'SetTokenProperties' | 'DeleteTokenProperties' | 'SetTokenPropertyPermissions' | 'CreateMultipleItemsEx' | 'SetTransfersEnabledFlag' | 'BurnItem' | 'BurnFrom' | 'Transfer' | 'Approve' | 'TransferFrom' | 'SetCollectionLimits' | 'SetCollectionPermissions'; } /** @name PalletUniqueError */ @@ -1784,8 +1786,8 @@ readonly type: 'CollectionSponsorRemoved' | 'CollectionAdminAdded' | 'CollectionOwnedChanged' | 'CollectionSponsorSet' | 'SponsorshipConfirmed' | 'CollectionAdminRemoved' | 'AllowListAddressRemoved' | 'AllowListAddressAdded' | 'CollectionLimitSet' | 'CollectionPermissionSet'; } -/** @name PalletUnqSchedulerCall */ -export interface PalletUnqSchedulerCall extends Enum { +/** @name PalletUniqueSchedulerCall */ +export interface PalletUniqueSchedulerCall extends Enum { readonly isScheduleNamed: boolean; readonly asScheduleNamed: { readonly id: U8aFixed; @@ -1809,8 +1811,8 @@ readonly type: 'ScheduleNamed' | 'CancelNamed' | 'ScheduleNamedAfter'; } -/** @name PalletUnqSchedulerError */ -export interface PalletUnqSchedulerError extends Enum { +/** @name PalletUniqueSchedulerError */ +export interface PalletUniqueSchedulerError extends Enum { readonly isFailedToSchedule: boolean; readonly isNotFound: boolean; readonly isTargetBlockNumberInPast: boolean; @@ -1818,8 +1820,8 @@ readonly type: 'FailedToSchedule' | 'NotFound' | 'TargetBlockNumberInPast' | 'RescheduleNoChange'; } -/** @name PalletUnqSchedulerEvent */ -export interface PalletUnqSchedulerEvent extends Enum { +/** @name PalletUniqueSchedulerEvent */ +export interface PalletUniqueSchedulerEvent extends Enum { readonly isScheduled: boolean; readonly asScheduled: { readonly when: u32; @@ -1845,8 +1847,8 @@ readonly type: 'Scheduled' | 'Canceled' | 'Dispatched' | 'CallLookupFailed'; } -/** @name PalletUnqSchedulerScheduledV3 */ -export interface PalletUnqSchedulerScheduledV3 extends Struct { +/** @name PalletUniqueSchedulerScheduledV3 */ +export interface PalletUniqueSchedulerScheduledV3 extends Struct { readonly maybeId: Option; readonly priority: u8; readonly call: FrameSupportScheduleMaybeHashed; @@ -2427,7 +2429,7 @@ /** @name UpDataStructsNestingPermissions */ export interface UpDataStructsNestingPermissions extends Struct { readonly tokenOwner: bool; - readonly admin: bool; + readonly collectionAdmin: bool; readonly restricted: Option; readonly permissive: bool; } --- a/tests/src/interfaces/lookup.ts +++ b/tests/src/interfaces/lookup.ts @@ -1313,7 +1313,7 @@ tokenId: 'u32', propertyKeys: 'Vec', }, - set_property_permissions: { + set_token_property_permissions: { collectionId: 'u32', propertyPermissions: 'Vec', }, @@ -1432,7 +1432,7 @@ **/ UpDataStructsNestingPermissions: { tokenOwner: 'bool', - admin: 'bool', + collectionAdmin: 'bool', restricted: 'Option', permissive: 'bool' }, @@ -1526,9 +1526,9 @@ users: 'BTreeMap' }, /** - * Lookup206: pallet_unq_scheduler::pallet::Call + * Lookup206: pallet_unique_scheduler::pallet::Call **/ - PalletUnqSchedulerCall: { + PalletUniqueSchedulerCall: { _enum: { schedule_named: { id: '[u8;16]', @@ -1593,10 +1593,12 @@ royaltyAmount: 'Option', metadata: 'Bytes', transferable: 'bool', + resources: 'Option>', }, burn_nft: { collectionId: 'u32', nftId: 'u32', + maxBurns: 'u32', }, send: { rmrkCollectionId: 'u32', @@ -1641,7 +1643,6 @@ add_composable_resource: { rmrkCollectionId: 'u32', nftId: 'u32', - resourceId: 'Bytes', resource: 'RmrkTraitsResourceComposableResource', }, add_slot_resource: { @@ -1657,12 +1658,13 @@ } }, /** - * Lookup215: rmrk_traits::nft::AccountIdOrCollectionNftTuple + * Lookup217: rmrk_traits::resource::ResourceTypes, frame_support::storage::bounded_vec::BoundedVec> **/ - RmrkTraitsNftAccountIdOrCollectionNftTuple: { + RmrkTraitsResourceResourceTypes: { _enum: { - AccountId: 'AccountId32', - CollectionAndNftTuple: '(u32,u32)' + Basic: 'RmrkTraitsResourceBasicResource', + Composable: 'RmrkTraitsResourceComposableResource', + Slot: 'RmrkTraitsResourceSlotResource' } }, /** @@ -1675,7 +1677,7 @@ thumb: 'Option' }, /** - * Lookup222: rmrk_traits::resource::ComposableResource, frame_support::storage::bounded_vec::BoundedVec> + * Lookup221: rmrk_traits::resource::ComposableResource, frame_support::storage::bounded_vec::BoundedVec> **/ RmrkTraitsResourceComposableResource: { parts: 'Vec', @@ -1686,7 +1688,7 @@ thumb: 'Option' }, /** - * Lookup224: rmrk_traits::resource::SlotResource> + * Lookup222: rmrk_traits::resource::SlotResource> **/ RmrkTraitsResourceSlotResource: { base: 'u32', @@ -1697,7 +1699,16 @@ thumb: 'Option' }, /** - * Lookup225: pallet_rmrk_equip::pallet::Call + * Lookup224: rmrk_traits::nft::AccountIdOrCollectionNftTuple + **/ + RmrkTraitsNftAccountIdOrCollectionNftTuple: { + _enum: { + AccountId: 'AccountId32', + CollectionAndNftTuple: '(u32,u32)' + } + }, + /** + * Lookup228: pallet_rmrk_equip::pallet::Call **/ PalletRmrkEquipCall: { _enum: { @@ -1713,7 +1724,7 @@ } }, /** - * Lookup227: rmrk_traits::part::PartType, frame_support::storage::bounded_vec::BoundedVec> + * Lookup230: rmrk_traits::part::PartType, frame_support::storage::bounded_vec::BoundedVec> **/ RmrkTraitsPartPartType: { _enum: { @@ -1722,7 +1733,7 @@ } }, /** - * Lookup229: rmrk_traits::part::FixedPart> + * Lookup232: rmrk_traits::part::FixedPart> **/ RmrkTraitsPartFixedPart: { id: 'u32', @@ -1730,7 +1741,7 @@ src: 'Bytes' }, /** - * Lookup230: rmrk_traits::part::SlotPart, frame_support::storage::bounded_vec::BoundedVec> + * Lookup233: rmrk_traits::part::SlotPart, frame_support::storage::bounded_vec::BoundedVec> **/ RmrkTraitsPartSlotPart: { id: 'u32', @@ -1739,7 +1750,7 @@ z: 'u32' }, /** - * Lookup231: rmrk_traits::part::EquippableList> + * Lookup234: rmrk_traits::part::EquippableList> **/ RmrkTraitsPartEquippableList: { _enum: { @@ -1749,7 +1760,7 @@ } }, /** - * Lookup233: rmrk_traits::theme::Theme, PropertyList> + * Lookup236: rmrk_traits::theme::Theme, PropertyList> **/ RmrkTraitsTheme: { name: 'Bytes', @@ -1757,14 +1768,14 @@ inherit: 'bool' }, /** - * Lookup235: rmrk_traits::theme::ThemeProperty> + * Lookup238: rmrk_traits::theme::ThemeProperty> **/ RmrkTraitsThemeThemeProperty: { key: 'Bytes', value: 'Bytes' }, /** - * Lookup236: pallet_evm::pallet::Call + * Lookup239: pallet_evm::pallet::Call **/ PalletEvmCall: { _enum: { @@ -1807,7 +1818,7 @@ } }, /** - * Lookup242: pallet_ethereum::pallet::Call + * Lookup245: pallet_ethereum::pallet::Call **/ PalletEthereumCall: { _enum: { @@ -1817,7 +1828,7 @@ } }, /** - * Lookup243: ethereum::transaction::TransactionV2 + * Lookup246: ethereum::transaction::TransactionV2 **/ EthereumTransactionTransactionV2: { _enum: { @@ -1827,7 +1838,7 @@ } }, /** - * Lookup244: ethereum::transaction::LegacyTransaction + * Lookup247: ethereum::transaction::LegacyTransaction **/ EthereumTransactionLegacyTransaction: { nonce: 'U256', @@ -1839,7 +1850,7 @@ signature: 'EthereumTransactionTransactionSignature' }, /** - * Lookup245: ethereum::transaction::TransactionAction + * Lookup248: ethereum::transaction::TransactionAction **/ EthereumTransactionTransactionAction: { _enum: { @@ -1848,7 +1859,7 @@ } }, /** - * Lookup246: ethereum::transaction::TransactionSignature + * Lookup249: ethereum::transaction::TransactionSignature **/ EthereumTransactionTransactionSignature: { v: 'u64', @@ -1856,7 +1867,7 @@ s: 'H256' }, /** - * Lookup248: ethereum::transaction::EIP2930Transaction + * Lookup251: ethereum::transaction::EIP2930Transaction **/ EthereumTransactionEip2930Transaction: { chainId: 'u64', @@ -1872,14 +1883,14 @@ s: 'H256' }, /** - * Lookup250: ethereum::transaction::AccessListItem + * Lookup253: ethereum::transaction::AccessListItem **/ EthereumTransactionAccessListItem: { address: 'H160', storageKeys: 'Vec' }, /** - * Lookup251: ethereum::transaction::EIP1559Transaction + * Lookup254: ethereum::transaction::EIP1559Transaction **/ EthereumTransactionEip1559Transaction: { chainId: 'u64', @@ -1896,7 +1907,7 @@ s: 'H256' }, /** - * Lookup252: pallet_evm_migration::pallet::Call + * Lookup255: pallet_evm_migration::pallet::Call **/ PalletEvmMigrationCall: { _enum: { @@ -1914,7 +1925,7 @@ } }, /** - * Lookup255: pallet_sudo::pallet::Event + * Lookup258: pallet_sudo::pallet::Event **/ PalletSudoEvent: { _enum: { @@ -1930,7 +1941,7 @@ } }, /** - * Lookup257: sp_runtime::DispatchError + * Lookup260: sp_runtime::DispatchError **/ SpRuntimeDispatchError: { _enum: { @@ -1947,38 +1958,38 @@ } }, /** - * Lookup258: sp_runtime::ModuleError + * Lookup261: sp_runtime::ModuleError **/ SpRuntimeModuleError: { index: 'u8', error: '[u8;4]' }, /** - * Lookup259: sp_runtime::TokenError + * Lookup262: sp_runtime::TokenError **/ SpRuntimeTokenError: { _enum: ['NoFunds', 'WouldDie', 'BelowMinimum', 'CannotCreate', 'UnknownAsset', 'Frozen', 'Unsupported'] }, /** - * Lookup260: sp_runtime::ArithmeticError + * Lookup263: sp_runtime::ArithmeticError **/ SpRuntimeArithmeticError: { _enum: ['Underflow', 'Overflow', 'DivisionByZero'] }, /** - * Lookup261: sp_runtime::TransactionalError + * Lookup264: sp_runtime::TransactionalError **/ SpRuntimeTransactionalError: { _enum: ['LimitReached', 'NoLayer'] }, /** - * Lookup262: pallet_sudo::pallet::Error + * Lookup265: pallet_sudo::pallet::Error **/ PalletSudoError: { _enum: ['RequireSudo'] }, /** - * Lookup263: frame_system::AccountInfo> + * Lookup266: frame_system::AccountInfo> **/ FrameSystemAccountInfo: { nonce: 'u32', @@ -1988,7 +1999,7 @@ data: 'PalletBalancesAccountData' }, /** - * Lookup264: frame_support::weights::PerDispatchClass + * Lookup267: frame_support::weights::PerDispatchClass **/ FrameSupportWeightsPerDispatchClassU64: { normal: 'u64', @@ -1996,13 +2007,13 @@ mandatory: 'u64' }, /** - * Lookup265: sp_runtime::generic::digest::Digest + * Lookup268: sp_runtime::generic::digest::Digest **/ SpRuntimeDigest: { logs: 'Vec' }, /** - * Lookup267: sp_runtime::generic::digest::DigestItem + * Lookup270: sp_runtime::generic::digest::DigestItem **/ SpRuntimeDigestDigestItem: { _enum: { @@ -2018,7 +2029,7 @@ } }, /** - * Lookup269: frame_system::EventRecord + * Lookup272: frame_system::EventRecord **/ FrameSystemEventRecord: { phase: 'FrameSystemPhase', @@ -2026,7 +2037,7 @@ topics: 'Vec' }, /** - * Lookup271: frame_system::pallet::Event + * Lookup274: frame_system::pallet::Event **/ FrameSystemEvent: { _enum: { @@ -2054,7 +2065,7 @@ } }, /** - * Lookup272: frame_support::weights::DispatchInfo + * Lookup275: frame_support::weights::DispatchInfo **/ FrameSupportWeightsDispatchInfo: { weight: 'u64', @@ -2062,19 +2073,19 @@ paysFee: 'FrameSupportWeightsPays' }, /** - * Lookup273: frame_support::weights::DispatchClass + * Lookup276: frame_support::weights::DispatchClass **/ FrameSupportWeightsDispatchClass: { _enum: ['Normal', 'Operational', 'Mandatory'] }, /** - * Lookup274: frame_support::weights::Pays + * Lookup277: frame_support::weights::Pays **/ FrameSupportWeightsPays: { _enum: ['Yes', 'No'] }, /** - * Lookup275: orml_vesting::module::Event + * Lookup278: orml_vesting::module::Event **/ OrmlVestingModuleEvent: { _enum: { @@ -2093,7 +2104,7 @@ } }, /** - * Lookup276: cumulus_pallet_xcmp_queue::pallet::Event + * Lookup279: cumulus_pallet_xcmp_queue::pallet::Event **/ CumulusPalletXcmpQueueEvent: { _enum: { @@ -2108,7 +2119,7 @@ } }, /** - * Lookup277: pallet_xcm::pallet::Event + * Lookup280: pallet_xcm::pallet::Event **/ PalletXcmEvent: { _enum: { @@ -2131,7 +2142,7 @@ } }, /** - * Lookup278: xcm::v2::traits::Outcome + * Lookup281: xcm::v2::traits::Outcome **/ XcmV2TraitsOutcome: { _enum: { @@ -2141,7 +2152,7 @@ } }, /** - * Lookup280: cumulus_pallet_xcm::pallet::Event + * Lookup283: cumulus_pallet_xcm::pallet::Event **/ CumulusPalletXcmEvent: { _enum: { @@ -2151,7 +2162,7 @@ } }, /** - * Lookup281: cumulus_pallet_dmp_queue::pallet::Event + * Lookup284: cumulus_pallet_dmp_queue::pallet::Event **/ CumulusPalletDmpQueueEvent: { _enum: { @@ -2164,7 +2175,7 @@ } }, /** - * Lookup282: pallet_unique::RawEvent> + * Lookup285: pallet_unique::RawEvent> **/ PalletUniqueRawEvent: { _enum: { @@ -2181,9 +2192,9 @@ } }, /** - * Lookup283: pallet_unq_scheduler::pallet::Event + * Lookup286: pallet_unique_scheduler::pallet::Event **/ - PalletUnqSchedulerEvent: { + PalletUniqueSchedulerEvent: { _enum: { Scheduled: { when: 'u32', @@ -2206,13 +2217,13 @@ } }, /** - * Lookup285: frame_support::traits::schedule::LookupError + * Lookup288: frame_support::traits::schedule::LookupError **/ FrameSupportScheduleLookupError: { _enum: ['Unknown', 'BadFormat'] }, /** - * Lookup286: pallet_common::pallet::Event + * Lookup289: pallet_common::pallet::Event **/ PalletCommonEvent: { _enum: { @@ -2230,7 +2241,7 @@ } }, /** - * Lookup287: pallet_structure::pallet::Event + * Lookup290: pallet_structure::pallet::Event **/ PalletStructureEvent: { _enum: { @@ -2238,7 +2249,7 @@ } }, /** - * Lookup288: pallet_rmrk_core::pallet::Event + * Lookup291: pallet_rmrk_core::pallet::Event **/ PalletRmrkCoreEvent: { _enum: { @@ -2315,7 +2326,7 @@ } }, /** - * Lookup289: pallet_rmrk_equip::pallet::Event + * Lookup292: pallet_rmrk_equip::pallet::Event **/ PalletRmrkEquipEvent: { _enum: { @@ -2326,7 +2337,7 @@ } }, /** - * Lookup290: pallet_evm::pallet::Event + * Lookup293: pallet_evm::pallet::Event **/ PalletEvmEvent: { _enum: { @@ -2340,7 +2351,7 @@ } }, /** - * Lookup291: ethereum::log::Log + * Lookup294: ethereum::log::Log **/ EthereumLog: { address: 'H160', @@ -2348,7 +2359,7 @@ data: 'Bytes' }, /** - * Lookup292: pallet_ethereum::pallet::Event + * Lookup295: pallet_ethereum::pallet::Event **/ PalletEthereumEvent: { _enum: { @@ -2356,7 +2367,7 @@ } }, /** - * Lookup293: evm_core::error::ExitReason + * Lookup296: evm_core::error::ExitReason **/ EvmCoreErrorExitReason: { _enum: { @@ -2367,13 +2378,13 @@ } }, /** - * Lookup294: evm_core::error::ExitSucceed + * Lookup297: evm_core::error::ExitSucceed **/ EvmCoreErrorExitSucceed: { _enum: ['Stopped', 'Returned', 'Suicided'] }, /** - * Lookup295: evm_core::error::ExitError + * Lookup298: evm_core::error::ExitError **/ EvmCoreErrorExitError: { _enum: { @@ -2395,13 +2406,13 @@ } }, /** - * Lookup298: evm_core::error::ExitRevert + * Lookup301: evm_core::error::ExitRevert **/ EvmCoreErrorExitRevert: { _enum: ['Reverted'] }, /** - * Lookup299: evm_core::error::ExitFatal + * Lookup302: evm_core::error::ExitFatal **/ EvmCoreErrorExitFatal: { _enum: { @@ -2412,7 +2423,7 @@ } }, /** - * Lookup300: frame_system::Phase + * Lookup303: frame_system::Phase **/ FrameSystemPhase: { _enum: { @@ -2422,14 +2433,14 @@ } }, /** - * Lookup302: frame_system::LastRuntimeUpgradeInfo + * Lookup305: frame_system::LastRuntimeUpgradeInfo **/ FrameSystemLastRuntimeUpgradeInfo: { specVersion: 'Compact', specName: 'Text' }, /** - * Lookup303: frame_system::limits::BlockWeights + * Lookup306: frame_system::limits::BlockWeights **/ FrameSystemLimitsBlockWeights: { baseBlock: 'u64', @@ -2437,7 +2448,7 @@ perClass: 'FrameSupportWeightsPerDispatchClassWeightsPerClass' }, /** - * Lookup304: frame_support::weights::PerDispatchClass + * Lookup307: frame_support::weights::PerDispatchClass **/ FrameSupportWeightsPerDispatchClassWeightsPerClass: { normal: 'FrameSystemLimitsWeightsPerClass', @@ -2445,7 +2456,7 @@ mandatory: 'FrameSystemLimitsWeightsPerClass' }, /** - * Lookup305: frame_system::limits::WeightsPerClass + * Lookup308: frame_system::limits::WeightsPerClass **/ FrameSystemLimitsWeightsPerClass: { baseExtrinsic: 'u64', @@ -2454,13 +2465,13 @@ reserved: 'Option' }, /** - * Lookup307: frame_system::limits::BlockLength + * Lookup310: frame_system::limits::BlockLength **/ FrameSystemLimitsBlockLength: { max: 'FrameSupportWeightsPerDispatchClassU32' }, /** - * Lookup308: frame_support::weights::PerDispatchClass + * Lookup311: frame_support::weights::PerDispatchClass **/ FrameSupportWeightsPerDispatchClassU32: { normal: 'u32', @@ -2468,14 +2479,14 @@ mandatory: 'u32' }, /** - * Lookup309: frame_support::weights::RuntimeDbWeight + * Lookup312: frame_support::weights::RuntimeDbWeight **/ FrameSupportWeightsRuntimeDbWeight: { read: 'u64', write: 'u64' }, /** - * Lookup310: sp_version::RuntimeVersion + * Lookup313: sp_version::RuntimeVersion **/ SpVersionRuntimeVersion: { specName: 'Text', @@ -2488,19 +2499,19 @@ stateVersion: 'u8' }, /** - * Lookup314: frame_system::pallet::Error + * Lookup317: frame_system::pallet::Error **/ FrameSystemError: { _enum: ['InvalidSpecName', 'SpecVersionNeedsToIncrease', 'FailedToExtractRuntimeVersion', 'NonDefaultComposite', 'NonZeroRefCount', 'CallFiltered'] }, /** - * Lookup316: orml_vesting::module::Error + * Lookup319: orml_vesting::module::Error **/ OrmlVestingModuleError: { _enum: ['ZeroVestingPeriod', 'ZeroVestingPeriodCount', 'InsufficientBalanceToLock', 'TooManyVestingSchedules', 'AmountLow', 'MaxVestingSchedulesExceeded'] }, /** - * Lookup318: cumulus_pallet_xcmp_queue::InboundChannelDetails + * Lookup321: cumulus_pallet_xcmp_queue::InboundChannelDetails **/ CumulusPalletXcmpQueueInboundChannelDetails: { sender: 'u32', @@ -2508,19 +2519,19 @@ messageMetadata: 'Vec<(u32,PolkadotParachainPrimitivesXcmpMessageFormat)>' }, /** - * Lookup319: cumulus_pallet_xcmp_queue::InboundState + * Lookup322: cumulus_pallet_xcmp_queue::InboundState **/ CumulusPalletXcmpQueueInboundState: { _enum: ['Ok', 'Suspended'] }, /** - * Lookup322: polkadot_parachain::primitives::XcmpMessageFormat + * Lookup325: polkadot_parachain::primitives::XcmpMessageFormat **/ PolkadotParachainPrimitivesXcmpMessageFormat: { _enum: ['ConcatenatedVersionedXcm', 'ConcatenatedEncodedBlob', 'Signals'] }, /** - * Lookup325: cumulus_pallet_xcmp_queue::OutboundChannelDetails + * Lookup328: cumulus_pallet_xcmp_queue::OutboundChannelDetails **/ CumulusPalletXcmpQueueOutboundChannelDetails: { recipient: 'u32', @@ -2530,13 +2541,13 @@ lastIndex: 'u16' }, /** - * Lookup326: cumulus_pallet_xcmp_queue::OutboundState + * Lookup329: cumulus_pallet_xcmp_queue::OutboundState **/ CumulusPalletXcmpQueueOutboundState: { _enum: ['Ok', 'Suspended'] }, /** - * Lookup328: cumulus_pallet_xcmp_queue::QueueConfigData + * Lookup331: cumulus_pallet_xcmp_queue::QueueConfigData **/ CumulusPalletXcmpQueueQueueConfigData: { suspendThreshold: 'u32', @@ -2547,29 +2558,29 @@ xcmpMaxIndividualWeight: 'u64' }, /** - * Lookup330: cumulus_pallet_xcmp_queue::pallet::Error + * Lookup333: cumulus_pallet_xcmp_queue::pallet::Error **/ CumulusPalletXcmpQueueError: { _enum: ['FailedToSend', 'BadXcmOrigin', 'BadXcm', 'BadOverweightIndex', 'WeightOverLimit'] }, /** - * Lookup331: pallet_xcm::pallet::Error + * Lookup334: pallet_xcm::pallet::Error **/ PalletXcmError: { _enum: ['Unreachable', 'SendFailure', 'Filtered', 'UnweighableMessage', 'DestinationNotInvertible', 'Empty', 'CannotReanchor', 'TooManyAssets', 'InvalidOrigin', 'BadVersion', 'BadLocation', 'NoSubscription', 'AlreadySubscribed'] }, /** - * Lookup332: cumulus_pallet_xcm::pallet::Error + * Lookup335: cumulus_pallet_xcm::pallet::Error **/ CumulusPalletXcmError: 'Null', /** - * Lookup333: cumulus_pallet_dmp_queue::ConfigData + * Lookup336: cumulus_pallet_dmp_queue::ConfigData **/ CumulusPalletDmpQueueConfigData: { maxIndividual: 'u64' }, /** - * Lookup334: cumulus_pallet_dmp_queue::PageIndexData + * Lookup337: cumulus_pallet_dmp_queue::PageIndexData **/ CumulusPalletDmpQueuePageIndexData: { beginUsed: 'u32', @@ -2577,21 +2588,21 @@ overweightCount: 'u64' }, /** - * Lookup337: cumulus_pallet_dmp_queue::pallet::Error + * Lookup340: cumulus_pallet_dmp_queue::pallet::Error **/ CumulusPalletDmpQueueError: { _enum: ['Unknown', 'OverLimit'] }, /** - * Lookup341: pallet_unique::Error + * Lookup344: pallet_unique::Error **/ PalletUniqueError: { _enum: ['CollectionDecimalPointLimitExceeded', 'ConfirmUnsetSponsorFail', 'EmptyArgument'] }, /** - * Lookup344: pallet_unq_scheduler::ScheduledV3, BlockNumber, opal_runtime::OriginCaller, sp_core::crypto::AccountId32> + * Lookup347: pallet_unique_scheduler::ScheduledV3, BlockNumber, opal_runtime::OriginCaller, sp_core::crypto::AccountId32> **/ - PalletUnqSchedulerScheduledV3: { + PalletUniqueSchedulerScheduledV3: { maybeId: 'Option<[u8;16]>', priority: 'u8', call: 'FrameSupportScheduleMaybeHashed', @@ -2599,7 +2610,7 @@ origin: 'OpalRuntimeOriginCaller' }, /** - * Lookup345: opal_runtime::OriginCaller + * Lookup348: opal_runtime::OriginCaller **/ OpalRuntimeOriginCaller: { _enum: { @@ -2708,7 +2719,7 @@ } }, /** - * Lookup346: frame_support::dispatch::RawOrigin + * Lookup349: frame_support::dispatch::RawOrigin **/ FrameSupportDispatchRawOrigin: { _enum: { @@ -2718,7 +2729,7 @@ } }, /** - * Lookup347: pallet_xcm::pallet::Origin + * Lookup350: pallet_xcm::pallet::Origin **/ PalletXcmOrigin: { _enum: { @@ -2727,7 +2738,7 @@ } }, /** - * Lookup348: cumulus_pallet_xcm::pallet::Origin + * Lookup351: cumulus_pallet_xcm::pallet::Origin **/ CumulusPalletXcmOrigin: { _enum: { @@ -2736,7 +2747,7 @@ } }, /** - * Lookup349: pallet_ethereum::RawOrigin + * Lookup352: pallet_ethereum::RawOrigin **/ PalletEthereumRawOrigin: { _enum: { @@ -2744,17 +2755,17 @@ } }, /** - * Lookup350: sp_core::Void + * Lookup353: sp_core::Void **/ SpCoreVoid: 'Null', /** - * Lookup351: pallet_unq_scheduler::pallet::Error + * Lookup354: pallet_unique_scheduler::pallet::Error **/ - PalletUnqSchedulerError: { + PalletUniqueSchedulerError: { _enum: ['FailedToSchedule', 'NotFound', 'TargetBlockNumberInPast', 'RescheduleNoChange'] }, /** - * Lookup352: up_data_structs::Collection + * Lookup355: up_data_structs::Collection **/ UpDataStructsCollection: { owner: 'AccountId32', @@ -2768,7 +2779,7 @@ externalCollection: 'bool' }, /** - * Lookup353: up_data_structs::SponsorshipState + * Lookup356: up_data_structs::SponsorshipState **/ UpDataStructsSponsorshipState: { _enum: { @@ -2778,7 +2789,7 @@ } }, /** - * Lookup354: up_data_structs::Properties + * Lookup357: up_data_structs::Properties **/ UpDataStructsProperties: { map: 'UpDataStructsPropertiesMapBoundedVec', @@ -2786,15 +2797,15 @@ spaceLimit: 'u32' }, /** - * Lookup355: up_data_structs::PropertiesMap> + * Lookup358: up_data_structs::PropertiesMap> **/ UpDataStructsPropertiesMapBoundedVec: 'BTreeMap', /** - * Lookup360: up_data_structs::PropertiesMap + * Lookup363: up_data_structs::PropertiesMap **/ UpDataStructsPropertiesMapPropertyPermission: 'BTreeMap', /** - * Lookup367: up_data_structs::CollectionStats + * Lookup370: up_data_structs::CollectionStats **/ UpDataStructsCollectionStats: { created: 'u32', @@ -2802,25 +2813,25 @@ alive: 'u32' }, /** - * Lookup368: up_data_structs::TokenChild + * Lookup371: up_data_structs::TokenChild **/ UpDataStructsTokenChild: { token: 'u32', collection: 'u32' }, /** - * Lookup369: PhantomType::up_data_structs + * Lookup372: PhantomType::up_data_structs **/ PhantomTypeUpDataStructs: '[(UpDataStructsTokenData,UpDataStructsRpcCollection,RmrkTraitsCollectionCollectionInfo,RmrkTraitsNftNftInfo,RmrkTraitsResourceResourceInfo,RmrkTraitsPropertyPropertyInfo,RmrkTraitsBaseBaseInfo,RmrkTraitsPartPartType,RmrkTraitsTheme,RmrkTraitsNftNftChild);0]', /** - * Lookup371: up_data_structs::TokenData> + * Lookup374: up_data_structs::TokenData> **/ UpDataStructsTokenData: { properties: 'Vec', owner: 'Option' }, /** - * Lookup373: up_data_structs::RpcCollection + * Lookup376: up_data_structs::RpcCollection **/ UpDataStructsRpcCollection: { owner: 'AccountId32', @@ -2836,7 +2847,7 @@ readOnly: 'bool' }, /** - * Lookup374: rmrk_traits::collection::CollectionInfo, frame_support::storage::bounded_vec::BoundedVec, sp_core::crypto::AccountId32> + * Lookup377: rmrk_traits::collection::CollectionInfo, frame_support::storage::bounded_vec::BoundedVec, sp_core::crypto::AccountId32> **/ RmrkTraitsCollectionCollectionInfo: { issuer: 'AccountId32', @@ -2846,7 +2857,7 @@ nftsCount: 'u32' }, /** - * Lookup375: rmrk_traits::nft::NftInfo> + * Lookup378: rmrk_traits::nft::NftInfo> **/ RmrkTraitsNftNftInfo: { owner: 'RmrkTraitsNftAccountIdOrCollectionNftTuple', @@ -2856,14 +2867,14 @@ pending: 'bool' }, /** - * Lookup377: rmrk_traits::nft::RoyaltyInfo + * Lookup380: rmrk_traits::nft::RoyaltyInfo **/ RmrkTraitsNftRoyaltyInfo: { recipient: 'AccountId32', amount: 'Permill' }, /** - * Lookup378: rmrk_traits::resource::ResourceInfo, frame_support::storage::bounded_vec::BoundedVec> + * Lookup381: rmrk_traits::resource::ResourceInfo, frame_support::storage::bounded_vec::BoundedVec> **/ RmrkTraitsResourceResourceInfo: { id: 'u32', @@ -2872,24 +2883,14 @@ pendingRemoval: 'bool' }, /** - * Lookup379: rmrk_traits::resource::ResourceTypes, frame_support::storage::bounded_vec::BoundedVec> - **/ - RmrkTraitsResourceResourceTypes: { - _enum: { - Basic: 'RmrkTraitsResourceBasicResource', - Composable: 'RmrkTraitsResourceComposableResource', - Slot: 'RmrkTraitsResourceSlotResource' - } - }, - /** - * Lookup380: rmrk_traits::property::PropertyInfo, frame_support::storage::bounded_vec::BoundedVec> + * Lookup382: rmrk_traits::property::PropertyInfo, frame_support::storage::bounded_vec::BoundedVec> **/ RmrkTraitsPropertyPropertyInfo: { key: 'Bytes', value: 'Bytes' }, /** - * Lookup381: rmrk_traits::base::BaseInfo> + * Lookup383: rmrk_traits::base::BaseInfo> **/ RmrkTraitsBaseBaseInfo: { issuer: 'AccountId32', @@ -2897,74 +2898,74 @@ symbol: 'Bytes' }, /** - * Lookup382: rmrk_traits::nft::NftChild + * Lookup384: rmrk_traits::nft::NftChild **/ RmrkTraitsNftNftChild: { collectionId: 'u32', nftId: 'u32' }, /** - * Lookup384: pallet_common::pallet::Error + * Lookup386: pallet_common::pallet::Error **/ PalletCommonError: { _enum: ['CollectionNotFound', 'MustBeTokenOwner', 'NoPermission', 'CantDestroyNotEmptyCollection', 'PublicMintingNotAllowed', 'AddressNotInAllowlist', 'CollectionNameLimitExceeded', 'CollectionDescriptionLimitExceeded', 'CollectionTokenPrefixLimitExceeded', 'TotalCollectionsLimitExceeded', 'CollectionAdminCountExceeded', 'CollectionLimitBoundsExceeded', 'OwnerPermissionsCantBeReverted', 'TransferNotAllowed', 'AccountTokenLimitExceeded', 'CollectionTokenLimitExceeded', 'MetadataFlagFrozen', 'TokenNotFound', 'TokenValueTooLow', 'ApprovedValueTooLow', 'CantApproveMoreThanOwned', 'AddressIsZero', 'UnsupportedOperation', 'NotSufficientFounds', 'UserIsNotAllowedToNest', 'SourceCollectionIsNotAllowedToNest', 'CollectionFieldSizeExceeded', 'NoSpaceForProperty', 'PropertyLimitReached', 'PropertyKeyIsTooLong', 'InvalidCharacterInPropertyKey', 'EmptyPropertyKey', 'CollectionIsExternal', 'CollectionIsInternal'] }, /** - * Lookup386: pallet_fungible::pallet::Error + * Lookup388: pallet_fungible::pallet::Error **/ PalletFungibleError: { _enum: ['NotFungibleDataUsedToMintFungibleCollectionToken', 'FungibleItemsHaveNoId', 'FungibleItemsDontHaveData', 'FungibleDisallowsNesting', 'SettingPropertiesNotAllowed'] }, /** - * Lookup387: pallet_refungible::ItemData + * Lookup389: pallet_refungible::ItemData **/ PalletRefungibleItemData: { constData: 'Bytes' }, /** - * Lookup391: pallet_refungible::pallet::Error + * Lookup393: pallet_refungible::pallet::Error **/ PalletRefungibleError: { _enum: ['NotRefungibleDataUsedToMintFungibleCollectionToken', 'WrongRefungiblePieces', 'RefungibleDisallowsNesting', 'SettingPropertiesNotAllowed'] }, /** - * Lookup392: pallet_nonfungible::ItemData> + * Lookup394: pallet_nonfungible::ItemData> **/ PalletNonfungibleItemData: { owner: 'PalletEvmAccountBasicCrossAccountIdRepr' }, /** - * Lookup394: pallet_nonfungible::pallet::Error + * Lookup396: pallet_nonfungible::pallet::Error **/ PalletNonfungibleError: { _enum: ['NotNonfungibleDataUsedToMintFungibleCollectionToken', 'NonfungibleItemsHaveNoAmount', 'CantBurnNftWithChildren'] }, /** - * Lookup395: pallet_structure::pallet::Error + * Lookup397: pallet_structure::pallet::Error **/ PalletStructureError: { _enum: ['OuroborosDetected', 'DepthLimit', 'BreadthLimit', 'TokenNotFound'] }, /** - * Lookup396: pallet_rmrk_core::pallet::Error + * Lookup398: pallet_rmrk_core::pallet::Error **/ PalletRmrkCoreError: { - _enum: ['CorruptedCollectionType', 'NftTypeEncodeError', 'RmrkPropertyKeyIsTooLong', 'RmrkPropertyValueIsTooLong', 'CollectionNotEmpty', 'NoAvailableCollectionId', 'NoAvailableNftId', 'CollectionUnknown', 'NoPermission', 'NonTransferable', 'CollectionFullOrLocked', 'ResourceDoesntExist', 'CannotSendToDescendentOrSelf', 'CannotAcceptNonOwnedNft', 'CannotRejectNonOwnedNft', 'ResourceNotPending'] + _enum: ['CorruptedCollectionType', 'NftTypeEncodeError', 'RmrkPropertyKeyIsTooLong', 'RmrkPropertyValueIsTooLong', 'UnableToDecodeRmrkData', 'CollectionNotEmpty', 'NoAvailableCollectionId', 'NoAvailableNftId', 'CollectionUnknown', 'NoPermission', 'NonTransferable', 'CollectionFullOrLocked', 'ResourceDoesntExist', 'CannotSendToDescendentOrSelf', 'CannotAcceptNonOwnedNft', 'CannotRejectNonOwnedNft', 'ResourceNotPending'] }, /** - * Lookup398: pallet_rmrk_equip::pallet::Error + * Lookup400: pallet_rmrk_equip::pallet::Error **/ PalletRmrkEquipError: { _enum: ['PermissionError', 'NoAvailableBaseId', 'NoAvailablePartId', 'BaseDoesntExist', 'NeedsDefaultThemeFirst'] }, /** - * Lookup401: pallet_evm::pallet::Error + * Lookup403: pallet_evm::pallet::Error **/ PalletEvmError: { _enum: ['BalanceLow', 'FeeOverflow', 'PaymentOverflow', 'WithdrawFailed', 'GasPriceTooLow', 'InvalidNonce'] }, /** - * Lookup404: fp_rpc::TransactionStatus + * Lookup406: fp_rpc::TransactionStatus **/ FpRpcTransactionStatus: { transactionHash: 'H256', @@ -2976,11 +2977,11 @@ logsBloom: 'EthbloomBloom' }, /** - * Lookup406: ethbloom::Bloom + * Lookup408: ethbloom::Bloom **/ EthbloomBloom: '[u8;256]', /** - * Lookup408: ethereum::receipt::ReceiptV3 + * Lookup410: ethereum::receipt::ReceiptV3 **/ EthereumReceiptReceiptV3: { _enum: { @@ -2990,7 +2991,7 @@ } }, /** - * Lookup409: ethereum::receipt::EIP658ReceiptData + * Lookup411: ethereum::receipt::EIP658ReceiptData **/ EthereumReceiptEip658ReceiptData: { statusCode: 'u8', @@ -2999,7 +3000,7 @@ logs: 'Vec' }, /** - * Lookup410: ethereum::block::Block + * Lookup412: ethereum::block::Block **/ EthereumBlock: { header: 'EthereumHeader', @@ -3007,7 +3008,7 @@ ommers: 'Vec' }, /** - * Lookup411: ethereum::header::Header + * Lookup413: ethereum::header::Header **/ EthereumHeader: { parentHash: 'H256', @@ -3027,41 +3028,41 @@ nonce: 'EthereumTypesHashH64' }, /** - * Lookup412: ethereum_types::hash::H64 + * Lookup414: ethereum_types::hash::H64 **/ EthereumTypesHashH64: '[u8;8]', /** - * Lookup417: pallet_ethereum::pallet::Error + * Lookup419: pallet_ethereum::pallet::Error **/ PalletEthereumError: { _enum: ['InvalidSignature', 'PreLogExists'] }, /** - * Lookup418: pallet_evm_coder_substrate::pallet::Error + * Lookup420: pallet_evm_coder_substrate::pallet::Error **/ PalletEvmCoderSubstrateError: { _enum: ['OutOfGas', 'OutOfFund'] }, /** - * Lookup419: pallet_evm_contract_helpers::SponsoringModeT + * Lookup421: pallet_evm_contract_helpers::SponsoringModeT **/ PalletEvmContractHelpersSponsoringModeT: { _enum: ['Disabled', 'Allowlisted', 'Generous'] }, /** - * Lookup421: pallet_evm_contract_helpers::pallet::Error + * Lookup423: pallet_evm_contract_helpers::pallet::Error **/ PalletEvmContractHelpersError: { _enum: ['NoPermission'] }, /** - * Lookup422: pallet_evm_migration::pallet::Error + * Lookup424: pallet_evm_migration::pallet::Error **/ PalletEvmMigrationError: { _enum: ['AccountNotEmpty', 'AccountIsNotMigrating'] }, /** - * Lookup424: sp_runtime::MultiSignature + * Lookup426: sp_runtime::MultiSignature **/ SpRuntimeMultiSignature: { _enum: { @@ -3071,43 +3072,43 @@ } }, /** - * Lookup425: sp_core::ed25519::Signature + * Lookup427: sp_core::ed25519::Signature **/ SpCoreEd25519Signature: '[u8;64]', /** - * Lookup427: sp_core::sr25519::Signature + * Lookup429: sp_core::sr25519::Signature **/ SpCoreSr25519Signature: '[u8;64]', /** - * Lookup428: sp_core::ecdsa::Signature + * Lookup430: sp_core::ecdsa::Signature **/ SpCoreEcdsaSignature: '[u8;65]', /** - * Lookup431: frame_system::extensions::check_spec_version::CheckSpecVersion + * Lookup433: frame_system::extensions::check_spec_version::CheckSpecVersion **/ FrameSystemExtensionsCheckSpecVersion: 'Null', /** - * Lookup432: frame_system::extensions::check_genesis::CheckGenesis + * Lookup434: frame_system::extensions::check_genesis::CheckGenesis **/ FrameSystemExtensionsCheckGenesis: 'Null', /** - * Lookup435: frame_system::extensions::check_nonce::CheckNonce + * Lookup437: frame_system::extensions::check_nonce::CheckNonce **/ FrameSystemExtensionsCheckNonce: 'Compact', /** - * Lookup436: frame_system::extensions::check_weight::CheckWeight + * Lookup438: frame_system::extensions::check_weight::CheckWeight **/ FrameSystemExtensionsCheckWeight: 'Null', /** - * Lookup437: pallet_template_transaction_payment::ChargeTransactionPayment + * Lookup439: pallet_template_transaction_payment::ChargeTransactionPayment **/ PalletTemplateTransactionPaymentChargeTransactionPayment: 'Compact', /** - * Lookup438: opal_runtime::Runtime + * Lookup440: opal_runtime::Runtime **/ OpalRuntimeRuntime: 'Null', /** - * Lookup439: pallet_ethereum::FakeTransactionFinalizer + * Lookup441: pallet_ethereum::FakeTransactionFinalizer **/ PalletEthereumFakeTransactionFinalizer: 'Null' }; --- a/tests/src/interfaces/registry.ts +++ b/tests/src/interfaces/registry.ts @@ -1,7 +1,7 @@ // Auto-generated via `yarn polkadot-types-from-defs`, do not edit /* eslint-disable */ -import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSupportWeightsWeightToFeeCoefficient, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUnqSchedulerCall, PalletUnqSchedulerError, PalletUnqSchedulerEvent, PalletUnqSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExData, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipState, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup'; +import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmOrigin, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchRawOrigin, FrameSupportPalletId, FrameSupportScheduleLookupError, FrameSupportScheduleMaybeHashed, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSupportWeightsWeightToFeeCoefficient, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeOriginCaller, OpalRuntimeRuntime, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEthereumRawOrigin, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletUniqueSchedulerCall, PalletUniqueSchedulerError, PalletUniqueSchedulerEvent, PalletUniqueSchedulerScheduledV3, PalletXcmCall, PalletXcmError, PalletXcmEvent, PalletXcmOrigin, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpCoreVoid, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExData, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsRpcCollection, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipState, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup'; declare module '@polkadot/types/types/registry' { export interface InterfaceTypes { @@ -133,10 +133,10 @@ PalletUniqueCall: PalletUniqueCall; PalletUniqueError: PalletUniqueError; PalletUniqueRawEvent: PalletUniqueRawEvent; - PalletUnqSchedulerCall: PalletUnqSchedulerCall; - PalletUnqSchedulerError: PalletUnqSchedulerError; - PalletUnqSchedulerEvent: PalletUnqSchedulerEvent; - PalletUnqSchedulerScheduledV3: PalletUnqSchedulerScheduledV3; + PalletUniqueSchedulerCall: PalletUniqueSchedulerCall; + PalletUniqueSchedulerError: PalletUniqueSchedulerError; + PalletUniqueSchedulerEvent: PalletUniqueSchedulerEvent; + PalletUniqueSchedulerScheduledV3: PalletUniqueSchedulerScheduledV3; PalletXcmCall: PalletXcmCall; PalletXcmError: PalletXcmError; PalletXcmEvent: PalletXcmEvent; --- a/tests/src/interfaces/types-lookup.ts +++ b/tests/src/interfaces/types-lookup.ts @@ -1438,8 +1438,8 @@ readonly tokenId: u32; readonly propertyKeys: Vec; } & Struct; - readonly isSetPropertyPermissions: boolean; - readonly asSetPropertyPermissions: { + readonly isSetTokenPropertyPermissions: boolean; + readonly asSetTokenPropertyPermissions: { readonly collectionId: u32; readonly propertyPermissions: Vec; } & Struct; @@ -1498,7 +1498,7 @@ readonly collectionId: u32; readonly newLimit: UpDataStructsCollectionPermissions; } & Struct; - readonly type: 'CreateCollection' | 'CreateCollectionEx' | 'DestroyCollection' | 'AddToAllowList' | 'RemoveFromAllowList' | 'ChangeCollectionOwner' | 'AddCollectionAdmin' | 'RemoveCollectionAdmin' | 'SetCollectionSponsor' | 'ConfirmSponsorship' | 'RemoveCollectionSponsor' | 'CreateItem' | 'CreateMultipleItems' | 'SetCollectionProperties' | 'DeleteCollectionProperties' | 'SetTokenProperties' | 'DeleteTokenProperties' | 'SetPropertyPermissions' | 'CreateMultipleItemsEx' | 'SetTransfersEnabledFlag' | 'BurnItem' | 'BurnFrom' | 'Transfer' | 'Approve' | 'TransferFrom' | 'SetCollectionLimits' | 'SetCollectionPermissions'; + readonly type: 'CreateCollection' | 'CreateCollectionEx' | 'DestroyCollection' | 'AddToAllowList' | 'RemoveFromAllowList' | 'ChangeCollectionOwner' | 'AddCollectionAdmin' | 'RemoveCollectionAdmin' | 'SetCollectionSponsor' | 'ConfirmSponsorship' | 'RemoveCollectionSponsor' | 'CreateItem' | 'CreateMultipleItems' | 'SetCollectionProperties' | 'DeleteCollectionProperties' | 'SetTokenProperties' | 'DeleteTokenProperties' | 'SetTokenPropertyPermissions' | 'CreateMultipleItemsEx' | 'SetTransfersEnabledFlag' | 'BurnItem' | 'BurnFrom' | 'Transfer' | 'Approve' | 'TransferFrom' | 'SetCollectionLimits' | 'SetCollectionPermissions'; } /** @name UpDataStructsCollectionMode (156) */ @@ -1562,7 +1562,7 @@ /** @name UpDataStructsNestingPermissions (169) */ export interface UpDataStructsNestingPermissions extends Struct { readonly tokenOwner: bool; - readonly admin: bool; + readonly collectionAdmin: bool; readonly restricted: Option; readonly permissive: bool; } @@ -1650,8 +1650,8 @@ readonly users: BTreeMap; } - /** @name PalletUnqSchedulerCall (206) */ - export interface PalletUnqSchedulerCall extends Enum { + /** @name PalletUniqueSchedulerCall (206) */ + export interface PalletUniqueSchedulerCall extends Enum { readonly isScheduleNamed: boolean; readonly asScheduleNamed: { readonly id: U8aFixed; @@ -1719,11 +1719,13 @@ readonly royaltyAmount: Option; readonly metadata: Bytes; readonly transferable: bool; + readonly resources: Option>; } & Struct; readonly isBurnNft: boolean; readonly asBurnNft: { readonly collectionId: u32; readonly nftId: u32; + readonly maxBurns: u32; } & Struct; readonly isSend: boolean; readonly asSend: { @@ -1777,7 +1779,6 @@ readonly asAddComposableResource: { readonly rmrkCollectionId: u32; readonly nftId: u32; - readonly resourceId: Bytes; readonly resource: RmrkTraitsResourceComposableResource; } & Struct; readonly isAddSlotResource: boolean; @@ -1795,13 +1796,15 @@ readonly type: 'CreateCollection' | 'DestroyCollection' | 'ChangeCollectionIssuer' | 'LockCollection' | 'MintNft' | 'BurnNft' | 'Send' | 'AcceptNft' | 'RejectNft' | 'AcceptResource' | 'AcceptResourceRemoval' | 'SetProperty' | 'SetPriority' | 'AddBasicResource' | 'AddComposableResource' | 'AddSlotResource' | 'RemoveResource'; } - /** @name RmrkTraitsNftAccountIdOrCollectionNftTuple (215) */ - export interface RmrkTraitsNftAccountIdOrCollectionNftTuple extends Enum { - readonly isAccountId: boolean; - readonly asAccountId: AccountId32; - readonly isCollectionAndNftTuple: boolean; - readonly asCollectionAndNftTuple: ITuple<[u32, u32]>; - readonly type: 'AccountId' | 'CollectionAndNftTuple'; + /** @name RmrkTraitsResourceResourceTypes (217) */ + export interface RmrkTraitsResourceResourceTypes extends Enum { + readonly isBasic: boolean; + readonly asBasic: RmrkTraitsResourceBasicResource; + readonly isComposable: boolean; + readonly asComposable: RmrkTraitsResourceComposableResource; + readonly isSlot: boolean; + readonly asSlot: RmrkTraitsResourceSlotResource; + readonly type: 'Basic' | 'Composable' | 'Slot'; } /** @name RmrkTraitsResourceBasicResource (219) */ @@ -1812,7 +1815,7 @@ readonly thumb: Option; } - /** @name RmrkTraitsResourceComposableResource (222) */ + /** @name RmrkTraitsResourceComposableResource (221) */ export interface RmrkTraitsResourceComposableResource extends Struct { readonly parts: Vec; readonly base: u32; @@ -1822,7 +1825,7 @@ readonly thumb: Option; } - /** @name RmrkTraitsResourceSlotResource (224) */ + /** @name RmrkTraitsResourceSlotResource (222) */ export interface RmrkTraitsResourceSlotResource extends Struct { readonly base: u32; readonly src: Option; @@ -1832,7 +1835,16 @@ readonly thumb: Option; } - /** @name PalletRmrkEquipCall (225) */ + /** @name RmrkTraitsNftAccountIdOrCollectionNftTuple (224) */ + export interface RmrkTraitsNftAccountIdOrCollectionNftTuple extends Enum { + readonly isAccountId: boolean; + readonly asAccountId: AccountId32; + readonly isCollectionAndNftTuple: boolean; + readonly asCollectionAndNftTuple: ITuple<[u32, u32]>; + readonly type: 'AccountId' | 'CollectionAndNftTuple'; + } + + /** @name PalletRmrkEquipCall (228) */ export interface PalletRmrkEquipCall extends Enum { readonly isCreateBase: boolean; readonly asCreateBase: { @@ -1848,7 +1860,7 @@ readonly type: 'CreateBase' | 'ThemeAdd'; } - /** @name RmrkTraitsPartPartType (227) */ + /** @name RmrkTraitsPartPartType (230) */ export interface RmrkTraitsPartPartType extends Enum { readonly isFixedPart: boolean; readonly asFixedPart: RmrkTraitsPartFixedPart; @@ -1857,14 +1869,14 @@ readonly type: 'FixedPart' | 'SlotPart'; } - /** @name RmrkTraitsPartFixedPart (229) */ + /** @name RmrkTraitsPartFixedPart (232) */ export interface RmrkTraitsPartFixedPart extends Struct { readonly id: u32; readonly z: u32; readonly src: Bytes; } - /** @name RmrkTraitsPartSlotPart (230) */ + /** @name RmrkTraitsPartSlotPart (233) */ export interface RmrkTraitsPartSlotPart extends Struct { readonly id: u32; readonly equippable: RmrkTraitsPartEquippableList; @@ -1872,7 +1884,7 @@ readonly z: u32; } - /** @name RmrkTraitsPartEquippableList (231) */ + /** @name RmrkTraitsPartEquippableList (234) */ export interface RmrkTraitsPartEquippableList extends Enum { readonly isAll: boolean; readonly isEmpty: boolean; @@ -1881,20 +1893,20 @@ readonly type: 'All' | 'Empty' | 'Custom'; } - /** @name RmrkTraitsTheme (233) */ + /** @name RmrkTraitsTheme (236) */ export interface RmrkTraitsTheme extends Struct { readonly name: Bytes; readonly properties: Vec; readonly inherit: bool; } - /** @name RmrkTraitsThemeThemeProperty (235) */ + /** @name RmrkTraitsThemeThemeProperty (238) */ export interface RmrkTraitsThemeThemeProperty extends Struct { readonly key: Bytes; readonly value: Bytes; } - /** @name PalletEvmCall (236) */ + /** @name PalletEvmCall (239) */ export interface PalletEvmCall extends Enum { readonly isWithdraw: boolean; readonly asWithdraw: { @@ -1939,7 +1951,7 @@ readonly type: 'Withdraw' | 'Call' | 'Create' | 'Create2'; } - /** @name PalletEthereumCall (242) */ + /** @name PalletEthereumCall (245) */ export interface PalletEthereumCall extends Enum { readonly isTransact: boolean; readonly asTransact: { @@ -1948,7 +1960,7 @@ readonly type: 'Transact'; } - /** @name EthereumTransactionTransactionV2 (243) */ + /** @name EthereumTransactionTransactionV2 (246) */ export interface EthereumTransactionTransactionV2 extends Enum { readonly isLegacy: boolean; readonly asLegacy: EthereumTransactionLegacyTransaction; @@ -1959,7 +1971,7 @@ readonly type: 'Legacy' | 'Eip2930' | 'Eip1559'; } - /** @name EthereumTransactionLegacyTransaction (244) */ + /** @name EthereumTransactionLegacyTransaction (247) */ export interface EthereumTransactionLegacyTransaction extends Struct { readonly nonce: U256; readonly gasPrice: U256; @@ -1970,7 +1982,7 @@ readonly signature: EthereumTransactionTransactionSignature; } - /** @name EthereumTransactionTransactionAction (245) */ + /** @name EthereumTransactionTransactionAction (248) */ export interface EthereumTransactionTransactionAction extends Enum { readonly isCall: boolean; readonly asCall: H160; @@ -1978,14 +1990,14 @@ readonly type: 'Call' | 'Create'; } - /** @name EthereumTransactionTransactionSignature (246) */ + /** @name EthereumTransactionTransactionSignature (249) */ export interface EthereumTransactionTransactionSignature extends Struct { readonly v: u64; readonly r: H256; readonly s: H256; } - /** @name EthereumTransactionEip2930Transaction (248) */ + /** @name EthereumTransactionEip2930Transaction (251) */ export interface EthereumTransactionEip2930Transaction extends Struct { readonly chainId: u64; readonly nonce: U256; @@ -2000,13 +2012,13 @@ readonly s: H256; } - /** @name EthereumTransactionAccessListItem (250) */ + /** @name EthereumTransactionAccessListItem (253) */ export interface EthereumTransactionAccessListItem extends Struct { readonly address: H160; readonly storageKeys: Vec; } - /** @name EthereumTransactionEip1559Transaction (251) */ + /** @name EthereumTransactionEip1559Transaction (254) */ export interface EthereumTransactionEip1559Transaction extends Struct { readonly chainId: u64; readonly nonce: U256; @@ -2022,7 +2034,7 @@ readonly s: H256; } - /** @name PalletEvmMigrationCall (252) */ + /** @name PalletEvmMigrationCall (255) */ export interface PalletEvmMigrationCall extends Enum { readonly isBegin: boolean; readonly asBegin: { @@ -2041,7 +2053,7 @@ readonly type: 'Begin' | 'SetData' | 'Finish'; } - /** @name PalletSudoEvent (255) */ + /** @name PalletSudoEvent (258) */ export interface PalletSudoEvent extends Enum { readonly isSudid: boolean; readonly asSudid: { @@ -2058,7 +2070,7 @@ readonly type: 'Sudid' | 'KeyChanged' | 'SudoAsDone'; } - /** @name SpRuntimeDispatchError (257) */ + /** @name SpRuntimeDispatchError (260) */ export interface SpRuntimeDispatchError extends Enum { readonly isOther: boolean; readonly isCannotLookup: boolean; @@ -2077,13 +2089,13 @@ readonly type: 'Other' | 'CannotLookup' | 'BadOrigin' | 'Module' | 'ConsumerRemaining' | 'NoProviders' | 'TooManyConsumers' | 'Token' | 'Arithmetic' | 'Transactional'; } - /** @name SpRuntimeModuleError (258) */ + /** @name SpRuntimeModuleError (261) */ export interface SpRuntimeModuleError extends Struct { readonly index: u8; readonly error: U8aFixed; } - /** @name SpRuntimeTokenError (259) */ + /** @name SpRuntimeTokenError (262) */ export interface SpRuntimeTokenError extends Enum { readonly isNoFunds: boolean; readonly isWouldDie: boolean; @@ -2095,7 +2107,7 @@ readonly type: 'NoFunds' | 'WouldDie' | 'BelowMinimum' | 'CannotCreate' | 'UnknownAsset' | 'Frozen' | 'Unsupported'; } - /** @name SpRuntimeArithmeticError (260) */ + /** @name SpRuntimeArithmeticError (263) */ export interface SpRuntimeArithmeticError extends Enum { readonly isUnderflow: boolean; readonly isOverflow: boolean; @@ -2103,20 +2115,20 @@ readonly type: 'Underflow' | 'Overflow' | 'DivisionByZero'; } - /** @name SpRuntimeTransactionalError (261) */ + /** @name SpRuntimeTransactionalError (264) */ export interface SpRuntimeTransactionalError extends Enum { readonly isLimitReached: boolean; readonly isNoLayer: boolean; readonly type: 'LimitReached' | 'NoLayer'; } - /** @name PalletSudoError (262) */ + /** @name PalletSudoError (265) */ export interface PalletSudoError extends Enum { readonly isRequireSudo: boolean; readonly type: 'RequireSudo'; } - /** @name FrameSystemAccountInfo (263) */ + /** @name FrameSystemAccountInfo (266) */ export interface FrameSystemAccountInfo extends Struct { readonly nonce: u32; readonly consumers: u32; @@ -2125,19 +2137,19 @@ readonly data: PalletBalancesAccountData; } - /** @name FrameSupportWeightsPerDispatchClassU64 (264) */ + /** @name FrameSupportWeightsPerDispatchClassU64 (267) */ export interface FrameSupportWeightsPerDispatchClassU64 extends Struct { readonly normal: u64; readonly operational: u64; readonly mandatory: u64; } - /** @name SpRuntimeDigest (265) */ + /** @name SpRuntimeDigest (268) */ export interface SpRuntimeDigest extends Struct { readonly logs: Vec; } - /** @name SpRuntimeDigestDigestItem (267) */ + /** @name SpRuntimeDigestDigestItem (270) */ export interface SpRuntimeDigestDigestItem extends Enum { readonly isOther: boolean; readonly asOther: Bytes; @@ -2151,14 +2163,14 @@ readonly type: 'Other' | 'Consensus' | 'Seal' | 'PreRuntime' | 'RuntimeEnvironmentUpdated'; } - /** @name FrameSystemEventRecord (269) */ + /** @name FrameSystemEventRecord (272) */ export interface FrameSystemEventRecord extends Struct { readonly phase: FrameSystemPhase; readonly event: Event; readonly topics: Vec; } - /** @name FrameSystemEvent (271) */ + /** @name FrameSystemEvent (274) */ export interface FrameSystemEvent extends Enum { readonly isExtrinsicSuccess: boolean; readonly asExtrinsicSuccess: { @@ -2186,14 +2198,14 @@ readonly type: 'ExtrinsicSuccess' | 'ExtrinsicFailed' | 'CodeUpdated' | 'NewAccount' | 'KilledAccount' | 'Remarked'; } - /** @name FrameSupportWeightsDispatchInfo (272) */ + /** @name FrameSupportWeightsDispatchInfo (275) */ export interface FrameSupportWeightsDispatchInfo extends Struct { readonly weight: u64; readonly class: FrameSupportWeightsDispatchClass; readonly paysFee: FrameSupportWeightsPays; } - /** @name FrameSupportWeightsDispatchClass (273) */ + /** @name FrameSupportWeightsDispatchClass (276) */ export interface FrameSupportWeightsDispatchClass extends Enum { readonly isNormal: boolean; readonly isOperational: boolean; @@ -2201,14 +2213,14 @@ readonly type: 'Normal' | 'Operational' | 'Mandatory'; } - /** @name FrameSupportWeightsPays (274) */ + /** @name FrameSupportWeightsPays (277) */ export interface FrameSupportWeightsPays extends Enum { readonly isYes: boolean; readonly isNo: boolean; readonly type: 'Yes' | 'No'; } - /** @name OrmlVestingModuleEvent (275) */ + /** @name OrmlVestingModuleEvent (278) */ export interface OrmlVestingModuleEvent extends Enum { readonly isVestingScheduleAdded: boolean; readonly asVestingScheduleAdded: { @@ -2228,7 +2240,7 @@ readonly type: 'VestingScheduleAdded' | 'Claimed' | 'VestingSchedulesUpdated'; } - /** @name CumulusPalletXcmpQueueEvent (276) */ + /** @name CumulusPalletXcmpQueueEvent (279) */ export interface CumulusPalletXcmpQueueEvent extends Enum { readonly isSuccess: boolean; readonly asSuccess: Option; @@ -2249,7 +2261,7 @@ readonly type: 'Success' | 'Fail' | 'BadVersion' | 'BadFormat' | 'UpwardMessageSent' | 'XcmpMessageSent' | 'OverweightEnqueued' | 'OverweightServiced'; } - /** @name PalletXcmEvent (277) */ + /** @name PalletXcmEvent (280) */ export interface PalletXcmEvent extends Enum { readonly isAttempted: boolean; readonly asAttempted: XcmV2TraitsOutcome; @@ -2286,7 +2298,7 @@ readonly type: 'Attempted' | 'Sent' | 'UnexpectedResponse' | 'ResponseReady' | 'Notified' | 'NotifyOverweight' | 'NotifyDispatchError' | 'NotifyDecodeFailed' | 'InvalidResponder' | 'InvalidResponderVersion' | 'ResponseTaken' | 'AssetsTrapped' | 'VersionChangeNotified' | 'SupportedVersionChanged' | 'NotifyTargetSendFail' | 'NotifyTargetMigrationFail'; } - /** @name XcmV2TraitsOutcome (278) */ + /** @name XcmV2TraitsOutcome (281) */ export interface XcmV2TraitsOutcome extends Enum { readonly isComplete: boolean; readonly asComplete: u64; @@ -2297,7 +2309,7 @@ readonly type: 'Complete' | 'Incomplete' | 'Error'; } - /** @name CumulusPalletXcmEvent (280) */ + /** @name CumulusPalletXcmEvent (283) */ export interface CumulusPalletXcmEvent extends Enum { readonly isInvalidFormat: boolean; readonly asInvalidFormat: U8aFixed; @@ -2308,7 +2320,7 @@ readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward'; } - /** @name CumulusPalletDmpQueueEvent (281) */ + /** @name CumulusPalletDmpQueueEvent (284) */ export interface CumulusPalletDmpQueueEvent extends Enum { readonly isInvalidFormat: boolean; readonly asInvalidFormat: U8aFixed; @@ -2325,7 +2337,7 @@ readonly type: 'InvalidFormat' | 'UnsupportedVersion' | 'ExecutedDownward' | 'WeightExhausted' | 'OverweightEnqueued' | 'OverweightServiced'; } - /** @name PalletUniqueRawEvent (282) */ + /** @name PalletUniqueRawEvent (285) */ export interface PalletUniqueRawEvent extends Enum { readonly isCollectionSponsorRemoved: boolean; readonly asCollectionSponsorRemoved: u32; @@ -2350,8 +2362,8 @@ readonly type: 'CollectionSponsorRemoved' | 'CollectionAdminAdded' | 'CollectionOwnedChanged' | 'CollectionSponsorSet' | 'SponsorshipConfirmed' | 'CollectionAdminRemoved' | 'AllowListAddressRemoved' | 'AllowListAddressAdded' | 'CollectionLimitSet' | 'CollectionPermissionSet'; } - /** @name PalletUnqSchedulerEvent (283) */ - export interface PalletUnqSchedulerEvent extends Enum { + /** @name PalletUniqueSchedulerEvent (286) */ + export interface PalletUniqueSchedulerEvent extends Enum { readonly isScheduled: boolean; readonly asScheduled: { readonly when: u32; @@ -2377,14 +2389,14 @@ readonly type: 'Scheduled' | 'Canceled' | 'Dispatched' | 'CallLookupFailed'; } - /** @name FrameSupportScheduleLookupError (285) */ + /** @name FrameSupportScheduleLookupError (288) */ export interface FrameSupportScheduleLookupError extends Enum { readonly isUnknown: boolean; readonly isBadFormat: boolean; readonly type: 'Unknown' | 'BadFormat'; } - /** @name PalletCommonEvent (286) */ + /** @name PalletCommonEvent (289) */ export interface PalletCommonEvent extends Enum { readonly isCollectionCreated: boolean; readonly asCollectionCreated: ITuple<[u32, u8, AccountId32]>; @@ -2411,14 +2423,14 @@ readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'ItemCreated' | 'ItemDestroyed' | 'Transfer' | 'Approved' | 'CollectionPropertySet' | 'CollectionPropertyDeleted' | 'TokenPropertySet' | 'TokenPropertyDeleted' | 'PropertyPermissionSet'; } - /** @name PalletStructureEvent (287) */ + /** @name PalletStructureEvent (290) */ export interface PalletStructureEvent extends Enum { readonly isExecuted: boolean; readonly asExecuted: Result; readonly type: 'Executed'; } - /** @name PalletRmrkCoreEvent (288) */ + /** @name PalletRmrkCoreEvent (291) */ export interface PalletRmrkCoreEvent extends Enum { readonly isCollectionCreated: boolean; readonly asCollectionCreated: { @@ -2508,7 +2520,7 @@ readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'IssuerChanged' | 'CollectionLocked' | 'NftMinted' | 'NftBurned' | 'NftSent' | 'NftAccepted' | 'NftRejected' | 'PropertySet' | 'ResourceAdded' | 'ResourceRemoval' | 'ResourceAccepted' | 'ResourceRemovalAccepted' | 'PrioritySet'; } - /** @name PalletRmrkEquipEvent (289) */ + /** @name PalletRmrkEquipEvent (292) */ export interface PalletRmrkEquipEvent extends Enum { readonly isBaseCreated: boolean; readonly asBaseCreated: { @@ -2518,7 +2530,7 @@ readonly type: 'BaseCreated'; } - /** @name PalletEvmEvent (290) */ + /** @name PalletEvmEvent (293) */ export interface PalletEvmEvent extends Enum { readonly isLog: boolean; readonly asLog: EthereumLog; @@ -2537,21 +2549,21 @@ readonly type: 'Log' | 'Created' | 'CreatedFailed' | 'Executed' | 'ExecutedFailed' | 'BalanceDeposit' | 'BalanceWithdraw'; } - /** @name EthereumLog (291) */ + /** @name EthereumLog (294) */ export interface EthereumLog extends Struct { readonly address: H160; readonly topics: Vec; readonly data: Bytes; } - /** @name PalletEthereumEvent (292) */ + /** @name PalletEthereumEvent (295) */ export interface PalletEthereumEvent extends Enum { readonly isExecuted: boolean; readonly asExecuted: ITuple<[H160, H160, H256, EvmCoreErrorExitReason]>; readonly type: 'Executed'; } - /** @name EvmCoreErrorExitReason (293) */ + /** @name EvmCoreErrorExitReason (296) */ export interface EvmCoreErrorExitReason extends Enum { readonly isSucceed: boolean; readonly asSucceed: EvmCoreErrorExitSucceed; @@ -2564,7 +2576,7 @@ readonly type: 'Succeed' | 'Error' | 'Revert' | 'Fatal'; } - /** @name EvmCoreErrorExitSucceed (294) */ + /** @name EvmCoreErrorExitSucceed (297) */ export interface EvmCoreErrorExitSucceed extends Enum { readonly isStopped: boolean; readonly isReturned: boolean; @@ -2572,7 +2584,7 @@ readonly type: 'Stopped' | 'Returned' | 'Suicided'; } - /** @name EvmCoreErrorExitError (295) */ + /** @name EvmCoreErrorExitError (298) */ export interface EvmCoreErrorExitError extends Enum { readonly isStackUnderflow: boolean; readonly isStackOverflow: boolean; @@ -2593,13 +2605,13 @@ readonly type: 'StackUnderflow' | 'StackOverflow' | 'InvalidJump' | 'InvalidRange' | 'DesignatedInvalid' | 'CallTooDeep' | 'CreateCollision' | 'CreateContractLimit' | 'OutOfOffset' | 'OutOfGas' | 'OutOfFund' | 'PcUnderflow' | 'CreateEmpty' | 'Other' | 'InvalidCode'; } - /** @name EvmCoreErrorExitRevert (298) */ + /** @name EvmCoreErrorExitRevert (301) */ export interface EvmCoreErrorExitRevert extends Enum { readonly isReverted: boolean; readonly type: 'Reverted'; } - /** @name EvmCoreErrorExitFatal (299) */ + /** @name EvmCoreErrorExitFatal (302) */ export interface EvmCoreErrorExitFatal extends Enum { readonly isNotSupported: boolean; readonly isUnhandledInterrupt: boolean; @@ -2610,7 +2622,7 @@ readonly type: 'NotSupported' | 'UnhandledInterrupt' | 'CallErrorAsFatal' | 'Other'; } - /** @name FrameSystemPhase (300) */ + /** @name FrameSystemPhase (303) */ export interface FrameSystemPhase extends Enum { readonly isApplyExtrinsic: boolean; readonly asApplyExtrinsic: u32; @@ -2619,27 +2631,27 @@ readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization'; } - /** @name FrameSystemLastRuntimeUpgradeInfo (302) */ + /** @name FrameSystemLastRuntimeUpgradeInfo (305) */ export interface FrameSystemLastRuntimeUpgradeInfo extends Struct { readonly specVersion: Compact; readonly specName: Text; } - /** @name FrameSystemLimitsBlockWeights (303) */ + /** @name FrameSystemLimitsBlockWeights (306) */ export interface FrameSystemLimitsBlockWeights extends Struct { readonly baseBlock: u64; readonly maxBlock: u64; readonly perClass: FrameSupportWeightsPerDispatchClassWeightsPerClass; } - /** @name FrameSupportWeightsPerDispatchClassWeightsPerClass (304) */ + /** @name FrameSupportWeightsPerDispatchClassWeightsPerClass (307) */ export interface FrameSupportWeightsPerDispatchClassWeightsPerClass extends Struct { readonly normal: FrameSystemLimitsWeightsPerClass; readonly operational: FrameSystemLimitsWeightsPerClass; readonly mandatory: FrameSystemLimitsWeightsPerClass; } - /** @name FrameSystemLimitsWeightsPerClass (305) */ + /** @name FrameSystemLimitsWeightsPerClass (308) */ export interface FrameSystemLimitsWeightsPerClass extends Struct { readonly baseExtrinsic: u64; readonly maxExtrinsic: Option; @@ -2647,25 +2659,25 @@ readonly reserved: Option; } - /** @name FrameSystemLimitsBlockLength (307) */ + /** @name FrameSystemLimitsBlockLength (310) */ export interface FrameSystemLimitsBlockLength extends Struct { readonly max: FrameSupportWeightsPerDispatchClassU32; } - /** @name FrameSupportWeightsPerDispatchClassU32 (308) */ + /** @name FrameSupportWeightsPerDispatchClassU32 (311) */ export interface FrameSupportWeightsPerDispatchClassU32 extends Struct { readonly normal: u32; readonly operational: u32; readonly mandatory: u32; } - /** @name FrameSupportWeightsRuntimeDbWeight (309) */ + /** @name FrameSupportWeightsRuntimeDbWeight (312) */ export interface FrameSupportWeightsRuntimeDbWeight extends Struct { readonly read: u64; readonly write: u64; } - /** @name SpVersionRuntimeVersion (310) */ + /** @name SpVersionRuntimeVersion (313) */ export interface SpVersionRuntimeVersion extends Struct { readonly specName: Text; readonly implName: Text; @@ -2677,7 +2689,7 @@ readonly stateVersion: u8; } - /** @name FrameSystemError (314) */ + /** @name FrameSystemError (317) */ export interface FrameSystemError extends Enum { readonly isInvalidSpecName: boolean; readonly isSpecVersionNeedsToIncrease: boolean; @@ -2688,7 +2700,7 @@ readonly type: 'InvalidSpecName' | 'SpecVersionNeedsToIncrease' | 'FailedToExtractRuntimeVersion' | 'NonDefaultComposite' | 'NonZeroRefCount' | 'CallFiltered'; } - /** @name OrmlVestingModuleError (316) */ + /** @name OrmlVestingModuleError (319) */ export interface OrmlVestingModuleError extends Enum { readonly isZeroVestingPeriod: boolean; readonly isZeroVestingPeriodCount: boolean; @@ -2699,21 +2711,21 @@ readonly type: 'ZeroVestingPeriod' | 'ZeroVestingPeriodCount' | 'InsufficientBalanceToLock' | 'TooManyVestingSchedules' | 'AmountLow' | 'MaxVestingSchedulesExceeded'; } - /** @name CumulusPalletXcmpQueueInboundChannelDetails (318) */ + /** @name CumulusPalletXcmpQueueInboundChannelDetails (321) */ export interface CumulusPalletXcmpQueueInboundChannelDetails extends Struct { readonly sender: u32; readonly state: CumulusPalletXcmpQueueInboundState; readonly messageMetadata: Vec>; } - /** @name CumulusPalletXcmpQueueInboundState (319) */ + /** @name CumulusPalletXcmpQueueInboundState (322) */ export interface CumulusPalletXcmpQueueInboundState extends Enum { readonly isOk: boolean; readonly isSuspended: boolean; readonly type: 'Ok' | 'Suspended'; } - /** @name PolkadotParachainPrimitivesXcmpMessageFormat (322) */ + /** @name PolkadotParachainPrimitivesXcmpMessageFormat (325) */ export interface PolkadotParachainPrimitivesXcmpMessageFormat extends Enum { readonly isConcatenatedVersionedXcm: boolean; readonly isConcatenatedEncodedBlob: boolean; @@ -2721,7 +2733,7 @@ readonly type: 'ConcatenatedVersionedXcm' | 'ConcatenatedEncodedBlob' | 'Signals'; } - /** @name CumulusPalletXcmpQueueOutboundChannelDetails (325) */ + /** @name CumulusPalletXcmpQueueOutboundChannelDetails (328) */ export interface CumulusPalletXcmpQueueOutboundChannelDetails extends Struct { readonly recipient: u32; readonly state: CumulusPalletXcmpQueueOutboundState; @@ -2730,14 +2742,14 @@ readonly lastIndex: u16; } - /** @name CumulusPalletXcmpQueueOutboundState (326) */ + /** @name CumulusPalletXcmpQueueOutboundState (329) */ export interface CumulusPalletXcmpQueueOutboundState extends Enum { readonly isOk: boolean; readonly isSuspended: boolean; readonly type: 'Ok' | 'Suspended'; } - /** @name CumulusPalletXcmpQueueQueueConfigData (328) */ + /** @name CumulusPalletXcmpQueueQueueConfigData (331) */ export interface CumulusPalletXcmpQueueQueueConfigData extends Struct { readonly suspendThreshold: u32; readonly dropThreshold: u32; @@ -2747,7 +2759,7 @@ readonly xcmpMaxIndividualWeight: u64; } - /** @name CumulusPalletXcmpQueueError (330) */ + /** @name CumulusPalletXcmpQueueError (333) */ export interface CumulusPalletXcmpQueueError extends Enum { readonly isFailedToSend: boolean; readonly isBadXcmOrigin: boolean; @@ -2757,7 +2769,7 @@ readonly type: 'FailedToSend' | 'BadXcmOrigin' | 'BadXcm' | 'BadOverweightIndex' | 'WeightOverLimit'; } - /** @name PalletXcmError (331) */ + /** @name PalletXcmError (334) */ export interface PalletXcmError extends Enum { readonly isUnreachable: boolean; readonly isSendFailure: boolean; @@ -2775,29 +2787,29 @@ readonly type: 'Unreachable' | 'SendFailure' | 'Filtered' | 'UnweighableMessage' | 'DestinationNotInvertible' | 'Empty' | 'CannotReanchor' | 'TooManyAssets' | 'InvalidOrigin' | 'BadVersion' | 'BadLocation' | 'NoSubscription' | 'AlreadySubscribed'; } - /** @name CumulusPalletXcmError (332) */ + /** @name CumulusPalletXcmError (335) */ export type CumulusPalletXcmError = Null; - /** @name CumulusPalletDmpQueueConfigData (333) */ + /** @name CumulusPalletDmpQueueConfigData (336) */ export interface CumulusPalletDmpQueueConfigData extends Struct { readonly maxIndividual: u64; } - /** @name CumulusPalletDmpQueuePageIndexData (334) */ + /** @name CumulusPalletDmpQueuePageIndexData (337) */ export interface CumulusPalletDmpQueuePageIndexData extends Struct { readonly beginUsed: u32; readonly endUsed: u32; readonly overweightCount: u64; } - /** @name CumulusPalletDmpQueueError (337) */ + /** @name CumulusPalletDmpQueueError (340) */ export interface CumulusPalletDmpQueueError extends Enum { readonly isUnknown: boolean; readonly isOverLimit: boolean; readonly type: 'Unknown' | 'OverLimit'; } - /** @name PalletUniqueError (341) */ + /** @name PalletUniqueError (344) */ export interface PalletUniqueError extends Enum { readonly isCollectionDecimalPointLimitExceeded: boolean; readonly isConfirmUnsetSponsorFail: boolean; @@ -2805,8 +2817,8 @@ readonly type: 'CollectionDecimalPointLimitExceeded' | 'ConfirmUnsetSponsorFail' | 'EmptyArgument'; } - /** @name PalletUnqSchedulerScheduledV3 (344) */ - export interface PalletUnqSchedulerScheduledV3 extends Struct { + /** @name PalletUniqueSchedulerScheduledV3 (347) */ + export interface PalletUniqueSchedulerScheduledV3 extends Struct { readonly maybeId: Option; readonly priority: u8; readonly call: FrameSupportScheduleMaybeHashed; @@ -2814,7 +2826,7 @@ readonly origin: OpalRuntimeOriginCaller; } - /** @name OpalRuntimeOriginCaller (345) */ + /** @name OpalRuntimeOriginCaller (348) */ export interface OpalRuntimeOriginCaller extends Enum { readonly isVoid: boolean; readonly isSystem: boolean; @@ -2828,7 +2840,7 @@ readonly type: 'Void' | 'System' | 'PolkadotXcm' | 'CumulusXcm' | 'Ethereum'; } - /** @name FrameSupportDispatchRawOrigin (346) */ + /** @name FrameSupportDispatchRawOrigin (349) */ export interface FrameSupportDispatchRawOrigin extends Enum { readonly isRoot: boolean; readonly isSigned: boolean; @@ -2837,7 +2849,7 @@ readonly type: 'Root' | 'Signed' | 'None'; } - /** @name PalletXcmOrigin (347) */ + /** @name PalletXcmOrigin (350) */ export interface PalletXcmOrigin extends Enum { readonly isXcm: boolean; readonly asXcm: XcmV1MultiLocation; @@ -2846,7 +2858,7 @@ readonly type: 'Xcm' | 'Response'; } - /** @name CumulusPalletXcmOrigin (348) */ + /** @name CumulusPalletXcmOrigin (351) */ export interface CumulusPalletXcmOrigin extends Enum { readonly isRelay: boolean; readonly isSiblingParachain: boolean; @@ -2854,18 +2866,18 @@ readonly type: 'Relay' | 'SiblingParachain'; } - /** @name PalletEthereumRawOrigin (349) */ + /** @name PalletEthereumRawOrigin (352) */ export interface PalletEthereumRawOrigin extends Enum { readonly isEthereumTransaction: boolean; readonly asEthereumTransaction: H160; readonly type: 'EthereumTransaction'; } - /** @name SpCoreVoid (350) */ + /** @name SpCoreVoid (353) */ export type SpCoreVoid = Null; - /** @name PalletUnqSchedulerError (351) */ - export interface PalletUnqSchedulerError extends Enum { + /** @name PalletUniqueSchedulerError (354) */ + export interface PalletUniqueSchedulerError extends Enum { readonly isFailedToSchedule: boolean; readonly isNotFound: boolean; readonly isTargetBlockNumberInPast: boolean; @@ -2873,7 +2885,7 @@ readonly type: 'FailedToSchedule' | 'NotFound' | 'TargetBlockNumberInPast' | 'RescheduleNoChange'; } - /** @name UpDataStructsCollection (352) */ + /** @name UpDataStructsCollection (355) */ export interface UpDataStructsCollection extends Struct { readonly owner: AccountId32; readonly mode: UpDataStructsCollectionMode; @@ -2886,7 +2898,7 @@ readonly externalCollection: bool; } - /** @name UpDataStructsSponsorshipState (353) */ + /** @name UpDataStructsSponsorshipState (356) */ export interface UpDataStructsSponsorshipState extends Enum { readonly isDisabled: boolean; readonly isUnconfirmed: boolean; @@ -2896,42 +2908,42 @@ readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed'; } - /** @name UpDataStructsProperties (354) */ + /** @name UpDataStructsProperties (357) */ export interface UpDataStructsProperties extends Struct { readonly map: UpDataStructsPropertiesMapBoundedVec; readonly consumedSpace: u32; readonly spaceLimit: u32; } - /** @name UpDataStructsPropertiesMapBoundedVec (355) */ + /** @name UpDataStructsPropertiesMapBoundedVec (358) */ export interface UpDataStructsPropertiesMapBoundedVec extends BTreeMap {} - /** @name UpDataStructsPropertiesMapPropertyPermission (360) */ + /** @name UpDataStructsPropertiesMapPropertyPermission (363) */ export interface UpDataStructsPropertiesMapPropertyPermission extends BTreeMap {} - /** @name UpDataStructsCollectionStats (367) */ + /** @name UpDataStructsCollectionStats (370) */ export interface UpDataStructsCollectionStats extends Struct { readonly created: u32; readonly destroyed: u32; readonly alive: u32; } - /** @name UpDataStructsTokenChild (368) */ + /** @name UpDataStructsTokenChild (371) */ export interface UpDataStructsTokenChild extends Struct { readonly token: u32; readonly collection: u32; } - /** @name PhantomTypeUpDataStructs (369) */ + /** @name PhantomTypeUpDataStructs (372) */ export interface PhantomTypeUpDataStructs extends Vec> {} - /** @name UpDataStructsTokenData (371) */ + /** @name UpDataStructsTokenData (374) */ export interface UpDataStructsTokenData extends Struct { readonly properties: Vec; readonly owner: Option; } - /** @name UpDataStructsRpcCollection (373) */ + /** @name UpDataStructsRpcCollection (376) */ export interface UpDataStructsRpcCollection extends Struct { readonly owner: AccountId32; readonly mode: UpDataStructsCollectionMode; @@ -2946,7 +2958,7 @@ readonly readOnly: bool; } - /** @name RmrkTraitsCollectionCollectionInfo (374) */ + /** @name RmrkTraitsCollectionCollectionInfo (377) */ export interface RmrkTraitsCollectionCollectionInfo extends Struct { readonly issuer: AccountId32; readonly metadata: Bytes; @@ -2955,7 +2967,7 @@ readonly nftsCount: u32; } - /** @name RmrkTraitsNftNftInfo (375) */ + /** @name RmrkTraitsNftNftInfo (378) */ export interface RmrkTraitsNftNftInfo extends Struct { readonly owner: RmrkTraitsNftAccountIdOrCollectionNftTuple; readonly royalty: Option; @@ -2964,13 +2976,13 @@ readonly pending: bool; } - /** @name RmrkTraitsNftRoyaltyInfo (377) */ + /** @name RmrkTraitsNftRoyaltyInfo (380) */ export interface RmrkTraitsNftRoyaltyInfo extends Struct { readonly recipient: AccountId32; readonly amount: Permill; } - /** @name RmrkTraitsResourceResourceInfo (378) */ + /** @name RmrkTraitsResourceResourceInfo (381) */ export interface RmrkTraitsResourceResourceInfo extends Struct { readonly id: u32; readonly resource: RmrkTraitsResourceResourceTypes; @@ -2978,37 +2990,26 @@ readonly pendingRemoval: bool; } - /** @name RmrkTraitsResourceResourceTypes (379) */ - export interface RmrkTraitsResourceResourceTypes extends Enum { - readonly isBasic: boolean; - readonly asBasic: RmrkTraitsResourceBasicResource; - readonly isComposable: boolean; - readonly asComposable: RmrkTraitsResourceComposableResource; - readonly isSlot: boolean; - readonly asSlot: RmrkTraitsResourceSlotResource; - readonly type: 'Basic' | 'Composable' | 'Slot'; - } - - /** @name RmrkTraitsPropertyPropertyInfo (380) */ + /** @name RmrkTraitsPropertyPropertyInfo (382) */ export interface RmrkTraitsPropertyPropertyInfo extends Struct { readonly key: Bytes; readonly value: Bytes; } - /** @name RmrkTraitsBaseBaseInfo (381) */ + /** @name RmrkTraitsBaseBaseInfo (383) */ export interface RmrkTraitsBaseBaseInfo extends Struct { readonly issuer: AccountId32; readonly baseType: Bytes; readonly symbol: Bytes; } - /** @name RmrkTraitsNftNftChild (382) */ + /** @name RmrkTraitsNftNftChild (384) */ export interface RmrkTraitsNftNftChild extends Struct { readonly collectionId: u32; readonly nftId: u32; } - /** @name PalletCommonError (384) */ + /** @name PalletCommonError (386) */ export interface PalletCommonError extends Enum { readonly isCollectionNotFound: boolean; readonly isMustBeTokenOwner: boolean; @@ -3047,7 +3048,7 @@ readonly type: 'CollectionNotFound' | 'MustBeTokenOwner' | 'NoPermission' | 'CantDestroyNotEmptyCollection' | 'PublicMintingNotAllowed' | 'AddressNotInAllowlist' | 'CollectionNameLimitExceeded' | 'CollectionDescriptionLimitExceeded' | 'CollectionTokenPrefixLimitExceeded' | 'TotalCollectionsLimitExceeded' | 'CollectionAdminCountExceeded' | 'CollectionLimitBoundsExceeded' | 'OwnerPermissionsCantBeReverted' | 'TransferNotAllowed' | 'AccountTokenLimitExceeded' | 'CollectionTokenLimitExceeded' | 'MetadataFlagFrozen' | 'TokenNotFound' | 'TokenValueTooLow' | 'ApprovedValueTooLow' | 'CantApproveMoreThanOwned' | 'AddressIsZero' | 'UnsupportedOperation' | 'NotSufficientFounds' | 'UserIsNotAllowedToNest' | 'SourceCollectionIsNotAllowedToNest' | 'CollectionFieldSizeExceeded' | 'NoSpaceForProperty' | 'PropertyLimitReached' | 'PropertyKeyIsTooLong' | 'InvalidCharacterInPropertyKey' | 'EmptyPropertyKey' | 'CollectionIsExternal' | 'CollectionIsInternal'; } - /** @name PalletFungibleError (386) */ + /** @name PalletFungibleError (388) */ export interface PalletFungibleError extends Enum { readonly isNotFungibleDataUsedToMintFungibleCollectionToken: boolean; readonly isFungibleItemsHaveNoId: boolean; @@ -3057,12 +3058,12 @@ readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed'; } - /** @name PalletRefungibleItemData (387) */ + /** @name PalletRefungibleItemData (389) */ export interface PalletRefungibleItemData extends Struct { readonly constData: Bytes; } - /** @name PalletRefungibleError (391) */ + /** @name PalletRefungibleError (393) */ export interface PalletRefungibleError extends Enum { readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean; readonly isWrongRefungiblePieces: boolean; @@ -3071,12 +3072,12 @@ readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed'; } - /** @name PalletNonfungibleItemData (392) */ + /** @name PalletNonfungibleItemData (394) */ export interface PalletNonfungibleItemData extends Struct { readonly owner: PalletEvmAccountBasicCrossAccountIdRepr; } - /** @name PalletNonfungibleError (394) */ + /** @name PalletNonfungibleError (396) */ export interface PalletNonfungibleError extends Enum { readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean; readonly isNonfungibleItemsHaveNoAmount: boolean; @@ -3084,7 +3085,7 @@ readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren'; } - /** @name PalletStructureError (395) */ + /** @name PalletStructureError (397) */ export interface PalletStructureError extends Enum { readonly isOuroborosDetected: boolean; readonly isDepthLimit: boolean; @@ -3093,12 +3094,13 @@ readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound'; } - /** @name PalletRmrkCoreError (396) */ + /** @name PalletRmrkCoreError (398) */ export interface PalletRmrkCoreError extends Enum { readonly isCorruptedCollectionType: boolean; readonly isNftTypeEncodeError: boolean; readonly isRmrkPropertyKeyIsTooLong: boolean; readonly isRmrkPropertyValueIsTooLong: boolean; + readonly isUnableToDecodeRmrkData: boolean; readonly isCollectionNotEmpty: boolean; readonly isNoAvailableCollectionId: boolean; readonly isNoAvailableNftId: boolean; @@ -3111,10 +3113,10 @@ readonly isCannotAcceptNonOwnedNft: boolean; readonly isCannotRejectNonOwnedNft: boolean; readonly isResourceNotPending: boolean; - readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'ResourceNotPending'; + readonly type: 'CorruptedCollectionType' | 'NftTypeEncodeError' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'ResourceNotPending'; } - /** @name PalletRmrkEquipError (398) */ + /** @name PalletRmrkEquipError (400) */ export interface PalletRmrkEquipError extends Enum { readonly isPermissionError: boolean; readonly isNoAvailableBaseId: boolean; @@ -3124,7 +3126,7 @@ readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst'; } - /** @name PalletEvmError (401) */ + /** @name PalletEvmError (403) */ export interface PalletEvmError extends Enum { readonly isBalanceLow: boolean; readonly isFeeOverflow: boolean; @@ -3135,7 +3137,7 @@ readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce'; } - /** @name FpRpcTransactionStatus (404) */ + /** @name FpRpcTransactionStatus (406) */ export interface FpRpcTransactionStatus extends Struct { readonly transactionHash: H256; readonly transactionIndex: u32; @@ -3146,10 +3148,10 @@ readonly logsBloom: EthbloomBloom; } - /** @name EthbloomBloom (406) */ + /** @name EthbloomBloom (408) */ export interface EthbloomBloom extends U8aFixed {} - /** @name EthereumReceiptReceiptV3 (408) */ + /** @name EthereumReceiptReceiptV3 (410) */ export interface EthereumReceiptReceiptV3 extends Enum { readonly isLegacy: boolean; readonly asLegacy: EthereumReceiptEip658ReceiptData; @@ -3160,7 +3162,7 @@ readonly type: 'Legacy' | 'Eip2930' | 'Eip1559'; } - /** @name EthereumReceiptEip658ReceiptData (409) */ + /** @name EthereumReceiptEip658ReceiptData (411) */ export interface EthereumReceiptEip658ReceiptData extends Struct { readonly statusCode: u8; readonly usedGas: U256; @@ -3168,14 +3170,14 @@ readonly logs: Vec; } - /** @name EthereumBlock (410) */ + /** @name EthereumBlock (412) */ export interface EthereumBlock extends Struct { readonly header: EthereumHeader; readonly transactions: Vec; readonly ommers: Vec; } - /** @name EthereumHeader (411) */ + /** @name EthereumHeader (413) */ export interface EthereumHeader extends Struct { readonly parentHash: H256; readonly ommersHash: H256; @@ -3194,24 +3196,24 @@ readonly nonce: EthereumTypesHashH64; } - /** @name EthereumTypesHashH64 (412) */ + /** @name EthereumTypesHashH64 (414) */ export interface EthereumTypesHashH64 extends U8aFixed {} - /** @name PalletEthereumError (417) */ + /** @name PalletEthereumError (419) */ export interface PalletEthereumError extends Enum { readonly isInvalidSignature: boolean; readonly isPreLogExists: boolean; readonly type: 'InvalidSignature' | 'PreLogExists'; } - /** @name PalletEvmCoderSubstrateError (418) */ + /** @name PalletEvmCoderSubstrateError (420) */ export interface PalletEvmCoderSubstrateError extends Enum { readonly isOutOfGas: boolean; readonly isOutOfFund: boolean; readonly type: 'OutOfGas' | 'OutOfFund'; } - /** @name PalletEvmContractHelpersSponsoringModeT (419) */ + /** @name PalletEvmContractHelpersSponsoringModeT (421) */ export interface PalletEvmContractHelpersSponsoringModeT extends Enum { readonly isDisabled: boolean; readonly isAllowlisted: boolean; @@ -3219,20 +3221,20 @@ readonly type: 'Disabled' | 'Allowlisted' | 'Generous'; } - /** @name PalletEvmContractHelpersError (421) */ + /** @name PalletEvmContractHelpersError (423) */ export interface PalletEvmContractHelpersError extends Enum { readonly isNoPermission: boolean; readonly type: 'NoPermission'; } - /** @name PalletEvmMigrationError (422) */ + /** @name PalletEvmMigrationError (424) */ export interface PalletEvmMigrationError extends Enum { readonly isAccountNotEmpty: boolean; readonly isAccountIsNotMigrating: boolean; readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating'; } - /** @name SpRuntimeMultiSignature (424) */ + /** @name SpRuntimeMultiSignature (426) */ export interface SpRuntimeMultiSignature extends Enum { readonly isEd25519: boolean; readonly asEd25519: SpCoreEd25519Signature; @@ -3243,34 +3245,34 @@ readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa'; } - /** @name SpCoreEd25519Signature (425) */ + /** @name SpCoreEd25519Signature (427) */ export interface SpCoreEd25519Signature extends U8aFixed {} - /** @name SpCoreSr25519Signature (427) */ + /** @name SpCoreSr25519Signature (429) */ export interface SpCoreSr25519Signature extends U8aFixed {} - /** @name SpCoreEcdsaSignature (428) */ + /** @name SpCoreEcdsaSignature (430) */ export interface SpCoreEcdsaSignature extends U8aFixed {} - /** @name FrameSystemExtensionsCheckSpecVersion (431) */ + /** @name FrameSystemExtensionsCheckSpecVersion (433) */ export type FrameSystemExtensionsCheckSpecVersion = Null; - /** @name FrameSystemExtensionsCheckGenesis (432) */ + /** @name FrameSystemExtensionsCheckGenesis (434) */ export type FrameSystemExtensionsCheckGenesis = Null; - /** @name FrameSystemExtensionsCheckNonce (435) */ + /** @name FrameSystemExtensionsCheckNonce (437) */ export interface FrameSystemExtensionsCheckNonce extends Compact {} - /** @name FrameSystemExtensionsCheckWeight (436) */ + /** @name FrameSystemExtensionsCheckWeight (438) */ export type FrameSystemExtensionsCheckWeight = Null; - /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (437) */ + /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (439) */ export interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact {} - /** @name OpalRuntimeRuntime (438) */ + /** @name OpalRuntimeRuntime (440) */ export type OpalRuntimeRuntime = Null; - /** @name PalletEthereumFakeTransactionFinalizer (439) */ + /** @name PalletEthereumFakeTransactionFinalizer (441) */ export type PalletEthereumFakeTransactionFinalizer = Null; } // declare module --- a/tests/src/limits.test.ts +++ b/tests/src/limits.test.ts @@ -406,6 +406,7 @@ it('Effective collection limits', async () => { await usingApi(async (api) => { const collectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); + await setCollectionLimitsExpectSuccess(alice, collectionId, {ownerCanTransfer: true}); { // Check that limits is undefined const collection = await api.rpc.unique.collectionById(collectionId); @@ -419,7 +420,7 @@ expect(limits.tokenLimit.toHuman()).to.be.null; expect(limits.sponsorTransferTimeout.toHuman()).to.be.null; expect(limits.sponsorApproveTimeout.toHuman()).to.be.null; - expect(limits.ownerCanTransfer.toHuman()).to.be.null; + expect(limits.ownerCanTransfer.toHuman()).to.be.true; expect(limits.ownerCanDestroy.toHuman()).to.be.null; expect(limits.transfersEnabled.toHuman()).to.be.null; } --- a/tests/src/nesting/graphs.test.ts +++ b/tests/src/nesting/graphs.test.ts @@ -3,7 +3,7 @@ import {expect} from 'chai'; import {tokenIdToCross} from '../eth/util/helpers'; import usingApi, {executeTransaction} from '../substrate/substrate-api'; -import {getCreateCollectionResult, transferExpectSuccess} from '../util/helpers'; +import {getCreateCollectionResult, transferExpectSuccess, setCollectionLimitsExpectSuccess} from '../util/helpers'; /** * ```dot @@ -13,7 +13,7 @@ * ``` */ async function buildComplexObjectGraph(api: ApiPromise, sender: IKeyringPair): Promise { - const events = await executeTransaction(api, sender, api.tx.unique.createCollectionEx({mode: 'NFT', permissions: {nesting: 'Owner'}})); + const events = await executeTransaction(api, sender, api.tx.unique.createCollectionEx({mode: 'NFT', permissions: {nesting: {tokenOwner: true}}})); const {collectionId} = getCreateCollectionResult(events); await executeTransaction(api, sender, api.tx.unique.createMultipleItemsEx(collectionId, {NFT: Array(8).fill({owner: {Substrate: sender.address}})})); @@ -36,6 +36,7 @@ await usingApi(async (api, privateKeyWrapper) => { const alice = privateKeyWrapper('//Alice'); const collection = await buildComplexObjectGraph(api, alice); + await setCollectionLimitsExpectSuccess(alice, collection, {ownerCanTransfer: true}); // to self await expect( --- a/tests/src/nesting/nest.test.ts +++ b/tests/src/nesting/nest.test.ts @@ -2,6 +2,7 @@ import {tokenIdToAddress} from '../eth/util/helpers'; import usingApi, {executeTransaction} from '../substrate/substrate-api'; import { + addCollectionAdminExpectSuccess, addToAllowListExpectSuccess, createCollectionExpectSuccess, createItemExpectSuccess, @@ -15,15 +16,17 @@ transferExpectFailure, transferExpectSuccess, transferFromExpectSuccess, + setCollectionLimitsExpectSuccess, } from '../util/helpers'; import {IKeyringPair} from '@polkadot/types/types'; let alice: IKeyringPair; let bob: IKeyringPair; +let charlie: IKeyringPair; -describe('Integration Test: Nesting', () => { +describe('Integration Test: Composite nesting tests', () => { before(async () => { - await usingApi(async (api, privateKeyWrapper) => { + await usingApi(async (_, privateKeyWrapper) => { alice = privateKeyWrapper('//Alice'); bob = privateKeyWrapper('//Bob'); }); @@ -92,6 +95,7 @@ it('Checks token children', async () => { await usingApi(async api => { const collectionA = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); + await setCollectionLimitsExpectSuccess(alice, collectionA, {ownerCanTransfer: true}); await setCollectionPermissionsExpectSuccess(alice, collectionA, {nesting: {tokenOwner: true}}); const collectionB = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); @@ -145,7 +149,79 @@ ], 'Children contents check at deeper nesting'); }); }); +}); + +describe('Integration Test: Various token type nesting', async () => { + before(async () => { + await usingApi(async (_, privateKeyWrapper) => { + alice = privateKeyWrapper('//Alice'); + bob = privateKeyWrapper('//Bob'); + charlie = privateKeyWrapper('//Charlie'); + }); + }); + + it('Admin (NFT): allows an Admin to nest a token', async () => { + await usingApi(async api => { + const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); + await setCollectionPermissionsExpectSuccess(alice, collection, {nesting: {collectionAdmin: true}}); + await addCollectionAdminExpectSuccess(alice, collection, bob.address); + const targetToken = await createItemExpectSuccess(alice, collection, 'NFT', charlie.address); + + // Create a nested token + const nestedToken = await createItemExpectSuccess(bob, collection, 'NFT', {Ethereum: tokenIdToAddress(collection, targetToken)}); + expect(await getTopmostTokenOwner(api, collection, nestedToken)).to.be.deep.equal({Substrate: charlie.address}); + expect(await getTokenOwner(api, collection, nestedToken)).to.be.deep.equal({Ethereum: tokenIdToAddress(collection, targetToken).toLowerCase()}); + + // Create a token to be nested and nest + const newToken = await createItemExpectSuccess(bob, collection, 'NFT'); + await transferExpectSuccess(collection, newToken, bob, {Ethereum: tokenIdToAddress(collection, targetToken)}); + expect(await getTopmostTokenOwner(api, collection, newToken)).to.be.deep.equal({Substrate: charlie.address}); + expect(await getTokenOwner(api, collection, newToken)).to.be.deep.equal({Ethereum: tokenIdToAddress(collection, targetToken).toLowerCase()}); + }); + }); + it('Admin (NFT): Admin and Token Owner can operate together', async () => { + await usingApi(async api => { + const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); + await setCollectionPermissionsExpectSuccess(alice, collection, {nesting: {tokenOwner: true, collectionAdmin: true}}); + await addCollectionAdminExpectSuccess(alice, collection, bob.address); + const targetToken = await createItemExpectSuccess(alice, collection, 'NFT', charlie.address); + + // Create a nested token by an administrator + const nestedToken = await createItemExpectSuccess(bob, collection, 'NFT', {Ethereum: tokenIdToAddress(collection, targetToken)}); + expect(await getTopmostTokenOwner(api, collection, nestedToken)).to.be.deep.equal({Substrate: charlie.address}); + expect(await getTokenOwner(api, collection, nestedToken)).to.be.deep.equal({Ethereum: tokenIdToAddress(collection, targetToken).toLowerCase()}); + + // Create a token and allow the owner to nest too + const newToken = await createItemExpectSuccess(alice, collection, 'NFT', charlie.address); + await transferExpectSuccess(collection, newToken, charlie, {Ethereum: tokenIdToAddress(collection, nestedToken)}); + expect(await getTopmostTokenOwner(api, collection, newToken)).to.be.deep.equal({Substrate: charlie.address}); + expect(await getTokenOwner(api, collection, newToken)).to.be.deep.equal({Ethereum: tokenIdToAddress(collection, nestedToken).toLowerCase()}); + }); + }); + + it('Admin (NFT): allows an Admin to nest a token (Restricted nesting)', async () => { + await usingApi(async api => { + const collectionA = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); + await addCollectionAdminExpectSuccess(alice, collectionA, bob.address); + const collectionB = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); + await addCollectionAdminExpectSuccess(alice, collectionB, bob.address); + await setCollectionPermissionsExpectSuccess(alice, collectionA, {nesting: {collectionAdmin: true, restricted:[collectionA, collectionB]}}); + const targetToken = await createItemExpectSuccess(alice, collectionA, 'NFT', charlie.address); + + // Create a nested token + const nestedToken = await createItemExpectSuccess(bob, collectionB, 'NFT', {Ethereum: tokenIdToAddress(collectionA, targetToken)}); + expect(await getTopmostTokenOwner(api, collectionB, nestedToken)).to.be.deep.equal({Substrate: charlie.address}); + expect(await getTokenOwner(api, collectionB, nestedToken)).to.be.deep.equal({Ethereum: tokenIdToAddress(collectionA, targetToken).toLowerCase()}); + + // Create a token to be nested and nest + const newToken = await createItemExpectSuccess(bob, collectionB, 'NFT'); + await transferExpectSuccess(collectionB, newToken, bob, {Ethereum: tokenIdToAddress(collectionA, targetToken)}); + expect(await getTopmostTokenOwner(api, collectionB, newToken)).to.be.deep.equal({Substrate: charlie.address}); + expect(await getTokenOwner(api, collectionB, newToken)).to.be.deep.equal({Ethereum: tokenIdToAddress(collectionA, targetToken).toLowerCase()}); + }); + }); + // ---------- Non-Fungible ---------- it('NFT: allows an Owner to nest/unnest their token', async () => { @@ -248,7 +324,7 @@ await expect(executeTransaction(api, alice, api.tx.unique.createItem( collectionRFT, targetAddress, - {ReFungible: {const_data: [], pieces: 100}}, + {ReFungible: {pieces: 100}}, ))).to.not.be.rejected; // Nest a new token @@ -271,7 +347,7 @@ await expect(executeTransaction(api, alice, api.tx.unique.createItem( collectionRFT, targetAddress, - {ReFungible: {const_data: [], pieces: 100}}, + {ReFungible: {pieces: 100}}, ))).to.not.be.rejected; // Nest a new token @@ -283,7 +359,7 @@ describe('Negative Test: Nesting', async() => { before(async () => { - await usingApi(async (api, privateKeyWrapper) => { + await usingApi(async (_, privateKeyWrapper) => { alice = privateKeyWrapper('//Alice'); bob = privateKeyWrapper('//Bob'); }); @@ -314,13 +390,122 @@ await expect(executeTransaction(api, alice, api.tx.unique.createItem( collection, {Ethereum: tokenIdToAddress(collection, prevToken)}, - {nft: {const_data: [], variable_data: []}} as any, + {nft: {}} as any, )), 'while creating nested token').to.be.rejectedWith(/^structure\.DepthLimit$/); expect(await getTopmostTokenOwner(api, collection, prevToken)).to.be.deep.equal({Substrate: alice.address}); }); }); + // ---------- Admin ------------ + + it('Admin (NFT): disallows an Admin to operate nesting when only TokenOwner is allowed', async () => { + await usingApi(async api => { + const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); + await setCollectionPermissionsExpectSuccess(alice, collection, {nesting: {tokenOwner: true}}); + await addCollectionAdminExpectSuccess(alice, collection, bob.address); + const targetToken = await createItemExpectSuccess(alice, collection, 'NFT'); + + // Try to create a nested token as collection admin when it's disallowed + await expect(executeTransaction(api, bob, api.tx.unique.createItem( + collection, + {Ethereum: tokenIdToAddress(collection, targetToken)}, + {nft: {}} as any, + )), 'while creating nested token').to.be.rejectedWith(/common\.UserIsNotAllowedToNest/); + + // Try to create and nest a token in the wrong collection + const newToken = await createItemExpectSuccess(bob, collection, 'NFT'); + await expect(executeTransaction( + api, + bob, + api.tx.unique.transfer({Ethereum: tokenIdToAddress(collection, targetToken)}, collection, newToken, 1), + ), 'while nesting new token').to.be.rejectedWith(/common\.UserIsNotAllowedToNest/); + expect(await getTokenOwner(api, collection, newToken)).to.be.deep.equal({Substrate: bob.address}); + }); + }); + + it('Admin (NFT): disallows a Token Owner to operate nesting when only Admin is allowed', async () => { + await usingApi(async api => { + const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); + await setCollectionPermissionsExpectSuccess(alice, collection, {nesting: {collectionAdmin: true}}); + await addToAllowListExpectSuccess(alice, collection, bob.address); + await enableAllowListExpectSuccess(alice, collection); + await enablePublicMintingExpectSuccess(alice, collection); + const targetToken = await createItemExpectSuccess(alice, collection, 'NFT'); + + // Try to create a nested token as collection admin when it's disallowed + await expect(executeTransaction(api, bob, api.tx.unique.createItem( + collection, + {Ethereum: tokenIdToAddress(collection, targetToken)}, + {nft: {}} as any, + )), 'while creating nested token').to.be.rejectedWith(/common\.AddressNotInAllowlist/); + + // Try to create and nest a token in the wrong collection + const newToken = await createItemExpectSuccess(bob, collection, 'NFT'); + await expect(executeTransaction( + api, + bob, + api.tx.unique.transfer({Ethereum: tokenIdToAddress(collection, targetToken)}, collection, newToken, 1), + ), 'while nesting new token').to.be.rejectedWith(/common\.AddressNotInAllowlist/); + expect(await getTokenOwner(api, collection, newToken)).to.be.deep.equal({Substrate: bob.address}); + }); + }); + + it('Admin (NFT): disallows an Admin to nest and unnest someone else\'s token', async () => { + await usingApi(async api => { + const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); + await setCollectionLimitsExpectSuccess(alice, collection, {ownerCanTransfer: true}); + await setCollectionPermissionsExpectSuccess(alice, collection, {nesting: {collectionAdmin: true}}); + + await addToAllowListExpectSuccess(alice, collection, bob.address); + await enableAllowListExpectSuccess(alice, collection); + await enablePublicMintingExpectSuccess(alice, collection); + + // Create a token to attempt to be nested into + const targetToken = await createItemExpectSuccess(bob, collection, 'NFT'); + const targetAddress = {Ethereum: tokenIdToAddress(collection, targetToken).toLowerCase()}; + + // Try to nest somebody else's token + const newToken = await createItemExpectSuccess(bob, collection, 'NFT'); + await expect(executeTransaction( + api, + alice, + api.tx.unique.transfer(targetAddress, collection, newToken, 1), + ), 'while nesting another\'s token token').to.be.rejectedWith(/common\.AddressNotInAllowlist/); + expect(await getTokenOwner(api, collection, newToken)).to.be.deep.equal({Substrate: bob.address}); + + // Nest a token as admin and try to unnest it, now belonging to someone else + const nestedToken = await createItemExpectSuccess(alice, collection, 'NFT', targetAddress); + await expect(executeTransaction( + api, + alice, + api.tx.unique.transferFrom(targetAddress, normalizeAccountId(alice), collection, nestedToken, 1), + ), 'while unnesting another\'s token').to.be.rejectedWith(/common\.AddressNotInAllowlist/); + expect(await getTokenOwner(api, collection, nestedToken)).to.be.deep.equal(targetAddress); + expect(await getTopmostTokenOwner(api, collection, nestedToken)).to.be.deep.equal({Substrate: bob.address}); + }); + }); + + it('Admin (NFT): disallows an Admin to nest a token from an unlisted collection (Restricted nesting)', async () => { + await usingApi(async api => { + const collectionA = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); + const collectionB = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); + await setCollectionPermissionsExpectSuccess(alice, collectionA, {nesting: {collectionAdmin: true, restricted:[collectionA]}}); + + // Create a token to attempt to be nested into + const targetToken = await createItemExpectSuccess(alice, collectionA, 'NFT'); + + // Try to create and nest a token in the wrong collection + const newToken = await createItemExpectSuccess(alice, collectionB, 'NFT'); + await expect(executeTransaction( + api, + alice, + api.tx.unique.transfer({Ethereum: tokenIdToAddress(collectionA, targetToken)}, collectionB, newToken, 1), + ), 'while nesting a foreign token').to.be.rejectedWith(/common\.SourceCollectionIsNotAllowedToNest/); + expect(await getTokenOwner(api, collectionB, newToken)).to.be.deep.equal({Substrate: alice.address}); + }); + }); + // ---------- Non-Fungible ---------- it('NFT: disallows to nest token if nesting is disabled', async () => { @@ -333,7 +518,7 @@ await expect(executeTransaction(api, alice, api.tx.unique.createItem( collection, {Ethereum: tokenIdToAddress(collection, targetToken)}, - {nft: {const_data: [], variable_data: []}} as any, + {nft: {}} as any, )), 'while creating nested token').to.be.rejectedWith(/^common\.UserIsNotAllowedToNest$/); // Create a token to be nested @@ -361,7 +546,7 @@ await expect(executeTransaction(api, alice, api.tx.unique.createItem( collection, {Ethereum: tokenIdToAddress(collection, targetToken)}, - {nft: {const_data: [], variable_data: []}} as any, + {nft: {}} as any, )), 'while creating nested token').to.be.rejectedWith(/common\.UserIsNotAllowedToNest/); // Try to create and nest a token in the wrong collection @@ -387,7 +572,7 @@ await expect(executeTransaction(api, alice, api.tx.unique.createItem( collection, {Ethereum: tokenIdToAddress(collection, targetToken)}, - {nft: {const_data: [], variable_data: []}} as any, + {nft: {}} as any, )), 'while creating nested token').to.be.rejectedWith(/common\.UserIsNotAllowedToNest/); // Try to create and nest a token in the wrong collection @@ -409,7 +594,7 @@ await expect(executeTransaction(api, alice, api.tx.unique.createItem( collection, {Ethereum: tokenIdToAddress(collection, targetToken)}, - {nft: {const_data: [], variable_data: []}} as any, + {nft: {}} as any, )), 'while creating nested token').to.be.rejectedWith(/common\.SourceCollectionIsNotAllowedToNest/); // Try to create and nest a token in the wrong collection @@ -543,7 +728,7 @@ await expect(executeTransaction(api, alice, api.tx.unique.createItem( collectionRFT, targetAddress, - {ReFungible: {const_data: [], pieces: 100}}, + {ReFungible: {pieces: 100}}, )), 'while creating a nested token').to.be.rejectedWith(/^common\.UserIsNotAllowedToNest$/); // Create a token to be nested @@ -579,7 +764,7 @@ await expect(executeTransaction(api, alice, api.tx.unique.createItem( collectionRFT, targetAddress, - {ReFungible: {const_data: [], pieces: 100}}, + {ReFungible: {pieces: 100}}, )), 'while creating a nested token').to.be.rejectedWith(/common\.UserIsNotAllowedToNest/); // Try to create and nest a token in the wrong collection @@ -606,7 +791,7 @@ await expect(executeTransaction(api, alice, api.tx.unique.createItem( collectionRFT, targetAddress, - {ReFungible: {const_data: [], pieces: 100}}, + {ReFungible: {pieces: 100}}, )), 'while creating a nested token').to.be.rejectedWith(/common\.UserIsNotAllowedToNest/); // Try to create and nest a token in the wrong collection @@ -630,7 +815,7 @@ await expect(executeTransaction(api, alice, api.tx.unique.createItem( collectionRFT, targetAddress, - {ReFungible: {const_data: [], pieces: 100}}, + {ReFungible: {pieces: 100}}, )), 'while creating a nested token').to.be.rejectedWith(/common\.SourceCollectionIsNotAllowedToNest/); // Try to create and nest a token in the wrong collection --- a/tests/src/nesting/properties.test.ts +++ b/tests/src/nesting/properties.test.ts @@ -38,7 +38,7 @@ await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collectionId, propertyPermissions), + api.tx.unique.setTokenPropertyPermissions(collectionId, propertyPermissions), )).to.not.be.rejected; const collectionProperties = [ @@ -106,6 +106,58 @@ }); }); + it('Check valid names for collection properties keys', async () => { + await usingApi(async api => { + const events = await executeTransaction(api, bob, api.tx.unique.createCollectionEx({mode: 'NFT'})); + const {collectionId} = getCreateCollectionResult(events); + + // alpha symbols + await expect(executeTransaction( + api, + bob, + api.tx.unique.setCollectionProperties(collectionId, [{key: 'alpha'}]), + )).to.not.be.rejected; + + // numeric symbols + await expect(executeTransaction( + api, + bob, + api.tx.unique.setCollectionProperties(collectionId, [{key: '123'}]), + )).to.not.be.rejected; + + // underscore symbol + await expect(executeTransaction( + api, + bob, + api.tx.unique.setCollectionProperties(collectionId, [{key: 'black_hole'}]), + )).to.not.be.rejected; + + // dash symbol + await expect(executeTransaction( + api, + bob, + api.tx.unique.setCollectionProperties(collectionId, [{key: 'semi-automatic'}]), + )).to.not.be.rejected; + + // underscore symbol + await expect(executeTransaction( + api, + bob, + api.tx.unique.setCollectionProperties(collectionId, [{key: 'build.rs'}]), + )).to.not.be.rejected; + + const propertyKeys = ['alpha', '123', 'black_hole', 'semi-automatic', 'build.rs']; + const properties = (await api.rpc.unique.collectionProperties(collectionId, propertyKeys)).toHuman(); + expect(properties).to.be.deep.equal([ + {key: 'alpha', value: ''}, + {key: '123', value: ''}, + {key: 'black_hole', value: ''}, + {key: 'semi-automatic', value: ''}, + {key: 'build.rs', value: ''}, + ]); + }); + }); + it('Changes properties of a collection', async () => { await usingApi(async api => { const collection = await createCollectionExpectSuccess(); @@ -241,7 +293,7 @@ const invalidProperties = [ [{key: 'electron', value: 'negative'}, {key: 'string theory', value: 'understandable'}], - [{key: 'Mr.Sandman', value: 'Bring me a gene'}], + [{key: 'Mr/Sandman', value: 'Bring me a gene'}], [{key: 'déjà vu', value: 'hmm...'}], ]; @@ -310,7 +362,7 @@ await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: true}}]), + api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: true}}]), )).to.not.be.rejected; await addCollectionAdminExpectSuccess(alice, collection, bob.address); @@ -318,7 +370,7 @@ await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, [{key: 'mindgame', permission: {collectionAdmin: true, tokenOwner: false}}]), + api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'mindgame', permission: {collectionAdmin: true, tokenOwner: false}}]), )).to.not.be.rejected; const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery', 'mindgame'])).toHuman(); @@ -336,13 +388,13 @@ await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: true, collectionAdmin: true}}]), + api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: true, collectionAdmin: true}}]), )).to.not.be.rejected; await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}]), + api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}]), )).to.not.be.rejected; const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery'])).toHuman(); @@ -368,7 +420,7 @@ await expect(executeTransaction( api, bob, - api.tx.unique.setPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: true, tokenOwner: true}}]), + api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: true, tokenOwner: true}}]), )).to.be.rejectedWith(/common\.NoPermission/); const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery'])).toJSON(); @@ -391,7 +443,7 @@ await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, constitution), + api.tx.unique.setTokenPropertyPermissions(collection, constitution), )).to.be.rejectedWith(/common\.PropertyLimitReached/); const propertyRights = (await api.query.common.collectionPropertyPermissions(collection)).toJSON(); @@ -406,13 +458,13 @@ await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}]), + api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {mutable: false, tokenOwner: true}}]), )).to.not.be.rejected; await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, [{key: 'skullduggery', permission: {}}]), + api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'skullduggery', permission: {}}]), )).to.be.rejectedWith(/common\.NoPermission/); const propertyRights = (await api.rpc.unique.propertyPermissions(collection, ['skullduggery'])).toHuman(); @@ -436,21 +488,21 @@ await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, invalidProperties[i]), + api.tx.unique.setTokenPropertyPermissions(collection, invalidProperties[i]), ), `on setting the new badly-named property #${i}`).to.be.rejectedWith(/common\.InvalidCharacterInPropertyKey/); } await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, [{key: '', permission: {}}]), + api.tx.unique.setTokenPropertyPermissions(collection, [{key: '', permission: {}}]), ), 'on rejecting an unnamed property').to.be.rejectedWith(/common\.EmptyPropertyKey/); const correctKey = '--0x03116e387820CA05'; // PolkadotJS would parse this as an already encoded hex-string await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, [ + api.tx.unique.setTokenPropertyPermissions(collection, [ {key: correctKey, permission: {collectionAdmin: true}}, ]), ), 'on setting the correctly-but-still-badly-named property').to.not.be.rejected; @@ -524,7 +576,7 @@ await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, [{key: key, permission: permission.permission}]), + api.tx.unique.setTokenPropertyPermissions(collection, [{key: key, permission: permission.permission}]), ), `on setting permission ${i} by ${signer.address}`).to.not.be.rejected; await expect(executeTransaction( @@ -560,7 +612,7 @@ await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, [{key: key, permission: permission.permission}]), + api.tx.unique.setTokenPropertyPermissions(collection, [{key: key, permission: permission.permission}]), ), `on setting permission ${i} by ${signer.address}`).to.not.be.rejected; await expect(executeTransaction( @@ -603,7 +655,7 @@ await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, [{key: key, permission: permission.permission}]), + api.tx.unique.setTokenPropertyPermissions(collection, [{key: key, permission: permission.permission}]), ), `on setting permission ${i} by ${signer.address}`).to.not.be.rejected; await expect(executeTransaction( @@ -669,7 +721,7 @@ await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, [{key: `${i}`, permission: passage.permission}]), + api.tx.unique.setTokenPropertyPermissions(collection, [{key: `${i}`, permission: passage.permission}]), ), `on setting permission ${i} by ${signer.address}`).to.not.be.rejected; await expect(executeTransaction( @@ -746,7 +798,7 @@ await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, [{key: 'now-existent', permission: {}}]), + api.tx.unique.setTokenPropertyPermissions(collection, [{key: 'now-existent', permission: {}}]), ), 'on setting a new non-permitted property').to.not.be.rejected; await expect(executeTransaction( @@ -766,7 +818,7 @@ await expect(executeTransaction( api, alice, - api.tx.unique.setPropertyPermissions(collection, [ + api.tx.unique.setTokenPropertyPermissions(collection, [ {key: 'a_holy_book', permission: {collectionAdmin: true, tokenOwner: true}}, {key: 'young_years', permission: {collectionAdmin: true, tokenOwner: true}}, ]), --- a/tests/src/nesting/rules-smoke.test.ts +++ b/tests/src/nesting/rules-smoke.test.ts @@ -27,11 +27,11 @@ await usingApi(async api => { const collection = await createCollectionExpectSuccess({mode: {type: 'Fungible',decimalPoints:0}}); await expect(executeTransaction(api, alice, api.tx.unique.createItem(collection, nestTarget, {Fungible: {Value: 1}}))) - .to.be.rejectedWith(/^common\.SourceCollectionIsNotAllowedToNest$/); + .to.be.rejectedWith(/^common\.UserIsNotAllowedToNest$/); await createFungibleItemExpectSuccess(alice, collection, {Value:1n}, {Substrate: alice.address}); await expect(executeTransaction(api, alice, api.tx.unique.transfer(nestTarget, collection, 0, 1n))) - .to.be.rejectedWith(/^common\.SourceCollectionIsNotAllowedToNest$/); + .to.be.rejectedWith(/^common\.UserIsNotAllowedToNest$/); }); }); @@ -39,11 +39,11 @@ await usingApi(async api => { const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); await expect(executeTransaction(api, alice, api.tx.unique.createItem(collection, nestTarget, {NFT: {properties: []}}))) - .to.be.rejectedWith(/^common\.SourceCollectionIsNotAllowedToNest$/); + .to.be.rejectedWith(/^common\.UserIsNotAllowedToNest$/); const token = await createItemExpectSuccess(alice, collection, 'NFT', {Substrate: alice.address}); await expect(executeTransaction(api, alice, api.tx.unique.transfer(nestTarget, collection, token, 1n))) - .to.be.rejectedWith(/^common\.SourceCollectionIsNotAllowedToNest$/); + .to.be.rejectedWith(/^common\.UserIsNotAllowedToNest$/); }); }); @@ -51,11 +51,11 @@ await usingApi(async api => { const collection = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}}); await expect(executeTransaction(api, alice, api.tx.unique.createItem(collection, nestTarget, {ReFungible: {}}))) - .to.be.rejectedWith(/^common\.SourceCollectionIsNotAllowedToNest$/); + .to.be.rejectedWith(/^common\.UserIsNotAllowedToNest$/); const token = await createItemExpectSuccess(alice, collection, 'ReFungible', {Substrate: alice.address}); await expect(executeTransaction(api, alice, api.tx.unique.transfer(nestTarget, collection, token, 1n))) - .to.be.rejectedWith(/^common\.SourceCollectionIsNotAllowedToNest$/); + .to.be.rejectedWith(/^common\.UserIsNotAllowedToNest$/); }); }); }); --- a/tests/src/pallet-presence.test.ts +++ b/tests/src/pallet-presence.test.ts @@ -50,8 +50,6 @@ 'unique', 'nonfungible', 'refungible', - 'rmrkcore', - 'rmrkequip', 'scheduler', 'charging', ]; @@ -64,6 +62,16 @@ ]; describe('Pallet presence', () => { + before(async () => { + await usingApi(async api => { + const chain = await api.rpc.system.chain(); + + if (!chain.eq('UNIQUE')) { + requiredPallets.push(...['rmrkcore', 'rmrkequip']); + } + }); + }); + it('Required pallets are present', async () => { await usingApi(async api => { for (let i=0; i { @@ -47,14 +49,26 @@ return result.data!; } -describe('RMRK External Integration Test', () => { +async function isUnique(): Promise { + return usingApi(async api => { + const chain = await api.rpc.system.chain(); + + return chain.eq('UNIQUE'); + }); +} + +describe('RMRK External Integration Test', async () => { + const it_rmrk = (await isUnique() ? it : it.skip); + before(async () => { await usingApi(async (api, privateKeyWrapper) => { alice = privateKeyWrapper('//Alice'); + + }); }); - it('Creates a new RMRK collection that is mapped to a different ID and is tagged as external', async () => { + it_rmrk('Creates a new RMRK collection that is mapped to a different ID and is tagged as external', async () => { await usingApi(async api => { // throwaway collection to bump last Unique collection ID to test ID mapping await createCollectionExpectSuccess(); @@ -69,11 +83,13 @@ }); }); -describe('Negative Integration Test: External Collections, Internal Ops', () => { +describe('Negative Integration Test: External Collections, Internal Ops', async () => { let uniqueCollectionId: number; let rmrkCollectionId: number; let rmrkNftId: number; + const it_rmrk = (await isUnique() ? it : it.skip); + before(async () => { await usingApi(async (api, privateKeyWrapper) => { alice = privateKeyWrapper('//Alice'); @@ -87,7 +103,7 @@ }); }); - it('[Negative] Forbids Unique operations with an external collection, handled by dispatch_call', async () => { + it_rmrk('[Negative] Forbids Unique operations with an external collection, handled by dispatch_call', async () => { await usingApi(async api => { // Collection item creation @@ -113,8 +129,8 @@ await expect(executeTransaction(api, alice, txDeleteCollectionProperties), 'deleting collection properties') .to.be.rejectedWith(/common\.CollectionIsExternal/); - const txSetPropertyPermissions = api.tx.unique.setPropertyPermissions(uniqueCollectionId, [{key: 'a', permission: {mutable: true}}]); - await expect(executeTransaction(api, alice, txSetPropertyPermissions), 'setting property permissions') + const txsetTokenPropertyPermissions = api.tx.unique.setTokenPropertyPermissions(uniqueCollectionId, [{key: 'a', permission: {mutable: true}}]); + await expect(executeTransaction(api, alice, txsetTokenPropertyPermissions), 'setting property permissions') .to.be.rejectedWith(/common\.CollectionIsExternal/); // NFT @@ -146,7 +162,7 @@ }); }); - it('[Negative] Forbids Unique collection operations with an external collection', async () => { + it_rmrk('[Negative] Forbids Unique collection operations with an external collection', async () => { await usingApi(async api => { const txDestroyCollection = api.tx.unique.destroyCollection(uniqueCollectionId); await expect(executeTransaction(api, alice, txDestroyCollection), 'destroying collection') @@ -205,10 +221,12 @@ }); }); -describe('Negative Integration Test: Internal Collections, External Ops', () => { +describe('Negative Integration Test: Internal Collections, External Ops', async () => { let collectionId: number; let nftId: number; + const it_rmrk = (await isUnique() ? it : it.skip); + before(async () => { await usingApi(async (api, privateKeyWrapper) => { alice = privateKeyWrapper('//Alice'); @@ -219,14 +237,15 @@ }); }); - it('[Negative] Forbids RMRK operations with the internal collection and NFT (due to the lack of mapping)', async () => { + it_rmrk('[Negative] Forbids RMRK operations with the internal collection and NFT (due to the lack of mapping)', async () => { await usingApi(async api => { const txChangeOwner = api.tx.rmrkCore.changeCollectionIssuer(collectionId, bob.address); await expect(executeTransaction(api, alice, txChangeOwner), 'changing collection issuer') .to.be.rejectedWith(/rmrkCore\.CollectionUnknown/); - const txBurnItem = api.tx.rmrkCore.burnNft(collectionId, nftId); + const maxBurns = 10; + const txBurnItem = api.tx.rmrkCore.burnNft(collectionId, nftId, maxBurns); await expect(executeTransaction(api, alice, txBurnItem), 'burning NFT').to.be.rejectedWith(/rmrkCore\.CollectionUnknown/); }); }); -}); \ No newline at end of file +}); --- a/tests/src/setCollectionLimits.test.ts +++ b/tests/src/setCollectionLimits.test.ts @@ -46,6 +46,7 @@ before(async () => { await usingApi(async (api, privateKeyWrapper) => { alice = privateKeyWrapper('//Alice'); + bob = privateKeyWrapper('//Bob'); collectionIdForTesting = await createCollectionExpectSuccess({name: 'A', description: 'B', tokenPrefix: 'C', mode: {type: 'NFT'}}); }); }); @@ -115,6 +116,21 @@ }); }); + it('execute setCollectionLimits from admin collection', async () => { + await addCollectionAdminExpectSuccess(alice, collectionIdForTesting, bob.address); + await usingApi(async (api: ApiPromise) => { + tx = api.tx.unique.setCollectionLimits( + collectionIdForTesting, + { + accountTokenOwnershipLimit, + sponsoredDataSize, + // sponsoredMintSize, + tokenLimit, + }, + ); + await expect(submitTransactionAsync(bob, tx)).to.be.not.rejected; + }); + }); }); describe('setCollectionLimits negative', () => { @@ -143,21 +159,6 @@ }); }); it('execute setCollectionLimits from user who is not owner of this collection', async () => { - await usingApi(async (api: ApiPromise) => { - tx = api.tx.unique.setCollectionLimits( - collectionIdForTesting, - { - accountTokenOwnershipLimit, - sponsoredDataSize, - // sponsoredMintSize, - tokenLimit, - }, - ); - await expect(submitTransactionExpectFailAsync(bob, tx)).to.be.rejected; - }); - }); - it('execute setCollectionLimits from admin collection', async () => { - await addCollectionAdminExpectSuccess(alice, collectionIdForTesting, bob.address); await usingApi(async (api: ApiPromise) => { tx = api.tx.unique.setCollectionLimits( collectionIdForTesting, --- a/tests/src/setCollectionSponsor.test.ts +++ b/tests/src/setCollectionSponsor.test.ts @@ -65,6 +65,11 @@ await setCollectionSponsorExpectSuccess(collectionId, bob.address); await setCollectionSponsorExpectSuccess(collectionId, charlie.address); }); + it('Collection admin add sponsor', async () => { + const collectionId = await createCollectionExpectSuccess(); + await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); + await setCollectionSponsorExpectSuccess(collectionId, charlie.address, '//Bob'); + }); }); describe('(!negative test!) integration test: ext. setCollectionSponsor():', () => { @@ -93,10 +98,5 @@ const collectionId = await createCollectionExpectSuccess(); await destroyCollectionExpectSuccess(collectionId); await setCollectionSponsorExpectFailure(collectionId, bob.address); - }); - it('(!negative test!) Collection admin add sponsor', async () => { - const collectionId = await createCollectionExpectSuccess(); - await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); - await setCollectionSponsorExpectFailure(collectionId, charlie.address, '//Bob'); }); }); --- a/tests/src/setMintPermission.test.ts +++ b/tests/src/setMintPermission.test.ts @@ -67,6 +67,14 @@ await setMintPermissionExpectSuccess(alice, collectionId, false); }); }); + + it('Collection admin success on set', async () => { + await usingApi(async () => { + const collectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); + await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); + await setMintPermissionExpectSuccess(bob, collectionId, true); + }); + }); }); describe('Negative Integration Test setMintPermission', () => { @@ -100,14 +108,6 @@ const collectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); await enableAllowListExpectSuccess(alice, collectionId); await setMintPermissionExpectFailure(bob, collectionId, true); - }); - - it('Collection admin fails on set', async () => { - await usingApi(async () => { - const collectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); - await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); - await setMintPermissionExpectFailure(bob, collectionId, true); - }); }); it('ensure non-allow-listed non-privileged address can\'t mint tokens', async () => { --- a/tests/src/setPublicAccessMode.test.ts +++ b/tests/src/setPublicAccessMode.test.ts @@ -103,22 +103,23 @@ await expect(submitTransactionExpectFailAsync(bob, tx)).to.be.rejected; }); }); -}); -describe('Negative Integration Test ext. collection admin setPublicAccessMode(): ', () => { - before(async () => { - await usingApi(async (api, privateKeyWrapper) => { - alice = privateKeyWrapper('//Alice'); - bob = privateKeyWrapper('//Bob'); - }); - }); it('setPublicAccessMode by collection admin', async () => { await usingApi(async (api: ApiPromise) => { // tslint:disable-next-line: no-bitwise const collectionId = await createCollectionExpectSuccess(); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); const tx = api.tx.unique.setCollectionPermissions(collectionId, {access: 'AllowList'}); - await expect(submitTransactionExpectFailAsync(bob, tx)).to.be.rejected; + await expect(submitTransactionExpectFailAsync(bob, tx)).to.be.not.rejected; + }); + }); +}); + +describe('Negative Integration Test ext. collection admin setPublicAccessMode(): ', () => { + before(async () => { + await usingApi(async (api, privateKeyWrapper) => { + alice = privateKeyWrapper('//Alice'); + bob = privateKeyWrapper('//Bob'); }); }); }); --- a/tests/src/transferFrom.test.ts +++ b/tests/src/transferFrom.test.ts @@ -99,6 +99,7 @@ it('can be called by collection owner on non-owned item when OwnerCanTransfer == true', async () => { const collectionId = await createCollectionExpectSuccess(); + await setCollectionLimitsExpectSuccess(alice, collectionId, {ownerCanTransfer: true}); const itemId = await createItemExpectSuccess(alice, collectionId, 'NFT', bob.address); await transferFromExpectSuccess(collectionId, itemId, alice, bob, charlie); @@ -257,6 +258,7 @@ await usingApi(async () => { // nft const nftCollectionId = await createCollectionExpectSuccess(); + await setCollectionLimitsExpectSuccess(alice, nftCollectionId, {ownerCanTransfer: true}); const newNftTokenId = await createItemExpectSuccess(alice, nftCollectionId, 'NFT'); await burnItemExpectSuccess(alice, nftCollectionId, newNftTokenId, 1); await approveExpectFail(nftCollectionId, newNftTokenId, alice, bob); @@ -266,6 +268,7 @@ it('transferFrom burnt token before approve Fungible', async () => { await usingApi(async () => { const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); + await setCollectionLimitsExpectSuccess(alice, fungibleCollectionId, {ownerCanTransfer: true}); const newFungibleTokenId = await createItemExpectSuccess(alice, fungibleCollectionId, 'Fungible'); await burnItemExpectSuccess(alice, fungibleCollectionId, newFungibleTokenId, 10); await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, alice, bob.address); @@ -276,6 +279,7 @@ it('transferFrom burnt token before approve ReFungible', async () => { await usingApi(async () => { const reFungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}}); + await setCollectionLimitsExpectSuccess(alice, reFungibleCollectionId, {ownerCanTransfer: true}); const newReFungibleTokenId = await createItemExpectSuccess(alice, reFungibleCollectionId, 'ReFungible'); await burnItemExpectSuccess(alice, reFungibleCollectionId, newReFungibleTokenId, 100); await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, alice, bob); --- a/tests/src/util/helpers.ts +++ b/tests/src/util/helpers.ts @@ -921,6 +921,18 @@ }); } +export async function adminApproveFromExpectFail( + collectionId: number, + tokenId: number, admin: IKeyringPair, owner: CrossAccountId | string, approved: CrossAccountId | string, amount: number | bigint = 1, +) { + await usingApi(async (api: ApiPromise) => { + const approveUniqueTx = api.tx.unique.approve(normalizeAccountId(approved), collectionId, tokenId, amount); + const events = await expect(submitTransactionAsync(admin, approveUniqueTx)).to.be.rejected; + const result = getGenericResult(events); + expect(result.success).to.be.false; + }); +} + export async function getFreeBalance(account: IKeyringPair): Promise { let balance = 0n; --- a/tests/update_types.sh +++ b/tests/update_types.sh @@ -7,7 +7,7 @@ fi rsync -ar --exclude .gitignore src/interfaces/ unique-types-js -for file in unique-types-js/augment-* unique-types-js/**/types.ts unique-types-js/**/registry.ts; do +for file in unique-types-js/augment-* unique-types-js/**/types.ts unique-types-js/registry.ts; do sed -i '1s;^;//@ts-nocheck\n;' $file done