git.delta.rocks / unique-network / refs/commits / 9f4fc065e116

difftreelog

Merge pull request #871 from UniqueNetwork/feature/move_TokenChanged_event

Yaroslav Bolyukin2023-02-13parents: #3563d09 #40d2262.patch.diff
in: master

21 files changed

modifiedCargo.lockdiffbeforeafterboth
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2445,8 +2445,8 @@
 
 [[package]]
 name = "evm-coder"
-version = "0.3.0"
-source = "git+https://github.com/uniquenetwork/evm-coder?tag=v0.3.0#c4bfdf39d84fbe74c6178417177f2a7f81d92bdd"
+version = "0.3.1"
+source = "git+https://github.com/uniquenetwork/evm-coder?tag=v0.3.1#21e61c627f71337d6b8a03899fe8de14bfbf67aa"
 dependencies = [
  "ethereum",
  "evm-coder-procedural",
@@ -2457,8 +2457,8 @@
 
 [[package]]
 name = "evm-coder-procedural"
-version = "0.3.0"
-source = "git+https://github.com/uniquenetwork/evm-coder?tag=v0.3.0#c4bfdf39d84fbe74c6178417177f2a7f81d92bdd"
+version = "0.3.1"
+source = "git+https://github.com/uniquenetwork/evm-coder?tag=v0.3.1#21e61c627f71337d6b8a03899fe8de14bfbf67aa"
 dependencies = [
  "Inflector",
  "hex",
modifiedCargo.tomldiffbeforeafterboth
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -19,16 +19,9 @@
 
 [workspace.dependencies]
 # Unique
-evm-coder = { git = "https://github.com/uniquenetwork/evm-coder", tag = "v0.3.0", default-features = false }
-struct-versioning = { path = "crates/struct-versioning" }
-precompile-utils-macro = { path = "runtime/common/ethereum/precompiles/utils/macro" }
-up-common = { path = "primitives/common", default-features = false }
-up-data-structs = { path = "primitives/data-structs", default-features = false }
-up-pov-estimate-rpc = { path = "primitives/pov-estimate-rpc", default-features = false }
-up-rpc = { path = "primitives/rpc", default-features = false }
-up-sponsorship = { default-features = false, git = "https://github.com/uniquenetwork/pallet-sponsoring", branch = "polkadot-v0.9.37" }
-uc-rpc = { path =  "client/rpc" }
-unique-rpc = { path = "node/rpc" }
+app-promotion-rpc = { path = "primitives/app_promotion_rpc", default-features = false }
+evm-coder = { git = "https://github.com/uniquenetwork/evm-coder", tag = "v0.3.1", default-features = false }
+pallet-app-promotion = { path = "pallets/app-promotion", default-features = false }
 pallet-charge-transaction = { package = "pallet-template-transaction-payment", default-features = false, git = "https://github.com/uniquenetwork/pallet-sponsoring", branch = "polkadot-v0.9.37" }
 pallet-collator-selection = { default-features = false, path = "pallets/collator-selection" }
 pallet-common = { default-features = false, path = "pallets/common" }
@@ -45,56 +38,59 @@
 pallet-nonfungible = { default-features = false, path = "pallets/nonfungible" }
 pallet-refungible = { default-features = false, path = "pallets/refungible" }
 pallet-structure = { default-features = false, path = "pallets/structure" }
+pallet-test-utils = { default-features = false, path = "test-pallets/utils" }
 pallet-unique = { path = "pallets/unique", default-features = false }
 pallet-unique-scheduler-v2 = { path = "pallets/scheduler-v2", default-features = false }
-pallet-test-utils = { default-features = false, path = "test-pallets/utils" }
-pallet-app-promotion = { path = "pallets/app-promotion", default-features = false }
-app-promotion-rpc = { path = "primitives/app_promotion_rpc", default-features = false }
+precompile-utils-macro = { path = "runtime/common/ethereum/precompiles/utils/macro" }
+struct-versioning = { path = "crates/struct-versioning" }
+uc-rpc = { path = "client/rpc" }
+unique-rpc = { path = "node/rpc" }
+up-common = { path = "primitives/common", default-features = false }
+up-data-structs = { path = "primitives/data-structs", default-features = false }
+up-pov-estimate-rpc = { path = "primitives/pov-estimate-rpc", default-features = false }
+up-rpc = { path = "primitives/rpc", default-features = false }
+up-sponsorship = { default-features = false, git = "https://github.com/uniquenetwork/pallet-sponsoring", branch = "polkadot-v0.9.37" }
 
 # Unique: Runtimes
+opal-runtime = { path = "runtime/opal" }
+quartz-runtime = { path = "runtime/quartz" }
 unique-runtime = { path = "runtime/unique" }
-quartz-runtime = { path = "runtime/quartz" }
-opal-runtime = { path = "runtime/opal" }
 
 # Frontier (Unique patches over the Parity version)
+fc-consensus = { git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
+fc-db = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
+fc-mapping-sync = { git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
+fc-rpc = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
+fc-rpc-core = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
 fp-evm = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
 fp-evm-mapping = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
 fp-rpc = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
 fp-self-contained = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
-fc-db = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
-fc-rpc = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
-fc-rpc-core = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
 fp-storage = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
-fc-consensus = { git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
-fc-mapping-sync = { git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
+pallet-base-fee = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
 pallet-ethereum = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
 pallet-evm = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
-pallet-base-fee = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
 pallet-evm-precompile-simple = { default-features = false, git = "https://github.com/uniquenetwork/unique-frontier", branch = "unique-polkadot-v0.9.37" }
 
 # Parity
 codec = { default-features = false, features = ['derive'], package = 'parity-scale-codec', version = "3.2.2" }
-scale-info = { version = "2.1.1", default-features = false, features = ["derive"] }
-polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.37" }
-polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.37" }
-polkadot-service = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.37" }
 cumulus-client-cli = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37" }
 cumulus-client-consensus-aura = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37" }
 cumulus-client-consensus-common = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37" }
 cumulus-client-network = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37" }
 cumulus-client-service = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37" }
-cumulus-primitives-parachain-inherent = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37" }
-cumulus-relay-chain-inprocess-interface = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37" }
-cumulus-relay-chain-interface = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37" }
-cumulus-relay-chain-minimal-node = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37" }
 cumulus-pallet-aura-ext = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37", default-features = false }
 cumulus-pallet-dmp-queue = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37", default-features = false }
 cumulus-pallet-parachain-system = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37", default-features = false }
 cumulus-pallet-xcm = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37", default-features = false }
 cumulus-pallet-xcmp-queue = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37", default-features = false }
 cumulus-primitives-core = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37", default-features = false }
+cumulus-primitives-parachain-inherent = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37" }
 cumulus-primitives-timestamp = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37", default-features = false }
 cumulus-primitives-utility = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37", default-features = false }
+cumulus-relay-chain-inprocess-interface = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37" }
+cumulus-relay-chain-interface = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37" }
+cumulus-relay-chain-minimal-node = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37" }
 frame-executive = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
@@ -107,67 +103,71 @@
 pallet-sudo = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 pallet-timestamp = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 pallet-transaction-payment = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 pallet-transaction-payment-rpc-runtime-api = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 pallet-treasury = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 pallet-xcm = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.37", default-features = false }
-pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 parachain-info = { default-features = false, git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.37" }
+polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.37" }
 polkadot-parachain = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.37", default-features = false }
+polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.37" }
+polkadot-service = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.37" }
+sc-basic-authorship = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sc-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sc-consensus-manual-seal = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sc-executor = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sc-finality-grandpa = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sc-network = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sc-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sc-rpc-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sc-service = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sc-sysinfo = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sc-telemetry = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sc-tracing = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sc-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+scale-info = { version = "2.1.1", default-features = false, features = ["derive"] }
 sp-api = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 sp-arithmetic = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 sp-block-builder = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 sp-consensus-aura = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sp-externalities = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 sp-inherents = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 sp-io = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 sp-offchain = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 sp-session = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sp-transaction-pool = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sp-version = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 sp-staking = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sp-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 sp-tracing = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sp-timestamp = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sp-externalities = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sp-transaction-pool = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 sp-trie = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-finality-grandpa = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-network = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-rpc-api = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-service = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-basic-authorship = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-consensus-manual-seal = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-executor = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-sysinfo = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-telemetry = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-sc-tracing = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+sp-version = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
+substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 xcm = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.37", default-features = false }
 xcm-builder = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.37", default-features = false }
 xcm-executor = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.37", default-features = false }
 
 # Parity: Build utils
+substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 
 # Parity: Benchmarking
+frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 frame-system-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-frame-benchmarking = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 
 # Parity: Try Runtime
+frame-try-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 try-runtime-cli = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
-frame-try-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.37" }
 
 # ORML
 orml-tokens = { git = "https://github.com/open-web3-stack/open-runtime-module-library", branch = "polkadot-v0.9.37", default-features = false }
@@ -176,15 +176,15 @@
 orml-xtokens = { git = "https://github.com/open-web3-stack/open-runtime-module-library", branch = "polkadot-v0.9.37", default-features = false }
 
 # Other
-smallvec = "1.6.1"
 derivative = { version = "2.2.0", features = ["use_core"] }
-serde = { default-features = false, features = ['derive'], version = "1.0.136" }
-log = { version = "0.4.16", default-features = false }
-num_enum = { version = "0.5.3", default-features = false }
+ethereum = { version = "0.14.0", default-features = false }
+evm-core = { default-features = false, version = "0.37.0" }
 hex-literal = "0.3.4"
 impl-trait-for-tuples = "0.2.2"
+jsonrpsee = { version = "0.16.2", features = ["macros", "server"] }
+log = { version = "0.4.16", default-features = false }
 logtest = "2.0.0"
-ethereum = { version = "0.14.0", default-features = false }
-evm-core = { default-features = false, version = "0.37.0" }
+num_enum = { version = "0.5.3", default-features = false }
 primitive-types = { version = "0.12.1", default-features = false }
-jsonrpsee = { version = "0.16.2", features = ["macros", "server"] }
+serde = { default-features = false, features = ['derive'], version = "1.0.136" }
+smallvec = "1.6.1"
modifiedpallets/common/src/erc.rsdiffbeforeafterboth
--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -26,7 +26,6 @@
 };
 use pallet_evm_coder_substrate::dispatch_to_evm;
 use sp_std::{vec, vec::Vec};
-use sp_core::U256;
 use up_data_structs::{
 	CollectionMode, CollectionPermissions, OwnerRestrictedSet, Property, SponsoringRateLimit,
 	SponsorshipState,
@@ -62,18 +61,9 @@
 	},
 	/// The collection has been changed.
 	CollectionChanged {
-		/// Collection ID.
-		#[indexed]
-		collection_id: Address,
-	},
-
-	/// The token has been changed.
-	TokenChanged {
 		/// Collection ID.
 		#[indexed]
 		collection_id: Address,
-		/// Token ID.
-		token_id: U256,
 	},
 }
 
modifiedpallets/common/src/lib.rsdiffbeforeafterboth
--- a/pallets/common/src/lib.rs
+++ b/pallets/common/src/lib.rs
@@ -86,7 +86,6 @@
 use sp_core::H160;
 use sp_runtime::{ArithmeticError, DispatchError, DispatchResult};
 
-use crate::erc::CollectionHelpersEvents;
 #[cfg(feature = "runtime-benchmarks")]
 pub mod benchmarking;
 pub mod dispatch;
@@ -1250,6 +1249,7 @@
 		mut stored_properties: Properties,
 		is_token_owner: impl Fn() -> Result<bool, DispatchError>,
 		set_token_properties: impl FnOnce(Properties),
+		log: evm_coder::ethereum::Log,
 	) -> DispatchResult {
 		let is_collection_admin = collection.is_owner_or_admin(sender);
 		let permissions = Self::property_permissions(collection.id);
@@ -1304,13 +1304,7 @@
 				}
 			}
 
-			<PalletEvm<T>>::deposit_log(
-				CollectionHelpersEvents::TokenChanged {
-					collection_id: eth::collection_id_to_address(collection.id),
-					token_id: token_id.into(),
-				}
-				.to_log(T::ContractAddress::get()),
-			);
+			<PalletEvm<T>>::deposit_log(log.clone());
 		}
 
 		set_token_properties(stored_properties);
modifiedpallets/nonfungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -50,13 +50,24 @@
 	TokenProperties, SelfWeightOf, weights::WeightInfo,
 };
 
+/// Nft events.
+#[derive(ToLog)]
+pub enum ERC721TokenEvent {
+	/// The token has been changed.
+	TokenChanged {
+		/// Token ID.
+		#[indexed]
+		token_id: U256,
+	},
+}
+
 frontier_contract! {
 	macro_rules! NonfungibleHandle_result {...}
 	impl<T: Config> Contract for NonfungibleHandle<T> {...}
 }
 
 /// @title A contract that allows to set and delete token properties and change token property permissions.
-#[solidity_interface(name = TokenProperties, enum(derive(PreDispatch)), enum_attr(weight))]
+#[solidity_interface(name = TokenProperties, events(ERC721TokenEvent), enum(derive(PreDispatch)), enum_attr(weight))]
 impl<T: Config> NonfungibleHandle<T> {
 	/// @notice Set permissions for token property.
 	/// @dev Throws error if `msg.sender` is not admin or owner of the collection.
modifiedpallets/nonfungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/lib.rs
+++ b/pallets/nonfungible/src/lib.rs
@@ -112,7 +112,7 @@
 };
 use pallet_structure::{Pallet as PalletStructure, Error as StructureError};
 use pallet_evm_coder_substrate::{SubstrateRecorder, WithRecorder};
-use sp_core::H160;
+use sp_core::{Get, H160};
 use sp_runtime::{ArithmeticError, DispatchError, DispatchResult, TransactionOutcome};
 use sp_std::{vec::Vec, vec, collections::btree_map::BTreeMap};
 use core::ops::Deref;
@@ -622,6 +622,10 @@
 			stored_properties,
 			is_token_owner,
 			|properties| <TokenProperties<T>>::set((collection.id, token_id), properties),
+			erc::ERC721TokenEvent::TokenChanged {
+				token_id: token_id.into(),
+			}
+			.to_log(T::ContractAddress::get()),
 		)
 	}
 
modifiedpallets/nonfungible/src/stubs/UniqueNFT.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth
--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -17,9 +17,14 @@
 	}
 }
 
+/// @dev inlined interface
+contract ERC721TokenEvent {
+	event TokenChanged(uint256 indexed tokenId);
+}
+
 /// @title A contract that allows to set and delete token properties and change token property permissions.
 /// @dev the ERC-165 identifier for this interface is 0xde0695c2
-contract TokenProperties is Dummy, ERC165 {
+contract TokenProperties is Dummy, ERC165, ERC721TokenEvent {
 	// /// @notice Set permissions for token property.
 	// /// @dev Throws error if `msg.sender` is not admin or owner of the collection.
 	// /// @param key Property key.
modifiedpallets/refungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/refungible/src/erc.rs
+++ b/pallets/refungible/src/erc.rs
@@ -59,8 +59,19 @@
 
 pub const ADDRESS_FOR_PARTIALLY_OWNED_TOKENS: H160 = H160::repeat_byte(0xff);
 
+/// Rft events.
+#[derive(ToLog)]
+pub enum ERC721TokenEvent {
+	/// The token has been changed.
+	TokenChanged {
+		/// Token ID.
+		#[indexed]
+		token_id: U256,
+	},
+}
+
 /// @title A contract that allows to set and delete token properties and change token property permissions.
-#[solidity_interface(name = TokenProperties, enum(derive(PreDispatch)), enum_attr(weight))]
+#[solidity_interface(name = TokenProperties, events(ERC721TokenEvent), enum(derive(PreDispatch)), enum_attr(weight))]
 impl<T: Config> RefungibleHandle<T> {
 	/// @notice Set permissions for token property.
 	/// @dev Throws error if `msg.sender` is not admin or owner of the collection.
modifiedpallets/refungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -100,7 +100,7 @@
 	Event as CommonEvent, Pallet as PalletCommon,
 };
 use pallet_structure::Pallet as PalletStructure;
-use sp_core::H160;
+use sp_core::{Get, H160};
 use sp_runtime::{ArithmeticError, DispatchError, DispatchResult, TransactionOutcome};
 use sp_std::{vec::Vec, vec, collections::btree_map::BTreeMap};
 use up_data_structs::{
@@ -571,6 +571,10 @@
 			stored_properties,
 			is_token_owner,
 			|properties| <TokenProperties<T>>::set((collection.id, token_id), properties),
+			erc::ERC721TokenEvent::TokenChanged {
+				token_id: token_id.into(),
+			}
+			.to_log(T::ContractAddress::get()),
 		)
 	}
 
modifiedpallets/refungible/src/stubs/UniqueRefungible.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth
--- a/pallets/refungible/src/stubs/UniqueRefungible.sol
+++ b/pallets/refungible/src/stubs/UniqueRefungible.sol
@@ -17,9 +17,14 @@
 	}
 }
 
+/// @dev inlined interface
+contract ERC721TokenEvent {
+	event TokenChanged(uint256 indexed tokenId);
+}
+
 /// @title A contract that allows to set and delete token properties and change token property permissions.
 /// @dev the ERC-165 identifier for this interface is 0xde0695c2
-contract TokenProperties is Dummy, ERC165 {
+contract TokenProperties is Dummy, ERC165, ERC721TokenEvent {
 	// /// @notice Set permissions for token property.
 	// /// @dev Throws error if `msg.sender` is not admin or owner of the collection.
 	// /// @param key Property key.
modifiedpallets/unique/src/eth/stubs/CollectionHelpers.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/unique/src/eth/stubs/CollectionHelpers.soldiffbeforeafterboth
--- a/pallets/unique/src/eth/stubs/CollectionHelpers.sol
+++ b/pallets/unique/src/eth/stubs/CollectionHelpers.sol
@@ -22,7 +22,6 @@
 	event CollectionCreated(address indexed owner, address indexed collectionId);
 	event CollectionDestroyed(address indexed collectionId);
 	event CollectionChanged(address indexed collectionId);
-	event TokenChanged(address indexed collectionId, uint256 tokenId);
 }
 
 /// @title Contract, which allows users to operate with collections
modifiedtests/src/eth/abi/collectionHelpers.jsondiffbeforeafterboth
--- a/tests/src/eth/abi/collectionHelpers.json
+++ b/tests/src/eth/abi/collectionHelpers.json
@@ -45,25 +45,6 @@
     "type": "event"
   },
   {
-    "anonymous": false,
-    "inputs": [
-      {
-        "indexed": true,
-        "internalType": "address",
-        "name": "collectionId",
-        "type": "address"
-      },
-      {
-        "indexed": false,
-        "internalType": "uint256",
-        "name": "tokenId",
-        "type": "uint256"
-      }
-    ],
-    "name": "TokenChanged",
-    "type": "event"
-  },
-  {
     "inputs": [
       { "internalType": "uint32", "name": "collectionId", "type": "uint32" }
     ],
modifiedtests/src/eth/abi/nonFungible.jsondiffbeforeafterboth
--- a/tests/src/eth/abi/nonFungible.json
+++ b/tests/src/eth/abi/nonFungible.json
@@ -54,6 +54,19 @@
     "inputs": [
       {
         "indexed": true,
+        "internalType": "uint256",
+        "name": "tokenId",
+        "type": "uint256"
+      }
+    ],
+    "name": "TokenChanged",
+    "type": "event"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
         "internalType": "address",
         "name": "from",
         "type": "address"
modifiedtests/src/eth/abi/reFungible.jsondiffbeforeafterboth
--- a/tests/src/eth/abi/reFungible.json
+++ b/tests/src/eth/abi/reFungible.json
@@ -54,6 +54,19 @@
     "inputs": [
       {
         "indexed": true,
+        "internalType": "uint256",
+        "name": "tokenId",
+        "type": "uint256"
+      }
+    ],
+    "name": "TokenChanged",
+    "type": "event"
+  },
+  {
+    "anonymous": false,
+    "inputs": [
+      {
+        "indexed": true,
         "internalType": "address",
         "name": "from",
         "type": "address"
modifiedtests/src/eth/api/CollectionHelpers.soldiffbeforeafterboth
--- a/tests/src/eth/api/CollectionHelpers.sol
+++ b/tests/src/eth/api/CollectionHelpers.sol
@@ -17,7 +17,6 @@
 	event CollectionCreated(address indexed owner, address indexed collectionId);
 	event CollectionDestroyed(address indexed collectionId);
 	event CollectionChanged(address indexed collectionId);
-	event TokenChanged(address indexed collectionId, uint256 tokenId);
 }
 
 /// @title Contract, which allows users to operate with collections
modifiedtests/src/eth/api/UniqueNFT.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -12,9 +12,14 @@
 	function supportsInterface(bytes4 interfaceID) external view returns (bool);
 }
 
+/// @dev inlined interface
+interface ERC721TokenEvent {
+	event TokenChanged(uint256 indexed tokenId);
+}
+
 /// @title A contract that allows to set and delete token properties and change token property permissions.
 /// @dev the ERC-165 identifier for this interface is 0xde0695c2
-interface TokenProperties is Dummy, ERC165 {
+interface TokenProperties is Dummy, ERC165, ERC721TokenEvent {
 	// /// @notice Set permissions for token property.
 	// /// @dev Throws error if `msg.sender` is not admin or owner of the collection.
 	// /// @param key Property key.
modifiedtests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueRefungible.sol
+++ b/tests/src/eth/api/UniqueRefungible.sol
@@ -12,9 +12,14 @@
 	function supportsInterface(bytes4 interfaceID) external view returns (bool);
 }
 
+/// @dev inlined interface
+interface ERC721TokenEvent {
+	event TokenChanged(uint256 indexed tokenId);
+}
+
 /// @title A contract that allows to set and delete token properties and change token property permissions.
 /// @dev the ERC-165 identifier for this interface is 0xde0695c2
-interface TokenProperties is Dummy, ERC165 {
+interface TokenProperties is Dummy, ERC165, ERC721TokenEvent {
 	// /// @notice Set permissions for token property.
 	// /// @dev Throws error if `msg.sender` is not admin or owner of the collection.
 	// /// @param key Property key.
modifiedtests/src/eth/events.test.tsdiffbeforeafterboth
before · tests/src/eth/events.test.ts
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import {expect} from 'chai';18import {IKeyringPair} from '@polkadot/types/types';19import {EthUniqueHelper, itEth, usingEthPlaygrounds} from './util';20import {IEvent, TCollectionMode} from '../util/playgrounds/types';21import {Pallets, requirePalletsOrSkip} from '../util';22import {CollectionLimitField, TokenPermissionField, NormalizedEvent} from './util/playgrounds/types';2324let donor: IKeyringPair;2526before(async function () {27  await usingEthPlaygrounds(async (_helper, privateKey) => {28    donor = await privateKey({filename: __filename});29  });30});3132function clearEvents(ethEvents: NormalizedEvent[], subEvents: IEvent[]) {33  ethEvents.splice(0);34  subEvents.splice(0);35}3637async function testCollectionCreatedAndDestroy(helper: EthUniqueHelper, mode: TCollectionMode) {38  const owner = await helper.eth.createAccountWithBalance(donor);39  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionCreated', 'CollectionDestroyed']}]);40  const {collectionAddress, events: ethEvents} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');41  await helper.wait.newBlocks(1);42  {43    expect(ethEvents).to.containSubset([44      {45        event: 'CollectionCreated',46        args: {47          owner: owner,48          collectionId: collectionAddress,49        },50      },51    ]);52    expect(subEvents).to.containSubset([{method: 'CollectionCreated'}]);53    clearEvents(ethEvents, subEvents);54  }55  {56    const collectionHelper = await helper.ethNativeContract.collectionHelpers(owner);57    const result = await collectionHelper.methods.destroyCollection(collectionAddress).send({from:owner});58    await helper.wait.newBlocks(1);59    expect(result.events).to.containSubset({60      CollectionDestroyed: {61        returnValues: {62          collectionId: collectionAddress,63        },64      },65    });66    expect(subEvents).to.containSubset([{method: 'CollectionDestroyed'}]);67  }68  unsubscribe();69}7071async function testCollectionPropertySetAndDeleted(helper: EthUniqueHelper, mode: TCollectionMode) {72  const owner = await helper.eth.createAccountWithBalance(donor);73  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');74  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);75  const collectionHelper = await helper.ethNativeContract.collectionHelpers(owner);7677  const ethEvents: any = [];78  collectionHelper.events.allEvents((_: any, event: any) => {79    ethEvents.push(event);80  });81  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionPropertySet', 'CollectionPropertyDeleted']}]);82  {83    await collection.methods.setCollectionProperties([{key: 'A', value: [0,1,2,3]}]).send({from:owner});84    await helper.wait.newBlocks(1);85    expect(ethEvents).to.containSubset([86      {87        event: 'CollectionChanged',88        returnValues: {89          collectionId: collectionAddress,90        },91      },92    ]);93    expect(subEvents).to.containSubset([{method: 'CollectionPropertySet'}]);94    clearEvents(ethEvents, subEvents);95  }96  {97    await collection.methods.deleteCollectionProperties(['A']).send({from:owner});98    await helper.wait.newBlocks(1);99    expect(ethEvents).to.containSubset([100      {101        event: 'CollectionChanged',102        returnValues: {103          collectionId: collectionAddress,104        },105      },106    ]);107    expect(subEvents).to.containSubset([{method: 'CollectionPropertyDeleted'}]);108  }109  unsubscribe();110}111112async function testPropertyPermissionSet(helper: EthUniqueHelper, mode: TCollectionMode) {113  const owner = await helper.eth.createAccountWithBalance(donor);114  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');115  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);116  const collectionHelper = await helper.ethNativeContract.collectionHelpers(owner);117  const ethEvents: any = [];118  collectionHelper.events.allEvents((_: any, event: any) => {119    ethEvents.push(event);120  });121  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['PropertyPermissionSet']}]);122  await collection.methods.setTokenPropertyPermissions([123    ['A', [124      [TokenPermissionField.Mutable, true],125      [TokenPermissionField.TokenOwner, true],126      [TokenPermissionField.CollectionAdmin, true]],127    ],128  ]).send({from: owner});129  await helper.wait.newBlocks(1);130  expect(ethEvents).to.containSubset([131    {132      event: 'CollectionChanged',133      returnValues: {134        collectionId: collectionAddress,135      },136    },137  ]);138  expect(subEvents).to.containSubset([{method: 'PropertyPermissionSet'}]);139  unsubscribe();140}141142async function testAllowListAddressAddedAndRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {143  const owner = await helper.eth.createAccountWithBalance(donor);144  const user = helper.ethCrossAccount.createAccount();145  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');146  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);147  const collectionHelper = await helper.ethNativeContract.collectionHelpers(owner);148  const ethEvents: any[] = [];149  collectionHelper.events.allEvents((_: any, event: any) => {150    ethEvents.push(event);151  });152153  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['AllowListAddressAdded', 'AllowListAddressRemoved']}]);154  {155    await collection.methods.addToCollectionAllowListCross(user).send({from: owner});156    await helper.wait.newBlocks(1);157    expect(ethEvents).to.containSubset([158      {159        event: 'CollectionChanged',160        returnValues: {161          collectionId: collectionAddress,162        },163      },164    ]);165    expect(subEvents).to.containSubset([{method: 'AllowListAddressAdded'}]);166    clearEvents(ethEvents, subEvents);167  }168  {169    await collection.methods.removeFromCollectionAllowListCross(user).send({from: owner});170    await helper.wait.newBlocks(1);171    expect(ethEvents).to.containSubset([172      {173        event: 'CollectionChanged',174        returnValues: {175          collectionId: collectionAddress,176        },177      },178    ]);179    expect(subEvents).to.containSubset([{method: 'AllowListAddressRemoved'}]);180  }181  unsubscribe();182}183184async function testCollectionAdminAddedAndRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {185  const owner = await helper.eth.createAccountWithBalance(donor);186  const user = helper.ethCrossAccount.createAccount();187  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');188  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);189  const collectionHelper = await helper.ethNativeContract.collectionHelpers(owner);190  const ethEvents: any = [];191  collectionHelper.events.allEvents((_: any, event: any) => {192    ethEvents.push(event);193  });194  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionAdminAdded', 'CollectionAdminRemoved']}]);195  {196    await collection.methods.addCollectionAdminCross(user).send({from: owner});197    await helper.wait.newBlocks(1);198    expect(ethEvents).to.containSubset([199      {200        event: 'CollectionChanged',201        returnValues: {202          collectionId: collectionAddress,203        },204      },205    ]);206    expect(subEvents).to.containSubset([{method: 'CollectionAdminAdded'}]);207    clearEvents(ethEvents, subEvents);208  }209  {210    await collection.methods.removeCollectionAdminCross(user).send({from: owner});211    await helper.wait.newBlocks(1);212    expect(ethEvents).to.containSubset([213      {214        event: 'CollectionChanged',215        returnValues: {216          collectionId: collectionAddress,217        },218      },219    ]);220    expect(subEvents).to.containSubset([{method: 'CollectionAdminRemoved'}]);221  }222  unsubscribe();223}224225async function testCollectionLimitSet(helper: EthUniqueHelper, mode: TCollectionMode) {226  const owner = await helper.eth.createAccountWithBalance(donor);227  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');228  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);229  const collectionHelper = await helper.ethNativeContract.collectionHelpers(owner);230  const ethEvents: any = [];231  collectionHelper.events.allEvents((_: any, event: any) => {232    ethEvents.push(event);233  });234  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionLimitSet']}]);235  {236    await collection.methods.setCollectionLimit({field: CollectionLimitField.OwnerCanTransfer, value: {status: true, value: 0}}).send({from: owner});237    await helper.wait.newBlocks(1);238    expect(ethEvents).to.containSubset([239      {240        event: 'CollectionChanged',241        returnValues: {242          collectionId: collectionAddress,243        },244      },245    ]);246    expect(subEvents).to.containSubset([{method: 'CollectionLimitSet'}]);247  }248  unsubscribe();249}250251async function testCollectionOwnerChanged(helper: EthUniqueHelper, mode: TCollectionMode) {252  const owner = await helper.eth.createAccountWithBalance(donor);253  const newOwner = helper.ethCrossAccount.createAccount();254  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');255  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);256  const collectionHelper = await helper.ethNativeContract.collectionHelpers(owner);257  const ethEvents: any = [];258  collectionHelper.events.allEvents((_: any, event: any) => {259    ethEvents.push(event);260  });261  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionOwnerChanged']}]);262  {263    await collection.methods.changeCollectionOwnerCross(newOwner).send({from: owner});264    await helper.wait.newBlocks(1);265    expect(ethEvents).to.containSubset([266      {267        event: 'CollectionChanged',268        returnValues: {269          collectionId: collectionAddress,270        },271      },272    ]);273    expect(subEvents).to.containSubset([{method: 'CollectionOwnerChanged'}]);274  }275  unsubscribe();276}277278async function testCollectionPermissionSet(helper: EthUniqueHelper, mode: TCollectionMode) {279  const owner = await helper.eth.createAccountWithBalance(donor);280  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');281  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);282  const collectionHelper = await helper.ethNativeContract.collectionHelpers(owner);283  const ethEvents: any = [];284  collectionHelper.events.allEvents((_: any, event: any) => {285    ethEvents.push(event);286  });287  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionPermissionSet']}]);288  {289    await collection.methods.setCollectionMintMode(true).send({from: owner});290    await helper.wait.newBlocks(1);291    expect(ethEvents).to.containSubset([292      {293        event: 'CollectionChanged',294        returnValues: {295          collectionId: collectionAddress,296        },297      },298    ]);299    expect(subEvents).to.containSubset([{method: 'CollectionPermissionSet'}]);300    clearEvents(ethEvents, subEvents);301  }302  {303    await collection.methods.setCollectionAccess(1).send({from: owner});304    await helper.wait.newBlocks(1);305    expect(ethEvents).to.containSubset([306      {307        event: 'CollectionChanged',308        returnValues: {309          collectionId: collectionAddress,310        },311      },312    ]);313    expect(subEvents).to.containSubset([{method: 'CollectionPermissionSet'}]);314  }315  unsubscribe();316}317318async function testCollectionSponsorSetAndConfirmedAndThenRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {319  const owner = await helper.eth.createAccountWithBalance(donor);320  const sponsor = await helper.ethCrossAccount.createAccountWithBalance(donor);321  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');322  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);323  const collectionHelper = await helper.ethNativeContract.collectionHelpers(owner);324  const ethEvents: any = [];325  collectionHelper.events.allEvents((_: any, event: any) => {326    ethEvents.push(event);327  });328  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{329    section: 'common', names: ['CollectionSponsorSet', 'SponsorshipConfirmed', 'CollectionSponsorRemoved',330    ]}]);331  {332    await collection.methods.setCollectionSponsorCross(sponsor).send({from: owner});333    await helper.wait.newBlocks(1);334    expect(ethEvents).to.containSubset([{335      event: 'CollectionChanged',336      returnValues: {337        collectionId: collectionAddress,338      },339    }]);340    expect(subEvents).to.containSubset([{method: 'CollectionSponsorSet'}]);341    clearEvents(ethEvents, subEvents);342  }343  {344    await collection.methods.confirmCollectionSponsorship().send({from: sponsor.eth});345    await helper.wait.newBlocks(1);346    expect(ethEvents).to.containSubset([347      {348        event: 'CollectionChanged',349        returnValues: {350          collectionId: collectionAddress,351        },352      },353    ]);354    expect(subEvents).to.containSubset([{method: 'SponsorshipConfirmed'}]);355    clearEvents(ethEvents, subEvents);356  }357  {358    await collection.methods.removeCollectionSponsor().send({from: owner});359    await helper.wait.newBlocks(1);360    expect(ethEvents).to.containSubset([361      {362        event: 'CollectionChanged',363        returnValues: {364          collectionId: collectionAddress,365        },366      },367    ]);368    expect(subEvents).to.containSubset([{method: 'CollectionSponsorRemoved'}]);369  }370  unsubscribe();371}372373async function testTokenPropertySetAndDeleted(helper: EthUniqueHelper, mode: TCollectionMode) {374  const owner = await helper.eth.createAccountWithBalance(donor);375  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');376  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);377  const collectionHelper = await helper.ethNativeContract.collectionHelpers(owner);378  const result = await collection.methods.mint(owner).send({from: owner});379  const tokenId = result.events.Transfer.returnValues.tokenId;380  await collection.methods.setTokenPropertyPermissions([381    ['A', [382      [TokenPermissionField.Mutable, true],383      [TokenPermissionField.TokenOwner, true],384      [TokenPermissionField.CollectionAdmin, true]],385    ],386  ]).send({from: owner});387388389  const ethEvents: any = [];390  collectionHelper.events.allEvents((_: any, event: any) => {391    ethEvents.push(event);392  });393  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['TokenPropertySet', 'TokenPropertyDeleted']}]);394  {395    await collection.methods.setProperties(tokenId, [{key: 'A', value: [1,2,3]}]).send({from: owner});396    await helper.wait.newBlocks(1);397    expect(ethEvents).to.containSubset([398      {399        event: 'TokenChanged',400        returnValues: {401          collectionId: collectionAddress,402        },403      },404    ]);405    expect(subEvents).to.containSubset([{method: 'TokenPropertySet'}]);406    clearEvents(ethEvents, subEvents);407  }408  {409    await collection.methods.deleteProperties(tokenId, ['A']).send({from: owner});410    await helper.wait.newBlocks(1);411    expect(ethEvents).to.containSubset([412      {413        event: 'TokenChanged',414        returnValues: {415          collectionId: collectionAddress,416        },417      },418    ]);419    expect(subEvents).to.containSubset([{method: 'TokenPropertyDeleted'}]);420  }421  unsubscribe();422}423424describe('[FT] Sync sub & eth events', () => {425  const mode: TCollectionMode = 'ft';426427  itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {428    await testCollectionCreatedAndDestroy(helper, mode);429  });430431  itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {432    await testCollectionPropertySetAndDeleted(helper, mode);433  });434435  itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {436    await testAllowListAddressAddedAndRemoved(helper, mode);437  });438439  itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {440    await testCollectionAdminAddedAndRemoved(helper, mode);441  });442443  itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {444    await testCollectionLimitSet(helper, mode);445  });446447  itEth('CollectionChanged event for CollectionOwnerChanged', async ({helper}) => {448    await testCollectionOwnerChanged(helper, mode);449  });450451  itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {452    await testCollectionPermissionSet(helper, mode);453  });454455  itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {456    await testCollectionSponsorSetAndConfirmedAndThenRemoved(helper, mode);457  });458});459460describe('[NFT] Sync sub & eth events', () => {461  const mode: TCollectionMode = 'nft';462463  itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {464    await testCollectionCreatedAndDestroy(helper, mode);465  });466467  itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {468    await testCollectionPropertySetAndDeleted(helper, mode);469  });470471  itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {472    await testPropertyPermissionSet(helper, mode);473  });474475  itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {476    await testAllowListAddressAddedAndRemoved(helper, mode);477  });478479  itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {480    await testCollectionAdminAddedAndRemoved(helper, mode);481  });482483  itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {484    await testCollectionLimitSet(helper, mode);485  });486487  itEth('CollectionChanged event for CollectionOwnerChanged', async ({helper}) => {488    await testCollectionOwnerChanged(helper, mode);489  });490491  itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {492    await testCollectionPermissionSet(helper, mode);493  });494495  itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {496    await testCollectionSponsorSetAndConfirmedAndThenRemoved(helper, mode);497  });498499  itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {500    await testTokenPropertySetAndDeleted(helper, mode);501  });502});503504describe('[RFT] Sync sub & eth events', () => {505  const mode: TCollectionMode = 'rft';506507  before(async function() {508    await usingEthPlaygrounds(async (helper, privateKey) => {509      requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);510      const _donor = await privateKey({filename: __filename});511    });512  });513514  itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {515    await testCollectionCreatedAndDestroy(helper, mode);516  });517518  itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {519    await testCollectionPropertySetAndDeleted(helper, mode);520  });521522  itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {523    await testPropertyPermissionSet(helper, mode);524  });525526  itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {527    await testAllowListAddressAddedAndRemoved(helper, mode);528  });529530  itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {531    await testCollectionAdminAddedAndRemoved(helper, mode);532  });533534  itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {535    await testCollectionLimitSet(helper, mode);536  });537538  itEth('CollectionChanged event for CollectionOwnerChanged', async ({helper}) => {539    await testCollectionOwnerChanged(helper, mode);540  });541542  itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {543    await testCollectionPermissionSet(helper, mode);544  });545546  itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {547    await testCollectionSponsorSetAndConfirmedAndThenRemoved(helper, mode);548  });549550  itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {551    await testTokenPropertySetAndDeleted(helper, mode);552  });553});