From fd489363b37ad4151533106d8b7c608a78407de6 Mon Sep 17 00:00:00 2001 From: tgmichel Date: Thu, 20 Jul 2023 10:24:45 +0200 Subject: [PATCH] tracing runtime 2402 (#74) --- ...nbase-runtime-2402-substitute-tracing.json | 1 + ...nbeam-runtime-2402-substitute-tracing.json | 1 + ...river-runtime-2402-substitute-tracing.json | 1 + tracing/2402/Cargo.lock | 12473 ++++++++++++++++ tracing/2402/Cargo.toml | 422 + tracing/2402/runtime/common/Cargo.toml | 81 + tracing/2402/runtime/common/src/apis.rs | 887 ++ .../common/src/impl_moonbeam_xcm_call.rs | 51 + .../src/impl_moonbeam_xcm_call_tracing.rs | 112 + .../src/impl_on_charge_evm_transaction.rs | 64 + .../common/src/impl_self_contained_call.rs | 78 + .../runtime/common/src/impl_xcm_evm_runner.rs | 188 + tracing/2402/runtime/common/src/lib.rs | 40 + tracing/2402/runtime/common/src/migrations.rs | 232 + tracing/2402/runtime/moonbase/Cargo.toml | 343 + tracing/2402/runtime/moonbase/build.rs | 25 + .../2402/runtime/moonbase/src/asset_config.rs | 342 + .../moonbase/src/governance/councils.rs | 88 + .../moonbase/src/governance/democracy.rs | 76 + .../runtime/moonbase/src/governance/mod.rs | 30 + .../moonbase/src/governance/origins.rs | 80 + .../moonbase/src/governance/referenda.rs | 97 + .../runtime/moonbase/src/governance/tracks.rs | 179 + tracing/2402/runtime/moonbase/src/lib.rs | 1690 +++ .../2402/runtime/moonbase/src/precompiles.rs | 261 + .../2402/runtime/moonbase/src/xcm_config.rs | 698 + .../2402/runtime/moonbase/tests/common/mod.rs | 402 + .../runtime/moonbase/tests/evm_tracing.rs | 94 + .../moonbase/tests/integration_test.rs | 3542 +++++ .../runtime/moonbase/tests/runtime_apis.rs | 397 + .../runtime/moonbase/tests/xcm_mock/mod.rs | 256 + .../moonbase/tests/xcm_mock/parachain.rs | 1194 ++ .../moonbase/tests/xcm_mock/relay_chain.rs | 349 + .../moonbase/tests/xcm_mock/statemint_like.rs | 529 + .../2402/runtime/moonbase/tests/xcm_tests.rs | 3332 +++++ tracing/2402/runtime/moonbeam/Cargo.toml | 334 + tracing/2402/runtime/moonbeam/build.rs | 25 + .../2402/runtime/moonbeam/src/asset_config.rs | 341 + .../moonbeam/src/governance/councils.rs | 88 + .../moonbeam/src/governance/democracy.rs | 77 + .../runtime/moonbeam/src/governance/mod.rs | 30 + .../moonbeam/src/governance/origins.rs | 82 + .../moonbeam/src/governance/referenda.rs | 98 + .../runtime/moonbeam/src/governance/tracks.rs | 179 + tracing/2402/runtime/moonbeam/src/lib.rs | 1707 +++ .../2402/runtime/moonbeam/src/precompiles.rs | 264 + .../2402/runtime/moonbeam/src/xcm_config.rs | 688 + .../2402/runtime/moonbeam/tests/common/mod.rs | 403 + .../runtime/moonbeam/tests/evm_tracing.rs | 94 + .../moonbeam/tests/integration_test.rs | 3246 ++++ .../runtime/moonbeam/tests/runtime_apis.rs | 393 + .../runtime/moonbeam/tests/xcm_mock/mod.rs | 254 + .../moonbeam/tests/xcm_mock/parachain.rs | 1176 ++ .../moonbeam/tests/xcm_mock/relay_chain.rs | 349 + .../moonbeam/tests/xcm_mock/statemint_like.rs | 528 + .../2402/runtime/moonbeam/tests/xcm_tests.rs | 3055 ++++ tracing/2402/runtime/moonriver/Cargo.toml | 337 + tracing/2402/runtime/moonriver/build.rs | 25 + .../runtime/moonriver/src/asset_config.rs | 342 + .../moonriver/src/governance/councils.rs | 88 + .../moonriver/src/governance/democracy.rs | 77 + .../runtime/moonriver/src/governance/mod.rs | 30 + .../moonriver/src/governance/origins.rs | 82 + .../moonriver/src/governance/referenda.rs | 98 + .../moonriver/src/governance/tracks.rs | 179 + tracing/2402/runtime/moonriver/src/lib.rs | 1714 +++ .../2402/runtime/moonriver/src/precompiles.rs | 263 + .../2402/runtime/moonriver/src/xcm_config.rs | 700 + .../runtime/moonriver/tests/common/mod.rs | 412 + .../runtime/moonriver/tests/evm_tracing.rs | 94 + .../moonriver/tests/integration_test.rs | 3152 ++++ .../runtime/moonriver/tests/runtime_apis.rs | 396 + .../runtime/moonriver/tests/xcm_mock/mod.rs | 257 + .../moonriver/tests/xcm_mock/parachain.rs | 1186 ++ .../moonriver/tests/xcm_mock/relay_chain.rs | 349 + .../tests/xcm_mock/statemine_like.rs | 529 + .../2402/runtime/moonriver/tests/xcm_tests.rs | 3367 +++++ tracing/2402/rust-toolchain | 5 + ...nbase-runtime-2402-substitute-tracing.wasm | Bin 0 -> 1667577 bytes ...nbeam-runtime-2402-substitute-tracing.wasm | Bin 0 -> 1654682 bytes ...river-runtime-2402-substitute-tracing.wasm | Bin 0 -> 1660672 bytes 81 files changed, 55728 insertions(+) create mode 100644 srtool-digest/moonbase-runtime-2402-substitute-tracing.json create mode 100644 srtool-digest/moonbeam-runtime-2402-substitute-tracing.json create mode 100644 srtool-digest/moonriver-runtime-2402-substitute-tracing.json create mode 100644 tracing/2402/Cargo.lock create mode 100644 tracing/2402/Cargo.toml create mode 100644 tracing/2402/runtime/common/Cargo.toml create mode 100644 tracing/2402/runtime/common/src/apis.rs create mode 100644 tracing/2402/runtime/common/src/impl_moonbeam_xcm_call.rs create mode 100644 tracing/2402/runtime/common/src/impl_moonbeam_xcm_call_tracing.rs create mode 100644 tracing/2402/runtime/common/src/impl_on_charge_evm_transaction.rs create mode 100644 tracing/2402/runtime/common/src/impl_self_contained_call.rs create mode 100644 tracing/2402/runtime/common/src/impl_xcm_evm_runner.rs create mode 100644 tracing/2402/runtime/common/src/lib.rs create mode 100644 tracing/2402/runtime/common/src/migrations.rs create mode 100644 tracing/2402/runtime/moonbase/Cargo.toml create mode 100644 tracing/2402/runtime/moonbase/build.rs create mode 100644 tracing/2402/runtime/moonbase/src/asset_config.rs create mode 100644 tracing/2402/runtime/moonbase/src/governance/councils.rs create mode 100644 tracing/2402/runtime/moonbase/src/governance/democracy.rs create mode 100644 tracing/2402/runtime/moonbase/src/governance/mod.rs create mode 100644 tracing/2402/runtime/moonbase/src/governance/origins.rs create mode 100644 tracing/2402/runtime/moonbase/src/governance/referenda.rs create mode 100644 tracing/2402/runtime/moonbase/src/governance/tracks.rs create mode 100644 tracing/2402/runtime/moonbase/src/lib.rs create mode 100644 tracing/2402/runtime/moonbase/src/precompiles.rs create mode 100644 tracing/2402/runtime/moonbase/src/xcm_config.rs create mode 100644 tracing/2402/runtime/moonbase/tests/common/mod.rs create mode 100644 tracing/2402/runtime/moonbase/tests/evm_tracing.rs create mode 100644 tracing/2402/runtime/moonbase/tests/integration_test.rs create mode 100644 tracing/2402/runtime/moonbase/tests/runtime_apis.rs create mode 100644 tracing/2402/runtime/moonbase/tests/xcm_mock/mod.rs create mode 100644 tracing/2402/runtime/moonbase/tests/xcm_mock/parachain.rs create mode 100644 tracing/2402/runtime/moonbase/tests/xcm_mock/relay_chain.rs create mode 100644 tracing/2402/runtime/moonbase/tests/xcm_mock/statemint_like.rs create mode 100644 tracing/2402/runtime/moonbase/tests/xcm_tests.rs create mode 100644 tracing/2402/runtime/moonbeam/Cargo.toml create mode 100644 tracing/2402/runtime/moonbeam/build.rs create mode 100644 tracing/2402/runtime/moonbeam/src/asset_config.rs create mode 100644 tracing/2402/runtime/moonbeam/src/governance/councils.rs create mode 100644 tracing/2402/runtime/moonbeam/src/governance/democracy.rs create mode 100644 tracing/2402/runtime/moonbeam/src/governance/mod.rs create mode 100644 tracing/2402/runtime/moonbeam/src/governance/origins.rs create mode 100644 tracing/2402/runtime/moonbeam/src/governance/referenda.rs create mode 100644 tracing/2402/runtime/moonbeam/src/governance/tracks.rs create mode 100644 tracing/2402/runtime/moonbeam/src/lib.rs create mode 100644 tracing/2402/runtime/moonbeam/src/precompiles.rs create mode 100644 tracing/2402/runtime/moonbeam/src/xcm_config.rs create mode 100644 tracing/2402/runtime/moonbeam/tests/common/mod.rs create mode 100644 tracing/2402/runtime/moonbeam/tests/evm_tracing.rs create mode 100644 tracing/2402/runtime/moonbeam/tests/integration_test.rs create mode 100644 tracing/2402/runtime/moonbeam/tests/runtime_apis.rs create mode 100644 tracing/2402/runtime/moonbeam/tests/xcm_mock/mod.rs create mode 100644 tracing/2402/runtime/moonbeam/tests/xcm_mock/parachain.rs create mode 100644 tracing/2402/runtime/moonbeam/tests/xcm_mock/relay_chain.rs create mode 100644 tracing/2402/runtime/moonbeam/tests/xcm_mock/statemint_like.rs create mode 100644 tracing/2402/runtime/moonbeam/tests/xcm_tests.rs create mode 100644 tracing/2402/runtime/moonriver/Cargo.toml create mode 100644 tracing/2402/runtime/moonriver/build.rs create mode 100644 tracing/2402/runtime/moonriver/src/asset_config.rs create mode 100644 tracing/2402/runtime/moonriver/src/governance/councils.rs create mode 100644 tracing/2402/runtime/moonriver/src/governance/democracy.rs create mode 100644 tracing/2402/runtime/moonriver/src/governance/mod.rs create mode 100644 tracing/2402/runtime/moonriver/src/governance/origins.rs create mode 100644 tracing/2402/runtime/moonriver/src/governance/referenda.rs create mode 100644 tracing/2402/runtime/moonriver/src/governance/tracks.rs create mode 100644 tracing/2402/runtime/moonriver/src/lib.rs create mode 100644 tracing/2402/runtime/moonriver/src/precompiles.rs create mode 100644 tracing/2402/runtime/moonriver/src/xcm_config.rs create mode 100644 tracing/2402/runtime/moonriver/tests/common/mod.rs create mode 100644 tracing/2402/runtime/moonriver/tests/evm_tracing.rs create mode 100644 tracing/2402/runtime/moonriver/tests/integration_test.rs create mode 100644 tracing/2402/runtime/moonriver/tests/runtime_apis.rs create mode 100644 tracing/2402/runtime/moonriver/tests/xcm_mock/mod.rs create mode 100644 tracing/2402/runtime/moonriver/tests/xcm_mock/parachain.rs create mode 100644 tracing/2402/runtime/moonriver/tests/xcm_mock/relay_chain.rs create mode 100644 tracing/2402/runtime/moonriver/tests/xcm_mock/statemine_like.rs create mode 100644 tracing/2402/runtime/moonriver/tests/xcm_tests.rs create mode 100644 tracing/2402/rust-toolchain create mode 100644 wasm/moonbase-runtime-2402-substitute-tracing.wasm create mode 100644 wasm/moonbeam-runtime-2402-substitute-tracing.wasm create mode 100644 wasm/moonriver-runtime-2402-substitute-tracing.wasm diff --git a/srtool-digest/moonbase-runtime-2402-substitute-tracing.json b/srtool-digest/moonbase-runtime-2402-substitute-tracing.json new file mode 100644 index 0000000..fffe7ea --- /dev/null +++ b/srtool-digest/moonbase-runtime-2402-substitute-tracing.json @@ -0,0 +1 @@ +{"gen":"srtool v0.9.25","src":"zip","version":"0.8.4","commit":"","tag":"","branch":"","rustc":"rustc 1.66.1 (90743e729 2023-01-10)","pkg":"moonbase-runtime","tmsp":"2023-07-20T07:59:49Z","size":"1667577","prop":"0xc64999ace28427bae3a9b9bc187e5b18b6b13e6cce7f5301b98d4f716e94d48c","authorize_upgrade_prop":"0xa6539f408c5c3f4f7cbb18d3baa5df174c9e2e7eef01206fcf96b389d4579849","ipfs":"QmRZ3CEATzfcjsWWtdDxSgZZkHdHBwvYE3STVG5Y2QuvSt","sha256":"0xd2cfadc0ac2c7c4934a7c5458d60055edc7c66da2401ebb6bd5b65dd70b5f953","wasm":"runtime/moonbase/target/srtool/release/wbuild/moonbase-runtime/moonbase_runtime.compact.compressed.wasm","info":{"generator":{"name":"srtool","version":"0.9.25"},"src":"zip","version":"0.8.4","git":{"commit":"","tag":"","branch":""},"rustc":"rustc 1.66.1 (90743e729 2023-01-10)","pkg":"moonbase-runtime","profile":"release"},"context":{"package":"moonbase-runtime","runtime_dir":"runtime/moonbase","docker":{"image":"paritytech/srtool","tag":"1.66.1"},"profile":"release"},"runtimes":{"compact":{"tmsp":"2023-07-20T07:59:27Z","size":"7927749","prop":"0x8ea6413903d1f6fa6304c9dd301f6b77fbfb106518b257876694102df0619074","authorize_upgrade_prop":"0xe5ba2399cb6e506051b9ecd90291fc6e1e3dba5bad4bfb0ed395e0661375e2ef","blake2_256":"0x7a1006d925b23b0971a223316153ec4ff87102fcf2947d2b0ca10a9c4e3e9999","ipfs":"QmWvPurhcGQrbTMrVfpLSi5bQYQZkspjKYcu5bLdyiqHDr","sha256":"0x9d95938fc11422a560290a65a6d52bda3e1c06dc82f6cca9f15657e66ed2e86d","wasm":"runtime/moonbase/target/srtool/release/wbuild/moonbase-runtime/moonbase_runtime.compact.wasm","subwasm":{"size":7927749,"compression":{"size_compressed":7927749,"size_decompressed":7927749,"compressed":false},"reserved_meta":[109,101,116,97],"reserved_meta_valid":true,"metadata_version":14,"core_version":{"specName":"moonbase","implName":"moonbase","authoringVersion":4,"specVersion":2402,"implVersion":0,"apis":[["0xd2bc9897eed08f15",3],["0xdf6acb689907609b",4],["0x37e397fc7c91f5e4",1],["0x40fe3ad401f8959a",6],["0xf78b278be53f454c",2],["0xab3c0572291feb8b",1],["0xbc9d89904f5b923f",1],["0xbd78255d4feeea1f",4],["0xa33d43f58731ad84",2],["0x582211f65bb14b89",5],["0xe65b00e46cedd0aa",2],["0x37c8bb1350a9a2a8",3],["0x2aa62120049dd2d2",1],["0xea93e3f16f3d6962",2],["0xba8173bf23b2e6f8",1]],"transactionVersion":2},"proposal_hash":"0x8ea6413903d1f6fa6304c9dd301f6b77fbfb106518b257876694102df0619074","parachain_authorize_upgrade_hash":"0xe5ba2399cb6e506051b9ecd90291fc6e1e3dba5bad4bfb0ed395e0661375e2ef","ipfs_hash":"QmWvPurhcGQrbTMrVfpLSi5bQYQZkspjKYcu5bLdyiqHDr","blake2_256":"0x7a1006d925b23b0971a223316153ec4ff87102fcf2947d2b0ca10a9c4e3e9999"}},"compressed":{"tmsp":"2023-07-20T07:57:52Z","size":"1667577","prop":"0xc64999ace28427bae3a9b9bc187e5b18b6b13e6cce7f5301b98d4f716e94d48c","authorize_upgrade_prop":"0xa6539f408c5c3f4f7cbb18d3baa5df174c9e2e7eef01206fcf96b389d4579849","blake2_256":"0xb554aacf985a27bfaca925145bcb8f98f620ef1ef3c7c5c073c89dc3d0371c77","ipfs":"QmRZ3CEATzfcjsWWtdDxSgZZkHdHBwvYE3STVG5Y2QuvSt","sha256":"0xd2cfadc0ac2c7c4934a7c5458d60055edc7c66da2401ebb6bd5b65dd70b5f953","wasm":"runtime/moonbase/target/srtool/release/wbuild/moonbase-runtime/moonbase_runtime.compact.compressed.wasm","subwasm":{"size":1667577,"compression":{"size_compressed":1667577,"size_decompressed":7927749,"compressed":true},"reserved_meta":[109,101,116,97],"reserved_meta_valid":true,"metadata_version":14,"core_version":{"specName":"moonbase","implName":"moonbase","authoringVersion":4,"specVersion":2402,"implVersion":0,"apis":[["0xd2bc9897eed08f15",3],["0xdf6acb689907609b",4],["0x37e397fc7c91f5e4",1],["0x40fe3ad401f8959a",6],["0xf78b278be53f454c",2],["0xab3c0572291feb8b",1],["0xbc9d89904f5b923f",1],["0xbd78255d4feeea1f",4],["0xa33d43f58731ad84",2],["0x582211f65bb14b89",5],["0xe65b00e46cedd0aa",2],["0x37c8bb1350a9a2a8",3],["0x2aa62120049dd2d2",1],["0xea93e3f16f3d6962",2],["0xba8173bf23b2e6f8",1]],"transactionVersion":2},"proposal_hash":"0xc64999ace28427bae3a9b9bc187e5b18b6b13e6cce7f5301b98d4f716e94d48c","parachain_authorize_upgrade_hash":"0xa6539f408c5c3f4f7cbb18d3baa5df174c9e2e7eef01206fcf96b389d4579849","ipfs_hash":"QmRZ3CEATzfcjsWWtdDxSgZZkHdHBwvYE3STVG5Y2QuvSt","blake2_256":"0xb554aacf985a27bfaca925145bcb8f98f620ef1ef3c7c5c073c89dc3d0371c77"}}}} diff --git a/srtool-digest/moonbeam-runtime-2402-substitute-tracing.json b/srtool-digest/moonbeam-runtime-2402-substitute-tracing.json new file mode 100644 index 0000000..2795cd7 --- /dev/null +++ b/srtool-digest/moonbeam-runtime-2402-substitute-tracing.json @@ -0,0 +1 @@ +{"gen":"srtool v0.9.25","src":"zip","version":"0.8.4","commit":"","tag":"","branch":"","rustc":"rustc 1.66.1 (90743e729 2023-01-10)","pkg":"moonbeam-runtime","tmsp":"2023-07-20T08:13:49Z","size":"1654682","prop":"0xd58bed1d5558a2ce91ad6675ddc7dd365ed2090dd5a96fa3352776f5335b8d43","authorize_upgrade_prop":"0x9db417201ecb6e27aa5c9359aa19766cefa8c511b39dad371b15db8f4c0ec442","ipfs":"QmQV22sRb33BYuvR15NtgzYGb3G9fu4aXD3LKzPn6zKjrN","sha256":"0xd806b35e524f7f3d65eaf3db5d405947110f89eb2316f0312b5dfa28183ce0a0","wasm":"runtime/moonbeam/target/srtool/release/wbuild/moonbeam-runtime/moonbeam_runtime.compact.compressed.wasm","info":{"generator":{"name":"srtool","version":"0.9.25"},"src":"zip","version":"0.8.4","git":{"commit":"","tag":"","branch":""},"rustc":"rustc 1.66.1 (90743e729 2023-01-10)","pkg":"moonbeam-runtime","profile":"release"},"context":{"package":"moonbeam-runtime","runtime_dir":"runtime/moonbeam","docker":{"image":"paritytech/srtool","tag":"1.66.1"},"profile":"release"},"runtimes":{"compact":{"tmsp":"2023-07-20T08:13:28Z","size":"7846106","prop":"0xf1aa35694fa2da968a08665254d2257d56f647900242333a7405bd296e745202","authorize_upgrade_prop":"0x83d4c0791628770d6418002607bc7f8dbe4079351f5d0c0e08ec617ba85b5951","blake2_256":"0xd91433bd716205991f3441284b567789b3579dea1837fb3aca535bfd271f0ae7","ipfs":"Qmemkx6nAqV5EtQ3oXyj2USC4EzPke7u94PURu9E9eLjNP","sha256":"0x3a751dc4136fe3d85dbb3a7f9e7d7594740247ad085896da90d745ce746ddf56","wasm":"runtime/moonbeam/target/srtool/release/wbuild/moonbeam-runtime/moonbeam_runtime.compact.wasm","subwasm":{"size":7846106,"compression":{"size_compressed":7846106,"size_decompressed":7846106,"compressed":false},"reserved_meta":[109,101,116,97],"reserved_meta_valid":true,"metadata_version":14,"core_version":{"specName":"moonbeam","implName":"moonbeam","authoringVersion":3,"specVersion":2402,"implVersion":0,"apis":[["0xd2bc9897eed08f15",3],["0xdf6acb689907609b",4],["0x37e397fc7c91f5e4",1],["0x40fe3ad401f8959a",6],["0xf78b278be53f454c",2],["0xab3c0572291feb8b",1],["0xbc9d89904f5b923f",1],["0xbd78255d4feeea1f",4],["0xa33d43f58731ad84",2],["0x582211f65bb14b89",5],["0xe65b00e46cedd0aa",2],["0x37c8bb1350a9a2a8",3],["0x2aa62120049dd2d2",1],["0xea93e3f16f3d6962",2],["0xba8173bf23b2e6f8",1]],"transactionVersion":2},"proposal_hash":"0xf1aa35694fa2da968a08665254d2257d56f647900242333a7405bd296e745202","parachain_authorize_upgrade_hash":"0x83d4c0791628770d6418002607bc7f8dbe4079351f5d0c0e08ec617ba85b5951","ipfs_hash":"Qmemkx6nAqV5EtQ3oXyj2USC4EzPke7u94PURu9E9eLjNP","blake2_256":"0xd91433bd716205991f3441284b567789b3579dea1837fb3aca535bfd271f0ae7"}},"compressed":{"tmsp":"2023-07-20T08:11:53Z","size":"1654682","prop":"0xd58bed1d5558a2ce91ad6675ddc7dd365ed2090dd5a96fa3352776f5335b8d43","authorize_upgrade_prop":"0x9db417201ecb6e27aa5c9359aa19766cefa8c511b39dad371b15db8f4c0ec442","blake2_256":"0x538212bf6ab7e65d72235ee10c8b5feb334c11ccec02134f7b7b3c17b25b34a6","ipfs":"QmQV22sRb33BYuvR15NtgzYGb3G9fu4aXD3LKzPn6zKjrN","sha256":"0xd806b35e524f7f3d65eaf3db5d405947110f89eb2316f0312b5dfa28183ce0a0","wasm":"runtime/moonbeam/target/srtool/release/wbuild/moonbeam-runtime/moonbeam_runtime.compact.compressed.wasm","subwasm":{"size":1654682,"compression":{"size_compressed":1654682,"size_decompressed":7846106,"compressed":true},"reserved_meta":[109,101,116,97],"reserved_meta_valid":true,"metadata_version":14,"core_version":{"specName":"moonbeam","implName":"moonbeam","authoringVersion":3,"specVersion":2402,"implVersion":0,"apis":[["0xd2bc9897eed08f15",3],["0xdf6acb689907609b",4],["0x37e397fc7c91f5e4",1],["0x40fe3ad401f8959a",6],["0xf78b278be53f454c",2],["0xab3c0572291feb8b",1],["0xbc9d89904f5b923f",1],["0xbd78255d4feeea1f",4],["0xa33d43f58731ad84",2],["0x582211f65bb14b89",5],["0xe65b00e46cedd0aa",2],["0x37c8bb1350a9a2a8",3],["0x2aa62120049dd2d2",1],["0xea93e3f16f3d6962",2],["0xba8173bf23b2e6f8",1]],"transactionVersion":2},"proposal_hash":"0xd58bed1d5558a2ce91ad6675ddc7dd365ed2090dd5a96fa3352776f5335b8d43","parachain_authorize_upgrade_hash":"0x9db417201ecb6e27aa5c9359aa19766cefa8c511b39dad371b15db8f4c0ec442","ipfs_hash":"QmQV22sRb33BYuvR15NtgzYGb3G9fu4aXD3LKzPn6zKjrN","blake2_256":"0x538212bf6ab7e65d72235ee10c8b5feb334c11ccec02134f7b7b3c17b25b34a6"}}}} diff --git a/srtool-digest/moonriver-runtime-2402-substitute-tracing.json b/srtool-digest/moonriver-runtime-2402-substitute-tracing.json new file mode 100644 index 0000000..8dee91f --- /dev/null +++ b/srtool-digest/moonriver-runtime-2402-substitute-tracing.json @@ -0,0 +1 @@ +{"gen":"srtool v0.9.25","src":"zip","version":"0.8.4","commit":"","tag":"","branch":"","rustc":"rustc 1.66.1 (90743e729 2023-01-10)","pkg":"moonriver-runtime","tmsp":"2023-07-20T08:06:49Z","size":"1660672","prop":"0xb48ee0f99d28254361e774b29501e68a825dbe23b69ee97c889c3b434389d451","authorize_upgrade_prop":"0x16f21b583014912284550e8b34007c8e0bba31e6c36cd5c4ecb1f1b5eb53dfc1","ipfs":"QmarTjX1ePL9n6su9xmuHSgnGZtG2ueQnF6CpamdWAfcMc","sha256":"0x90d2cdc6988c7d6c96119f2e68022c1c5e3e5bd95f6051700afc725966a6f743","wasm":"runtime/moonriver/target/srtool/release/wbuild/moonriver-runtime/moonriver_runtime.compact.compressed.wasm","info":{"generator":{"name":"srtool","version":"0.9.25"},"src":"zip","version":"0.8.4","git":{"commit":"","tag":"","branch":""},"rustc":"rustc 1.66.1 (90743e729 2023-01-10)","pkg":"moonriver-runtime","profile":"release"},"context":{"package":"moonriver-runtime","runtime_dir":"runtime/moonriver","docker":{"image":"paritytech/srtool","tag":"1.66.1"},"profile":"release"},"runtimes":{"compact":{"tmsp":"2023-07-20T08:06:28Z","size":"7874336","prop":"0xfcc2e4fac6ec4607a73e25365700eef294b349f5339373508496f17bfb617d10","authorize_upgrade_prop":"0x54e7fbb0c116532f52606a08e6845d5429ddc3a2617514f0f177dbaead063324","blake2_256":"0x7a1b4781a1672bbae4a7a74f5951492adac971f4714960ad0c15de3c61b054fc","ipfs":"QmQprwWMn2xo2RZPyAUuTRAkxqkzayDpNbWATUtuKMshH2","sha256":"0xc44a672849df0aa92839625bc167346d0091b018a51a0025b56d7a7f9b3f5878","wasm":"runtime/moonriver/target/srtool/release/wbuild/moonriver-runtime/moonriver_runtime.compact.wasm","subwasm":{"size":7874336,"compression":{"size_compressed":7874336,"size_decompressed":7874336,"compressed":false},"reserved_meta":[109,101,116,97],"reserved_meta_valid":true,"metadata_version":14,"core_version":{"specName":"moonriver","implName":"moonriver","authoringVersion":3,"specVersion":2402,"implVersion":0,"apis":[["0xd2bc9897eed08f15",3],["0xdf6acb689907609b",4],["0x37e397fc7c91f5e4",1],["0x40fe3ad401f8959a",6],["0xf78b278be53f454c",2],["0xab3c0572291feb8b",1],["0xbc9d89904f5b923f",1],["0xbd78255d4feeea1f",4],["0xa33d43f58731ad84",2],["0x582211f65bb14b89",5],["0xe65b00e46cedd0aa",2],["0x37c8bb1350a9a2a8",3],["0x2aa62120049dd2d2",1],["0xea93e3f16f3d6962",2],["0xba8173bf23b2e6f8",1]],"transactionVersion":2},"proposal_hash":"0xfcc2e4fac6ec4607a73e25365700eef294b349f5339373508496f17bfb617d10","parachain_authorize_upgrade_hash":"0x54e7fbb0c116532f52606a08e6845d5429ddc3a2617514f0f177dbaead063324","ipfs_hash":"QmQprwWMn2xo2RZPyAUuTRAkxqkzayDpNbWATUtuKMshH2","blake2_256":"0x7a1b4781a1672bbae4a7a74f5951492adac971f4714960ad0c15de3c61b054fc"}},"compressed":{"tmsp":"2023-07-20T08:04:53Z","size":"1660672","prop":"0xb48ee0f99d28254361e774b29501e68a825dbe23b69ee97c889c3b434389d451","authorize_upgrade_prop":"0x16f21b583014912284550e8b34007c8e0bba31e6c36cd5c4ecb1f1b5eb53dfc1","blake2_256":"0x49a79c0bbbb1da2cbc2259089ab6dca6b1e76cc218c342053564688a7d5f9829","ipfs":"QmarTjX1ePL9n6su9xmuHSgnGZtG2ueQnF6CpamdWAfcMc","sha256":"0x90d2cdc6988c7d6c96119f2e68022c1c5e3e5bd95f6051700afc725966a6f743","wasm":"runtime/moonriver/target/srtool/release/wbuild/moonriver-runtime/moonriver_runtime.compact.compressed.wasm","subwasm":{"size":1660672,"compression":{"size_compressed":1660672,"size_decompressed":7874336,"compressed":true},"reserved_meta":[109,101,116,97],"reserved_meta_valid":true,"metadata_version":14,"core_version":{"specName":"moonriver","implName":"moonriver","authoringVersion":3,"specVersion":2402,"implVersion":0,"apis":[["0xd2bc9897eed08f15",3],["0xdf6acb689907609b",4],["0x37e397fc7c91f5e4",1],["0x40fe3ad401f8959a",6],["0xf78b278be53f454c",2],["0xab3c0572291feb8b",1],["0xbc9d89904f5b923f",1],["0xbd78255d4feeea1f",4],["0xa33d43f58731ad84",2],["0x582211f65bb14b89",5],["0xe65b00e46cedd0aa",2],["0x37c8bb1350a9a2a8",3],["0x2aa62120049dd2d2",1],["0xea93e3f16f3d6962",2],["0xba8173bf23b2e6f8",1]],"transactionVersion":2},"proposal_hash":"0xb48ee0f99d28254361e774b29501e68a825dbe23b69ee97c889c3b434389d451","parachain_authorize_upgrade_hash":"0x16f21b583014912284550e8b34007c8e0bba31e6c36cd5c4ecb1f1b5eb53dfc1","ipfs_hash":"QmarTjX1ePL9n6su9xmuHSgnGZtG2ueQnF6CpamdWAfcMc","blake2_256":"0x49a79c0bbbb1da2cbc2259089ab6dca6b1e76cc218c342053564688a7d5f9829"}}}} diff --git a/tracing/2402/Cargo.lock b/tracing/2402/Cargo.lock new file mode 100644 index 0000000..d345428 --- /dev/null +++ b/tracing/2402/Cargo.lock @@ -0,0 +1,12473 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "account" +version = "0.1.1" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "blake2-rfc", + "hex", + "impl-serde 0.3.2", + "libsecp256k1", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sha3", + "sp-core", + "sp-io", + "sp-runtime", + "sp-runtime-interface", + "sp-std", +] + +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli 0.26.2", +] + +[[package]] +name = "addr2line" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +dependencies = [ + "gimli 0.27.1", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aead" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" +dependencies = [ + "generic-array 0.14.6", +] + +[[package]] +name = "aead" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +dependencies = [ + "generic-array 0.14.6", + "rand_core 0.6.4", +] + +[[package]] +name = "aes" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" +dependencies = [ + "aes-soft", + "aesni", + "cipher 0.2.5", +] + +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if", + "cipher 0.3.0", + "cpufeatures", + "opaque-debug 0.3.0", +] + +[[package]] +name = "aes-gcm" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5278b5fabbb9bd46e24aa69b2fdea62c99088e0a950a9be40e3e0101298f88da" +dependencies = [ + "aead 0.3.2", + "aes 0.6.0", + "cipher 0.2.5", + "ctr 0.6.0", + "ghash 0.3.1", + "subtle", +] + +[[package]] +name = "aes-gcm" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" +dependencies = [ + "aead 0.4.3", + "aes 0.7.5", + "cipher 0.3.0", + "ctr 0.8.0", + "ghash 0.4.4", + "subtle", +] + +[[package]] +name = "aes-soft" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" +dependencies = [ + "cipher 0.2.5", + "opaque-debug 0.3.0", +] + +[[package]] +name = "aesni" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" +dependencies = [ + "cipher 0.2.5", + "opaque-debug 0.3.0", +] + +[[package]] +name = "affix" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e7ea84d3fa2009f355f8429a0b418a96849135a4188fadf384f59127d5d4bc" +dependencies = [ + "convert_case 0.5.0", +] + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom 0.2.8", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "getrandom 0.2.8", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" +dependencies = [ + "memchr", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anstream" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "342258dd14006105c2b75ab1bd7543a03bdf0cfc94383303ac212a04939dff6f" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-wincon", + "concolor-override", + "concolor-query", + "is-terminal", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23ea9e81bd02e310c216d080f6223c179012256e5151c41db88d12c88a1684d2" + +[[package]] +name = "anstyle-parse" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7d1bb534e9efed14f3e5f44e7dd1a4f709384023a4165199a4241e18dff0116" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-wincon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3127af6145b149f3287bb9a0d10ad9c5692dba8c53ad48285e5bec4063834fa" +dependencies = [ + "anstyle", + "windows-sys 0.45.0", +] + +[[package]] +name = "anyhow" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arc-swap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" + +[[package]] +name = "array-bytes" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a913633b0c922e6b745072795f50d90ebea78ba31a57e2ac8c2fc7b50950949" + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" +dependencies = [ + "nodrop", +] + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "asn1-rs" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ff05a702273012438132f449575dbc804e27b2f3cbe3069aa237d26c98fa33" +dependencies = [ + "asn1-rs-derive 0.1.0", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time 0.3.17", +] + +[[package]] +name = "asn1-rs" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf6690c370453db30743b373a60ba498fc0d6d83b11f4abfd87a84a075db5dd4" +dependencies = [ + "asn1-rs-derive 0.4.0", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time 0.3.17", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8b7511298d5b7784b40b092d9e9dcd3a627a5707e4b5e507931ab0d44eeebf" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "asn1_der" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22d1f4b888c298a027c99dc9048015fac177587de20fc30232a057dfbe24a21" + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "async-channel" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" +dependencies = [ + "concurrent-queue 2.1.0", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-io" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8121296a9f05be7f34aa4196b1747243b3b62e048bb7906f644f3fbfc490cf7" +dependencies = [ + "async-lock", + "autocfg", + "concurrent-queue 1.2.4", + "futures-lite", + "libc", + "log", + "parking", + "polling", + "slab", + "socket2", + "waker-fn", + "winapi", +] + +[[package]] +name = "async-lock" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8101efe8695a6c17e02911402145357e718ac92d3ff88ae8419e84b1707b685" +dependencies = [ + "event-listener", + "futures-lite", +] + +[[package]] +name = "async-trait" +version = "0.1.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.12", +] + +[[package]] +name = "asynchronous-codec" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06a0daa378f5fd10634e44b0a29b2a87b890657658e072a30d6f26e57ddee182" +dependencies = [ + "bytes", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite 0.2.9", +] + +[[package]] +name = "atomic-waker" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "auto_impl" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a8c1df849285fbacd587de7818cc7d13be6cd2cbcd47a04fb1801b0e2706e33" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +dependencies = [ + "addr2line 0.19.0", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.6.2", + "object 0.30.3", + "rustc-demangle", +] + +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + +[[package]] +name = "base58" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64ct" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b645a089122eccb6111b4f81cbc1a49f5900ac4666bb93ac027feaecf15607bf" + +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" +dependencies = [ + "serde", +] + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bindgen" +version = "0.60.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "062dddbc1ba4aca46de6338e2bf87771414c335f7b2f2036e8f3e9befebf88e6" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.5", +] + +[[package]] +name = "blake2-rfc" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" +dependencies = [ + "arrayvec 0.4.12", + "constant_time_eq 0.1.5", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" +dependencies = [ + "arrayref", + "arrayvec 0.7.2", + "constant_time_eq 0.2.5", +] + +[[package]] +name = "blake2s_simd" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db539cc2b5f6003621f1cd9ef92d7ded8ea5232c7de0f9faa2de251cd98730d4" +dependencies = [ + "arrayref", + "arrayvec 0.7.2", + "constant_time_eq 0.1.5", +] + +[[package]] +name = "blake3" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a08e53fc5a564bb15bfe6fae56bd71522205f1f91893f9c0116edad6496c183f" +dependencies = [ + "arrayref", + "arrayvec 0.7.2", + "cc", + "cfg-if", + "constant_time_eq 0.1.5", + "digest 0.10.5", +] + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding 0.1.5", + "byte-tools", + "byteorder", + "generic-array 0.12.4", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.6", +] + +[[package]] +name = "block-buffer" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +dependencies = [ + "generic-array 0.14.6", +] + +[[package]] +name = "block-modes" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" +dependencies = [ + "block-padding 0.2.1", + "cipher 0.2.5", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "bounded-collections" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a071c348a5ef6da1d3a87166b408170b46002382b1dda83992b5c2208cefb370" +dependencies = [ + "log", + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "bounded-vec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68534a48cbf63a4b1323c433cf21238c9ec23711e0df13b08c33e5c2082663ce" +dependencies = [ + "thiserror", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "bstr" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +dependencies = [ + "memchr", +] + +[[package]] +name = "build-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" +dependencies = [ + "semver 0.6.0", +] + +[[package]] +name = "bumpalo" +version = "3.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "cache-padded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" + +[[package]] +name = "camino" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ad0e1e3e88dd237a156ab9f571021b8a158caa0ae44b1968a241efb5144c1e" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08a1ec454bc3eead8719cb56e15dbbfecdbc14e4b3a3ae4936cc6e31f5fc0d07" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.14", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "case" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6c0e7b807d60291f42f33f58480c0bfafe28ed08286446f45e463728cf9c1c" + +[[package]] +name = "cc" +version = "1.0.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581f5dba903aac52ea3feb5ec4810848460ee833876f1f9b0fdeab1f19091574" +dependencies = [ + "jobserver", +] + +[[package]] +name = "ccm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aca1a8fbc20b50ac9673ff014abfb2b5f4085ee1a850d408f14a159c5853ac7" +dependencies = [ + "aead 0.3.2", + "cipher 0.2.5", + "subtle", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-expr" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aacacf4d96c24b2ad6eb8ee6df040e4f27b0d0b39a5710c30091baa830485db" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "chacha20" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6" +dependencies = [ + "cfg-if", + "cipher 0.3.0", + "cpufeatures", + "zeroize", +] + +[[package]] +name = "chacha20poly1305" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5" +dependencies = [ + "aead 0.4.3", + "chacha20", + "cipher 0.3.0", + "poly1305", + "zeroize", +] + +[[package]] +name = "chrono" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-integer", + "num-traits", + "time 0.1.44", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "cid" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ed9c8b2d17acb8110c46f1da5bf4a696d745e1474a16db0cd2b49cd0249bf2" +dependencies = [ + "core2", + "multibase", + "multihash", + "serde", + "unsigned-varint", +] + +[[package]] +name = "cipher" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" +dependencies = [ + "generic-array 0.14.6", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array 0.14.6", +] + +[[package]] +name = "clang-sys" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa2e27ae6ab525c3d369ded447057bca5438d86dc3a68f6faafb8269ba82ebf3" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046ae530c528f252094e4a77886ee1374437744b2bff1497aa898bbddbbb29b3" +dependencies = [ + "clap_builder", + "clap_derive", + "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "223163f58c9a40c3b0a43e1c4b50a9ce09f007ea2cb1ec258a687945b4b7929f" +dependencies = [ + "anstream", + "anstyle", + "bitflags", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.12", +] + +[[package]] +name = "clap_lex" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" + +[[package]] +name = "coarsetime" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "454038500439e141804c655b4cd1bc6a70bcb95cd2bc9463af5661b6956f0e46" +dependencies = [ + "libc", + "once_cell", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "concolor-override" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a855d4a1978dc52fb0536a04d384c2c0c1aa273597f08b77c8c4d3b2eec6037f" + +[[package]] +name = "concolor-query" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d11d52c3d7ca2e6d0040212be9e4dbbcd78b6447f535b6b561f449427944cf" +dependencies = [ + "windows-sys 0.45.0", +] + +[[package]] +name = "concurrent-queue" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4780a44ab5696ea9e28294517f1fffb421a83a25af521333c838635509db9c" +dependencies = [ + "cache-padded", +] + +[[package]] +name = "concurrent-queue" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cec318a675afcb6a1ea1d4340e2d377e56e47c266f28043ceccbf4412ddfdd3b" + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "constant_time_eq" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13418e745008f7349ec7e449155f419a61b92b58a99cc3616942b926825ec76b" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "convert_case" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb4a24b1aaf0fd0ce8b45161144d6f42cd91677fd5940fd431183eb023b3a2b8" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "cpp_demangle" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "cpufeatures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +dependencies = [ + "libc", +] + +[[package]] +name = "cpuid-bool" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" + +[[package]] +name = "cranelift-bforest" +version = "0.93.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7379abaacee0f14abf3204a7606118f0465785252169d186337bcb75030815a" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.93.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9489fa336927df749631f1008007ced2871068544f40a202ce6d93fbf2366a7b" +dependencies = [ + "arrayvec 0.7.2", + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "cranelift-isle", + "gimli 0.26.2", + "hashbrown 0.12.3", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.93.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05bbb67da91ec721ed57cef2f7c5ef7728e1cd9bde9ffd3ef8601022e73e3239" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.93.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418ecb2f36032f6665dc1a5e2060a143dbab41d83b784882e97710e890a7a16d" + +[[package]] +name = "cranelift-entity" +version = "0.93.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cf583f7b093f291005f9fb1323e2c37f6ee4c7909e39ce016b2e8360d461705" +dependencies = [ + "serde", +] + +[[package]] +name = "cranelift-frontend" +version = "0.93.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b66bf9e916f57fbbd0f7703ec6286f4624866bf45000111627c70d272c8dda1" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.93.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "649782a39ce99798dd6b4029e2bb318a2fbeaade1b4fa25330763c10c65bc358" + +[[package]] +name = "cranelift-native" +version = "0.93.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "937e021e089c51f9749d09e7ad1c4f255c2f8686cb8c3df63a34b3ec9921bc41" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + +[[package]] +name = "cranelift-wasm" +version = "0.93.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d850cf6775477747c9dfda9ae23355dd70512ffebc70cf82b85a5b111ae668b5" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "itertools", + "log", + "smallvec", + "wasmparser", + "wasmtime-types", +] + +[[package]] +name = "crc" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f916dfc5d356b0ed9dae65f1db9fc9770aa2851d2662b988ccf4fe3516e86348" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd42583b04998a5363558e5f9291ee5a5ff6b49944332103f251e7479a82aa7" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array 0.14.6", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array 0.14.6", + "typenum 1.15.0", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array 0.14.6", + "subtle", +] + +[[package]] +name = "crypto-mac" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff07008ec701e8028e2ceb8f83f0e4274ee62bd2dbdc4fefff2e9a91824081a" +dependencies = [ + "generic-array 0.14.6", + "subtle", +] + +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array 0.14.6", + "subtle", +] + +[[package]] +name = "ctr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f" +dependencies = [ + "cipher 0.2.5", +] + +[[package]] +name = "ctr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher 0.3.0", +] + +[[package]] +name = "cumulus-pallet-dmp-queue" +version = "0.1.0" +source = "git+https://github.com/purestake/cumulus?branch=moonbeam-polkadot-v0.9.40#0d8911b7557bad5788909fc71cadb916b041417b" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", +] + +[[package]] +name = "cumulus-pallet-parachain-system" +version = "0.1.0" +source = "git+https://github.com/purestake/cumulus?branch=moonbeam-polkadot-v0.9.40#0d8911b7557bad5788909fc71cadb916b041417b" +dependencies = [ + "bytes", + "cumulus-pallet-parachain-system-proc-macro", + "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "environmental", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "polkadot-parachain", + "scale-info", + "sp-core", + "sp-externalities", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", + "sp-version", + "xcm", +] + +[[package]] +name = "cumulus-pallet-parachain-system-proc-macro" +version = "0.1.0" +source = "git+https://github.com/purestake/cumulus?branch=moonbeam-polkadot-v0.9.40#0d8911b7557bad5788909fc71cadb916b041417b" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cumulus-pallet-xcm" +version = "0.1.0" +source = "git+https://github.com/purestake/cumulus?branch=moonbeam-polkadot-v0.9.40#0d8911b7557bad5788909fc71cadb916b041417b" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", +] + +[[package]] +name = "cumulus-pallet-xcmp-queue" +version = "0.1.0" +source = "git+https://github.com/purestake/cumulus?branch=moonbeam-polkadot-v0.9.40#0d8911b7557bad5788909fc71cadb916b041417b" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "polkadot-runtime-common", + "rand_chacha 0.3.1", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", + "xcm-executor", +] + +[[package]] +name = "cumulus-primitives-core" +version = "0.1.0" +source = "git+https://github.com/purestake/cumulus?branch=moonbeam-polkadot-v0.9.40#0d8911b7557bad5788909fc71cadb916b041417b" +dependencies = [ + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain", + "polkadot-primitives", + "sp-api", + "sp-runtime", + "sp-std", + "sp-trie", + "xcm", +] + +[[package]] +name = "cumulus-primitives-parachain-inherent" +version = "0.1.0" +source = "git+https://github.com/purestake/cumulus?branch=moonbeam-polkadot-v0.9.40#0d8911b7557bad5788909fc71cadb916b041417b" +dependencies = [ + "async-trait", + "cumulus-primitives-core", + "cumulus-relay-chain-interface", + "cumulus-test-relay-sproof-builder", + "parity-scale-codec", + "sc-client-api", + "scale-info", + "sp-api", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-storage", + "sp-trie", + "tracing", +] + +[[package]] +name = "cumulus-primitives-timestamp" +version = "0.1.0" +source = "git+https://github.com/purestake/cumulus?branch=moonbeam-polkadot-v0.9.40#0d8911b7557bad5788909fc71cadb916b041417b" +dependencies = [ + "cumulus-primitives-core", + "futures", + "parity-scale-codec", + "sp-inherents", + "sp-std", + "sp-timestamp", +] + +[[package]] +name = "cumulus-primitives-utility" +version = "0.1.0" +source = "git+https://github.com/purestake/cumulus?branch=moonbeam-polkadot-v0.9.40#0d8911b7557bad5788909fc71cadb916b041417b" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "log", + "parity-scale-codec", + "polkadot-runtime-common", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", + "xcm-builder", + "xcm-executor", +] + +[[package]] +name = "cumulus-relay-chain-interface" +version = "0.1.0" +source = "git+https://github.com/purestake/cumulus?branch=moonbeam-polkadot-v0.9.40#0d8911b7557bad5788909fc71cadb916b041417b" +dependencies = [ + "async-trait", + "cumulus-primitives-core", + "futures", + "jsonrpsee-core", + "parity-scale-codec", + "polkadot-overseer", + "sc-client-api", + "sp-api", + "sp-blockchain", + "sp-state-machine", + "thiserror", +] + +[[package]] +name = "cumulus-test-relay-sproof-builder" +version = "0.1.0" +source = "git+https://github.com/purestake/cumulus?branch=moonbeam-polkadot-v0.9.40#0d8911b7557bad5788909fc71cadb916b041417b" +dependencies = [ + "cumulus-primitives-core", + "parity-scale-codec", + "polkadot-primitives", + "sp-runtime", + "sp-state-machine", + "sp-std", +] + +[[package]] +name = "curve25519-dalek" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" +dependencies = [ + "byteorder", + "digest 0.8.1", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "4.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4033478fbf70d6acf2655ac70da91ee65852d69daf7a67bf7a2f518fb47aafcf" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "cxx" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b7d4e43b25d3c994662706a1d4fcfc32aaa6afd287502c111b237093bb23f3a" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84f8829ddc213e2c1368e51a2564c552b65a8cb6a28f31e576270ac81d5e5827" +dependencies = [ + "cc", + "codespan-reporting", + "once_cell", + "proc-macro2", + "quote", + "scratch", + "syn 1.0.109", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e72537424b474af1460806647c41d4b6d35d09ef7fe031c5c2fa5766047cc56a" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "309e4fb93eed90e1e14bea0da16b209f81813ba9fc7830c20ed151dd7bc0a4d7" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "darling" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0dd3cd20dc6b5a876612a6e5accfe7f3dd883db6d07acfbf14c128f61550dfa" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a784d2ccaf7c98501746bf0be29b2022ba41fd62a2e622af997a03e9f972859f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7618812407e9402654622dd402b0a89dff9ba93badd6540781526117b92aab7e" +dependencies = [ + "darling_core", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "data-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" + +[[package]] +name = "data-encoding-macro" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86927b7cd2fe88fa698b87404b287ab98d1a0063a34071d92e575b72d3029aca" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5bbed42daaa95e780b60a50546aa345b8413a1e46f9a40a12907d3598f038db" +dependencies = [ + "data-encoding", + "syn 1.0.109", +] + +[[package]] +name = "der" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe398ac75057914d7d07307bf67dc7f3f574a26783b4fc7805a20ffa9f506e82" +dependencies = [ + "asn1-rs 0.3.1", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "der-parser" +version = "8.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d4bc9b0db0a0df9ae64634ac5bdefb7afcb534e182275ca0beadbe486701c1" +dependencies = [ + "asn1-rs 0.5.1", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive-syn-parse" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79116f119dd1dba1abf1f3405f03b9b0e79a27a3883864bfebded8a3dc768cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_builder" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07adf7be193b71cc36b193d0f5fe60b918a3a9db4dad0449f57bcfd519704a3" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f91d4cfa921f1c05904dc3c57b4a32c38aed3340cce209f3a6fd1478babafc4" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_builder_macro" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f0314b72bed045f3a68671b3c86328386762c93f82d98c65c3cb5e5f573dd68" +dependencies = [ + "derive_builder_core", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case 0.4.0", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", +] + +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.6", +] + +[[package]] +name = "digest" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" +dependencies = [ + "block-buffer 0.10.3", + "crypto-common", + "subtle", +] + +[[package]] +name = "directories" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "displaydoc" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "downcast" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + +[[package]] +name = "dtoa" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8a6eee2d5d0d113f015688310da018bd1d864d86bd567c8fca9c266889e1bfa" + +[[package]] +name = "dyn-clonable" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +dependencies = [ + "dyn-clonable-impl", + "dyn-clone", +] + +[[package]] +name = "dyn-clonable-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dyn-clone" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" + +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der", + "elliptic-curve", + "rfc6979", + "signature", +] + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek 3.2.0", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek 3.2.0", + "hashbrown 0.12.3", + "hex", + "rand_core 0.6.4", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "either" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct", + "crypto-bigint", + "der", + "digest 0.10.5", + "ff", + "generic-array 0.14.6", + "group", + "hkdf", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "enum-as-inner" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "enumflags2" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e75d4cd21b95383444831539909fbb14b9dc3fdceb2a6f5d36577329a1f55ccb" +dependencies = [ + "enumflags2_derive", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f58dc3c5e468259f19f2d46304a6b28f1c3d034442e14b322d2b850e36f6d5ae" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "enumn" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "038b1afa59052df211f9efd58f8b1d84c242935ede1c3dbaed26b018a9e06ae2" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "env_logger" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c90bf5f19754d10198ccb95b70664fc925bd1fc090a0fd9a6ebc54acc8cd6272" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "environmental" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" + +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.45.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde 0.4.0", + "scale-info", + "tiny-keccak", +] + +[[package]] +name = "ethereum" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a89fb87a9e103f71b903b80b670200b54cc67a07578f070681f1fffb7396fb7" +dependencies = [ + "bytes", + "ethereum-types", + "hash-db 0.15.2", + "hash256-std-hasher", + "parity-scale-codec", + "rlp", + "scale-info", + "serde", + "sha3", + "triehash", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde 0.4.0", + "primitive-types", + "scale-info", + "uint", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "evm" +version = "0.39.0" +source = "git+https://github.com/purestake/evm?branch=tgm-record-external-cost#c3db4777854b8b5a7cc6f54b78de988c0c387b4f" +dependencies = [ + "auto_impl", + "environmental", + "ethereum", + "evm-core", + "evm-gasometer", + "evm-runtime", + "log", + "parity-scale-codec", + "primitive-types", + "rlp", + "scale-info", + "serde", + "sha3", +] + +[[package]] +name = "evm-core" +version = "0.39.0" +source = "git+https://github.com/purestake/evm?branch=tgm-record-external-cost#c3db4777854b8b5a7cc6f54b78de988c0c387b4f" +dependencies = [ + "parity-scale-codec", + "primitive-types", + "scale-info", + "serde", +] + +[[package]] +name = "evm-gasometer" +version = "0.39.0" +source = "git+https://github.com/purestake/evm?branch=tgm-record-external-cost#c3db4777854b8b5a7cc6f54b78de988c0c387b4f" +dependencies = [ + "environmental", + "evm-core", + "evm-runtime", + "primitive-types", +] + +[[package]] +name = "evm-runtime" +version = "0.39.0" +source = "git+https://github.com/purestake/evm?branch=tgm-record-external-cost#c3db4777854b8b5a7cc6f54b78de988c0c387b4f" +dependencies = [ + "auto_impl", + "environmental", + "evm-core", + "primitive-types", + "sha3", +] + +[[package]] +name = "evm-tracing-events" +version = "0.1.0" +dependencies = [ + "environmental", + "ethereum", + "ethereum-types", + "evm", + "evm-gasometer", + "evm-runtime", + "parity-scale-codec", + "sp-runtime-interface", +] + +[[package]] +name = "exit-future" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" +dependencies = [ + "futures", +] + +[[package]] +name = "expander" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a718c0675c555c5f976fff4ea9e2c150fa06cefa201cadef87cfbf9324075881" +dependencies = [ + "blake3", + "fs-err", + "proc-macro2", + "quote", +] + +[[package]] +name = "expander" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3774182a5df13c3d1690311ad32fbe913feef26baba609fa2dd5f72042bd2ab6" +dependencies = [ + "blake2", + "fs-err", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "expander" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f360349150728553f92e4c997a16af8915f418d3a0f21b440d34c5632f16ed84" +dependencies = [ + "blake2", + "fs-err", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "faster-hex" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51e2ce894d53b295cf97b05685aa077950ff3e8541af83217fc720a6437169f8" + +[[package]] +name = "fastrand" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +dependencies = [ + "instant", +] + +[[package]] +name = "fatality" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ad875162843b0d046276327afe0136e9ed3a23d5a754210fb6f1f33610d39ab" +dependencies = [ + "fatality-proc-macro", + "thiserror", +] + +[[package]] +name = "fatality-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5aa1e3ae159e592ad222dc90c5acbad632b527779ba88486abe92782ab268bd" +dependencies = [ + "expander 0.0.4", + "indexmap", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", + "thiserror", +] + +[[package]] +name = "fdlimit" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4c9e43643f5a3be4ca5b67d26b98031ff9db6806c3440ae32e02e3ceac3f1b" +dependencies = [ + "libc", +] + +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "file-per-thread-logger" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e16290574b39ee41c71aeb90ae960c504ebaf1e2a1c87bd52aa56ed6e1a02f" +dependencies = [ + "env_logger", + "log", +] + +[[package]] +name = "filetime" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9663d381d07ae25dc88dbdf27df458faa83a9b25336bcac83d5e452b5fc9d3" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "windows-sys 0.42.0", +] + +[[package]] +name = "finality-grandpa" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e24e6c429951433ccb7c87fd528c60084834dcd14763182c1f83291bcde24c34" +dependencies = [ + "either", + "futures", + "futures-timer", + "log", + "num-traits", + "parity-scale-codec", + "parking_lot 0.12.1", + "scale-info", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" +dependencies = [ + "crc32fast", + "libz-sys", + "miniz_oxide 0.5.4", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fork-tree" +version = "3.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fp-account" +version = "1.0.0-dev" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "hex", + "impl-serde 0.4.0", + "libsecp256k1", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "fp-consensus" +version = "2.0.0-dev" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "ethereum", + "parity-scale-codec", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "fp-ethereum" +version = "1.0.0-dev" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "ethereum", + "ethereum-types", + "fp-evm", + "frame-support", + "num_enum", + "parity-scale-codec", + "sp-std", +] + +[[package]] +name = "fp-evm" +version = "3.0.0-dev" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "evm", + "frame-support", + "parity-scale-codec", + "serde", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "fp-rpc" +version = "3.0.0-dev" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "ethereum", + "ethereum-types", + "fp-evm", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-core", + "sp-runtime", + "sp-state-machine", + "sp-std", +] + +[[package]] +name = "fp-self-contained" +version = "1.0.0-dev" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "frame-support", + "parity-scale-codec", + "scale-info", + "serde", + "sp-runtime", +] + +[[package]] +name = "fp-storage" +version = "2.0.0" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "parity-scale-codec", + "serde", +] + +[[package]] +name = "fragile" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" + +[[package]] +name = "frame-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-support", + "frame-support-procedural", + "frame-system", + "linregress", + "log", + "parity-scale-codec", + "paste", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-runtime", + "sp-runtime-interface", + "sp-std", + "sp-storage", + "static_assertions", +] + +[[package]] +name = "frame-election-provider-solution-type" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "frame-election-provider-support" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-election-provider-solution-type", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-npos-elections", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "frame-executive" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-support", + "frame-system", + "frame-try-runtime", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-tracing", +] + +[[package]] +name = "frame-metadata" +version = "15.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df6bb8542ef006ef0de09a5c4420787d79823c0ed7924225822362fd2bf2ff2d" +dependencies = [ + "cfg-if", + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "frame-support" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "bitflags", + "environmental", + "frame-metadata", + "frame-support-procedural", + "impl-trait-for-tuples", + "k256", + "log", + "once_cell", + "parity-scale-codec", + "paste", + "scale-info", + "serde", + "smallvec", + "sp-api", + "sp-arithmetic", + "sp-core", + "sp-core-hashing-proc-macro", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-state-machine", + "sp-std", + "sp-tracing", + "sp-weights", + "tt-call", +] + +[[package]] +name = "frame-support-procedural" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "Inflector", + "cfg-expr", + "derive-syn-parse", + "frame-support-procedural-tools", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "frame-support-procedural-tools" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-support-procedural-tools-derive", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "frame-support-procedural-tools-derive" +version = "3.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "frame-system" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-support", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-version", + "sp-weights", +] + +[[package]] +name = "frame-system-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "frame-system-rpc-runtime-api" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "parity-scale-codec", + "sp-api", +] + +[[package]] +name = "frame-try-runtime" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-support", + "parity-scale-codec", + "sp-api", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "fs-err" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0845fa252299212f0389d64ba26f34fa32cfe41588355f21ed507c59a0f64541" + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "fs4" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea55201cc351fdb478217c0fb641b59813da9b4efe4c414a9d8f989a657d149" +dependencies = [ + "libc", + "rustix 0.35.13", + "winapi", +] + +[[package]] +name = "fs_extra" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-lite" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite 0.2.9", + "waker-fn", +] + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.12", +] + +[[package]] +name = "futures-rustls" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2411eed028cdf8c8034eaf21f9915f956b6c3abec4d4c7949ee67f0721127bd" +dependencies = [ + "futures-io", + "rustls 0.20.7", + "webpki 0.22.0", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-timer" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite 0.2.9", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum 1.15.0", +] + +[[package]] +name = "generic-array" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +dependencies = [ + "typenum 1.15.0", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "ghash" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97304e4cd182c3846f7575ced3890c53012ce534ad9114046b0a9e00bb30a375" +dependencies = [ + "opaque-debug 0.3.0", + "polyval 0.4.5", +] + +[[package]] +name = "ghash" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" +dependencies = [ + "opaque-debug 0.3.0", + "polyval 0.5.3", +] + +[[package]] +name = "gimli" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + +[[package]] +name = "gimli" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "221996f774192f0f718773def8201c4ae31f02616a54ccfc2d358bb0e5cefdec" + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "globset" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a" +dependencies = [ + "aho-corasick", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hash-db" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" + +[[package]] +name = "hash-db" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e7d7786361d7425ae2fe4f9e407eb0efaa0840f5212d109cc018c40c35c6ab4" + +[[package]] +name = "hash256-std-hasher" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" +dependencies = [ + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.6", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.3", +] + +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hex-literal" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" + +[[package]] +name = "hkdf" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +dependencies = [ + "hmac 0.12.1", +] + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac 0.8.0", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +dependencies = [ + "crypto-mac 0.10.1", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac 0.11.1", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.5", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array 0.14.6", + "hmac 0.8.1", +] + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", +] + +[[package]] +name = "http" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite 0.2.9", +] + +[[package]] +name = "http-range-header" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abfba89e19b959ca163c7752ba59d737c1ceea53a5d31a149c805446fc958064" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite 0.2.9", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac" +dependencies = [ + "http", + "hyper", + "log", + "rustls 0.20.7", + "rustls-native-certs", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +dependencies = [ + "cxx", + "cxx-build", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "if-addrs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc0fa01ffc752e9dbc72818cdb072cd028b86be5e09dd04c5a643704fe101a9" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "if-watch" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba7abdbb86e485125dad06c2691e1e393bf3b08c7b743b43aa162a00fd39062e" +dependencies = [ + "async-io", + "core-foundation", + "fnv", + "futures", + "if-addrs", + "ipnet", + "log", + "rtnetlink", + "system-configuration", + "tokio", + "windows", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4551f042f3438e64dbd6226b20527fc84a6e1fe65688b58746a2f53623f25f5c" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "indexmap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "integer-encoding" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" + +[[package]] +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +dependencies = [ + "num-traits", +] + +[[package]] +name = "interceptor" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8a11ae2da61704edada656798b61c94b35ecac2c58eb955156987d5e6be90b" +dependencies = [ + "async-trait", + "bytes", + "log", + "rand 0.8.5", + "rtcp", + "rtp", + "thiserror", + "tokio", + "waitgroup", + "webrtc-srtp", + "webrtc-util", +] + +[[package]] +name = "io-lifetimes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ce5ef949d49ee85593fc4d3f3f95ad61657076395cbbce23e2121fc5542074" + +[[package]] +name = "io-lifetimes" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e" +dependencies = [ + "libc", + "windows-sys 0.42.0", +] + +[[package]] +name = "ip_network" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2f047c0a98b2f299aa5d6d7088443570faae494e9ae1305e48be000c9e0eb1" + +[[package]] +name = "ipconfig" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "723519edce41262b05d4143ceb95050e4c614f483e78e9fd9e39a8275a84ad98" +dependencies = [ + "socket2", + "widestring", + "winapi", + "winreg", +] + +[[package]] +name = "ipnet" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" + +[[package]] +name = "is-terminal" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "256017f749ab3117e93acb91063009e1f1bb56d03965b14c2c8df4eb02c524d8" +dependencies = [ + "hermit-abi 0.3.1", + "io-lifetimes 1.0.4", + "rustix 0.37.6", + "windows-sys 0.45.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" + +[[package]] +name = "jobserver" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonrpsee" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d291e3a5818a2384645fd9756362e6d89cf0541b0b916fa7702ea4a9833608e" +dependencies = [ + "jsonrpsee-core", + "jsonrpsee-proc-macros", + "jsonrpsee-server", + "jsonrpsee-types", + "tracing", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e70b4439a751a5de7dd5ed55eacff78ebf4ffe0fc009cb1ebb11417f5b536b" +dependencies = [ + "anyhow", + "arrayvec 0.7.2", + "async-trait", + "beef", + "futures-channel", + "futures-util", + "globset", + "hyper", + "jsonrpsee-types", + "parking_lot 0.12.1", + "rand 0.8.5", + "rustc-hash", + "serde", + "serde_json", + "soketto", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "jsonrpsee-proc-macros" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa6da1e4199c10d7b1d0a6e5e8bd8e55f351163b6f4b3cbb044672a69bd4c1c" +dependencies = [ + "heck", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "jsonrpsee-server" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fb69dad85df79527c019659a992498d03f8495390496da2f07e6c24c2b356fc" +dependencies = [ + "futures-channel", + "futures-util", + "http", + "hyper", + "jsonrpsee-core", + "jsonrpsee-types", + "serde", + "serde_json", + "soketto", + "tokio", + "tokio-stream", + "tokio-util", + "tower", + "tracing", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bd522fe1ce3702fd94812965d7bb7a3364b1c9aba743944c5a00529aae80f8c" +dependencies = [ + "anyhow", + "beef", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "k256" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "sha2 0.10.6", +] + +[[package]] +name = "keccak" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" + +[[package]] +name = "kvdb" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7d770dcb02bf6835887c3a979b5107a04ff4bbde97a5f0928d27404a155add9" +dependencies = [ + "smallvec", +] + +[[package]] +name = "kvdb-memorydb" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf7a85fe66f9ff9cd74e169fdd2c94c6e1e74c412c99a73b4df3200b5d3760b2" +dependencies = [ + "kvdb", + "parking_lot 0.12.1", +] + +[[package]] +name = "kvdb-rocksdb" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2182b8219fee6bd83aacaab7344e840179ae079d5216aa4e249b4d704646a844" +dependencies = [ + "kvdb", + "num_cpus", + "parking_lot 0.12.1", + "regex", + "rocksdb", + "smallvec", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin", +] + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" + +[[package]] +name = "libloading" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libm" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "292a948cd991e376cf75541fe5b97a1081d713c618b4f1b9500f8844e49eb565" + +[[package]] +name = "libp2p" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e0a0d2f693675f49ded13c5d510c48b78069e23cbd9108d7ccd59f6dc568819" +dependencies = [ + "bytes", + "futures", + "futures-timer", + "getrandom 0.2.8", + "instant", + "libp2p-core", + "libp2p-dns", + "libp2p-identify", + "libp2p-kad", + "libp2p-mdns", + "libp2p-metrics", + "libp2p-mplex", + "libp2p-noise", + "libp2p-ping", + "libp2p-quic", + "libp2p-request-response", + "libp2p-swarm", + "libp2p-tcp", + "libp2p-wasm-ext", + "libp2p-webrtc", + "libp2p-websocket", + "libp2p-yamux", + "multiaddr", + "parking_lot 0.12.1", + "pin-project", + "smallvec", +] + +[[package]] +name = "libp2p-core" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6a8fcd392ff67af6cc3f03b1426c41f7f26b6b9aff2dc632c1c56dd649e571f" +dependencies = [ + "asn1_der", + "bs58", + "ed25519-dalek", + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "log", + "multiaddr", + "multihash", + "multistream-select", + "once_cell", + "parking_lot 0.12.1", + "pin-project", + "prost", + "prost-build", + "rand 0.8.5", + "rw-stream-sink", + "sec1", + "sha2 0.10.6", + "smallvec", + "thiserror", + "unsigned-varint", + "void", + "zeroize", +] + +[[package]] +name = "libp2p-dns" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e42a271c1b49f789b92f7fc87749fa79ce5c7bdc88cbdfacb818a4bca47fec5" +dependencies = [ + "futures", + "libp2p-core", + "log", + "parking_lot 0.12.1", + "smallvec", + "trust-dns-resolver", +] + +[[package]] +name = "libp2p-identify" +version = "0.41.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c052d0026f4817b44869bfb6810f4e1112f43aec8553f2cb38881c524b563abf" +dependencies = [ + "asynchronous-codec", + "futures", + "futures-timer", + "libp2p-core", + "libp2p-swarm", + "log", + "lru 0.8.1", + "prost", + "prost-build", + "prost-codec", + "smallvec", + "thiserror", + "void", +] + +[[package]] +name = "libp2p-kad" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2766dcd2be8c87d5e1f35487deb22d765f49c6ae1251b3633efe3b25698bd3d2" +dependencies = [ + "arrayvec 0.7.2", + "asynchronous-codec", + "bytes", + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-swarm", + "log", + "prost", + "prost-build", + "rand 0.8.5", + "sha2 0.10.6", + "smallvec", + "thiserror", + "uint", + "unsigned-varint", + "void", +] + +[[package]] +name = "libp2p-mdns" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f378264aade9872d6ccd315c0accc18be3a35d15fc1b9c36e5b6f983b62b5b" +dependencies = [ + "data-encoding", + "futures", + "if-watch", + "libp2p-core", + "libp2p-swarm", + "log", + "rand 0.8.5", + "smallvec", + "socket2", + "tokio", + "trust-dns-proto", + "void", +] + +[[package]] +name = "libp2p-metrics" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ad8a64f29da86005c86a4d2728b8a0719e9b192f4092b609fd8790acb9dec55" +dependencies = [ + "libp2p-core", + "libp2p-identify", + "libp2p-kad", + "libp2p-ping", + "libp2p-swarm", + "prometheus-client", +] + +[[package]] +name = "libp2p-mplex" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03805b44107aa013e7cbbfa5627b31c36cbedfdfb00603c0311998882bc4bace" +dependencies = [ + "asynchronous-codec", + "bytes", + "futures", + "libp2p-core", + "log", + "nohash-hasher", + "parking_lot 0.12.1", + "rand 0.8.5", + "smallvec", + "unsigned-varint", +] + +[[package]] +name = "libp2p-noise" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a978cb57efe82e892ec6f348a536bfbd9fee677adbe5689d7a93ad3a9bffbf2e" +dependencies = [ + "bytes", + "curve25519-dalek 3.2.0", + "futures", + "libp2p-core", + "log", + "once_cell", + "prost", + "prost-build", + "rand 0.8.5", + "sha2 0.10.6", + "snow", + "static_assertions", + "thiserror", + "x25519-dalek 1.1.1", + "zeroize", +] + +[[package]] +name = "libp2p-ping" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "929fcace45a112536e22b3dcfd4db538723ef9c3cb79f672b98be2cc8e25f37f" +dependencies = [ + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-swarm", + "log", + "rand 0.8.5", + "void", +] + +[[package]] +name = "libp2p-quic" +version = "0.7.0-alpha" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01e7c867e95c8130667b24409d236d37598270e6da69b3baf54213ba31ffca59" +dependencies = [ + "bytes", + "futures", + "futures-timer", + "if-watch", + "libp2p-core", + "libp2p-tls", + "log", + "parking_lot 0.12.1", + "quinn-proto", + "rand 0.8.5", + "rustls 0.20.7", + "thiserror", + "tokio", +] + +[[package]] +name = "libp2p-request-response" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3236168796727bfcf4927f766393415361e2c644b08bedb6a6b13d957c9a4884" +dependencies = [ + "async-trait", + "bytes", + "futures", + "instant", + "libp2p-core", + "libp2p-swarm", + "log", + "rand 0.8.5", + "smallvec", + "unsigned-varint", +] + +[[package]] +name = "libp2p-swarm" +version = "0.41.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a35472fe3276b3855c00f1c032ea8413615e030256429ad5349cdf67c6e1a0" +dependencies = [ + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-swarm-derive", + "log", + "pin-project", + "rand 0.8.5", + "smallvec", + "thiserror", + "tokio", + "void", +] + +[[package]] +name = "libp2p-swarm-derive" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d527d5827582abd44a6d80c07ff8b50b4ee238a8979e05998474179e79dc400" +dependencies = [ + "heck", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "libp2p-tcp" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b257baf6df8f2df39678b86c578961d48cc8b68642a12f0f763f56c8e5858d" +dependencies = [ + "futures", + "futures-timer", + "if-watch", + "libc", + "libp2p-core", + "log", + "socket2", + "tokio", +] + +[[package]] +name = "libp2p-tls" +version = "0.1.0-alpha" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7905ce0d040576634e8a3229a7587cc8beab83f79db6023800f1792895defa8" +dependencies = [ + "futures", + "futures-rustls", + "libp2p-core", + "rcgen 0.10.0", + "ring", + "rustls 0.20.7", + "thiserror", + "webpki 0.22.0", + "x509-parser 0.14.0", + "yasna", +] + +[[package]] +name = "libp2p-wasm-ext" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bb1a35299860e0d4b3c02a3e74e3b293ad35ae0cee8a056363b0c862d082069" +dependencies = [ + "futures", + "js-sys", + "libp2p-core", + "parity-send-wrapper", + "wasm-bindgen", + "wasm-bindgen-futures", +] + +[[package]] +name = "libp2p-webrtc" +version = "0.4.0-alpha" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb6cd86dd68cba72308ea05de1cebf3ba0ae6e187c40548167955d4e3970f6a" +dependencies = [ + "async-trait", + "asynchronous-codec", + "bytes", + "futures", + "futures-timer", + "hex", + "if-watch", + "libp2p-core", + "libp2p-noise", + "log", + "multihash", + "prost", + "prost-build", + "prost-codec", + "rand 0.8.5", + "rcgen 0.9.3", + "serde", + "stun", + "thiserror", + "tinytemplate", + "tokio", + "tokio-util", + "webrtc", +] + +[[package]] +name = "libp2p-websocket" +version = "0.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d705506030d5c0aaf2882437c70dab437605f21c5f9811978f694e6917a3b54" +dependencies = [ + "either", + "futures", + "futures-rustls", + "libp2p-core", + "log", + "parking_lot 0.12.1", + "quicksink", + "rw-stream-sink", + "soketto", + "url", + "webpki-roots", +] + +[[package]] +name = "libp2p-yamux" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f63594a0aa818642d9d4915c791945053877253f08a3626f13416b5cd928a29" +dependencies = [ + "futures", + "libp2p-core", + "log", + "parking_lot 0.12.1", + "thiserror", + "yamux", +] + +[[package]] +name = "librocksdb-sys" +version = "0.8.0+7.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "611804e4666a25136fcc5f8cf425ab4d26c7f74ea245ffe92ea23b85b6420b5d" +dependencies = [ + "bindgen", + "bzip2-sys", + "cc", + "glob", + "libc", + "libz-sys", + "tikv-jemalloc-sys", +] + +[[package]] +name = "libsecp256k1" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" +dependencies = [ + "arrayref", + "base64", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.8.5", + "serde", + "sha2 0.9.9", + "typenum 1.15.0", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libz-sys" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" +dependencies = [ + "cc", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linked_hash_set" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47186c6da4d81ca383c7c47c1bfc80f4b95f4720514d860a5407aaf4233f9588" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "linregress" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "475015a7f8f017edb28d2e69813be23500ad4b32cfe3421c4148efc97324ee52" +dependencies = [ + "nalgebra", +] + +[[package]] +name = "linux-raw-sys" +version = "0.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d" + +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + +[[package]] +name = "linux-raw-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "lru" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" +dependencies = [ + "hashbrown 0.12.3", +] + +[[package]] +name = "lru" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e7d46de488603ffdd5f30afbc64fbba2378214a2c3a2fb83abf3d33126df17" +dependencies = [ + "hashbrown 0.13.2", +] + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "lz4" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" +dependencies = [ + "libc", + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "matrixmultiply" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add85d4dd35074e6fedc608f8c8f513a3548619a9024b751949ef0e8e45a4d84" +dependencies = [ + "rawpointer", +] + +[[package]] +name = "md-5" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" +dependencies = [ + "digest 0.10.5", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memfd" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc89ccdc6e10d6907450f753537ebc5c5d3460d2e4e62ea74bd571db62c0f9e" +dependencies = [ + "rustix 0.37.6", +] + +[[package]] +name = "memmap2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95af15f345b17af2efc8ead6080fb8bc376f8cec1b35277b935637595fe77498" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memory-db" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808b50db46293432a45e63bc15ea51e0ab4c0a1647b8eb114e31a3e698dd6fbe" +dependencies = [ + "hash-db 0.16.0", +] + +[[package]] +name = "memory_units" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" + +[[package]] +name = "merlin" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.5.1", + "zeroize", +] + +[[package]] +name = "mick-jaeger" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69672161530e8aeca1d1400fbf3f1a1747ff60ea604265a4e906c2442df20532" +dependencies = [ + "futures", + "rand 0.8.5", + "thrift", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" +dependencies = [ + "adler", +] + +[[package]] +name = "miniz_oxide" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.42.0", +] + +[[package]] +name = "mockall" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e4a1c770583dac7ab5e2f6c139153b783a53a1bbee9729613f193e59828326" +dependencies = [ + "cfg-if", + "downcast", + "fragile", + "lazy_static", + "mockall_derive", + "predicates", + "predicates-tree", +] + +[[package]] +name = "mockall_derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "832663583d5fa284ca8810bf7015e46c9fff9622d3cf34bd1eea5003fec06dd0" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "moonbase-runtime" +version = "0.8.4" +dependencies = [ + "account", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-timestamp", + "cumulus-primitives-utility", + "evm-tracing-events", + "fp-evm", + "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", + "moonbeam-core-primitives", + "moonbeam-evm-tracer", + "moonbeam-relay-encoder", + "moonbeam-rpc-primitives-debug", + "moonbeam-rpc-primitives-txpool", + "moonbeam-runtime-common", + "moonbeam-xcm-benchmarks", + "nimbus-primitives", + "num_enum", + "orml-traits", + "orml-xcm-support", + "orml-xtokens", + "pallet-asset-manager", + "pallet-assets", + "pallet-author-inherent", + "pallet-author-mapping", + "pallet-author-slot-filter", + "pallet-balances", + "pallet-base-fee", + "pallet-collective", + "pallet-conviction-voting", + "pallet-crowdloan-rewards", + "pallet-democracy", + "pallet-erc20-xcm-bridge", + "pallet-ethereum", + "pallet-ethereum-chain-id", + "pallet-ethereum-xcm", + "pallet-evm", + "pallet-evm-precompile-author-mapping", + "pallet-evm-precompile-balances-erc20", + "pallet-evm-precompile-batch", + "pallet-evm-precompile-blake2", + "pallet-evm-precompile-bn128", + "pallet-evm-precompile-call-permit", + "pallet-evm-precompile-collective", + "pallet-evm-precompile-conviction-voting", + "pallet-evm-precompile-crowdloan-rewards", + "pallet-evm-precompile-democracy", + "pallet-evm-precompile-dispatch", + "pallet-evm-precompile-gmp", + "pallet-evm-precompile-modexp", + "pallet-evm-precompile-parachain-staking", + "pallet-evm-precompile-preimage", + "pallet-evm-precompile-proxy", + "pallet-evm-precompile-randomness", + "pallet-evm-precompile-referenda", + "pallet-evm-precompile-registry", + "pallet-evm-precompile-relay-encoder", + "pallet-evm-precompile-sha3fips", + "pallet-evm-precompile-simple", + "pallet-evm-precompile-xcm-transactor", + "pallet-evm-precompile-xcm-utils", + "pallet-evm-precompile-xtokens", + "pallet-evm-precompileset-assets-erc20", + "pallet-identity", + "pallet-maintenance-mode", + "pallet-migrations", + "pallet-moonbeam-orbiters", + "pallet-multisig", + "pallet-parachain-staking", + "pallet-preimage", + "pallet-proxy", + "pallet-proxy-genesis-companion", + "pallet-randomness", + "pallet-referenda", + "pallet-root-testing", + "pallet-scheduler", + "pallet-society", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-treasury", + "pallet-utility", + "pallet-whitelist", + "pallet-xcm", + "pallet-xcm-benchmarks", + "pallet-xcm-transactor", + "parachain-info", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain", + "precompile-utils", + "rlp", + "scale-info", + "serde", + "session-keys-primitives", + "sha3", + "smallvec", + "sp-api", + "sp-block-builder", + "sp-core", + "sp-debug-derive", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-version", + "strum", + "strum_macros", + "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", + "xcm-primitives", +] + +[[package]] +name = "moonbeam-core-primitives" +version = "0.1.1" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "account", + "fp-self-contained", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "moonbeam-evm-tracer" +version = "0.1.0" +dependencies = [ + "ethereum-types", + "evm", + "evm-gasometer", + "evm-runtime", + "evm-tracing-events", + "fp-evm", + "moonbeam-primitives-ext", + "pallet-evm", + "parity-scale-codec", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "moonbeam-primitives-ext" +version = "0.1.0" +dependencies = [ + "ethereum-types", + "evm-tracing-events", + "parity-scale-codec", + "sp-externalities", + "sp-runtime-interface", + "sp-std", +] + +[[package]] +name = "moonbeam-relay-encoder" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "cumulus-primitives-core", + "frame-system", + "pallet-evm-precompile-relay-encoder", + "pallet-staking", + "parity-scale-codec", + "sp-runtime", + "sp-std", + "xcm", + "xcm-primitives", +] + +[[package]] +name = "moonbeam-rpc-primitives-debug" +version = "0.1.0" +dependencies = [ + "environmental", + "ethereum", + "ethereum-types", + "hex", + "parity-scale-codec", + "serde", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "moonbeam-rpc-primitives-txpool" +version = "0.6.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "ethereum", + "parity-scale-codec", + "sp-api", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "moonbeam-runtime" +version = "0.8.4" +dependencies = [ + "account", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-timestamp", + "cumulus-primitives-utility", + "evm-tracing-events", + "fp-evm", + "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", + "moonbeam-core-primitives", + "moonbeam-evm-tracer", + "moonbeam-relay-encoder", + "moonbeam-rpc-primitives-debug", + "moonbeam-rpc-primitives-txpool", + "moonbeam-runtime-common", + "moonbeam-xcm-benchmarks", + "nimbus-primitives", + "num_enum", + "orml-traits", + "orml-xcm-support", + "orml-xtokens", + "pallet-asset-manager", + "pallet-assets", + "pallet-author-inherent", + "pallet-author-mapping", + "pallet-author-slot-filter", + "pallet-balances", + "pallet-base-fee", + "pallet-collective", + "pallet-conviction-voting", + "pallet-crowdloan-rewards", + "pallet-democracy", + "pallet-erc20-xcm-bridge", + "pallet-ethereum", + "pallet-ethereum-chain-id", + "pallet-ethereum-xcm", + "pallet-evm", + "pallet-evm-precompile-author-mapping", + "pallet-evm-precompile-balances-erc20", + "pallet-evm-precompile-batch", + "pallet-evm-precompile-blake2", + "pallet-evm-precompile-bn128", + "pallet-evm-precompile-call-permit", + "pallet-evm-precompile-collective", + "pallet-evm-precompile-conviction-voting", + "pallet-evm-precompile-crowdloan-rewards", + "pallet-evm-precompile-democracy", + "pallet-evm-precompile-dispatch", + "pallet-evm-precompile-gmp", + "pallet-evm-precompile-modexp", + "pallet-evm-precompile-parachain-staking", + "pallet-evm-precompile-preimage", + "pallet-evm-precompile-proxy", + "pallet-evm-precompile-randomness", + "pallet-evm-precompile-referenda", + "pallet-evm-precompile-registry", + "pallet-evm-precompile-relay-encoder", + "pallet-evm-precompile-sha3fips", + "pallet-evm-precompile-simple", + "pallet-evm-precompile-xcm-transactor", + "pallet-evm-precompile-xcm-utils", + "pallet-evm-precompile-xtokens", + "pallet-evm-precompileset-assets-erc20", + "pallet-identity", + "pallet-maintenance-mode", + "pallet-migrations", + "pallet-moonbeam-orbiters", + "pallet-multisig", + "pallet-parachain-staking", + "pallet-preimage", + "pallet-proxy", + "pallet-proxy-genesis-companion", + "pallet-randomness", + "pallet-referenda", + "pallet-root-testing", + "pallet-scheduler", + "pallet-society", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-treasury", + "pallet-utility", + "pallet-whitelist", + "pallet-xcm", + "pallet-xcm-benchmarks", + "pallet-xcm-transactor", + "parachain-info", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain", + "precompile-utils", + "rlp", + "scale-info", + "serde", + "session-keys-primitives", + "sha3", + "smallvec", + "sp-api", + "sp-block-builder", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-version", + "strum", + "strum_macros", + "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", + "xcm-primitives", +] + +[[package]] +name = "moonbeam-runtime-common" +version = "0.8.0-dev" +dependencies = [ + "fp-ethereum", + "fp-evm", + "frame-support", + "frame-system", + "hex-literal", + "impl-trait-for-tuples", + "log", + "moonbeam-xcm-benchmarks", + "pallet-asset-manager", + "pallet-author-inherent", + "pallet-author-mapping", + "pallet-author-slot-filter", + "pallet-base-fee", + "pallet-collective", + "pallet-democracy", + "pallet-ethereum-xcm", + "pallet-evm", + "pallet-migrations", + "pallet-parachain-staking", + "pallet-preimage", + "pallet-randomness", + "pallet-referenda", + "pallet-scheduler", + "pallet-xcm-transactor", + "precompile-utils", + "sp-core", + "sp-runtime", + "sp-std", + "xcm", + "xcm-executor", + "xcm-primitives", +] + +[[package]] +name = "moonbeam-xcm-benchmarks" +version = "0.2.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-erc20-xcm-bridge", + "pallet-xcm-benchmarks", + "parity-scale-codec", + "scale-info", + "serde", + "sp-std", + "xcm", + "xcm-executor", + "xcm-primitives", +] + +[[package]] +name = "moonriver-runtime" +version = "0.8.4" +dependencies = [ + "account", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-timestamp", + "cumulus-primitives-utility", + "evm-tracing-events", + "fp-evm", + "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", + "moonbeam-core-primitives", + "moonbeam-evm-tracer", + "moonbeam-relay-encoder", + "moonbeam-rpc-primitives-debug", + "moonbeam-rpc-primitives-txpool", + "moonbeam-runtime-common", + "moonbeam-xcm-benchmarks", + "nimbus-primitives", + "num_enum", + "orml-traits", + "orml-xcm-support", + "orml-xtokens", + "pallet-asset-manager", + "pallet-assets", + "pallet-author-inherent", + "pallet-author-mapping", + "pallet-author-slot-filter", + "pallet-balances", + "pallet-base-fee", + "pallet-collective", + "pallet-conviction-voting", + "pallet-crowdloan-rewards", + "pallet-democracy", + "pallet-erc20-xcm-bridge", + "pallet-ethereum", + "pallet-ethereum-chain-id", + "pallet-ethereum-xcm", + "pallet-evm", + "pallet-evm-precompile-author-mapping", + "pallet-evm-precompile-balances-erc20", + "pallet-evm-precompile-batch", + "pallet-evm-precompile-blake2", + "pallet-evm-precompile-bn128", + "pallet-evm-precompile-call-permit", + "pallet-evm-precompile-collective", + "pallet-evm-precompile-conviction-voting", + "pallet-evm-precompile-crowdloan-rewards", + "pallet-evm-precompile-democracy", + "pallet-evm-precompile-dispatch", + "pallet-evm-precompile-gmp", + "pallet-evm-precompile-modexp", + "pallet-evm-precompile-parachain-staking", + "pallet-evm-precompile-preimage", + "pallet-evm-precompile-proxy", + "pallet-evm-precompile-randomness", + "pallet-evm-precompile-referenda", + "pallet-evm-precompile-registry", + "pallet-evm-precompile-relay-encoder", + "pallet-evm-precompile-sha3fips", + "pallet-evm-precompile-simple", + "pallet-evm-precompile-xcm-transactor", + "pallet-evm-precompile-xcm-utils", + "pallet-evm-precompile-xtokens", + "pallet-evm-precompileset-assets-erc20", + "pallet-identity", + "pallet-maintenance-mode", + "pallet-migrations", + "pallet-moonbeam-orbiters", + "pallet-multisig", + "pallet-parachain-staking", + "pallet-preimage", + "pallet-proxy", + "pallet-proxy-genesis-companion", + "pallet-randomness", + "pallet-referenda", + "pallet-root-testing", + "pallet-scheduler", + "pallet-society", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-treasury", + "pallet-utility", + "pallet-whitelist", + "pallet-xcm", + "pallet-xcm-benchmarks", + "pallet-xcm-transactor", + "parachain-info", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain", + "precompile-utils", + "rlp", + "scale-info", + "serde", + "session-keys-primitives", + "sha3", + "smallvec", + "sp-api", + "sp-block-builder", + "sp-core", + "sp-debug-derive", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std", + "sp-transaction-pool", + "sp-version", + "strum", + "strum_macros", + "substrate-wasm-builder", + "xcm", + "xcm-builder", + "xcm-executor", + "xcm-primitives", +] + +[[package]] +name = "multiaddr" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4aebdb21e90f81d13ed01dc84123320838e53963c2ca94b60b305d3fa64f31e" +dependencies = [ + "arrayref", + "byteorder", + "data-encoding", + "multibase", + "multihash", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint", + "url", +] + +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c346cf9999c631f002d8f977c4eaeaa0e6386f16007202308d0b3757522c2cc" +dependencies = [ + "blake2b_simd", + "blake2s_simd", + "blake3", + "core2", + "digest 0.10.5", + "multihash-derive", + "sha2 0.10.6", + "sha3", + "unsigned-varint", +] + +[[package]] +name = "multihash-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc076939022111618a5026d3be019fd8b366e76314538ff9a1b59ffbcbf98bcd" +dependencies = [ + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "multistream-select" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8552ab875c1313b97b8d20cb857b9fd63e2d1d6a0a1b53ce9821e575405f27a" +dependencies = [ + "bytes", + "futures", + "log", + "pin-project", + "smallvec", + "unsigned-varint", +] + +[[package]] +name = "nalgebra" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68d47bba83f9e2006d117a9a33af1524e655516b8919caac694427a6fb1e511" +dependencies = [ + "approx", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum 1.15.0", +] + +[[package]] +name = "nalgebra-macros" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d232c68884c0c99810a5a4d333ef7e47689cfd0edc85efc9e54e1e6bf5212766" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "names" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7d66043b25d4a6cccb23619d10c19c25304b355a7dccd4a8e11423dd2382146" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" + +[[package]] +name = "netlink-packet-core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" +dependencies = [ + "anyhow", + "byteorder", + "libc", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-route" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" +dependencies = [ + "anyhow", + "bitflags", + "byteorder", + "libc", + "netlink-packet-core", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-utils" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25af9cf0dc55498b7bd94a1508af7a78706aa0ab715a73c5169273e03c84845e" +dependencies = [ + "anyhow", + "byteorder", + "paste", + "thiserror", +] + +[[package]] +name = "netlink-proto" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6" +dependencies = [ + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror", + "tokio", +] + +[[package]] +name = "netlink-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92b654097027250401127914afb37cb1f311df6610a9891ff07a757e94199027" +dependencies = [ + "bytes", + "futures", + "libc", + "log", + "tokio", +] + +[[package]] +name = "nimbus-primitives" +version = "0.9.0" +source = "git+https://github.com/purestake/nimbus?branch=moonbeam-polkadot-v0.9.40#50cf433ded9327fea98d9ffa62dc543e81bf805d" +dependencies = [ + "async-trait", + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-inherents", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "nix" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nom" +version = "7.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + +[[package]] +name = "num" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-format" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b862ff8df690cf089058c98b183676a7ed0f974cc08b426800093227cbff3b" +dependencies = [ + "arrayvec 0.7.2", + "itoa", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" +dependencies = [ + "hermit-abi 0.1.19", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "object" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" +dependencies = [ + "crc32fast", + "hashbrown 0.12.3", + "indexmap", + "memchr", +] + +[[package]] +name = "object" +version = "0.30.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +dependencies = [ + "memchr", +] + +[[package]] +name = "oid-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e20717fa0541f39bd146692035c37bedfa532b3e5071b35761082407546b2a" +dependencies = [ + "asn1-rs 0.3.1", +] + +[[package]] +name = "oid-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +dependencies = [ + "asn1-rs 0.5.1", +] + +[[package]] +name = "once_cell" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "orchestra" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b0766f60d83cac01c6e3f3bc36aaa9056e48bea0deddb98a8c74de6021f3061" +dependencies = [ + "async-trait", + "dyn-clonable", + "futures", + "futures-timer", + "orchestra-proc-macro", + "pin-project", + "prioritized-metered-channel", + "thiserror", + "tracing", +] + +[[package]] +name = "orchestra-proc-macro" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8e83dbd049009426b445424a1104c78e6172a4c13e3614e52a38262785a5d7" +dependencies = [ + "expander 1.0.0", + "indexmap", + "itertools", + "petgraph", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ordered-float" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3305af35278dd29f46fcdd139e0b1fbfae2153f0e5928b39b035542dd31e37b7" +dependencies = [ + "num-traits", +] + +[[package]] +name = "orml-traits" +version = "0.4.1-dev" +source = "git+https://github.com/purestake/open-runtime-module-library?branch=moonbeam-polkadot-v0.9.40#26c76e0ab4dbf20b60ec92646f59751f054d97a0" +dependencies = [ + "frame-support", + "impl-trait-for-tuples", + "num-traits", + "orml-utilities", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", +] + +[[package]] +name = "orml-utilities" +version = "0.4.1-dev" +source = "git+https://github.com/purestake/open-runtime-module-library?branch=moonbeam-polkadot-v0.9.40#26c76e0ab4dbf20b60ec92646f59751f054d97a0" +dependencies = [ + "frame-support", + "parity-scale-codec", + "scale-info", + "serde", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "orml-xcm-support" +version = "0.4.1-dev" +source = "git+https://github.com/purestake/open-runtime-module-library?branch=moonbeam-polkadot-v0.9.40#26c76e0ab4dbf20b60ec92646f59751f054d97a0" +dependencies = [ + "frame-support", + "orml-traits", + "parity-scale-codec", + "sp-runtime", + "sp-std", + "xcm", + "xcm-executor", +] + +[[package]] +name = "orml-xtokens" +version = "0.4.1-dev" +source = "git+https://github.com/purestake/open-runtime-module-library?branch=moonbeam-polkadot-v0.9.40#26c76e0ab4dbf20b60ec92646f59751f054d97a0" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "frame-system", + "orml-traits", + "orml-xcm-support", + "pallet-xcm", + "parity-scale-codec", + "scale-info", + "serde", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", + "xcm-executor", +] + +[[package]] +name = "p256" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" +dependencies = [ + "ecdsa", + "elliptic-curve", + "sha2 0.10.6", +] + +[[package]] +name = "p384" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc8c5bf642dde52bb9e87c0ecd8ca5a76faac2eeed98dedb7c717997e1080aa" +dependencies = [ + "ecdsa", + "elliptic-curve", + "sha2 0.10.6", +] + +[[package]] +name = "pallet-asset-manager" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", + "xcm-primitives", +] + +[[package]] +name = "pallet-assets" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-author-inherent" +version = "0.9.0" +source = "git+https://github.com/purestake/nimbus?branch=moonbeam-polkadot-v0.9.40#50cf433ded9327fea98d9ffa62dc543e81bf805d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "nimbus-primitives", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-inherents", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-author-mapping" +version = "2.0.5" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "nimbus-primitives", + "parity-scale-codec", + "scale-info", + "serde", + "session-keys-primitives", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-author-slot-filter" +version = "0.9.0" +source = "git+https://github.com/purestake/nimbus?branch=moonbeam-polkadot-v0.9.40#50cf433ded9327fea98d9ffa62dc543e81bf805d" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "nimbus-primitives", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-authority-discovery" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-support", + "frame-system", + "pallet-session", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-authority-discovery", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-authorship" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-babe" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-consensus-babe", + "sp-consensus-vrf", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", +] + +[[package]] +name = "pallet-balances" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-base-fee" +version = "1.0.0" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "fp-evm", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "pallet-collective" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-conviction-voting" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "assert_matches", + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "serde", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-crowdloan-rewards" +version = "0.6.0" +source = "git+https://github.com/purestake/crowdloan-rewards?branch=moonbeam-polkadot-v0.9.40#9ae442ecb9796bbb02bf87c983650575bdaffb43" +dependencies = [ + "ed25519-dalek", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "pallet-utility", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-trie", +] + +[[package]] +name = "pallet-democracy" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-election-provider-multi-phase" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-election-provider-support-benchmarking", + "parity-scale-codec", + "rand 0.8.5", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-npos-elections", + "sp-runtime", + "sp-std", + "strum", +] + +[[package]] +name = "pallet-election-provider-support-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-system", + "parity-scale-codec", + "sp-npos-elections", + "sp-runtime", +] + +[[package]] +name = "pallet-erc20-xcm-bridge" +version = "1.0.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "environmental", + "ethereum-types", + "fp-evm", + "frame-support", + "frame-system", + "pallet-evm", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-std", + "xcm", + "xcm-executor", +] + +[[package]] +name = "pallet-ethereum" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "environmental", + "ethereum", + "ethereum-types", + "evm", + "fp-consensus", + "fp-ethereum", + "fp-evm", + "fp-rpc", + "fp-storage", + "frame-support", + "frame-system", + "pallet-evm", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-ethereum-chain-id" +version = "1.0.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "pallet-ethereum-xcm" +version = "1.0.0-dev" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "ethereum", + "ethereum-types", + "fp-ethereum", + "fp-evm", + "fp-rpc", + "fp-self-contained", + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-evm", + "pallet-timestamp", + "parity-scale-codec", + "rlp", + "scale-info", + "serde", + "sp-io", + "sp-runtime", + "sp-std", + "xcm-primitives", +] + +[[package]] +name = "pallet-evm" +version = "6.0.0-dev" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "environmental", + "evm", + "fp-account", + "fp-evm", + "frame-benchmarking", + "frame-support", + "frame-system", + "hex", + "hex-literal", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "rlp", + "scale-info", + "sha3", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-evm-precompile-author-mapping" +version = "0.2.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "fp-evm", + "frame-support", + "frame-system", + "log", + "nimbus-primitives", + "num_enum", + "pallet-author-mapping", + "pallet-evm", + "parity-scale-codec", + "precompile-utils", + "sp-core", + "sp-io", + "sp-std", +] + +[[package]] +name = "pallet-evm-precompile-balances-erc20" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "pallet-balances", + "pallet-evm", + "pallet-timestamp", + "parity-scale-codec", + "paste", + "precompile-utils", + "slices", + "sp-core", + "sp-io", + "sp-std", +] + +[[package]] +name = "pallet-evm-precompile-batch" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "evm", + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "pallet-evm", + "parity-scale-codec", + "paste", + "precompile-utils", + "slices", + "sp-core", + "sp-io", + "sp-std", +] + +[[package]] +name = "pallet-evm-precompile-blake2" +version = "2.0.0-dev" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "fp-evm", +] + +[[package]] +name = "pallet-evm-precompile-bn128" +version = "2.0.0-dev" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "fp-evm", + "sp-core", + "substrate-bn", +] + +[[package]] +name = "pallet-evm-precompile-call-permit" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "evm", + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "pallet-evm", + "pallet-timestamp", + "parity-scale-codec", + "paste", + "precompile-utils", + "slices", + "sp-core", + "sp-io", + "sp-std", +] + +[[package]] +name = "pallet-evm-precompile-collective" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "evm", + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "pallet-collective", + "pallet-evm", + "parity-scale-codec", + "paste", + "precompile-utils", + "slices", + "sp-core", + "sp-io", + "sp-std", + "xcm-primitives", +] + +[[package]] +name = "pallet-evm-precompile-conviction-voting" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "pallet-conviction-voting", + "pallet-evm", + "parity-scale-codec", + "precompile-utils", + "rustc-hex", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-evm-precompile-crowdloan-rewards" +version = "0.6.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "pallet-crowdloan-rewards", + "pallet-evm", + "precompile-utils", + "rustc-hex", + "sp-core", + "sp-std", +] + +[[package]] +name = "pallet-evm-precompile-democracy" +version = "0.2.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "pallet-democracy", + "pallet-evm", + "pallet-preimage", + "parity-scale-codec", + "precompile-utils", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-evm-precompile-dispatch" +version = "2.0.0-dev" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "fp-evm", + "frame-support", + "pallet-evm", +] + +[[package]] +name = "pallet-evm-precompile-gmp" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "cumulus-primitives-core", + "evm", + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "orml-traits", + "orml-xtokens", + "pallet-evm", + "pallet-xcm", + "parity-scale-codec", + "paste", + "precompile-utils", + "slices", + "sp-core", + "sp-io", + "sp-std", + "xcm", + "xcm-builder", + "xcm-executor", + "xcm-primitives", +] + +[[package]] +name = "pallet-evm-precompile-modexp" +version = "2.0.0-dev" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "fp-evm", + "num", +] + +[[package]] +name = "pallet-evm-precompile-parachain-staking" +version = "1.0.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "pallet-evm", + "pallet-parachain-staking", + "parity-scale-codec", + "precompile-utils", + "rustc-hex", + "sp-core", + "sp-io", + "sp-std", +] + +[[package]] +name = "pallet-evm-precompile-preimage" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "pallet-evm", + "pallet-preimage", + "parity-scale-codec", + "precompile-utils", + "rustc-hex", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-evm-precompile-proxy" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "evm", + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "pallet-balances", + "pallet-evm", + "pallet-proxy", + "parity-scale-codec", + "precompile-utils", + "rustc-hex", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-evm-precompile-randomness" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "fp-evm", + "frame-support", + "frame-system", + "log", + "nimbus-primitives", + "num_enum", + "pallet-base-fee", + "pallet-evm", + "pallet-randomness", + "parity-scale-codec", + "precompile-utils", + "sp-core", + "sp-io", + "sp-std", +] + +[[package]] +name = "pallet-evm-precompile-referenda" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "pallet-evm", + "pallet-referenda", + "parity-scale-codec", + "precompile-utils", + "rustc-hex", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-evm-precompile-registry" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "fp-evm", + "frame-support", + "frame-system", + "log", + "pallet-evm", + "parity-scale-codec", + "precompile-utils", + "sp-core", + "sp-io", + "sp-std", +] + +[[package]] +name = "pallet-evm-precompile-relay-encoder" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "cumulus-primitives-core", + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "pallet-evm", + "pallet-staking", + "parity-scale-codec", + "precompile-utils", + "rustc-hex", + "sp-core", + "sp-runtime", + "sp-std", + "xcm-primitives", +] + +[[package]] +name = "pallet-evm-precompile-sha3fips" +version = "2.0.0-dev" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "fp-evm", + "tiny-keccak", +] + +[[package]] +name = "pallet-evm-precompile-simple" +version = "2.0.0-dev" +source = "git+https://github.com/purestake/frontier?branch=moonbeam-polkadot-v0.9.40#688ad3bf8d1eb28936a51c3a41287dd80804f5a3" +dependencies = [ + "fp-evm", + "ripemd", + "sp-io", +] + +[[package]] +name = "pallet-evm-precompile-xcm-transactor" +version = "0.2.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "cumulus-primitives-core", + "evm", + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "pallet-evm", + "pallet-xcm-transactor", + "precompile-utils", + "rustc-hex", + "sp-core", + "sp-runtime", + "sp-std", + "xcm", + "xcm-primitives", +] + +[[package]] +name = "pallet-evm-precompile-xcm-utils" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "fp-evm", + "frame-support", + "frame-system", + "num_enum", + "pallet-evm", + "pallet-xcm", + "parity-scale-codec", + "precompile-utils", + "sp-core", + "sp-std", + "xcm", + "xcm-executor", + "xcm-primitives", +] + +[[package]] +name = "pallet-evm-precompile-xtokens" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "orml-xtokens", + "pallet-evm", + "precompile-utils", + "rustc-hex", + "sp-core", + "sp-runtime", + "sp-std", + "xcm", + "xcm-primitives", +] + +[[package]] +name = "pallet-evm-precompileset-assets-erc20" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "fp-evm", + "frame-support", + "frame-system", + "log", + "num_enum", + "pallet-assets", + "pallet-balances", + "pallet-evm", + "pallet-timestamp", + "parity-scale-codec", + "paste", + "precompile-utils", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-fast-unstake" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", +] + +[[package]] +name = "pallet-identity" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "enumflags2", + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-maintenance-mode" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", + "xcm-primitives", +] + +[[package]] +name = "pallet-migrations" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-democracy", + "pallet-preimage", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "xcm-primitives", +] + +[[package]] +name = "pallet-moonbeam-orbiters" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "nimbus-primitives", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-multisig" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-parachain-staking" +version = "3.0.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "nimbus-primitives", + "parity-scale-codec", + "scale-info", + "serde", + "sp-runtime", + "sp-std", + "substrate-fixed", +] + +[[package]] +name = "pallet-preimage" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-proxy" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-proxy-genesis-companion" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "frame-support", + "frame-system", + "pallet-proxy", + "parity-scale-codec", + "scale-info", + "sp-runtime", +] + +[[package]] +name = "pallet-randomness" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "hex", + "log", + "nimbus-primitives", + "pallet-evm", + "parity-scale-codec", + "scale-info", + "serde", + "session-keys-primitives", + "sp-consensus-vrf", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-referenda" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "assert_matches", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-root-testing" +version = "1.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-scheduler" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", + "sp-weights", +] + +[[package]] +name = "pallet-session" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "sp-trie", +] + +[[package]] +name = "pallet-society" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "rand_chacha 0.2.2", + "scale-info", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-staking" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "scale-info", + "serde", + "sp-application-crypto", + "sp-io", + "sp-runtime", + "sp-staking", + "sp-std", +] + +[[package]] +name = "pallet-staking-reward-fn" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "log", + "sp-arithmetic", +] + +[[package]] +name = "pallet-sudo" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-timestamp" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std", + "sp-timestamp", +] + +[[package]] +name = "pallet-transaction-payment" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-transaction-payment-rpc-runtime-api" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "pallet-transaction-payment", + "parity-scale-codec", + "sp-api", + "sp-runtime", + "sp-weights", +] + +[[package]] +name = "pallet-treasury" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "serde", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-utility" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-vesting" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-whitelist" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "pallet-xcm" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "bounded-collections", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", + "xcm-executor", +] + +[[package]] +name = "pallet-xcm-benchmarks" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", + "xcm-builder", + "xcm-executor", +] + +[[package]] +name = "pallet-xcm-transactor" +version = "0.2.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "cumulus-primitives-core", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "orml-traits", + "parity-scale-codec", + "scale-info", + "serde", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", + "xcm-builder", + "xcm-executor", + "xcm-primitives", +] + +[[package]] +name = "parachain-info" +version = "0.1.0" +source = "git+https://github.com/purestake/cumulus?branch=moonbeam-polkadot-v0.9.40#0d8911b7557bad5788909fc71cadb916b041417b" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "parity-db" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00bfb81cf5c90a222db2fb7b3a7cbf8cc7f38dfb6647aca4d98edf8281f56ed5" +dependencies = [ + "blake2", + "crc32fast", + "fs2", + "hex", + "libc", + "log", + "lz4", + "memmap2", + "parking_lot 0.12.1", + "rand 0.8.5", + "siphasher", + "snap", +] + +[[package]] +name = "parity-scale-codec" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637935964ff85a605d114591d4d2c13c5d1ba2806dae97cea6bf180238a749ac" +dependencies = [ + "arrayvec 0.7.2", + "bitvec", + "byte-slice-cast", + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b26a931f824dd4eca30b3e43bb4f31cd5f0d3a403c5f5ff27106b805bfde7b" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parity-send-wrapper" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" + +[[package]] +name = "parity-wasm" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" + +[[package]] +name = "parking" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.5", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.4", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.42.0", +] + +[[package]] +name = "paste" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1" + +[[package]] +name = "pbkdf2" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" +dependencies = [ + "crypto-mac 0.11.1", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.5", +] + +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64", +] + +[[package]] +name = "pem-rfc7468" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + +[[package]] +name = "petgraph" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "pin-project-lite" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" + +[[package]] +name = "polkadot-core-primitives" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "polkadot-node-jaeger" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "lazy_static", + "log", + "mick-jaeger", + "parity-scale-codec", + "parking_lot 0.12.1", + "polkadot-node-primitives", + "polkadot-primitives", + "sc-network", + "sp-core", + "thiserror", + "tokio", +] + +[[package]] +name = "polkadot-node-metrics" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "bs58", + "futures", + "futures-timer", + "log", + "parity-scale-codec", + "polkadot-primitives", + "prioritized-metered-channel", + "sc-cli", + "sc-service", + "sc-tracing", + "substrate-prometheus-endpoint", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-network-protocol" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "async-trait", + "derive_more", + "fatality", + "futures", + "hex", + "parity-scale-codec", + "polkadot-node-jaeger", + "polkadot-node-primitives", + "polkadot-primitives", + "rand 0.8.5", + "sc-authority-discovery", + "sc-network", + "strum", + "thiserror", + "tracing-gum", +] + +[[package]] +name = "polkadot-node-primitives" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "bounded-vec", + "futures", + "parity-scale-codec", + "polkadot-parachain", + "polkadot-primitives", + "schnorrkel", + "serde", + "sp-application-crypto", + "sp-consensus-babe", + "sp-consensus-vrf", + "sp-core", + "sp-keystore", + "sp-maybe-compressed-blob", + "sp-runtime", + "thiserror", + "zstd", +] + +[[package]] +name = "polkadot-node-subsystem-types" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "async-trait", + "derive_more", + "futures", + "orchestra", + "polkadot-node-jaeger", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-primitives", + "polkadot-statement-table", + "sc-network", + "smallvec", + "sp-api", + "sp-authority-discovery", + "sp-consensus-babe", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "polkadot-overseer" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "lru 0.9.0", + "orchestra", + "parking_lot 0.12.1", + "polkadot-node-metrics", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem-types", + "polkadot-primitives", + "sc-client-api", + "sp-api", + "sp-core", + "tikv-jemalloc-ctl", + "tracing-gum", +] + +[[package]] +name = "polkadot-parachain" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "bounded-collections", + "derive_more", + "frame-support", + "parity-scale-codec", + "polkadot-core-primitives", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "polkadot-primitives" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "bitvec", + "hex-literal", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-authority-discovery", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-staking", + "sp-std", +] + +[[package]] +name = "polkadot-runtime-common" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "bitvec", + "frame-election-provider-support", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "libsecp256k1", + "log", + "pallet-authorship", + "pallet-balances", + "pallet-election-provider-multi-phase", + "pallet-fast-unstake", + "pallet-session", + "pallet-staking", + "pallet-staking-reward-fn", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-treasury", + "pallet-vesting", + "parity-scale-codec", + "polkadot-primitives", + "polkadot-runtime-parachains", + "rustc-hex", + "scale-info", + "serde", + "serde_derive", + "slot-range-helper", + "sp-api", + "sp-core", + "sp-inherents", + "sp-io", + "sp-npos-elections", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "static_assertions", + "xcm", +] + +[[package]] +name = "polkadot-runtime-metrics" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "bs58", + "parity-scale-codec", + "polkadot-primitives", + "sp-std", + "sp-tracing", +] + +[[package]] +name = "polkadot-runtime-parachains" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "bitflags", + "bitvec", + "derive_more", + "frame-support", + "frame-system", + "log", + "pallet-authority-discovery", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-session", + "pallet-staking", + "pallet-timestamp", + "pallet-vesting", + "parity-scale-codec", + "polkadot-parachain", + "polkadot-primitives", + "polkadot-runtime-metrics", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rustc-hex", + "scale-info", + "serde", + "sp-api", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std", + "xcm", + "xcm-executor", +] + +[[package]] +name = "polkadot-statement-table" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "parity-scale-codec", + "polkadot-primitives", + "sp-core", +] + +[[package]] +name = "polling" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab4609a838d88b73d8238967b60dd115cc08d38e2bbaf51ee1e4b695f89122e2" +dependencies = [ + "autocfg", + "cfg-if", + "libc", + "log", + "wepoll-ffi", + "winapi", +] + +[[package]] +name = "poly1305" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" +dependencies = [ + "cpufeatures", + "opaque-debug 0.3.0", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eebcc4aa140b9abd2bc40d9c3f7ccec842679cd79045ac3a7ac698c1a064b7cd" +dependencies = [ + "cpuid-bool", + "opaque-debug 0.3.0", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug 0.3.0", + "universal-hash", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "precompile-utils" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "affix", + "environmental", + "evm", + "fp-evm", + "frame-support", + "frame-system", + "hex", + "impl-trait-for-tuples", + "log", + "num_enum", + "pallet-evm", + "parity-scale-codec", + "paste", + "precompile-utils-macro", + "sha3", + "sp-core", + "sp-io", + "sp-std", + "xcm", +] + +[[package]] +name = "precompile-utils-macro" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "case", + "num_enum", + "prettyplease", + "proc-macro2", + "quote", + "sha3", + "syn 1.0.109", +] + +[[package]] +name = "predicates" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5aab5be6e4732b473071984b3164dbbfb7a3674d30ea5ff44410b6bcd960c3c" +dependencies = [ + "difflib", + "float-cmp", + "itertools", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" + +[[package]] +name = "predicates-tree" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d86de6de25020a36c6d3643a86d9a6a9f552107c0559c60ea03551b5e16c032" +dependencies = [ + "predicates-core", + "termtree", +] + +[[package]] +name = "prettyplease" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c142c0e46b57171fe0c528bee8c5b7569e80f0c17e377cd0e30ea57dbc11bb51" +dependencies = [ + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "primitive-types" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde 0.4.0", + "scale-info", + "uint", +] + +[[package]] +name = "prioritized-metered-channel" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3caef72a78ca8e77cbdfa87dd516ebb79d4cbe5b42e3b8435b463a8261339ff" +dependencies = [ + "async-channel", + "coarsetime", + "crossbeam-queue", + "derive_more", + "futures", + "futures-timer", + "nanorand", + "thiserror", + "tracing", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e472a104799c74b514a57226160104aa483546de37e839ec50e3c2e41dd87534" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prometheus" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c" +dependencies = [ + "cfg-if", + "fnv", + "lazy_static", + "memchr", + "parking_lot 0.12.1", + "thiserror", +] + +[[package]] +name = "prometheus-client" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83cd1b99916654a69008fd66b4f9397fbe08e6e51dfe23d4417acf5d3b8cb87c" +dependencies = [ + "dtoa", + "itoa", + "parking_lot 0.12.1", + "prometheus-client-derive-text-encode", +] + +[[package]] +name = "prometheus-client-derive-text-encode" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a455fbcb954c1a7decf3c586e860fd7889cddf4b8e164be736dbac95a953cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prost" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "399c3c31cdec40583bb68f0b18403400d01ec4289c383aa047560439952c4dd7" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f835c582e6bd972ba8347313300219fed5bfa52caf175298d860b61ff6069bb" +dependencies = [ + "bytes", + "heck", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prost", + "prost-types", + "regex", + "tempfile", + "which", +] + +[[package]] +name = "prost-codec" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc34979ff898b6e141106178981ce2596c387ea6e62533facfc61a37fc879c0" +dependencies = [ + "asynchronous-codec", + "bytes", + "prost", + "thiserror", + "unsigned-varint", +] + +[[package]] +name = "prost-derive" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7345d5f0e08c0536d7ac7229952590239e77abf0a0100a1b1d890add6ea96364" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prost-types" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dfaa718ad76a44b3415e6c4d53b17c8f99160dcb3a99b10470fce8ad43f6e3e" +dependencies = [ + "bytes", + "prost", +] + +[[package]] +name = "psm" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +dependencies = [ + "cc", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quicksink" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77de3c815e5a160b1539c6592796801df2043ae35e123b46d73380cfa57af858" +dependencies = [ + "futures-core", + "futures-sink", + "pin-project-lite 0.1.12", +] + +[[package]] +name = "quinn-proto" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4ced82a24bb281af338b9e8f94429b6eca01b4e66d899f40031f074e74c9" +dependencies = [ + "bytes", + "rand 0.8.5", + "ring", + "rustc-hash", + "rustls 0.20.7", + "slab", + "thiserror", + "tinyvec", + "tracing", + "webpki 0.22.0", +] + +[[package]] +name = "quote" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.8", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "rcgen" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd" +dependencies = [ + "pem", + "ring", + "time 0.3.17", + "x509-parser 0.13.2", + "yasna", +] + +[[package]] +name = "rcgen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" +dependencies = [ + "pem", + "ring", + "time 0.3.17", + "yasna", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom 0.2.8", + "redox_syscall", + "thiserror", +] + +[[package]] +name = "ref-cast" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b15debb4f9d60d767cd8ca9ef7abb2452922f3214671ff052defc7f3502c44" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abfa8511e9e94fd3de6585a3d3cd00e01ed556dc9814829280af0e8dc72a8f36" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "regalloc2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" +dependencies = [ + "fxhash", + "log", + "slice-group-by", + "smallvec", +] + +[[package]] +name = "regex" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" + +[[package]] +name = "region" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" +dependencies = [ + "bitflags", + "libc", + "mach", + "winapi", +] + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error", +] + +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint", + "hmac 0.12.1", + "zeroize", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest 0.10.5", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rlp-derive", + "rustc-hex", +] + +[[package]] +name = "rlp-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rocksdb" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e9562ea1d70c0cc63a34a22d977753b50cca91cc6b6527750463bd5dd8697bc" +dependencies = [ + "libc", + "librocksdb-sys", +] + +[[package]] +name = "rpassword" +version = "7.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c9f5d2a0c3e2ea729ab3706d22217177770654c3ef5056b68b69d07332d3f5" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "rtcp" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1919efd6d4a6a85d13388f9487549bb8e359f17198cc03ffd72f79b553873691" +dependencies = [ + "bytes", + "thiserror", + "webrtc-util", +] + +[[package]] +name = "rtnetlink" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322c53fd76a18698f1c27381d58091de3a043d356aa5bd0d510608b565f469a0" +dependencies = [ + "futures", + "log", + "netlink-packet-route", + "netlink-proto", + "nix", + "thiserror", + "tokio", +] + +[[package]] +name = "rtp" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a095411ff00eed7b12e4c6a118ba984d113e1079582570d56a5ee723f11f80" +dependencies = [ + "async-trait", + "bytes", + "rand 0.8.5", + "serde", + "thiserror", + "webrtc-util", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.14", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "0.35.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727a1a6d65f786ec22df8a81ca3121107f235970dc1705ed681d3e6e8b9cd5f9" +dependencies = [ + "bitflags", + "errno 0.2.8", + "io-lifetimes 0.7.5", + "libc", + "linux-raw-sys 0.0.46", + "windows-sys 0.42.0", +] + +[[package]] +name = "rustix" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03" +dependencies = [ + "bitflags", + "errno 0.2.8", + "io-lifetimes 1.0.4", + "libc", + "linux-raw-sys 0.1.4", + "windows-sys 0.42.0", +] + +[[package]] +name = "rustix" +version = "0.37.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d097081ed288dfe45699b72f5b5d648e5f15d64d900c7080273baa20c16a6849" +dependencies = [ + "bitflags", + "errno 0.3.0", + "io-lifetimes 1.0.4", + "libc", + "linux-raw-sys 0.3.1", + "windows-sys 0.45.0", +] + +[[package]] +name = "rustls" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64", + "log", + "ring", + "sct 0.6.1", + "webpki 0.21.4", +] + +[[package]] +name = "rustls" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "539a2bfe908f471bfa933876bd1eb6a19cf2176d375f82ef7f99530a40e48c2c" +dependencies = [ + "log", + "ring", + "sct 0.7.0", + "webpki 0.22.0", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" +dependencies = [ + "base64", +] + +[[package]] +name = "rustversion" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" + +[[package]] +name = "rw-stream-sink" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26338f5e09bb721b85b135ea05af7767c90b52f6de4f087d4f4a3a9d64e7dc04" +dependencies = [ + "futures", + "pin-project", + "static_assertions", +] + +[[package]] +name = "ryu" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" + +[[package]] +name = "safe_arch" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "794821e4ccb0d9f979512f9c1973480123f9bd62a90d74ab0f9426fcf8f4a529" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "sc-allocator" +version = "4.1.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "log", + "sp-core", + "sp-wasm-interface", + "thiserror", +] + +[[package]] +name = "sc-authority-discovery" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "ip_network", + "libp2p", + "log", + "parity-scale-codec", + "prost", + "prost-build", + "rand 0.8.5", + "sc-client-api", + "sc-network", + "sc-network-common", + "sp-api", + "sp-authority-discovery", + "sp-blockchain", + "sp-core", + "sp-keystore", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-block-builder" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "parity-scale-codec", + "sc-client-api", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-core", + "sp-inherents", + "sp-runtime", +] + +[[package]] +name = "sc-chain-spec" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "memmap2", + "sc-chain-spec-derive", + "sc-client-api", + "sc-executor", + "sc-network", + "sc-telemetry", + "serde", + "serde_json", + "sp-blockchain", + "sp-core", + "sp-runtime", + "sp-state-machine", +] + +[[package]] +name = "sc-chain-spec-derive" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sc-cli" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "array-bytes", + "chrono", + "clap", + "fdlimit", + "futures", + "libp2p", + "log", + "names", + "parity-scale-codec", + "rand 0.8.5", + "regex", + "rpassword", + "sc-client-api", + "sc-client-db", + "sc-keystore", + "sc-network", + "sc-network-common", + "sc-service", + "sc-telemetry", + "sc-tracing", + "sc-utils", + "serde", + "serde_json", + "sp-blockchain", + "sp-core", + "sp-keyring", + "sp-keystore", + "sp-panic-handler", + "sp-runtime", + "sp-version", + "thiserror", + "tiny-bip39", + "tokio", +] + +[[package]] +name = "sc-client-api" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "fnv", + "futures", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-executor", + "sc-transaction-pool-api", + "sc-utils", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-database", + "sp-externalities", + "sp-keystore", + "sp-runtime", + "sp-state-machine", + "sp-storage", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "sc-client-db" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "hash-db 0.16.0", + "kvdb", + "kvdb-memorydb", + "kvdb-rocksdb", + "linked-hash-map", + "log", + "parity-db", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-client-api", + "sc-state-db", + "schnellru", + "sp-arithmetic", + "sp-blockchain", + "sp-core", + "sp-database", + "sp-runtime", + "sp-state-machine", + "sp-trie", +] + +[[package]] +name = "sc-consensus" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "libp2p", + "log", + "mockall", + "parking_lot 0.12.1", + "sc-client-api", + "sc-utils", + "serde", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "sp-state-machine", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-executor" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "lru 0.8.1", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-executor-common", + "sc-executor-wasmi", + "sc-executor-wasmtime", + "sp-api", + "sp-core", + "sp-externalities", + "sp-io", + "sp-panic-handler", + "sp-runtime-interface", + "sp-trie", + "sp-version", + "sp-wasm-interface", + "tracing", + "wasmi", +] + +[[package]] +name = "sc-executor-common" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "sc-allocator", + "sp-maybe-compressed-blob", + "sp-wasm-interface", + "thiserror", + "wasm-instrument", + "wasmi", +] + +[[package]] +name = "sc-executor-wasmi" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "log", + "sc-allocator", + "sc-executor-common", + "sp-runtime-interface", + "sp-wasm-interface", + "wasmi", +] + +[[package]] +name = "sc-executor-wasmtime" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "anyhow", + "cfg-if", + "libc", + "log", + "once_cell", + "rustix 0.36.7", + "sc-allocator", + "sc-executor-common", + "sp-runtime-interface", + "sp-wasm-interface", + "wasmtime", +] + +[[package]] +name = "sc-informant" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "ansi_term", + "futures", + "futures-timer", + "log", + "sc-client-api", + "sc-network", + "sc-network-common", + "sp-blockchain", + "sp-runtime", +] + +[[package]] +name = "sc-keystore" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "array-bytes", + "async-trait", + "parking_lot 0.12.1", + "serde_json", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "thiserror", +] + +[[package]] +name = "sc-network" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "array-bytes", + "async-channel", + "async-trait", + "asynchronous-codec", + "bytes", + "either", + "fnv", + "futures", + "futures-timer", + "ip_network", + "libp2p", + "linked_hash_set", + "log", + "lru 0.8.1", + "mockall", + "parity-scale-codec", + "parking_lot 0.12.1", + "pin-project", + "rand 0.8.5", + "sc-block-builder", + "sc-client-api", + "sc-consensus", + "sc-network-common", + "sc-peerset", + "sc-utils", + "serde", + "serde_json", + "smallvec", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", + "unsigned-varint", + "zeroize", +] + +[[package]] +name = "sc-network-bitswap" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "cid", + "futures", + "libp2p", + "log", + "prost", + "prost-build", + "sc-client-api", + "sc-network", + "sc-network-common", + "sp-blockchain", + "sp-runtime", + "thiserror", + "unsigned-varint", +] + +[[package]] +name = "sc-network-common" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "array-bytes", + "async-trait", + "bitflags", + "bytes", + "futures", + "futures-timer", + "libp2p", + "parity-scale-codec", + "prost-build", + "sc-consensus", + "sc-peerset", + "sc-utils", + "serde", + "smallvec", + "sp-blockchain", + "sp-consensus", + "sp-consensus-grandpa", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", + "zeroize", +] + +[[package]] +name = "sc-network-light" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "array-bytes", + "futures", + "libp2p", + "log", + "parity-scale-codec", + "prost", + "prost-build", + "sc-client-api", + "sc-network", + "sc-network-common", + "sc-peerset", + "sp-blockchain", + "sp-core", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-network-sync" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "array-bytes", + "async-trait", + "fork-tree", + "futures", + "futures-timer", + "libp2p", + "log", + "lru 0.8.1", + "mockall", + "parity-scale-codec", + "prost", + "prost-build", + "sc-client-api", + "sc-consensus", + "sc-network", + "sc-network-common", + "sc-peerset", + "sc-utils", + "smallvec", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-network-transactions" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "array-bytes", + "futures", + "libp2p", + "log", + "parity-scale-codec", + "pin-project", + "sc-network", + "sc-network-common", + "sc-peerset", + "sc-utils", + "sp-consensus", + "sp-runtime", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "sc-offchain" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "array-bytes", + "bytes", + "fnv", + "futures", + "futures-timer", + "hyper", + "hyper-rustls", + "libp2p", + "num_cpus", + "once_cell", + "parity-scale-codec", + "parking_lot 0.12.1", + "rand 0.8.5", + "sc-client-api", + "sc-network", + "sc-network-common", + "sc-peerset", + "sc-utils", + "sp-api", + "sp-core", + "sp-offchain", + "sp-runtime", + "threadpool", + "tracing", +] + +[[package]] +name = "sc-peerset" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "futures", + "libp2p", + "log", + "sc-utils", + "serde_json", + "wasm-timer", +] + +[[package]] +name = "sc-rpc" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "futures", + "jsonrpsee", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-block-builder", + "sc-chain-spec", + "sc-client-api", + "sc-rpc-api", + "sc-tracing", + "sc-transaction-pool-api", + "sc-utils", + "serde_json", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-keystore", + "sp-offchain", + "sp-rpc", + "sp-runtime", + "sp-session", + "sp-version", + "tokio", +] + +[[package]] +name = "sc-rpc-api" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "jsonrpsee", + "parity-scale-codec", + "sc-chain-spec", + "sc-transaction-pool-api", + "scale-info", + "serde", + "serde_json", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-version", + "thiserror", +] + +[[package]] +name = "sc-rpc-server" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "http", + "jsonrpsee", + "log", + "serde_json", + "substrate-prometheus-endpoint", + "tokio", + "tower", + "tower-http", +] + +[[package]] +name = "sc-rpc-spec-v2" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "array-bytes", + "futures", + "futures-util", + "hex", + "jsonrpsee", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-chain-spec", + "sc-client-api", + "sc-transaction-pool-api", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-runtime", + "sp-version", + "thiserror", + "tokio-stream", +] + +[[package]] +name = "sc-service" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "async-trait", + "directories", + "exit-future", + "futures", + "futures-timer", + "jsonrpsee", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "pin-project", + "rand 0.8.5", + "sc-block-builder", + "sc-chain-spec", + "sc-client-api", + "sc-client-db", + "sc-consensus", + "sc-executor", + "sc-informant", + "sc-keystore", + "sc-network", + "sc-network-bitswap", + "sc-network-common", + "sc-network-light", + "sc-network-sync", + "sc-network-transactions", + "sc-offchain", + "sc-rpc", + "sc-rpc-server", + "sc-rpc-spec-v2", + "sc-storage-monitor", + "sc-sysinfo", + "sc-telemetry", + "sc-tracing", + "sc-transaction-pool", + "sc-transaction-pool-api", + "sc-utils", + "serde", + "serde_json", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-externalities", + "sp-keystore", + "sp-runtime", + "sp-session", + "sp-state-machine", + "sp-storage", + "sp-transaction-pool", + "sp-transaction-storage-proof", + "sp-trie", + "sp-version", + "static_init", + "substrate-prometheus-endpoint", + "tempfile", + "thiserror", + "tokio", + "tracing", + "tracing-futures", +] + +[[package]] +name = "sc-state-db" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "sp-core", +] + +[[package]] +name = "sc-storage-monitor" +version = "0.1.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "clap", + "fs4", + "futures", + "log", + "sc-client-db", + "sc-utils", + "sp-core", + "thiserror", + "tokio", +] + +[[package]] +name = "sc-sysinfo" +version = "6.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "futures", + "libc", + "log", + "rand 0.8.5", + "rand_pcg", + "regex", + "sc-telemetry", + "serde", + "serde_json", + "sp-core", + "sp-io", + "sp-std", +] + +[[package]] +name = "sc-telemetry" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "chrono", + "futures", + "libp2p", + "log", + "parking_lot 0.12.1", + "pin-project", + "rand 0.8.5", + "sc-utils", + "serde", + "serde_json", + "thiserror", + "wasm-timer", +] + +[[package]] +name = "sc-tracing" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "ansi_term", + "atty", + "chrono", + "lazy_static", + "libc", + "log", + "once_cell", + "parking_lot 0.12.1", + "regex", + "rustc-hash", + "sc-client-api", + "sc-rpc-server", + "sc-tracing-proc-macro", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-tracing", + "thiserror", + "tracing", + "tracing-log", + "tracing-subscriber", +] + +[[package]] +name = "sc-tracing-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sc-transaction-pool" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "linked-hash-map", + "log", + "num-traits", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-client-api", + "sc-transaction-pool-api", + "sc-utils", + "serde", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-runtime", + "sp-tracing", + "sp-transaction-pool", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-transaction-pool-api" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "async-trait", + "futures", + "log", + "serde", + "sp-blockchain", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-utils" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "async-channel", + "futures", + "futures-timer", + "lazy_static", + "log", + "parking_lot 0.12.1", + "prometheus", + "sp-arithmetic", +] + +[[package]] +name = "scale-info" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "001cf62ece89779fd16105b5f515ad0e5cedcd5440d3dd806bb067978e7c3608" +dependencies = [ + "bitvec", + "cfg-if", + "derive_more", + "parity-scale-codec", + "scale-info-derive", + "serde", +] + +[[package]] +name = "scale-info-derive" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "303959cf613a6f6efd19ed4b4ad5bf79966a13352716299ad532cfb115f4205c" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "schannel" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +dependencies = [ + "lazy_static", + "windows-sys 0.36.1", +] + +[[package]] +name = "schnellru" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" +dependencies = [ + "ahash 0.8.3", + "cfg-if", + "hashbrown 0.13.2", +] + +[[package]] +name = "schnorrkel" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "curve25519-dalek 2.1.3", + "getrandom 0.1.16", + "merlin", + "rand 0.7.3", + "rand_core 0.5.1", + "sha2 0.8.2", + "subtle", + "zeroize", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "scratch" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" + +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sdp" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d22a5ef407871893fd72b4562ee15e4742269b173959db4b8df6f538c414e13" +dependencies = [ + "rand 0.8.5", + "substring", + "thiserror", + "url", +] + +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct", + "der", + "generic-array 0.14.6", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62" +dependencies = [ + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b" +dependencies = [ + "cc", +] + +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "serde_json" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "session-keys-primitives" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "async-trait", + "frame-support", + "nimbus-primitives", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-consensus-babe", + "sp-consensus-vrf", + "sp-core", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sha-1" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sha2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.5", +] + +[[package]] +name = "sha3" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" +dependencies = [ + "digest 0.10.5", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.5", + "rand_core 0.6.4", +] + +[[package]] +name = "simba" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50582927ed6f77e4ac020c057f37a268fc6aebc29225050365aacbb9deeeddc4" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "slab" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slice-group-by" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" + +[[package]] +name = "slices" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2086e458a369cdca838e9f6ed04b4cc2e3ce636d99abb80c9e2eada107749cf" +dependencies = [ + "faster-hex", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "slot-range-helper" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "enumn", + "parity-scale-codec", + "paste", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "snap" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45456094d1983e2ee2a18fdfebce3189fa451699d0502cb8e3b49dba5ba41451" + +[[package]] +name = "snow" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "774d05a3edae07ce6d68ea6984f3c05e9bba8927e3dd591e3b479e5b03213d0d" +dependencies = [ + "aes-gcm 0.9.4", + "blake2", + "chacha20poly1305", + "curve25519-dalek 4.0.0-pre.1", + "rand_core 0.6.4", + "ring", + "rustc_version", + "sha2 0.10.6", + "subtle", +] + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "soketto" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +dependencies = [ + "base64", + "bytes", + "flate2", + "futures", + "http", + "httparse", + "log", + "rand 0.8.5", + "sha-1", +] + +[[package]] +name = "sp-api" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "hash-db 0.16.0", + "log", + "parity-scale-codec", + "sp-api-proc-macro", + "sp-core", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", + "sp-version", + "thiserror", +] + +[[package]] +name = "sp-api-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "Inflector", + "blake2", + "expander 1.0.0", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sp-application-crypto" +version = "7.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-std", +] + +[[package]] +name = "sp-arithmetic" +version = "6.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "integer-sqrt", + "num-traits", + "parity-scale-codec", + "scale-info", + "serde", + "sp-std", + "static_assertions", +] + +[[package]] +name = "sp-authority-discovery" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-block-builder" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "parity-scale-codec", + "sp-api", + "sp-inherents", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-blockchain" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "futures", + "log", + "lru 0.8.1", + "parity-scale-codec", + "parking_lot 0.12.1", + "sp-api", + "sp-consensus", + "sp-database", + "sp-runtime", + "sp-state-machine", + "thiserror", +] + +[[package]] +name = "sp-consensus" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "async-trait", + "futures", + "log", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "thiserror", +] + +[[package]] +name = "sp-consensus-babe" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "async-trait", + "merlin", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-consensus", + "sp-consensus-slots", + "sp-consensus-vrf", + "sp-core", + "sp-inherents", + "sp-keystore", + "sp-runtime", + "sp-std", + "sp-timestamp", +] + +[[package]] +name = "sp-consensus-grandpa" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "finality-grandpa", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-consensus-slots" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-std", + "sp-timestamp", +] + +[[package]] +name = "sp-consensus-vrf" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "parity-scale-codec", + "scale-info", + "schnorrkel", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-core" +version = "7.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "array-bytes", + "base58", + "bitflags", + "blake2", + "bounded-collections", + "dyn-clonable", + "ed25519-zebra", + "futures", + "hash-db 0.16.0", + "hash256-std-hasher", + "impl-serde 0.4.0", + "lazy_static", + "libsecp256k1", + "log", + "merlin", + "parity-scale-codec", + "parking_lot 0.12.1", + "primitive-types", + "rand 0.8.5", + "regex", + "scale-info", + "schnorrkel", + "secp256k1", + "secrecy", + "serde", + "sp-core-hashing", + "sp-debug-derive", + "sp-externalities", + "sp-runtime-interface", + "sp-std", + "sp-storage", + "ss58-registry", + "substrate-bip39", + "thiserror", + "tiny-bip39", + "zeroize", +] + +[[package]] +name = "sp-core-hashing" +version = "5.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "blake2b_simd", + "byteorder", + "digest 0.10.5", + "sha2 0.10.6", + "sha3", + "sp-std", + "twox-hash", +] + +[[package]] +name = "sp-core-hashing-proc-macro" +version = "5.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "proc-macro2", + "quote", + "sp-core-hashing", + "syn 1.0.109", +] + +[[package]] +name = "sp-database" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "kvdb", + "parking_lot 0.12.1", +] + +[[package]] +name = "sp-debug-derive" +version = "5.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sp-externalities" +version = "0.13.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "environmental", + "parity-scale-codec", + "sp-std", + "sp-storage", +] + +[[package]] +name = "sp-inherents" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "async-trait", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std", + "thiserror", +] + +[[package]] +name = "sp-io" +version = "7.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "bytes", + "ed25519", + "ed25519-dalek", + "futures", + "libsecp256k1", + "log", + "parity-scale-codec", + "rustversion", + "secp256k1", + "sp-core", + "sp-externalities", + "sp-keystore", + "sp-runtime-interface", + "sp-state-machine", + "sp-std", + "sp-tracing", + "sp-trie", + "tracing", + "tracing-core", +] + +[[package]] +name = "sp-keyring" +version = "7.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "lazy_static", + "sp-core", + "sp-runtime", + "strum", +] + +[[package]] +name = "sp-keystore" +version = "0.13.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "async-trait", + "futures", + "merlin", + "parity-scale-codec", + "parking_lot 0.12.1", + "schnorrkel", + "serde", + "sp-core", + "sp-externalities", + "thiserror", +] + +[[package]] +name = "sp-maybe-compressed-blob" +version = "4.1.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "thiserror", + "zstd", +] + +[[package]] +name = "sp-npos-elections" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-offchain" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "sp-api", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "sp-panic-handler" +version = "5.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "backtrace", + "lazy_static", + "regex", +] + +[[package]] +name = "sp-rpc" +version = "6.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "rustc-hash", + "serde", + "sp-core", +] + +[[package]] +name = "sp-runtime" +version = "7.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "either", + "hash256-std-hasher", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "paste", + "rand 0.8.5", + "scale-info", + "serde", + "sp-application-crypto", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-std", + "sp-weights", +] + +[[package]] +name = "sp-runtime-interface" +version = "7.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec", + "primitive-types", + "sp-externalities", + "sp-runtime-interface-proc-macro", + "sp-std", + "sp-storage", + "sp-tracing", + "sp-wasm-interface", + "static_assertions", +] + +[[package]] +name = "sp-runtime-interface-proc-macro" +version = "6.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "Inflector", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sp-session" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-core", + "sp-runtime", + "sp-staking", + "sp-std", +] + +[[package]] +name = "sp-staking" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "sp-state-machine" +version = "0.13.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "hash-db 0.16.0", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "rand 0.8.5", + "smallvec", + "sp-core", + "sp-externalities", + "sp-panic-handler", + "sp-std", + "sp-trie", + "thiserror", + "tracing", +] + +[[package]] +name = "sp-std" +version = "5.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" + +[[package]] +name = "sp-storage" +version = "7.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "impl-serde 0.4.0", + "parity-scale-codec", + "ref-cast", + "serde", + "sp-debug-derive", + "sp-std", +] + +[[package]] +name = "sp-timestamp" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "async-trait", + "futures-timer", + "log", + "parity-scale-codec", + "sp-inherents", + "sp-runtime", + "sp-std", + "thiserror", +] + +[[package]] +name = "sp-tracing" +version = "6.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "parity-scale-codec", + "sp-std", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "sp-transaction-pool" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "sp-api", + "sp-runtime", +] + +[[package]] +name = "sp-transaction-storage-proof" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "async-trait", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-std", + "sp-trie", +] + +[[package]] +name = "sp-trie" +version = "7.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "ahash 0.8.3", + "hash-db 0.16.0", + "hashbrown 0.12.3", + "lazy_static", + "memory-db", + "nohash-hasher", + "parity-scale-codec", + "parking_lot 0.12.1", + "scale-info", + "schnellru", + "sp-core", + "sp-std", + "thiserror", + "tracing", + "trie-db", + "trie-root", +] + +[[package]] +name = "sp-version" +version = "5.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "impl-serde 0.4.0", + "parity-scale-codec", + "parity-wasm", + "scale-info", + "serde", + "sp-core-hashing-proc-macro", + "sp-runtime", + "sp-std", + "sp-version-proc-macro", + "thiserror", +] + +[[package]] +name = "sp-version-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "parity-scale-codec", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sp-wasm-interface" +version = "7.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "anyhow", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "sp-std", + "wasmi", + "wasmtime", +] + +[[package]] +name = "sp-weights" +version = "4.0.0" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "smallvec", + "sp-arithmetic", + "sp-core", + "sp-debug-derive", + "sp-std", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "ss58-registry" +version = "1.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e40c020d72bc0a9c5660bb71e4a6fdef081493583062c474740a7d59f55f0e7b" +dependencies = [ + "Inflector", + "num-format", + "proc-macro2", + "quote", + "serde", + "serde_json", + "unicode-xid", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "static_init" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a2a1c578e98c1c16fc3b8ec1328f7659a500737d7a0c6d625e73e830ff9c1f6" +dependencies = [ + "bitflags", + "cfg_aliases", + "libc", + "parking_lot 0.11.2", + "parking_lot_core 0.8.5", + "static_init_macro", + "winapi", +] + +[[package]] +name = "static_init_macro" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a2595fc3aa78f2d0e45dd425b22282dd863273761cc77780914b2cf3003acf" +dependencies = [ + "cfg_aliases", + "memchr", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "stun" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7e94b1ec00bad60e6410e058b52f1c66de3dc5fe4d62d09b3e52bb7d3b73e25" +dependencies = [ + "base64", + "crc", + "lazy_static", + "md-5", + "rand 0.8.5", + "ring", + "subtle", + "thiserror", + "tokio", + "url", + "webrtc-util", +] + +[[package]] +name = "substrate-bip39" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49eee6965196b32f882dd2ee85a92b1dbead41b04e53907f269de3b0dc04733c" +dependencies = [ + "hmac 0.11.0", + "pbkdf2 0.8.0", + "schnorrkel", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "substrate-bn" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b5bbfa79abbae15dd642ea8176a21a635ff3c00059961d1ea27ad04e5b441c" +dependencies = [ + "byteorder", + "crunchy", + "lazy_static", + "rand 0.8.5", + "rustc-hex", +] + +[[package]] +name = "substrate-fixed" +version = "0.5.9" +source = "git+https://github.com/encointer/substrate-fixed#a4fb461aae6205ffc55bed51254a40c52be04e5d" +dependencies = [ + "parity-scale-codec", + "scale-info", + "typenum 1.16.0", +] + +[[package]] +name = "substrate-prometheus-endpoint" +version = "0.10.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "hyper", + "log", + "prometheus", + "thiserror", + "tokio", +] + +[[package]] +name = "substrate-wasm-builder" +version = "5.0.0-dev" +source = "git+https://github.com/purestake/substrate?branch=moonbeam-polkadot-v0.9.40#e7de77328d2b05ea4ed524f7fde7d4a9dbed7a62" +dependencies = [ + "ansi_term", + "build-helper", + "cargo_metadata", + "filetime", + "sp-maybe-compressed-blob", + "strum", + "tempfile", + "toml", + "walkdir", + "wasm-opt", +] + +[[package]] +name = "substring" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86" +dependencies = [ + "autocfg", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79d9531f94112cfc3e4c8f5f02cb2b58f72c97b7efd85f70203cc6d8efda5927" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "system-configuration" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75182f12f490e953596550b65ee31bda7c8e043d9386174b353bda50838c3fd" +dependencies = [ + "bitflags", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "target-lexicon" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02424087780c9b71cc96799eaeddff35af2bc513278cda5c99fc1f5d026d3c1" + +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "termtree" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b" + +[[package]] +name = "thiserror" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "thread_local" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +dependencies = [ + "once_cell", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "thrift" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b82ca8f46f95b3ce96081fe3dd89160fdea970c254bb72925255d1b62aae692e" +dependencies = [ + "byteorder", + "integer-encoding", + "log", + "ordered-float", + "threadpool", +] + +[[package]] +name = "tikv-jemalloc-ctl" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e37706572f4b151dff7a0146e040804e9c26fe3a3118591112f05cf12a4216c1" +dependencies = [ + "libc", + "paste", + "tikv-jemalloc-sys", +] + +[[package]] +name = "tikv-jemalloc-sys" +version = "0.5.2+5.3.0-patched" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec45c14da997d0925c7835883e4d5c181f196fa142f8c19d7643d1e9af2592c3" +dependencies = [ + "cc", + "fs_extra", + "libc", +] + +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "time" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +dependencies = [ + "itoa", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + +[[package]] +name = "time-macros" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +dependencies = [ + "time-core", +] + +[[package]] +name = "tiny-bip39" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" +dependencies = [ + "anyhow", + "hmac 0.12.1", + "once_cell", + "pbkdf2 0.11.0", + "rand 0.8.5", + "rustc-hash", + "sha2 0.10.6", + "thiserror", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +dependencies = [ + "autocfg", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot 0.12.1", + "pin-project-lite 0.2.9", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.45.0", +] + +[[package]] +name = "tokio-macros" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.12", +] + +[[package]] +name = "tokio-rustls" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +dependencies = [ + "rustls 0.20.7", + "tokio", + "webpki 0.22.0", +] + +[[package]] +name = "tokio-stream" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" +dependencies = [ + "futures-core", + "pin-project-lite 0.2.9", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-util" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite 0.2.9", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" + +[[package]] +name = "toml_edit" +version = "0.19.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-range-header", + "pin-project-lite 0.2.9", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite 0.2.9", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tracing-core" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "tracing-gum" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "polkadot-node-jaeger", + "polkadot-primitives", + "tracing", + "tracing-gum-proc-macro", +] + +[[package]] +name = "tracing-gum-proc-macro" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "expander 0.0.6", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "ansi_term", + "chrono", + "lazy_static", + "matchers", + "parking_lot 0.11.2", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "trie-db" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "767abe6ffed88a1889671a102c2861ae742726f52e0a5a425b92c9fbfa7e9c85" +dependencies = [ + "hash-db 0.16.0", + "hashbrown 0.13.2", + "log", + "rustc-hex", + "smallvec", +] + +[[package]] +name = "trie-root" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4ed310ef5ab98f5fa467900ed906cb9232dd5376597e00fd4cba2a449d06c0b" +dependencies = [ + "hash-db 0.16.0", +] + +[[package]] +name = "triehash" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1631b201eb031b563d2e85ca18ec8092508e262a3196ce9bd10a67ec87b9f5c" +dependencies = [ + "hash-db 0.15.2", + "rlp", +] + +[[package]] +name = "trust-dns-proto" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f7f83d1e4a0e4358ac54c5c3681e5d7da5efc5a7a632c90bb6d6669ddd9bc26" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.2.3", + "ipnet", + "lazy_static", + "rand 0.8.5", + "smallvec", + "socket2", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "trust-dns-resolver" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe" +dependencies = [ + "cfg-if", + "futures-util", + "ipconfig", + "lazy_static", + "lru-cache", + "parking_lot 0.12.1", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "tracing", + "trust-dns-proto", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + +[[package]] +name = "tt-call" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e66dcbec4290c69dd03c57e76c2469ea5c7ce109c6dd4351c13055cf71ea055" + +[[package]] +name = "turn" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4712ee30d123ec7ae26d1e1b218395a16c87cdbaf4b3925d170d684af62ea5e8" +dependencies = [ + "async-trait", + "base64", + "futures", + "log", + "md-5", + "rand 0.8.5", + "ring", + "stun", + "thiserror", + "tokio", + "webrtc-util", +] + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "digest 0.10.5", + "rand 0.8.5", + "static_assertions", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "typenum" +version = "1.16.0" +source = "git+https://github.com/encointer/typenum?tag=v1.16.0#4c8dddaa8bdd13130149e43b4085ad14e960617f" +dependencies = [ + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "uint" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a45526d29728d135c2900b0d30573fe3ee79fceb12ef534c7bb30e810a91b601" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array 0.14.6", + "subtle", +] + +[[package]] +name = "unsigned-varint" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836" +dependencies = [ + "asynchronous-codec", + "bytes", + "futures-io", + "futures-util", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna 0.3.0", + "percent-encoding", +] + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "uuid" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79" +dependencies = [ + "getrandom 0.2.8", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "waitgroup" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292" +dependencies = [ + "atomic-waker", +] + +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" + +[[package]] +name = "wasm-instrument" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa1dafb3e60065305741e83db35c6c2584bb3725b692b5b66148a38d72ace6cd" +dependencies = [ + "parity-wasm", +] + +[[package]] +name = "wasm-opt" +version = "0.111.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84a303793cbc01fb96551badfc7367db6007396bba6bac97936b3c8b6f7fdb41" +dependencies = [ + "anyhow", + "libc", + "strum", + "strum_macros", + "tempfile", + "thiserror", + "wasm-opt-cxx-sys", + "wasm-opt-sys", +] + +[[package]] +name = "wasm-opt-cxx-sys" +version = "0.111.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c9deb56f8a9f2ec177b3bd642a8205621835944ed5da55f2388ef216aca5a4" +dependencies = [ + "anyhow", + "cxx", + "cxx-build", + "wasm-opt-sys", +] + +[[package]] +name = "wasm-opt-sys" +version = "0.111.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4432e28b542738a9776cedf92e8a99d8991c7b4667ee2c7ccddfb479dd2856a7" +dependencies = [ + "anyhow", + "cc", + "cxx", + "cxx-build", + "regex", +] + +[[package]] +name = "wasm-timer" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.11.2", + "pin-utils", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmi" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06c326c93fbf86419608361a2c925a31754cf109da1b8b55737070b4d6669422" +dependencies = [ + "parity-wasm", + "wasmi-validation", + "wasmi_core", +] + +[[package]] +name = "wasmi-validation" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ff416ad1ff0c42e5a926ed5d5fab74c0f098749aa0ad8b2a34b982ce0e867b" +dependencies = [ + "parity-wasm", +] + +[[package]] +name = "wasmi_core" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d20cb3c59b788653d99541c646c561c9dd26506f25c0cebfe810659c54c6d7" +dependencies = [ + "downcast-rs", + "libm", + "memory_units", + "num-rational", + "num-traits", + "region", +] + +[[package]] +name = "wasmparser" +version = "0.100.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b20236ab624147dfbb62cf12a19aaf66af0e41b8398838b66e997d07d269d4" +dependencies = [ + "indexmap", + "url", +] + +[[package]] +name = "wasmtime" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e89f9819523447330ffd70367ef4a18d8c832e24e8150fe054d1d912841632" +dependencies = [ + "anyhow", + "bincode", + "cfg-if", + "indexmap", + "libc", + "log", + "object 0.29.0", + "once_cell", + "paste", + "psm", + "rayon", + "serde", + "target-lexicon", + "wasmparser", + "wasmtime-cache", + "wasmtime-cranelift", + "wasmtime-environ", + "wasmtime-jit", + "wasmtime-runtime", + "windows-sys 0.42.0", +] + +[[package]] +name = "wasmtime-asm-macros" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd3a5e46c198032da934469f3a6e48649d1f9142438e4fd4617b68a35644b8a" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "wasmtime-cache" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b389ae9b678b9c3851091a4804f4182d688d27aff7abc9aa37fa7be37d8ecffa" +dependencies = [ + "anyhow", + "base64", + "bincode", + "directories-next", + "file-per-thread-logger", + "log", + "rustix 0.36.7", + "serde", + "sha2 0.10.6", + "toml", + "windows-sys 0.42.0", + "zstd", +] + +[[package]] +name = "wasmtime-cranelift" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b2c92a08c0db6efffd88fdc97d7aa9c7c63b03edb0971dbca745469f820e8c" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "cranelift-wasm", + "gimli 0.26.2", + "log", + "object 0.29.0", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-environ" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a6db9fc52985ba06ca601f2ff0ff1f526c5d724c7ac267b47326304b0c97883" +dependencies = [ + "anyhow", + "cranelift-entity", + "gimli 0.26.2", + "indexmap", + "log", + "object 0.29.0", + "serde", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-types", +] + +[[package]] +name = "wasmtime-jit" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b77e3a52cd84d0f7f18554afa8060cfe564ccac61e3b0802d3fd4084772fa5f6" +dependencies = [ + "addr2line 0.17.0", + "anyhow", + "bincode", + "cfg-if", + "cpp_demangle", + "gimli 0.26.2", + "log", + "object 0.29.0", + "rustc-demangle", + "serde", + "target-lexicon", + "wasmtime-environ", + "wasmtime-jit-debug", + "wasmtime-jit-icache-coherence", + "wasmtime-runtime", + "windows-sys 0.42.0", +] + +[[package]] +name = "wasmtime-jit-debug" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0245e8a9347017c7185a72e215218a802ff561545c242953c11ba00fccc930f" +dependencies = [ + "object 0.29.0", + "once_cell", + "rustix 0.36.7", +] + +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67d412e9340ab1c83867051d8d1d7c90aa8c9afc91da086088068e2734e25064" +dependencies = [ + "cfg-if", + "libc", + "windows-sys 0.42.0", +] + +[[package]] +name = "wasmtime-runtime" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d594e791b5fdd4dbaf8cf7ae62f2e4ff85018ce90f483ca6f42947688e48827d" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "indexmap", + "libc", + "log", + "mach", + "memfd", + "memoffset", + "paste", + "rand 0.8.5", + "rustix 0.36.7", + "wasmtime-asm-macros", + "wasmtime-environ", + "wasmtime-jit-debug", + "windows-sys 0.42.0", +] + +[[package]] +name = "wasmtime-types" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6688d6f96d4dbc1f89fab626c56c1778936d122b5f4ae7a57c2eb42b8d982e2" +dependencies = [ + "cranelift-entity", + "serde", + "thiserror", + "wasmparser", +] + +[[package]] +name = "web-sys" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.22.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368bfe657969fb01238bb756d351dcade285e0f6fcbd36dcb23359a5169975be" +dependencies = [ + "webpki 0.22.0", +] + +[[package]] +name = "webrtc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3bc9049bdb2cea52f5fd4f6f728184225bdb867ed0dc2410eab6df5bdd67bb" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "hex", + "interceptor", + "lazy_static", + "log", + "rand 0.8.5", + "rcgen 0.9.3", + "regex", + "ring", + "rtcp", + "rtp", + "rustls 0.19.1", + "sdp", + "serde", + "serde_json", + "sha2 0.10.6", + "stun", + "thiserror", + "time 0.3.17", + "tokio", + "turn", + "url", + "waitgroup", + "webrtc-data", + "webrtc-dtls", + "webrtc-ice", + "webrtc-mdns", + "webrtc-media", + "webrtc-sctp", + "webrtc-srtp", + "webrtc-util", +] + +[[package]] +name = "webrtc-data" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef36a4d12baa6e842582fe9ec16a57184ba35e1a09308307b67d43ec8883100" +dependencies = [ + "bytes", + "derive_builder", + "log", + "thiserror", + "tokio", + "webrtc-sctp", + "webrtc-util", +] + +[[package]] +name = "webrtc-dtls" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7021987ae0a2ed6c8cd33f68e98e49bb6e74ffe9543310267b48a1bbe3900e5f" +dependencies = [ + "aes 0.6.0", + "aes-gcm 0.8.0", + "async-trait", + "bincode", + "block-modes", + "byteorder", + "ccm", + "curve25519-dalek 3.2.0", + "der-parser 8.1.0", + "elliptic-curve", + "hkdf", + "hmac 0.10.1", + "log", + "oid-registry 0.6.1", + "p256", + "p384", + "rand 0.8.5", + "rand_core 0.6.4", + "rcgen 0.9.3", + "ring", + "rustls 0.19.1", + "sec1", + "serde", + "sha-1", + "sha2 0.9.9", + "signature", + "subtle", + "thiserror", + "tokio", + "webpki 0.21.4", + "webrtc-util", + "x25519-dalek 2.0.0-pre.1", + "x509-parser 0.13.2", +] + +[[package]] +name = "webrtc-ice" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494483fbb2f5492620871fdc78b084aed8807377f6e3fe88b2e49f0a9c9c41d7" +dependencies = [ + "arc-swap", + "async-trait", + "crc", + "log", + "rand 0.8.5", + "serde", + "serde_json", + "stun", + "thiserror", + "tokio", + "turn", + "url", + "uuid", + "waitgroup", + "webrtc-mdns", + "webrtc-util", +] + +[[package]] +name = "webrtc-mdns" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f08dfd7a6e3987e255c4dbe710dde5d94d0f0574f8a21afa95d171376c143106" +dependencies = [ + "log", + "socket2", + "thiserror", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-media" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2a3c157a040324e5049bcbd644ffc9079e6738fa2cfab2bcff64e5cc4c00d7" +dependencies = [ + "byteorder", + "bytes", + "derive_builder", + "displaydoc", + "rand 0.8.5", + "rtp", + "thiserror", + "webrtc-util", +] + +[[package]] +name = "webrtc-sctp" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d47adcd9427eb3ede33d5a7f3424038f63c965491beafcc20bc650a2f6679c0" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "crc", + "log", + "rand 0.8.5", + "thiserror", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-srtp" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6183edc4c1c6c0175f8812eefdce84dfa0aea9c3ece71c2bf6ddd3c964de3da5" +dependencies = [ + "aead 0.4.3", + "aes 0.7.5", + "aes-gcm 0.9.4", + "async-trait", + "byteorder", + "bytes", + "ctr 0.8.0", + "hmac 0.11.0", + "log", + "rtcp", + "rtp", + "sha-1", + "subtle", + "thiserror", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-util" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f1db1727772c05cf7a2cfece52c3aca8045ca1e176cd517d323489aa3c6d87" +dependencies = [ + "async-trait", + "bitflags", + "bytes", + "cc", + "ipnet", + "lazy_static", + "libc", + "log", + "nix", + "rand 0.8.5", + "thiserror", + "tokio", + "winapi", +] + +[[package]] +name = "wepoll-ffi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" +dependencies = [ + "cc", +] + +[[package]] +name = "which" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b" +dependencies = [ + "either", + "libc", + "once_cell", +] + +[[package]] +name = "wide" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b689b6c49d6549434bf944e6b0f39238cf63693cb7a147e9d887507fffa3b223" +dependencies = [ + "bytemuck", + "safe_arch", +] + +[[package]] +name = "widestring" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f" +dependencies = [ + "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]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", +] + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_i686_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "winnow" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +dependencies = [ + "winapi", +] + +[[package]] +name = "wyz" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b31594f29d27036c383b53b59ed3476874d518f0efb151b27a4c275141390e" +dependencies = [ + "tap", +] + +[[package]] +name = "x25519-dalek" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a0c105152107e3b96f6a00a65e86ce82d9b125230e1c4302940eca58ff71f4f" +dependencies = [ + "curve25519-dalek 3.2.0", + "rand_core 0.5.1", + "zeroize", +] + +[[package]] +name = "x25519-dalek" +version = "2.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5da623d8af10a62342bcbbb230e33e58a63255a58012f8653c578e54bab48df" +dependencies = [ + "curve25519-dalek 3.2.0", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "x509-parser" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9bace5b5589ffead1afb76e43e34cff39cd0f3ce7e170ae0c29e53b88eb1c" +dependencies = [ + "asn1-rs 0.3.1", + "base64", + "data-encoding", + "der-parser 7.0.0", + "lazy_static", + "nom", + "oid-registry 0.4.0", + "ring", + "rusticata-macros", + "thiserror", + "time 0.3.17", +] + +[[package]] +name = "x509-parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +dependencies = [ + "asn1-rs 0.5.1", + "base64", + "data-encoding", + "der-parser 8.1.0", + "lazy_static", + "nom", + "oid-registry 0.6.1", + "rusticata-macros", + "thiserror", + "time 0.3.17", +] + +[[package]] +name = "xcm" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "bounded-collections", + "derivative", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-weights", + "xcm-procedural", +] + +[[package]] +name = "xcm-builder" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-transaction-payment", + "parity-scale-codec", + "polkadot-parachain", + "scale-info", + "sp-arithmetic", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", + "xcm-executor", +] + +[[package]] +name = "xcm-executor" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "environmental", + "frame-benchmarking", + "frame-support", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std", + "sp-weights", + "xcm", +] + +[[package]] +name = "xcm-primitives" +version = "0.1.0" +source = "git+https://github.com/PureStake/moonbeam?rev=runtime-2402#030f898f1fd82977cbcb30d99db50e448a409bb3" +dependencies = [ + "cumulus-primitives-core", + "ethereum", + "ethereum-types", + "frame-benchmarking", + "frame-support", + "frame-system", + "hex", + "impl-trait-for-tuples", + "log", + "orml-traits", + "parity-scale-codec", + "scale-info", + "serde", + "sha3", + "sp-io", + "sp-runtime", + "sp-std", + "xcm", + "xcm-builder", + "xcm-executor", +] + +[[package]] +name = "xcm-procedural" +version = "0.9.40" +source = "git+https://github.com/purestake/polkadot?branch=moonbeam-polkadot-v0.9.40#89fd916a027ea7fb4a1b0092d0259e7897b45a79" +dependencies = [ + "Inflector", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "yamux" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d9ba232399af1783a58d8eb26f6b5006fbefe2dc9ef36bd283324792d03ea5" +dependencies = [ + "futures", + "log", + "nohash-hasher", + "parking_lot 0.12.1", + "rand 0.8.5", + "static_assertions", +] + +[[package]] +name = "yasna" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aed2e7a52e3744ab4d0c05c20aa065258e84c49fd4226f5191b2ed29712710b4" +dependencies = [ + "time 0.3.17", +] + +[[package]] +name = "zeroize" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.1+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd07cbbc53846d9145dbffdf6dd09a7a0aa52be46741825f5c97bdd4f73f12b" +dependencies = [ + "cc", + "libc", +] diff --git a/tracing/2402/Cargo.toml b/tracing/2402/Cargo.toml new file mode 100644 index 0000000..d99794c --- /dev/null +++ b/tracing/2402/Cargo.toml @@ -0,0 +1,422 @@ +[workspace] +members = [ + "runtime/moonbase", + "runtime/moonbeam", + "runtime/moonriver", +] +resolver = "2" + +[workspace.package] +authors = ["PureStake"] +repository = "https://github.com/PureStake/moonbeam" + +[workspace.dependencies] +# Dependencies are split into 2 groups: wasm and client. +# - "wasm" dependencies requires to be no_std compatible, which often requires +# `default-features = false`. When used in a client-side crate the "std" feature should be enabled +# there if it exists. +# - "client" dependencies are only used in the client, and thus don't need to be no_std compatible. + +# Moonbeam (wasm) +account = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +evm-tracing-events = { path = "shared/primitives/rpc/evm-tracing-events", default-features = false , features = ["runtime-1600"] } +moonbeam-core-primitives = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +moonbeam-primitives-ext = { path = "shared/primitives/ext", default-features = false } +moonbeam-rpc-primitives-debug = { path = "shared/primitives/rpc/debug", default-features = false } +moonbeam-rpc-primitives-txpool = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } + +moonbeam-evm-tracer = { path = "shared/runtime/evm_tracer", default-features = false } +moonbeam-relay-encoder = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +moonbeam-runtime-common = { path = "runtime/common", default-features = false } + +moonbeam-xcm-benchmarks = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-asset-manager = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-author-mapping = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-erc20-xcm-bridge = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-ethereum-chain-id = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-ethereum-xcm = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } + +pallet-evm-precompile-author-mapping = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-balances-erc20 = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-batch = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-call-permit = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-collective = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-conviction-voting = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-crowdloan-rewards = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-democracy = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-gmp = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-parachain-staking = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-preimage = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-proxy = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-randomness = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-referenda = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-registry = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-relay-encoder = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-xcm-transactor = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-xcm-utils = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompile-xtokens = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-evm-precompileset-assets-erc20 = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-maintenance-mode = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-migrations = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-moonbeam-orbiters = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-parachain-staking = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-proxy-genesis-companion = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-randomness = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +pallet-xcm-transactor = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +precompile-utils = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +session-keys-primitives = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +xcm-primitives = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } + +pallet-crowdloan-rewards = { git = "https://github.com/purestake/crowdloan-rewards", branch = "moonbeam-polkadot-v0.9.40", default-features = false } + +# Moonbeam (client) +moonbeam-cli = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +moonbeam-cli-opt = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +moonbeam-service = { default-features = false , git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } + +manual-xcm-rpc = { git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +moonbeam-client-evm-tracing = { git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +moonbeam-finality-rpc = { git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +moonbeam-rpc-core-debug = { git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +moonbeam-rpc-core-trace = { git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +moonbeam-rpc-core-txpool = { git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +moonbeam-rpc-core-types = { git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +moonbeam-rpc-debug = { git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +moonbeam-rpc-trace = { git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +moonbeam-rpc-txpool = { git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } +moonbeam-vrf = { git = "https://github.com/PureStake/moonbeam", rev = "runtime-2402" } + +moonbase-runtime = { path = "runtime/moonbase" } +moonbeam-runtime = { path = "runtime/moonbeam" } +moonriver-runtime = { path = "runtime/moonriver" } + +# Substrate (wasm) +frame-benchmarking = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +frame-executive = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +frame-support = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +frame-system = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +frame-system-benchmarking = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +frame-system-rpc-runtime-api = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +frame-try-runtime = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-assets = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-balances = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-collective = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-conviction-voting = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-democracy = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-identity = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-multisig = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-preimage = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-proxy = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-referenda = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-root-testing = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-scheduler = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-society = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-staking = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-sudo = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-timestamp = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-transaction-payment = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-treasury = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-utility = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-whitelist = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +parity-scale-codec = { version = "3.2.2", default-features = false, features = [ + "derive", +] } +scale-info = { version = "2.0", default-features = false, features = [ + "derive", +] } +sp-api = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-application-crypto = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-block-builder = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-consensus-babe = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-consensus-vrf = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-core = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-debug-derive = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-externalities = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-inherents = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-io = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-keystore = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-offchain = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-runtime = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-runtime-interface = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-session = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-std = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-transaction-pool = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +sp-version = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +substrate-fixed = { git = "https://github.com/encointer/substrate-fixed", default-features = false } + +# Substrate (client) +frame-benchmarking-cli = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +pallet-transaction-payment-rpc = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-basic-authorship = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-block-builder = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-chain-spec = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-cli = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-client-api = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-client-db = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-consensus = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-consensus-grandpa = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-consensus-manual-seal = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-executor = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-informant = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-network = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-network-common = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-network-sync = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-rpc = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-rpc-api = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-service = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-sysinfo = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-telemetry = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-tracing = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-transaction-pool = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-transaction-pool-api = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sc-utils = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sp-blockchain = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sp-consensus = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sp-storage = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sp-timestamp = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sp-trie = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +sp-wasm-interface = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +substrate-build-script-utils = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +substrate-frame-rpc-system = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +substrate-prometheus-endpoint = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +substrate-test-client = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +substrate-test-runtime = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +substrate-test-runtime-client = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +substrate-wasm-builder = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } +try-runtime-cli = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.40" } + +# Frontier (wasm) +ethereum = { version = "0.14.0", default-features = false, features = [ + "with-codec", +] } +ethereum-types = { version = "0.14", default-features = false } +evm = { git = "https://github.com/purestake/evm", branch = "tgm-record-external-cost", default-features = false } +evm-gasometer = { git = "https://github.com/purestake/evm", branch = "tgm-record-external-cost", default-features = false } +evm-runtime = { git = "https://github.com/purestake/evm", branch = "tgm-record-external-cost", default-features = false } +fp-ethereum = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +fp-evm = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +fp-rpc = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +fp-self-contained = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-base-fee = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-ethereum = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40", default-features = false, features = [ + "forbid-evm-reentrancy", + "evm-with-weight-limit", +] } +pallet-evm = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40", default-features = false, features = [ + "forbid-evm-reentrancy", + "evm-with-weight-limit", +] } +pallet-evm-precompile-blake2 = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40", default-features = false, features = [ + "evm-with-weight-limit", +] } +pallet-evm-precompile-bn128 = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40", default-features = false, features = [ + "evm-with-weight-limit", +] } +pallet-evm-precompile-dispatch = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40", default-features = false, features = [ + "evm-with-weight-limit", +] } +pallet-evm-precompile-modexp = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40", default-features = false, features = [ + "evm-with-weight-limit", +] } +pallet-evm-precompile-sha3fips = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-evm-precompile-simple = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40", default-features = false, features = [ + "evm-with-weight-limit", +] } + +# Frontier (client) +fc-consensus = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40" } +fc-db = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40" } +fc-mapping-sync = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40" } +fc-rpc = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40", features = [ + "rpc-binary-search-estimate", +] } +fc-rpc-core = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40" } +fc-storage = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40" } +fp-consensus = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40" } +fp-storage = { git = "https://github.com/purestake/frontier", branch = "moonbeam-polkadot-v0.9.40" } + +# Cumulus / Nimbus (wasm) +cumulus-pallet-dmp-queue = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +cumulus-pallet-parachain-system = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +cumulus-pallet-xcm = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +cumulus-pallet-xcmp-queue = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +cumulus-primitives-core = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +cumulus-primitives-parachain-inherent = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +cumulus-primitives-timestamp = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +cumulus-primitives-utility = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +cumulus-test-relay-sproof-builder = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +nimbus-primitives = { git = "https://github.com/purestake/nimbus", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-author-inherent = { git = "https://github.com/purestake/nimbus", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-author-slot-filter = { git = "https://github.com/purestake/nimbus", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +parachain-info = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40", default-features = false } + +# Cumulus / Nimbus (client) +cumulus-client-cli = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40" } +cumulus-client-collator = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40" } +cumulus-client-consensus-common = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40" } +cumulus-client-consensus-relay-chain = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40" } +cumulus-client-network = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40" } +cumulus-client-service = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40" } +cumulus-relay-chain-inprocess-interface = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40" } +cumulus-relay-chain-interface = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40" } +cumulus-relay-chain-minimal-node = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40" } +cumulus-relay-chain-rpc-interface = { git = "https://github.com/purestake/cumulus", branch = "moonbeam-polkadot-v0.9.40" } +nimbus-consensus = { git = "https://github.com/purestake/nimbus", branch = "moonbeam-polkadot-v0.9.40" } + +# Polkadot / XCM (wasm) +orml-traits = { git = "https://github.com/purestake/open-runtime-module-library", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +orml-xcm-support = { git = "https://github.com/purestake/open-runtime-module-library", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +orml-xtokens = { git = "https://github.com/purestake/open-runtime-module-library", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-xcm = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +pallet-xcm-benchmarks = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +polkadot-core-primitives = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +polkadot-parachain = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +xcm = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +xcm-builder = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40", default-features = false } +xcm-executor = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40", default-features = false } + +# Polkadot / XCM (client) +kusama-runtime = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40" } +polkadot-cli = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40" } +polkadot-primitives = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40" } +polkadot-runtime = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40" } +polkadot-runtime-common = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40" } +polkadot-runtime-parachains = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40" } +polkadot-service = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40" } +rococo-runtime = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40" } +westend-runtime = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40" } +xcm-simulator = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.40" } + +# Other (wasm) +affix = "0.1.2" +async-trait = { version = "0.1.42" } +blake2-rfc = { version = "0.2.18", default-features = false } +derive_more = "0.99" +environmental = { version = "1.1.2", default-features = false } +hex = { version = "0.4.3", default-features = false } +hex-literal = { version = "0.3.4" } +impl-serde = { version = "0.3.1", default-features = false } +impl-trait-for-tuples = "0.2.1" +libsecp256k1 = { version = "0.7", default-features = false } +log = { version = "0.4", default-features = false } +num_enum = { version = "0.5.3", default-features = false } +paste = "1.0.6" +rlp = { version = "0.5", default-features = false } +rustc-hex = { version = "2.0.1", default-features = false } +serde = { version = "1.0.101", default-features = false } +sha3 = { version = "0.10", default-features = false } +slices = "0.2.0" +smallvec = "1.8.0" +strum = { version = "0.24", default-features = false, features = ["derive"] } +strum_macros = "0.24" + +# Other (client) +ansi_term = "0.12.1" +assert_cmd = "2.0.10" +async-io = "1.3" +bip32 = { git = "https://github.com/purestake/crates", branch = "bip32-v0.4.0-fix", default-features = false, features = [ + "bip39", +] } +clap = { version = "4.0.9", features = ["derive"] } +exit-future = "0.2" +flume = "0.10.9" +futures = { version = "0.3.21" } +jsonrpsee = { version = "0.16.2", default-features = false } +maplit = "1.0.2" +nix = "0.23" +parking_lot = "0.12.0" +primitive-types = "0.12.0" +prometheus = { version = "0.13.0", default-features = false } +rand = "0.7.3" +serde_json = { version = "1.0" } +similar-asserts = "1.1.0" +tempfile = "3.2.0" +tiny-bip39 = { version = "0.8", default-features = false } +tokio = { version = "1.13" } +tracing = "0.1.34" +tracing-core = "0.1.29" +trie-root = "0.15.2" +url = "2.2.2" + +# The list of dependencies below (which can be both direct and indirect dependencies) are crates +# that are suspected to be CPU-intensive, and that are unlikely to require debugging (as some of +# their debug info might be missing) or to require to be frequently recompiled. We compile these +# dependencies with `opt-level=3` even in "dev" mode in order to make "dev" mode more usable. +# The majority of these crates are cryptographic libraries. +# +# Note that this does **not** affect crates that depend on Moonbeam. In other words, if you add +# a dependency on Moonbeam, you have to copy-paste this list in your own `Cargo.toml` (assuming +# that you want the same list). This list is only relevant when running `cargo build` from within +# the Moonbeam workspace. +# +# If you see an error mentioning "profile package spec ... did not match any packages", it +# probably concerns this list. +# +# This list is ordered alphabetically. +[profile.dev.package] +blake2 = { opt-level = 3 } +blake2b_simd = { opt-level = 3 } +chacha20poly1305 = { opt-level = 3 } +cranelift-codegen = { opt-level = 3 } +cranelift-wasm = { opt-level = 3 } +crc32fast = { opt-level = 3 } +crossbeam-deque = { opt-level = 3 } +crypto-mac = { opt-level = 3 } +curve25519-dalek = { opt-level = 3 } +ed25519-zebra = { opt-level = 3 } +flate2 = { opt-level = 3 } +futures-channel = { opt-level = 3 } +hash-db = { opt-level = 3 } +hashbrown = { opt-level = 3 } +hmac = { opt-level = 3 } +httparse = { opt-level = 3 } +integer-sqrt = { opt-level = 3 } +k256 = { opt-level = 3 } +keccak = { opt-level = 3 } +libm = { opt-level = 3 } +librocksdb-sys = { opt-level = 3 } +libsecp256k1 = { opt-level = 3 } +libz-sys = { opt-level = 3 } +mio = { opt-level = 3 } +nalgebra = { opt-level = 3 } +num-bigint = { opt-level = 3 } +parking_lot = { opt-level = 3 } +parking_lot_core = { opt-level = 3 } +percent-encoding = { opt-level = 3 } +primitive-types = { opt-level = 3 } +ring = { opt-level = 3 } +rustls = { opt-level = 3 } +secp256k1 = { opt-level = 3 } +sha2 = { opt-level = 3 } +sha3 = { opt-level = 3 } +smallvec = { opt-level = 3 } +snow = { opt-level = 3 } +twox-hash = { opt-level = 3 } +uint = { opt-level = 3 } +wasmi = { opt-level = 3 } +x25519-dalek = { opt-level = 3 } +yamux = { opt-level = 3 } +zeroize = { opt-level = 3 } + +# make sure dev builds with backtrace do +# not slow us down +[profile.dev.package.backtrace] +inherits = "release" + +[profile.production] +codegen-units = 1 +incremental = false +inherits = "release" +lto = true + +[profile.testnet] +inherits = "release" +debug = 1 # debug symbols are useful for profilers +debug-assertions = true +overflow-checks = true + +[profile.release] +# Moonbeam runtime requires unwinding. +opt-level = 3 +panic = "unwind" diff --git a/tracing/2402/runtime/common/Cargo.toml b/tracing/2402/runtime/common/Cargo.toml new file mode 100644 index 0000000..7dff076 --- /dev/null +++ b/tracing/2402/runtime/common/Cargo.toml @@ -0,0 +1,81 @@ +[package] +name = "moonbeam-runtime-common" +authors = { workspace = true } +description = "Common code shared between runtimes" +edition = "2021" +homepage = "https://moonbeam.network" +license = "GPL-3.0-only" +version = "0.8.0-dev" + +[dependencies] +hex-literal = "0.3.4" +impl-trait-for-tuples = "0.2.1" +log = "0.4" + +# Moonbeam +moonbeam-xcm-benchmarks = { workspace = true, optional = true } +pallet-asset-manager = { workspace = true } +pallet-author-mapping = { workspace = true } +pallet-ethereum-xcm = { workspace = true } +pallet-migrations = { workspace = true } +pallet-parachain-staking = { workspace = true } +pallet-randomness = { workspace = true } +pallet-xcm-transactor = { workspace = true } +precompile-utils = { workspace = true } +xcm-primitives = { workspace = true } + +# Substrate +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-collective = { workspace = true } +pallet-democracy = { workspace = true } +pallet-preimage = { workspace = true } +pallet-referenda = { workspace = true } +pallet-scheduler = { workspace = true } +sp-core = { workspace = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } + +# Frontier +fp-ethereum = { workspace = true } +fp-evm = { workspace = true } +pallet-base-fee = { workspace = true } +pallet-evm = { workspace = true, features = [ "forbid-evm-reentrancy" ] } + +# Nimbus +pallet-author-inherent = { workspace = true } +pallet-author-slot-filter = { workspace = true } + +# Polkadot +xcm = { workspace = true } +xcm-executor = { workspace = true } + +[features] +std = [ + "fp-ethereum/std", + "fp-evm/std", + "frame-support/std", + "pallet-asset-manager/std", + "pallet-author-inherent/std", + "pallet-author-mapping/std", + "pallet-base-fee/std", + "pallet-ethereum-xcm/std", + "pallet-evm/std", + "pallet-migrations/std", + "pallet-parachain-staking/std", + "pallet-randomness/std", + "pallet-referenda/std", + "pallet-scheduler/std", + "pallet-xcm-transactor/std", + "precompile-utils/std", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", + "xcm-executor/std", + "xcm/std", +] +runtime-benchmarks = [ "pallet-ethereum-xcm/runtime-benchmarks", "pallet-referenda/runtime-benchmarks" ] +try-runtime = [ + "frame-support/try-runtime", + "pallet-migrations/try-runtime", +] diff --git a/tracing/2402/runtime/common/src/apis.rs b/tracing/2402/runtime/common/src/apis.rs new file mode 100644 index 0000000..4a923b9 --- /dev/null +++ b/tracing/2402/runtime/common/src/apis.rs @@ -0,0 +1,887 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +#[macro_export] +macro_rules! impl_runtime_apis_plus_common { + {$($custom:tt)*} => { + impl_runtime_apis! { + $($custom)* + + impl sp_api::Core for Runtime { + fn version() -> RuntimeVersion { + VERSION + } + + fn execute_block(block: Block) { + Executive::execute_block(block) + } + + fn initialize_block(header: &::Header) { + Executive::initialize_block(header) + } + } + + impl sp_api::Metadata for Runtime { + fn metadata() -> OpaqueMetadata { + OpaqueMetadata::new(Runtime::metadata().into()) + } + } + + impl sp_block_builder::BlockBuilder for Runtime { + fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { + Executive::apply_extrinsic(extrinsic) + } + + fn finalize_block() -> ::Header { + Executive::finalize_block() + } + + fn inherent_extrinsics( + data: sp_inherents::InherentData, + ) -> Vec<::Extrinsic> { + data.create_extrinsics() + } + + fn check_inherents( + block: Block, + data: sp_inherents::InherentData, + ) -> sp_inherents::CheckInherentsResult { + data.check_extrinsics(&block) + } + } + + impl sp_offchain::OffchainWorkerApi for Runtime { + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) + } + } + + impl sp_session::SessionKeys for Runtime { + fn decode_session_keys( + encoded: Vec, + ) -> Option, sp_core::crypto::KeyTypeId)>> { + opaque::SessionKeys::decode_into_raw_public_keys(&encoded) + } + + fn generate_session_keys(seed: Option>) -> Vec { + opaque::SessionKeys::generate(seed) + } + } + + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { + fn account_nonce(account: AccountId) -> Index { + System::account_nonce(account) + } + } + + impl moonbeam_rpc_primitives_debug::DebugRuntimeApi for Runtime { + fn trace_transaction( + extrinsics: Vec<::Extrinsic>, + traced_transaction: &EthereumTransaction, + ) -> Result< + (), + sp_runtime::DispatchError, + > { + #[cfg(feature = "evm-tracing")] + { + use moonbeam_evm_tracer::tracer::EvmTracer; + use xcm_primitives::{ + ETHEREUM_XCM_TRACING_STORAGE_KEY, + EthereumXcmTracingStatus + }; + use frame_support::storage::unhashed; + + // Tell the CallDispatcher we are tracing a specific Transaction. + unhashed::put::( + ETHEREUM_XCM_TRACING_STORAGE_KEY, + &EthereumXcmTracingStatus::Transaction(traced_transaction.hash()), + ); + + // Apply the a subset of extrinsics: all the substrate-specific or ethereum + // transactions that preceded the requested transaction. + for ext in extrinsics.into_iter() { + let _ = match &ext.0.function { + RuntimeCall::Ethereum(transact { transaction }) => { + if transaction == traced_transaction { + EvmTracer::new().trace(|| Executive::apply_extrinsic(ext)); + return Ok(()); + } else { + Executive::apply_extrinsic(ext) + } + } + _ => Executive::apply_extrinsic(ext), + }; + if let Some(EthereumXcmTracingStatus::TransactionExited) = unhashed::get( + ETHEREUM_XCM_TRACING_STORAGE_KEY + ) { + return Ok(()); + } + } + Err(sp_runtime::DispatchError::Other( + "Failed to find Ethereum transaction among the extrinsics.", + )) + } + #[cfg(not(feature = "evm-tracing"))] + Err(sp_runtime::DispatchError::Other( + "Missing `evm-tracing` compile time feature flag.", + )) + } + + fn trace_block( + extrinsics: Vec<::Extrinsic>, + known_transactions: Vec, + ) -> Result< + (), + sp_runtime::DispatchError, + > { + #[cfg(feature = "evm-tracing")] + { + use moonbeam_evm_tracer::tracer::EvmTracer; + use xcm_primitives::EthereumXcmTracingStatus; + + // Tell the CallDispatcher we are tracing a full Block. + frame_support::storage::unhashed::put::( + xcm_primitives::ETHEREUM_XCM_TRACING_STORAGE_KEY, + &EthereumXcmTracingStatus::Block, + ); + + let mut config = ::config().clone(); + config.estimate = true; + + // Apply all extrinsics. Ethereum extrinsics are traced. + for ext in extrinsics.into_iter() { + match &ext.0.function { + RuntimeCall::Ethereum(transact { transaction }) => { + if known_transactions.contains(&transaction.hash()) { + // Each known extrinsic is a new call stack. + EvmTracer::emit_new(); + EvmTracer::new().trace(|| Executive::apply_extrinsic(ext)); + } else { + let _ = Executive::apply_extrinsic(ext); + } + } + _ => { + let _ = Executive::apply_extrinsic(ext); + } + }; + } + + Ok(()) + } + #[cfg(not(feature = "evm-tracing"))] + Err(sp_runtime::DispatchError::Other( + "Missing `evm-tracing` compile time feature flag.", + )) + } + } + + impl moonbeam_rpc_primitives_txpool::TxPoolRuntimeApi for Runtime { + fn extrinsic_filter( + xts_ready: Vec<::Extrinsic>, + xts_future: Vec<::Extrinsic>, + ) -> TxPoolResponse { + TxPoolResponse { + ready: xts_ready + .into_iter() + .filter_map(|xt| match xt.0.function { + RuntimeCall::Ethereum(transact { transaction }) => Some(transaction), + _ => None, + }) + .collect(), + future: xts_future + .into_iter() + .filter_map(|xt| match xt.0.function { + RuntimeCall::Ethereum(transact { transaction }) => Some(transaction), + _ => None, + }) + .collect(), + } + } + } + + impl fp_rpc::EthereumRuntimeRPCApi for Runtime { + fn chain_id() -> u64 { + ::ChainId::get() + } + + fn account_basic(address: H160) -> EVMAccount { + let (account, _) = EVM::account_basic(&address); + account + } + + fn gas_price() -> U256 { + let (gas_price, _) = ::FeeCalculator::min_gas_price(); + gas_price + } + + fn account_code_at(address: H160) -> Vec { + pallet_evm::AccountCodes::::get(address) + } + + fn author() -> H160 { + >::find_author() + } + + fn storage_at(address: H160, index: U256) -> H256 { + let mut tmp = [0u8; 32]; + index.to_big_endian(&mut tmp); + pallet_evm::AccountStorages::::get(address, H256::from_slice(&tmp[..])) + } + + fn call( + from: H160, + to: H160, + data: Vec, + value: U256, + gas_limit: U256, + max_fee_per_gas: Option, + max_priority_fee_per_gas: Option, + nonce: Option, + estimate: bool, + access_list: Option)>>, + ) -> Result { + let config = if estimate { + let mut config = ::config().clone(); + config.estimate = true; + Some(config) + } else { + None + }; + let is_transactional = false; + let validate = true; + + let mut estimated_transaction_len = data.len() + + // to: 20 + // from: 20 + // value: 32 + // gas_limit: 32 + // nonce: 32 + // 1 byte transaction action variant + // chain id 8 bytes + // 65 bytes signature + 210; + if max_fee_per_gas.is_some() { + estimated_transaction_len += 32; + } + if max_priority_fee_per_gas.is_some() { + estimated_transaction_len += 32; + } + if access_list.is_some() { + estimated_transaction_len += access_list.encoded_size(); + } + + let gas_limit = gas_limit.min(u64::MAX.into()).low_u64(); + let without_base_extrinsic_weight = true; + + let (weight_limit, proof_size_base_cost) = + match ::GasWeightMapping::gas_to_weight( + gas_limit, + without_base_extrinsic_weight + ) { + weight_limit if weight_limit.proof_size() > 0 => { + (Some(weight_limit), Some(estimated_transaction_len as u64)) + } + _ => (None, None), + }; + + ::Runner::call( + from, + to, + data, + value, + gas_limit, + max_fee_per_gas, + max_priority_fee_per_gas, + nonce, + access_list.unwrap_or_default(), + is_transactional, + validate, + weight_limit, + proof_size_base_cost, + config.as_ref().unwrap_or(::config()), + ).map_err(|err| err.error.into()) + } + + fn create( + from: H160, + data: Vec, + value: U256, + gas_limit: U256, + max_fee_per_gas: Option, + max_priority_fee_per_gas: Option, + nonce: Option, + estimate: bool, + access_list: Option)>>, + ) -> Result { + let config = if estimate { + let mut config = ::config().clone(); + config.estimate = true; + Some(config) + } else { + None + }; + let is_transactional = false; + let validate = true; + + let mut estimated_transaction_len = data.len() + + // to: 20 + // from: 20 + // value: 32 + // gas_limit: 32 + // nonce: 32 + // 1 byte transaction action variant + // chain id 8 bytes + // 65 bytes signature + 210; + if max_fee_per_gas.is_some() { + estimated_transaction_len += 32; + } + if max_priority_fee_per_gas.is_some() { + estimated_transaction_len += 32; + } + if access_list.is_some() { + estimated_transaction_len += access_list.encoded_size(); + } + + let gas_limit = if gas_limit > U256::from(u64::MAX) { + u64::MAX + } else { + gas_limit.low_u64() + }; + let without_base_extrinsic_weight = true; + + let (weight_limit, proof_size_base_cost) = + match ::GasWeightMapping::gas_to_weight( + gas_limit, + without_base_extrinsic_weight + ) { + weight_limit if weight_limit.proof_size() > 0 => { + (Some(weight_limit), Some(estimated_transaction_len as u64)) + } + _ => (None, None), + }; + + #[allow(clippy::or_fun_call)] // suggestion not helpful here + ::Runner::create( + from, + data, + value, + gas_limit, + max_fee_per_gas, + max_priority_fee_per_gas, + nonce, + access_list.unwrap_or_default(), + is_transactional, + validate, + weight_limit, + proof_size_base_cost, + config.as_ref().unwrap_or(::config()), + ).map_err(|err| err.error.into()) + } + + fn current_transaction_statuses() -> Option> { + pallet_ethereum::CurrentTransactionStatuses::::get() + } + + fn current_block() -> Option { + pallet_ethereum::CurrentBlock::::get() + } + + fn current_receipts() -> Option> { + pallet_ethereum::CurrentReceipts::::get() + } + + fn current_all() -> ( + Option, + Option>, + Option>, + ) { + ( + pallet_ethereum::CurrentBlock::::get(), + pallet_ethereum::CurrentReceipts::::get(), + pallet_ethereum::CurrentTransactionStatuses::::get(), + ) + } + + fn extrinsic_filter( + xts: Vec<::Extrinsic>, + ) -> Vec { + xts.into_iter().filter_map(|xt| match xt.0.function { + RuntimeCall::Ethereum(transact { transaction }) => Some(transaction), + _ => None + }).collect::>() + } + + fn elasticity() -> Option { + None + } + + fn gas_limit_multiplier_support() {} + } + + impl fp_rpc::ConvertTransactionRuntimeApi for Runtime { + fn convert_transaction( + transaction: pallet_ethereum::Transaction + ) -> ::Extrinsic { + UncheckedExtrinsic::new_unsigned( + pallet_ethereum::Call::::transact { transaction }.into(), + ) + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi + for Runtime { + fn query_info( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { + TransactionPayment::query_info(uxt, len) + } + + fn query_fee_details( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_fee_details(uxt, len) + } + + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + + impl nimbus_primitives::NimbusApi for Runtime { + fn can_author( + author: nimbus_primitives::NimbusId, + slot: u32, + parent_header: &::Header + ) -> bool { + let block_number = parent_header.number + 1; + + // The Moonbeam runtimes use an entropy source that needs to do some accounting + // work during block initialization. Therefore we initialize it here to match + // the state it will be in when the next block is being executed. + use frame_support::traits::OnInitialize; + System::initialize( + &block_number, + &parent_header.hash(), + &parent_header.digest, + ); + + // Because the staking solution calculates the next staking set at the beginning + // of the first block in the new round, the only way to accurately predict the + // authors is to compute the selection during prediction. + if pallet_parachain_staking::Pallet::::round().should_update(block_number) { + // get author account id + use nimbus_primitives::AccountLookup; + let author_account_id = if let Some(account) = + pallet_author_mapping::Pallet::::lookup_account(&author) { + account + } else { + // return false if author mapping not registered like in can_author impl + return false + }; + let candidates = pallet_parachain_staking::Pallet::::compute_top_candidates(); + if candidates.is_empty() { + // If there are zero selected candidates, we use the same eligibility + // as the previous round + return AuthorInherent::can_author(&author, &slot); + } + + // predict eligibility post-selection by computing selection results now + let (eligible, _) = + pallet_author_slot_filter::compute_pseudo_random_subset::( + candidates, + &slot + ); + eligible.contains(&author_account_id) + } else { + AuthorInherent::can_author(&author, &slot) + } + } + } + + impl cumulus_primitives_core::CollectCollationInfo for Runtime { + fn collect_collation_info( + header: &::Header + ) -> cumulus_primitives_core::CollationInfo { + ParachainSystem::collect_collation_info(header) + } + } + + impl session_keys_primitives::VrfApi for Runtime { + fn get_last_vrf_output() -> Option<::Hash> { + // TODO: remove in future runtime upgrade along with storage item + if pallet_randomness::Pallet::::not_first_block().is_none() { + return None; + } + pallet_randomness::Pallet::::local_vrf_output() + } + fn vrf_key_lookup( + nimbus_id: nimbus_primitives::NimbusId + ) -> Option { + use session_keys_primitives::KeysLookup; + AuthorMapping::lookup_keys(&nimbus_id) + } + } + + #[cfg(feature = "runtime-benchmarks")] + impl frame_benchmarking::Benchmark for Runtime { + + fn benchmark_metadata(extra: bool) -> ( + Vec, + Vec, + ) { + use frame_benchmarking::{list_benchmark, Benchmarking, BenchmarkList}; + use moonbeam_xcm_benchmarks::generic::benchmarking as MoonbeamXcmBenchmarks; + use frame_support::traits::StorageInfoTrait; + use frame_system_benchmarking::Pallet as SystemBench; + use pallet_crowdloan_rewards::Pallet as PalletCrowdloanRewardsBench; + use pallet_parachain_staking::Pallet as ParachainStakingBench; + use pallet_author_mapping::Pallet as PalletAuthorMappingBench; + use pallet_author_slot_filter::Pallet as PalletAuthorSlotFilter; + use pallet_moonbeam_orbiters::Pallet as PalletMoonbeamOrbiters; + use pallet_author_inherent::Pallet as PalletAuthorInherent; + use pallet_asset_manager::Pallet as PalletAssetManagerBench; + use pallet_xcm_transactor::Pallet as XcmTransactorBench; + use pallet_randomness::Pallet as RandomnessBench; + use pallet_migrations::Pallet as MigrationsBench; + use MoonbeamXcmBenchmarks::XcmGenericBenchmarks as MoonbeamXcmGenericBench; + + let mut list = Vec::::new(); + + list_benchmark!(list, extra, frame_system, SystemBench::); + list_benchmark!(list, extra, parachain_staking, ParachainStakingBench::); + list_benchmark!(list, extra, pallet_crowdloan_rewards, PalletCrowdloanRewardsBench::); + list_benchmark!(list, extra, pallet_author_mapping, PalletAuthorMappingBench::); + list_benchmark!(list, extra, pallet_author_slot_filter, PalletAuthorSlotFilter::); + list_benchmark!(list, extra, pallet_moonbeam_orbiters, PalletMoonbeamOrbiters::); + list_benchmark!(list, extra, pallet_author_inherent, PalletAuthorInherent::); + list_benchmark!(list, extra, pallet_asset_manager, PalletAssetManagerBench::); + list_benchmark!(list, extra, xcm_transactor, XcmTransactorBench::); + list_benchmark!(list, extra, pallet_randomness, RandomnessBench::); + list_benchmark!( + list, + extra, + moonbeam_xcm_benchmarks_generic, + MoonbeamXcmGenericBench:: + ); + list_benchmark!(list, extra, pallet_migrations, MigrationsBench::); + + let storage_info = AllPalletsWithSystem::storage_info(); + + return (list, storage_info) + } + + fn dispatch_benchmark( + config: frame_benchmarking::BenchmarkConfig, + ) -> Result, sp_runtime::RuntimeString> { + use frame_benchmarking::{ + add_benchmark, BenchmarkBatch, Benchmarking, TrackedStorageKey, + }; + + use xcm::latest::prelude::*; + use frame_benchmarking::BenchmarkError; + + use frame_system_benchmarking::Pallet as SystemBench; + impl frame_system_benchmarking::Config for Runtime {} + + impl moonbeam_xcm_benchmarks::Config for Runtime {} + impl moonbeam_xcm_benchmarks::generic::Config for Runtime {} + + use pallet_asset_manager::Config as PalletAssetManagerConfig; + impl pallet_xcm_benchmarks::Config for Runtime { + type XcmConfig = xcm_config::XcmExecutorConfig; + type AccountIdConverter = xcm_config::LocationToAccountId; + fn valid_destination() -> Result { + Ok(MultiLocation::parent()) + } + fn worst_case_holding(_depositable_count: u32) -> MultiAssets { + // 100 fungibles + const HOLDING_FUNGIBLES: u32 = 100; + let fungibles_amount: u128 = 100; + let assets = (0..HOLDING_FUNGIBLES).map(|i| { + let location: MultiLocation = GeneralIndex(i as u128).into(); + MultiAsset { + id: Concrete(location), + fun: Fungible(fungibles_amount * i as u128), + } + .into() + }) + .chain( + core::iter::once( + MultiAsset { + id: Concrete(MultiLocation::parent()), + fun: Fungible(u128::MAX) + } + ) + ) + .collect::>(); + + + for (i, asset) in assets.iter().enumerate() { + if let MultiAsset { + id: Concrete(location), + fun: Fungible(_) + } = asset { + ::AssetId, + ::ForeignAssetType> + >::set_asset_type_asset_id( + location.clone().into(), + i as u128 + ); + // set 1-1 + ::ForeignAssetType> + >::set_units_per_second( + location.clone().into(), + 1_000_000_000_000u128 + ); + } + } + assets.into() + } + } + + impl pallet_xcm_benchmarks::generic::Config for Runtime { + type RuntimeCall = RuntimeCall; + + fn worst_case_response() -> (u64, Response) { + (0u64, Response::Version(Default::default())) + } + + fn worst_case_asset_exchange() + -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn universal_alias() -> Result { + Err(BenchmarkError::Skip) + } + + fn transact_origin_and_runtime_call() + -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + Ok((MultiLocation::parent(), frame_system::Call::remark_with_event { + remark: vec![] + }.into())) + } + + fn subscribe_origin() -> Result { + Ok(MultiLocation::parent()) + } + + fn claimable_asset() + -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + let origin = MultiLocation::parent(); + let assets: MultiAssets = (Concrete(MultiLocation::parent()), 1_000u128) + .into(); + let ticket = MultiLocation { parents: 0, interior: Here }; + Ok((origin, ticket, assets)) + } + + fn unlockable_asset() + -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + Err(BenchmarkError::Skip) + } + } + + use moonbeam_xcm_benchmarks::generic::benchmarking as MoonbeamXcmBenchmarks; + + use pallet_crowdloan_rewards::Pallet as PalletCrowdloanRewardsBench; + use pallet_parachain_staking::Pallet as ParachainStakingBench; + use pallet_author_mapping::Pallet as PalletAuthorMappingBench; + use pallet_author_slot_filter::Pallet as PalletAuthorSlotFilter; + use pallet_moonbeam_orbiters::Pallet as PalletMoonbeamOrbiters; + use pallet_author_inherent::Pallet as PalletAuthorInherent; + use pallet_asset_manager::Pallet as PalletAssetManagerBench; + use pallet_xcm_transactor::Pallet as XcmTransactorBench; + use pallet_randomness::Pallet as RandomnessBench; + use pallet_migrations::Pallet as MigrationsBench; + use MoonbeamXcmBenchmarks::XcmGenericBenchmarks as MoonbeamXcmGenericBench; + + let whitelist: Vec = vec![ + // Block Number + hex_literal::hex!( "26aa394eea5630e07c48ae0c9558cef7" + "02a5c1b19ab7a04f536c519aca4983ac") + .to_vec().into(), + // Total Issuance + hex_literal::hex!( "c2261276cc9d1f8598ea4b6a74b15c2f" + "57c875e4cff74148e4628f264b974c80") + .to_vec().into(), + // Execution Phase + hex_literal::hex!( "26aa394eea5630e07c48ae0c9558cef7" + "ff553b5a9862a516939d82b3d3d8661a") + .to_vec().into(), + // Event Count + hex_literal::hex!( "26aa394eea5630e07c48ae0c9558cef7" + "0a98fdbe9ce6c55837576c60c7af3850") + .to_vec().into(), + // System Events + hex_literal::hex!( "26aa394eea5630e07c48ae0c9558cef7" + "80d41e5e16056765bc8461851072c9d7") + .to_vec().into(), + // System BlockWeight + hex_literal::hex!( "26aa394eea5630e07c48ae0c9558cef7" + "34abf5cb34d6244378cddbf18e849d96") + .to_vec().into(), + // ParachainStaking Round + hex_literal::hex!( "a686a3043d0adcf2fa655e57bc595a78" + "13792e785168f725b60e2969c7fc2552") + .to_vec().into(), + // Treasury Account (py/trsry) + hex_literal::hex!( "26aa394eea5630e07c48ae0c9558cef7" + "b99d880ec681799c0cf30e8886371da9" + "7be2919ac397ba499ea5e57132180ec6" + "6d6f646c70792f747273727900000000" + "00000000" + ).to_vec().into(), + // Treasury Account (pc/trsry) + hex_literal::hex!( "26aa394eea5630e07c48ae0c9558cef7" + "b99d880ec681799c0cf30e8886371da9" + "7be2919ac397ba499ea5e57132180ec6" + "6d6f646c70632f747273727900000000" + "00000000" + ).to_vec().into(), + // ParachainInfo ParachainId + hex_literal::hex!( "0d715f2646c8f85767b5d2764bb27826" + "04a74d81251e398fd8a0a4d55023bb3f") + .to_vec().into(), + + ]; + + let mut batches = Vec::::new(); + let params = (&config, &whitelist); + + add_benchmark!( + params, + batches, + parachain_staking, + ParachainStakingBench:: + ); + add_benchmark!( + params, + batches, + pallet_crowdloan_rewards, + PalletCrowdloanRewardsBench:: + ); + add_benchmark!( + params, + batches, + pallet_author_mapping, + PalletAuthorMappingBench:: + ); + add_benchmark!(params, batches, frame_system, SystemBench::); + add_benchmark!( + params, + batches, + pallet_author_slot_filter, + PalletAuthorSlotFilter:: + ); + add_benchmark!( + params, + batches, + pallet_moonbeam_orbiters, + PalletMoonbeamOrbiters:: + ); + add_benchmark!( + params, + batches, + pallet_author_inherent, + PalletAuthorInherent:: + ); + add_benchmark!( + params, + batches, + pallet_asset_manager, + PalletAssetManagerBench:: + ); + add_benchmark!( + params, + batches, + xcm_transactor, + XcmTransactorBench:: + ); + + add_benchmark!( + params, + batches, + pallet_randomness, + RandomnessBench:: + ); + + add_benchmark!( + params, + batches, + pallet_migrations, + MigrationsBench:: + ); + + add_benchmark!( + params, + batches, + moonbeam_xcm_benchmarks_generic, + MoonbeamXcmGenericBench:: + ); + + if batches.is_empty() { + return Err("Benchmark not found for this pallet.".into()); + } + Ok(batches) + } + } + + #[cfg(feature = "try-runtime")] + impl frame_try_runtime::TryRuntime for Runtime { + fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { + log::info!("try-runtime::on_runtime_upgrade()"); + // NOTE: intentional expect: we don't want to propagate the error backwards, + // and want to have a backtrace here. If any of the pre/post migration checks + // fail, we shall stop right here and right now. + let weight = Executive::try_runtime_upgrade(checks) + .expect("runtime upgrade logic *must* be infallible"); + (weight, RuntimeBlockWeights::get().max_block) + } + + fn execute_block( + block: Block, + state_root_check: bool, + signature_check: bool, + select: frame_try_runtime::TryStateSelect + ) -> Weight { + log::info!( + "try-runtime: executing block {:?} / root checks: {:?} / try-state-select: {:?}", + block.header.hash(), + state_root_check, + select, + ); + // NOTE: intentional unwrap: we don't want to propagate the error backwards, + // and want to have a backtrace here. + Executive::try_execute_block( + block, + state_root_check, + signature_check, + select, + ).expect("execute-block failed") + } + } + } + }; +} diff --git a/tracing/2402/runtime/common/src/impl_moonbeam_xcm_call.rs b/tracing/2402/runtime/common/src/impl_moonbeam_xcm_call.rs new file mode 100644 index 0000000..112c457 --- /dev/null +++ b/tracing/2402/runtime/common/src/impl_moonbeam_xcm_call.rs @@ -0,0 +1,51 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +#[macro_export] +macro_rules! impl_moonbeam_xcm_call { + {} => { + + pub struct MoonbeamCall; + impl CallDispatcher for MoonbeamCall { + fn dispatch( + call: RuntimeCall, + origin: RuntimeOrigin, + ) -> Result< + PostDispatchInfoOf, + DispatchErrorWithPostInfo> + > { + if let Ok(raw_origin) = TryInto::>::try_into(origin.clone().caller) { + match (call.clone(), raw_origin) { + ( + RuntimeCall::EthereumXcm(pallet_ethereum_xcm::Call::transact { .. }) | + RuntimeCall::EthereumXcm(pallet_ethereum_xcm::Call::transact_through_proxy { .. }), + RawOrigin::Signed(account_id) + ) => { + return RuntimeCall::dispatch( + call, + pallet_ethereum_xcm::Origin::XcmEthereumTransaction( + account_id.into() + ).into() + ); + }, + _ => {} + } + } + RuntimeCall::dispatch(call, origin) + } + } + } +} diff --git a/tracing/2402/runtime/common/src/impl_moonbeam_xcm_call_tracing.rs b/tracing/2402/runtime/common/src/impl_moonbeam_xcm_call_tracing.rs new file mode 100644 index 0000000..87b1c94 --- /dev/null +++ b/tracing/2402/runtime/common/src/impl_moonbeam_xcm_call_tracing.rs @@ -0,0 +1,112 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +#[macro_export] +macro_rules! impl_moonbeam_xcm_call_tracing { + {} => { + + type CallResult = + Result< + PostDispatchInfoOf, + DispatchErrorWithPostInfo> + >; + + pub struct MoonbeamCall; + impl CallDispatcher for MoonbeamCall { + fn dispatch( + call: RuntimeCall, + origin: RuntimeOrigin, + ) -> CallResult { + if let Ok(raw_origin) = TryInto::>::try_into(origin.clone().caller) { + match (call.clone(), raw_origin) { + ( + RuntimeCall::EthereumXcm(pallet_ethereum_xcm::Call::transact { xcm_transaction }) | + RuntimeCall::EthereumXcm(pallet_ethereum_xcm::Call::transact_through_proxy { + xcm_transaction, .. + }), + RawOrigin::Signed(account_id) + ) => { + use crate::EthereumXcm; + use moonbeam_evm_tracer::tracer::EvmTracer; + use xcm_primitives::{ + XcmToEthereum, + EthereumXcmTracingStatus, + ETHEREUM_XCM_TRACING_STORAGE_KEY + }; + use frame_support::storage::unhashed; + use frame_support::traits::Get; + + let dispatch_call = || { + RuntimeCall::dispatch( + call, + pallet_ethereum_xcm::Origin::XcmEthereumTransaction( + account_id.into() + ).into() + ) + }; + + return match unhashed::get( + ETHEREUM_XCM_TRACING_STORAGE_KEY + ) { + // This runtime instance is used for tracing. + Some(transaction) => match transaction { + // Tracing a block, all calls are done using environmental. + EthereumXcmTracingStatus::Block => { + // Each known extrinsic is a new call stack. + EvmTracer::emit_new(); + let mut res: Option = None; + EvmTracer::new().trace(|| { + res = Some(dispatch_call()); + }); + res.expect("Invalid dispatch result") + }, + // Tracing a transaction, the one matching the trace request + // is done using environmental, the rest dispatched normally. + EthereumXcmTracingStatus::Transaction(traced_transaction_hash) => { + let transaction_hash = xcm_transaction.into_transaction_v2( + EthereumXcm::nonce(), + ::ChainId::get() + ) + .expect("Invalid transaction conversion") + .hash(); + if transaction_hash == traced_transaction_hash { + let mut res: Option = None; + EvmTracer::new().trace(|| { + res = Some(dispatch_call()); + }); + // Tracing runtime work is done, just signal instance exit. + unhashed::put::( + xcm_primitives::ETHEREUM_XCM_TRACING_STORAGE_KEY, + &EthereumXcmTracingStatus::TransactionExited, + ); + return res.expect("Invalid dispatch result"); + } + dispatch_call() + }, + _ => unreachable!() + }, + // This runtime instance is importing a block. + None => dispatch_call() + }; + }, + _ => {} + } + } + RuntimeCall::dispatch(call, origin) + } + } + } +} diff --git a/tracing/2402/runtime/common/src/impl_on_charge_evm_transaction.rs b/tracing/2402/runtime/common/src/impl_on_charge_evm_transaction.rs new file mode 100644 index 0000000..30e4ac9 --- /dev/null +++ b/tracing/2402/runtime/common/src/impl_on_charge_evm_transaction.rs @@ -0,0 +1,64 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +#[macro_export] +macro_rules! impl_on_charge_evm_transaction { + {} => { + type CurrencyAccountId = ::AccountId; + + type BalanceFor = + <::Currency as CurrencyT>>::Balance; + + type PositiveImbalanceFor = + <::Currency as CurrencyT>>::PositiveImbalance; + + type NegativeImbalanceFor = + <::Currency as CurrencyT>>::NegativeImbalance; + + pub struct OnChargeEVMTransaction(sp_std::marker::PhantomData); + impl OnChargeEVMTransactionT for OnChargeEVMTransaction + where + T: pallet_evm::Config, + PositiveImbalanceFor: Imbalance, Opposite = NegativeImbalanceFor>, + NegativeImbalanceFor: Imbalance, Opposite = PositiveImbalanceFor>, + OU: OnUnbalanced>, + U256: UniqueSaturatedInto> + { + type LiquidityInfo = Option>; + + fn withdraw_fee(who: &H160, fee: U256) -> Result> { + EVMCurrencyAdapter::<::Currency, ()>::withdraw_fee(who, fee) + } + + fn correct_and_deposit_fee( + who: &H160, + corrected_fee: U256, + base_fee: U256, + already_withdrawn: Self::LiquidityInfo, + ) -> Self::LiquidityInfo { + ::Currency, OU> as OnChargeEVMTransactionT< + T, + >>::correct_and_deposit_fee(who, corrected_fee, base_fee, already_withdrawn) + } + + fn pay_priority_fee(tip: Self::LiquidityInfo) { + if let Some(tip) = tip { + OU::on_unbalanced(tip); + } + } + } + } +} diff --git a/tracing/2402/runtime/common/src/impl_self_contained_call.rs b/tracing/2402/runtime/common/src/impl_self_contained_call.rs new file mode 100644 index 0000000..0dbce05 --- /dev/null +++ b/tracing/2402/runtime/common/src/impl_self_contained_call.rs @@ -0,0 +1,78 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +#[macro_export] +macro_rules! impl_self_contained_call { + {} => { + impl fp_self_contained::SelfContainedCall for RuntimeCall { + type SignedInfo = H160; + + fn is_self_contained(&self) -> bool { + match self { + RuntimeCall::Ethereum(call) => call.is_self_contained(), + _ => false, + } + } + + fn check_self_contained( + &self + ) -> Option> { + match self { + RuntimeCall::Ethereum(call) => call.check_self_contained(), + _ => None, + } + } + + fn validate_self_contained( + &self, + signed_info: &Self::SignedInfo, + dispatch_info: &DispatchInfoOf, + len: usize, + ) -> Option { + match self { + RuntimeCall::Ethereum(call) => call.validate_self_contained(signed_info, dispatch_info, len), + _ => None, + } + } + + fn pre_dispatch_self_contained( + &self, + info: &Self::SignedInfo, + dispatch_info: &DispatchInfoOf, + len: usize, + ) -> Option> { + match self { + RuntimeCall::Ethereum(call) => call.pre_dispatch_self_contained(info, dispatch_info, len), + _ => None, + } + } + + fn apply_self_contained( + self, + info: Self::SignedInfo, + ) -> Option>> { + match self { + call @ RuntimeCall::Ethereum(pallet_ethereum::Call::transact { .. }) => Some( + call.dispatch(RuntimeOrigin::from( + pallet_ethereum::RawOrigin::EthereumTransaction(info) + )) + ), + _ => None, + } + } + } + } +} diff --git a/tracing/2402/runtime/common/src/impl_xcm_evm_runner.rs b/tracing/2402/runtime/common/src/impl_xcm_evm_runner.rs new file mode 100644 index 0000000..0972bcf --- /dev/null +++ b/tracing/2402/runtime/common/src/impl_xcm_evm_runner.rs @@ -0,0 +1,188 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +#[macro_export] +macro_rules! impl_evm_runner_precompile_or_eth_xcm { + {} => { + use fp_evm::{CallInfo, CallOrCreateInfo, Context, Transfer}; + use frame_support::dispatch::CallableCallFor; + use pallet_evm::{Runner, RunnerError}; + use precompile_utils::{prelude::*, evm::handle::with_precompile_handle}; + use sp_core::U256; + use sp_runtime::DispatchError; + use sp_std::vec::Vec; + use xcm_primitives::{EthereumXcmTransaction, EthereumXcmTransactionV2}; + + pub struct EvmRunnerPrecompileOrEthXcm( + core::marker::PhantomData<(CallDispatcher, Runtime)>, + ); + + impl Runner + for EvmRunnerPrecompileOrEthXcm + where + CallDispatcher: xcm_executor::traits::CallDispatcher, + Runtime: pallet_evm::Config + pallet_ethereum_xcm::Config, + Runtime::RuntimeOrigin: From, + { + type Error = DispatchError; + + fn call( + source: H160, + target: H160, + input: Vec, + value: U256, + gas_limit: u64, + _max_fee_per_gas: Option, + _max_priority_fee_per_gas: Option, + _nonce: Option, + access_list: Vec<(H160, Vec)>, + _is_transactional: bool, + _validate: bool, + _weight_limit: Option, + _transaction_len: Option, + _config: &fp_evm::Config, + ) -> Result> { + // The `with_precompile_handle` function will execute the closure (and return the + // result in a Some) if and only if there is an available EVM context. Otherwise, + // it will return None. + if let Some((exit_reason, value)) = with_precompile_handle(|precompile_handle| { + let transfer = if value.is_zero() { + None + } else { + Some(Transfer { + source, + target, + value, + }) + }; + + precompile_handle.call( + target, + transfer, + input.clone(), + Some(gas_limit), + false, + &Context { + address: target, + caller: source, + apparent_value: value, + }, + ) + }) { + Ok(CallInfo { + exit_reason, + value, + used_gas: fp_evm::UsedGas { + standard: U256::default(), + effective: U256::default(), + }, + logs: Default::default(), + weight_info: None, + }) + } else { + let xcm_transaction = EthereumXcmTransaction::V2(EthereumXcmTransactionV2 { + gas_limit: gas_limit.into(), + action: pallet_ethereum_xcm::TransactionAction::Call(target), + value, + input: input.try_into().map_err(|_| RunnerError { + error: DispatchError::Exhausted, + weight: Default::default(), + })?, + access_list: Some(access_list), + }); + + let mut execution_info: Option = None; + pallet_ethereum::catch_exec_info(&mut execution_info, || { + CallDispatcher::dispatch( + RuntimeCall::EthereumXcm(pallet_ethereum_xcm::Call::transact { xcm_transaction }), + pallet_ethereum_xcm::RawOrigin::XcmEthereumTransaction(source.into()).into(), + ) + .map_err(|DispatchErrorWithPostInfo { error, .. }| RunnerError { + error, + weight: Default::default(), + }) + })?; + + if let Some(CallOrCreateInfo::Call(call_info))= execution_info { + Ok(call_info) + } else { + // `execution_info` must have been filled in + Err(RunnerError { + error: DispatchError::Unavailable, + weight: Default::default(), + }) + } + } + } + + fn create( + _source: H160, + _init: Vec, + _value: U256, + _gas_limit: u64, + _max_fee_per_gas: Option, + _max_priority_fee_per_gas: Option, + _nonce: Option, + _access_list: Vec<(H160, Vec)>, + _is_transactional: bool, + _validate: bool, + _weight_limit: Option, + _transaction_len: Option, + _config: &fp_evm::Config, + ) -> Result> { + unimplemented!() + } + + fn create2( + _source: H160, + _init: Vec, + _salt: H256, + _value: U256, + _gas_limit: u64, + _max_fee_per_gas: Option, + _max_priority_fee_per_gas: Option, + _nonce: Option, + _access_list: Vec<(H160, Vec)>, + _is_transactional: bool, + _validate: bool, + _weight_limit: Option, + _transaction_len: Option, + _config: &fp_evm::Config, + ) -> Result> { + unimplemented!() + } + + fn validate( + _source: H160, + _target: Option, + _input: Vec, + _value: U256, + _gas_limit: u64, + _max_fee_per_gas: Option, + _max_priority_fee_per_gas: Option, + _nonce: Option, + _access_list: Vec<(H160, Vec)>, + _is_transactional: bool, + _weight_limit: Option, + _transaction_len: Option, + _evm_config: &fp_evm::Config, + ) -> Result<(), RunnerError> { + unimplemented!() + } + } + + } +} diff --git a/tracing/2402/runtime/common/src/lib.rs b/tracing/2402/runtime/common/src/lib.rs new file mode 100644 index 0000000..615245e --- /dev/null +++ b/tracing/2402/runtime/common/src/lib.rs @@ -0,0 +1,40 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +#![cfg_attr(not(feature = "std"), no_std)] + +use sp_core::H160; + +mod apis; +mod impl_moonbeam_xcm_call; +mod impl_moonbeam_xcm_call_tracing; +mod impl_on_charge_evm_transaction; +mod impl_self_contained_call; +mod impl_xcm_evm_runner; +pub mod migrations; + +//TODO maybe this should be upstreamed into Frontier. + +/// And ipmlementation of Frontier's AddressMapping trait for Moonbeam Accounts. +/// This is basically identical to Frontier's own IdentityAddressMapping, but it works for any type +/// that is Into like AccountId20 for example. +pub struct IntoAddressMapping; + +impl> pallet_evm::AddressMapping for IntoAddressMapping { + fn into_account_id(address: H160) -> T { + address.into() + } +} diff --git a/tracing/2402/runtime/common/src/migrations.rs b/tracing/2402/runtime/common/src/migrations.rs new file mode 100644 index 0000000..de095fa --- /dev/null +++ b/tracing/2402/runtime/common/src/migrations.rs @@ -0,0 +1,232 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! # Migrations +//! +//! This module acts as a registry where each migration is defined. Each migration should implement +//! the "Migration" trait declared in the pallet-migrations crate. + +use frame_support::{ + dispatch::GetStorageVersion, + traits::{Hash as PreimageHash, OnRuntimeUpgrade, PalletInfoAccess}, + weights::Weight, +}; +use pallet_author_slot_filter::Config as AuthorSlotFilterConfig; +use pallet_migrations::{GetMigrations, Migration}; +use sp_std::{marker::PhantomData, prelude::*}; + +pub struct PreimageMigrationHashToBoundedCall(PhantomData); +impl Migration for PreimageMigrationHashToBoundedCall +where + T: pallet_preimage::Config + frame_system::Config, +{ + fn friendly_name(&self) -> &str { + "MM_PreimageMigrationHashToBoundedCall" + } + + fn migrate(&self, _available_weight: Weight) -> Weight { + pallet_preimage::migration::v1::Migration::::on_runtime_upgrade() + } + + /// Run a standard pre-runtime test. This works the same way as in a normal runtime upgrade. + #[cfg(feature = "try-runtime")] + fn pre_upgrade(&self) -> Result, &'static str> { + pallet_preimage::migration::v1::Migration::::pre_upgrade() + } + + /// Run a standard post-runtime test. This works the same way as in a normal runtime upgrade. + #[cfg(feature = "try-runtime")] + fn post_upgrade(&self, state: Vec) -> Result<(), &'static str> { + pallet_preimage::migration::v1::Migration::::post_upgrade(state) + } +} + +pub struct PalletReferendaMigrateV0ToV1(pub PhantomData); +impl Migration for PalletReferendaMigrateV0ToV1 +where + T: pallet_referenda::Config + frame_system::Config, +{ + fn friendly_name(&self) -> &str { + "MM_PalletReferendaMigrateV0ToV1" + } + + fn migrate(&self, _available_weight: Weight) -> Weight { + pallet_referenda::migration::v1::MigrateV0ToV1::::on_runtime_upgrade() + } + + /// Run a standard pre-runtime test. This works the same way as in a normal runtime upgrade. + #[cfg(feature = "try-runtime")] + fn pre_upgrade(&self) -> Result, &'static str> { + pallet_referenda::migration::v1::MigrateV0ToV1::::pre_upgrade() + } + + /// Run a standard post-runtime test. This works the same way as in a normal runtime upgrade. + #[cfg(feature = "try-runtime")] + fn post_upgrade(&self, state: Vec) -> Result<(), &'static str> { + pallet_referenda::migration::v1::MigrateV0ToV1::::post_upgrade(state) + } +} + +pub struct ReferendaMigrations(PhantomData<(Runtime, Council, Tech)>); + +impl GetMigrations for ReferendaMigrations +where + Runtime: pallet_author_mapping::Config, + Runtime: pallet_parachain_staking::Config, + Runtime: pallet_scheduler::Config, + Runtime: AuthorSlotFilterConfig, + Council: GetStorageVersion + PalletInfoAccess + 'static, + Tech: GetStorageVersion + PalletInfoAccess + 'static, + Runtime: pallet_democracy::Config, + Runtime: pallet_preimage::Config, + Runtime: pallet_referenda::Config, +{ + fn get_migrations() -> Vec> { + let pallet_referenda_migrate_v0_to_v1 = + PalletReferendaMigrateV0ToV1::(Default::default()); + vec![Box::new(pallet_referenda_migrate_v0_to_v1)] + } +} + +pub struct CommonMigrations(PhantomData<(Runtime, Council, Tech)>); + +impl GetMigrations for CommonMigrations +where + Runtime: pallet_author_mapping::Config, + Runtime: pallet_parachain_staking::Config, + Runtime: pallet_scheduler::Config, + Runtime: AuthorSlotFilterConfig, + Council: GetStorageVersion + PalletInfoAccess + 'static, + Tech: GetStorageVersion + PalletInfoAccess + 'static, + Runtime: pallet_democracy::Config, + Runtime: pallet_preimage::Config, + Runtime: pallet_asset_manager::Config, + ::ForeignAssetType: From, + Runtime: pallet_xcm_transactor::Config, +{ + fn get_migrations() -> Vec> { + // let migration_author_mapping_twox_to_blake = AuthorMappingTwoXToBlake:: { + // 0: Default::default(), + // }; + + // let migration_parachain_staking_purge_stale_storage = + // ParachainStakingPurgeStaleStorage::(Default::default()); + // let migration_parachain_staking_manual_exits = + // ParachainStakingManualExits::(Default::default()); + // let migration_parachain_staking_increase_max_delegations_per_candidate = + // ParachainStakingIncreaseMaxDelegationsPerCandidate::(Default::default()); + // let migration_parachain_staking_split_candidate_state = + // ParachainStakingSplitCandidateState::(Default::default()); + // let migration_parachain_staking_patch_incorrect_delegation_sums = + // ParachainStakingPatchIncorrectDelegationSums::(Default::default()); + + // let migration_scheduler_v3 = SchedulerMigrationV3::(Default::default()); + + // let migration_base_fee = MigrateBaseFeePerGas::(Default::default()); + + // TODO: this is a lot of allocation to do upon every get() call. this *should* be avoided + // except when pallet_migrations undergoes a runtime upgrade -- but TODO: review + + // let migration_author_slot_filter_eligible_ratio_to_eligibility_count = + // AuthorSlotFilterEligibleRatioToEligiblityCount::(Default::default()); + // let migration_author_mapping_add_keys_to_registration_info = + // AuthorMappingAddKeysToRegistrationInfo::(Default::default()); + // let staking_delegator_state_requests = + // ParachainStakingSplitDelegatorStateIntoDelegationScheduledRequests::( + // Default::default(), + // ); + // let migration_author_mapping_add_account_id_to_nimbus_lookup = + // AuthorMappingAddAccountIdToNimbusLookup::(Default::default()); + + // let xcm_transactor_max_weight = + // XcmTransactorMaxTransactWeight::(Default::default()); + + // let asset_manager_units_with_asset_type = + // AssetManagerUnitsWithAssetType::(Default::default()); + + // let asset_manager_populate_asset_type_id_storage = + // AssetManagerPopulateAssetTypeIdStorage::(Default::default()); + + // let asset_manager_change_statemine_prefixes = AssetManagerChangeStateminePrefixes::< + // Runtime, + // StatemineParaIdInfo, + // StatemineAssetsInstanceInfo, + // >(Default::default()); + + // let xcm_supported_assets = XcmPaymentSupportedAssets::(Default::default()); + + // let migration_elasticity = MigrateBaseFeeElasticity::(Default::default()); + //let staking_at_stake_auto_compound = + // ParachainStakingMigrateAtStakeAutoCompound::(Default::default()); + + //let scheduler_to_v4 = SchedulerMigrationV4::(Default::default()); + //let democracy_migration_hash_to_bounded_call = + // DemocracryMigrationHashToBoundedCall::(Default::default()); + //let preimage_migration_hash_to_bounded_call = + // PreimageMigrationHashToBoundedCall::(Default::default()); + //let asset_manager_to_xcm_v3 = + // PalletAssetManagerMigrateXcmV2ToV3::(Default::default()); + //let xcm_transactor_to_xcm_v3 = + // PalletXcmTransactorMigrateXcmV2ToV3::(Default::default()); + vec![ + // completed in runtime 800 + // Box::new(migration_author_mapping_twox_to_blake), + // completed in runtime 900 + // completed in runtime 1000 + // Box::new(migration_parachain_staking_purge_stale_storage), + // completed in runtime 1000 + // Box::new(migration_parachain_staking_manual_exits), + // completed in runtime 1101 + // Box::new(migration_parachain_staking_increase_max_delegations_per_candidate), + // completed in runtime 1201 + // Box::new(migration_parachain_staking_split_candidate_state), + // completed in runtime 1201 + // Box::new(xcm_transactor_max_weight), + // completed in runtime 1201 + // Box::new(asset_manager_units_with_asset_type), + // completed in runtime 1201 + // Box::new(asset_manager_change_statemine_prefixes), + // completed in runtime 1201 + // Box::new(asset_manager_populate_asset_type_id_storage), + // completed in runtime 1300 + // Box::new(migration_scheduler_v3), + // completed in runtime 1300 + // Box::new(migration_parachain_staking_patch_incorrect_delegation_sums), + // completed in runtime 1300 + // Box::new(migration_base_fee), + // completed in runtime 1300 + // Box::new(xcm_supported_assets), + // completed in runtime 1500 + // Box::new(migration_author_slot_filter_eligible_ratio_to_eligibility_count), + // Box::new(migration_author_mapping_add_keys_to_registration_info), + // Box::new(staking_delegator_state_requests), + // completed in runtime 1600 + // Box::new(migration_author_mapping_add_account_id_to_nimbus_lookup), + // completed in runtime 1600 + // Box::new(xcm_transactor_transact_signed), + // completed in runtime 1700 + //Box::new(migration_elasticity), + // completed in runtime 1900 + //Box::new(staking_at_stake_auto_compound), + // completed in runtime 2000 + //Box::new(scheduler_to_v4), + //Box::new(democracy_migration_hash_to_bounded_call), + //Box::new(preimage_migration_hash_to_bounded_call), + //Box::new(asset_manager_to_xcm_v3), + //Box::new(xcm_transactor_to_xcm_v3), + ] + } +} diff --git a/tracing/2402/runtime/moonbase/Cargo.toml b/tracing/2402/runtime/moonbase/Cargo.toml new file mode 100644 index 0000000..69e868f --- /dev/null +++ b/tracing/2402/runtime/moonbase/Cargo.toml @@ -0,0 +1,343 @@ +[package] +name = "moonbase-runtime" +authors = { workspace = true } +build = "build.rs" +description = "Moonbase Runtime" +edition = "2021" +homepage = "https://moonbeam.network" +license = "GPL-3.0-only" +version = "0.8.4" + +[dependencies] +hex-literal = { workspace = true, optional = true } +log = { workspace = true } +num_enum = { workspace = true } +rlp = { workspace = true, optional = true } +serde = { workspace = true, optional = true, features = [ "derive" ] } +sha3 = { workspace = true, optional = true } +smallvec = { workspace = true } +strum = { workspace = true } +strum_macros = { workspace = true } + +# Moonbeam +account = { workspace = true } +moonbeam-core-primitives = { workspace = true } +moonbeam-relay-encoder = { workspace = true } +moonbeam-runtime-common = { workspace = true } +precompile-utils = { workspace = true } +session-keys-primitives = { workspace = true } +xcm-primitives = { workspace = true } + +# Moonbeam pallets +moonbeam-xcm-benchmarks = { workspace = true } +pallet-asset-manager = { workspace = true } +pallet-author-mapping = { workspace = true } +pallet-crowdloan-rewards = { workspace = true } +pallet-erc20-xcm-bridge = { workspace = true } +pallet-ethereum-chain-id = { workspace = true } +pallet-ethereum-xcm = { workspace = true } +pallet-maintenance-mode = { workspace = true, features = [ "xcm-support" ] } +pallet-migrations = { workspace = true } +pallet-moonbeam-orbiters = { workspace = true } +pallet-parachain-staking = { workspace = true } +pallet-proxy-genesis-companion = { workspace = true } +pallet-randomness = { workspace = true } +pallet-xcm-transactor = { workspace = true } + +# Moonbeam precompiles +pallet-evm-precompile-author-mapping = { workspace = true } +pallet-evm-precompile-balances-erc20 = { workspace = true } +pallet-evm-precompile-batch = { workspace = true } +pallet-evm-precompile-call-permit = { workspace = true } +pallet-evm-precompile-collective = { workspace = true } +pallet-evm-precompile-conviction-voting = { workspace = true } +pallet-evm-precompile-crowdloan-rewards = { workspace = true } +pallet-evm-precompile-democracy = { workspace = true } +pallet-evm-precompile-gmp = { workspace = true } +pallet-evm-precompile-parachain-staking = { workspace = true } +pallet-evm-precompile-preimage = { workspace = true } +pallet-evm-precompile-proxy = { workspace = true } +pallet-evm-precompile-randomness = { workspace = true } +pallet-evm-precompile-referenda = { workspace = true } +pallet-evm-precompile-registry = { workspace = true } +pallet-evm-precompile-relay-encoder = { workspace = true } +pallet-evm-precompile-xcm-transactor = { workspace = true } +pallet-evm-precompile-xcm-utils = { workspace = true } +pallet-evm-precompile-xtokens = { workspace = true } +pallet-evm-precompileset-assets-erc20 = { workspace = true } + +# Moonbeam tracing +evm-tracing-events = { workspace = true, optional = true } +moonbeam-evm-tracer = { workspace = true, optional = true } +moonbeam-rpc-primitives-debug = { workspace = true } +moonbeam-rpc-primitives-txpool = { workspace = true } + +# Substrate +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +pallet-assets = { workspace = true } +pallet-balances = { workspace = true } +pallet-collective = { workspace = true } +pallet-conviction-voting = { workspace = true } +pallet-democracy = { workspace = true } +pallet-identity = { workspace = true } +pallet-multisig = { workspace = true } +pallet-preimage = { workspace = true } +pallet-proxy = { workspace = true } +pallet-referenda = { workspace = true } +pallet-root-testing = { workspace = true } +pallet-scheduler = { workspace = true } +pallet-society = { workspace = true } +pallet-sudo = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } +pallet-treasury = { workspace = true } +pallet-utility = { workspace = true } +pallet-whitelist = { workspace = true } +parity-scale-codec = { workspace = true, features = [ "derive", "max-encoded-len" ] } +scale-info = { workspace = true, features = [ "derive" ] } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-core = { workspace = true } +sp-debug-derive = { workspace = true } +sp-inherents = { workspace = true } +sp-io = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } + +# Frontier +fp-evm = { workspace = true } +fp-rpc = { workspace = true } +fp-self-contained = { workspace = true } +pallet-base-fee = { workspace = true } +pallet-ethereum = { workspace = true, features = [ "forbid-evm-reentrancy" ] } +pallet-evm = { workspace = true, features = [ "forbid-evm-reentrancy" ] } +pallet-evm-precompile-blake2 = { workspace = true } +pallet-evm-precompile-bn128 = { workspace = true } +pallet-evm-precompile-dispatch = { workspace = true } +pallet-evm-precompile-modexp = { workspace = true } +pallet-evm-precompile-sha3fips = { workspace = true } +pallet-evm-precompile-simple = { workspace = true } + +# Cumulus / Nimbus +cumulus-pallet-dmp-queue = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-timestamp = { workspace = true } +cumulus-primitives-utility = { workspace = true } +nimbus-primitives = { workspace = true } +pallet-author-inherent = { workspace = true } +pallet-author-slot-filter = { workspace = true } +parachain-info = { workspace = true } + +# Polkadot / XCM +orml-traits = { workspace = true } +orml-xcm-support = { workspace = true } +orml-xtokens = { workspace = true } +pallet-xcm = { workspace = true } +pallet-xcm-benchmarks = { workspace = true, optional = true } +polkadot-core-primitives = { workspace = true } +polkadot-parachain = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } + +# Benchmarking +frame-benchmarking = { workspace = true, optional = true } +frame-system-benchmarking = { workspace = true, optional = true } +frame-try-runtime = { workspace = true, optional = true } + +[build-dependencies] +substrate-wasm-builder = { workspace = true } + +[features] +default = [ "std" , "evm-tracing"] +std = [ + "account/std", + "cumulus-pallet-dmp-queue/std", + "cumulus-pallet-parachain-system/std", + "cumulus-pallet-xcm/std", + "cumulus-pallet-xcmp-queue/std", + "cumulus-primitives-core/std", + "cumulus-primitives-timestamp/std", + "evm-tracing-events/std", + "fp-evm/std", + "fp-rpc/std", + "fp-self-contained/std", + "frame-benchmarking/std", + "frame-executive/std", + "frame-support/std", + "frame-system-rpc-runtime-api/std", + "frame-system/std", + "moonbeam-core-primitives/std", + "moonbeam-evm-tracer/std", + "moonbeam-rpc-primitives-debug/std", + "moonbeam-rpc-primitives-txpool/std", + "moonbeam-runtime-common/std", + "nimbus-primitives/std", + "orml-xtokens/std", + "pallet-asset-manager/std", + "pallet-assets/std", + "pallet-author-inherent/std", + "pallet-author-mapping/std", + "pallet-author-slot-filter/std", + "pallet-balances/std", + "pallet-base-fee/std", + "pallet-collective/std", + "pallet-conviction-voting/std", + "pallet-crowdloan-rewards/std", + "pallet-democracy/std", + "pallet-erc20-xcm-bridge/std", + "pallet-ethereum-chain-id/std", + "pallet-ethereum-xcm/std", + "pallet-ethereum/std", + "pallet-evm-precompile-author-mapping/std", + "pallet-evm-precompile-balances-erc20/std", + "pallet-evm-precompile-batch/std", + "pallet-evm-precompile-call-permit/std", + "pallet-evm-precompile-collective/std", + "pallet-evm-precompile-conviction-voting/std", + "pallet-evm-precompile-democracy/std", + "pallet-evm-precompile-parachain-staking/std", + "pallet-evm-precompile-preimage/std", + "pallet-evm-precompile-randomness/std", + "pallet-evm-precompile-referenda/std", + "pallet-evm-precompile-registry/std", + "pallet-evm-precompile-xcm-transactor/std", + "pallet-evm-precompile-xcm-utils/std", + "pallet-evm-precompile-xtokens/std", + "pallet-evm-precompileset-assets-erc20/std", + "pallet-evm/std", + "pallet-identity/std", + "pallet-maintenance-mode/std", + "pallet-migrations/std", + "pallet-moonbeam-orbiters/std", + "pallet-multisig/std", + "pallet-parachain-staking/std", + "pallet-preimage/std", + "pallet-proxy-genesis-companion/std", + "pallet-proxy/std", + "pallet-randomness/std", + "pallet-referenda/std", + "pallet-root-testing/std", + "pallet-scheduler/std", + "pallet-society/std", + "pallet-sudo/std", + "pallet-timestamp/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-transaction-payment/std", + "pallet-treasury/std", + "pallet-utility/std", + "pallet-whitelist/std", + "pallet-xcm-transactor/std", + "pallet-xcm/std", + "parachain-info/std", + "parity-scale-codec/std", + "precompile-utils/std", + "scale-info/std", + "serde", + "session-keys-primitives/std", + "sp-api/std", + "sp-block-builder/std", + "sp-core/std", + "sp-inherents/std", + "sp-io/std", + "sp-offchain/std", + "sp-runtime/std", + "sp-session/std", + "sp-std/std", + "sp-transaction-pool/std", + "sp-version/std", + "strum/std", + "xcm-builder/std", + "xcm-executor/std", + "xcm-primitives/std", + "xcm/std", + ] + +# Must be enabled for tracing runtimes only +evm-tracing = [ "evm-tracing-events", "moonbeam-evm-tracer", "rlp", "sha3" ] + +# Allow to print logs details (no wasm:stripped) +force-debug = [ "sp-debug-derive/force-debug" ] + +# Will be enabled by the `wasm-builder` when building the runtime for WASM. +runtime-wasm = [] + +# A feature that should be enabled when the runtime should be build for on-chain +# deployment. This will disable stuff that shouldn't be part of the on-chain wasm +# to make it smaller like logging for example. +on-chain-release-build = [ "sp-api/disable-logging" ] + +runtime-benchmarks = [ + "cumulus-pallet-parachain-system/runtime-benchmarks", + "frame-benchmarking", + "frame-support/runtime-benchmarks", + "frame-system-benchmarking/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "hex-literal", + "moonbeam-runtime-common/runtime-benchmarks", + "moonbeam-xcm-benchmarks/runtime-benchmarks", + "pallet-asset-manager/runtime-benchmarks", + "pallet-author-inherent/runtime-benchmarks", + "pallet-author-mapping/runtime-benchmarks", + "pallet-author-slot-filter/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-collective/runtime-benchmarks", + "pallet-conviction-voting/runtime-benchmarks", + "pallet-crowdloan-rewards/runtime-benchmarks", + "pallet-ethereum-xcm/runtime-benchmarks", + "pallet-ethereum/runtime-benchmarks", + "pallet-migrations/runtime-benchmarks", + "pallet-moonbeam-orbiters/runtime-benchmarks", + "pallet-parachain-staking/runtime-benchmarks", + "pallet-preimage/runtime-benchmarks", + "pallet-randomness/runtime-benchmarks", + "pallet-referenda/runtime-benchmarks", + "pallet-society/runtime-benchmarks", + "pallet-timestamp/runtime-benchmarks", + "pallet-xcm-benchmarks", + "pallet-xcm-transactor/runtime-benchmarks", + "pallet-xcm/runtime-benchmarks", + "session-keys-primitives/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", +] + +try-runtime = [ + "fp-self-contained/try-runtime", + "frame-executive/try-runtime", + "frame-system/try-runtime", + "frame-try-runtime", + "moonbeam-runtime-common/try-runtime", + "pallet-asset-manager/try-runtime", + "pallet-author-mapping/try-runtime", + "pallet-author-slot-filter/try-runtime", + "pallet-balances/try-runtime", + "pallet-collective/try-runtime", + "pallet-conviction-voting/try-runtime", + "pallet-democracy/try-runtime", + "pallet-maintenance-mode/try-runtime", + #"pallet-crowdloan-rewards/try-runtime", + "pallet-maintenance-mode/try-runtime", + "pallet-migrations/try-runtime", + "pallet-parachain-staking/try-runtime", + "pallet-preimage/try-runtime", + "pallet-referenda/try-runtime", + "pallet-root-testing/try-runtime", + "pallet-scheduler/try-runtime", + "pallet-society/try-runtime", + "pallet-timestamp/try-runtime", + "pallet-xcm-transactor/try-runtime", +] + +moonbase-runtime-benchmarks = [] diff --git a/tracing/2402/runtime/moonbase/build.rs b/tracing/2402/runtime/moonbase/build.rs new file mode 100644 index 0000000..3934b9c --- /dev/null +++ b/tracing/2402/runtime/moonbase/build.rs @@ -0,0 +1,25 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +use substrate_wasm_builder::WasmBuilder; + +fn main() { + WasmBuilder::new() + .with_current_project() + .export_heap_base() + .import_memory() + .build() +} diff --git a/tracing/2402/runtime/moonbase/src/asset_config.rs b/tracing/2402/runtime/moonbase/src/asset_config.rs new file mode 100644 index 0000000..84a5d03 --- /dev/null +++ b/tracing/2402/runtime/moonbase/src/asset_config.rs @@ -0,0 +1,342 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Asset configuration for Moonbase. +//! + +use super::{ + currency, governance, xcm_config, AccountId, AssetId, AssetManager, Assets, Balance, Balances, + CouncilInstance, LocalAssets, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, +}; + +use pallet_evm_precompileset_assets_erc20::AccountIdAssetIdConversion; +use sp_runtime::traits::Hash as THash; + +use frame_support::{ + dispatch::GetDispatchInfo, + parameter_types, + traits::{AsEnsureOriginWithArg, ConstU128, ConstU32, EitherOfDiverse}, + weights::Weight, +}; + +use frame_system::{EnsureNever, EnsureRoot}; +use parity_scale_codec::{Compact, Decode, Encode}; +use scale_info::TypeInfo; +use sp_core::{H160, H256}; + +use sp_std::{ + convert::{From, Into}, + prelude::*, +}; + +// Number of items that can be destroyed with our configured max extrinsic proof size. +// x = (a - b) / c where: +// a: maxExtrinsic proof size +// b: base proof size for destroy_accounts in pallet_assets weights +// c: proof size for each item +// 656.87 = (3_407_872 - 8232) / 5180 +const REMOVE_ITEMS_LIMIT: u32 = 656; + +// Not to disrupt the previous asset instance, we assign () to Foreign +pub type ForeignAssetInstance = (); +pub type LocalAssetInstance = pallet_assets::Instance1; + +// For foreign assets, these parameters dont matter much +// as this will only be called by root with the forced arguments +// No deposit is substracted with those methods +// For local assets, they do matter. We use similar parameters +// to those in statemine (except for approval) +parameter_types! { + pub const AssetDeposit: Balance = 100 * currency::UNIT * currency::SUPPLY_FACTOR; + pub const ApprovalDeposit: Balance = 0; + pub const AssetsStringLimit: u32 = 50; + pub const MetadataDepositBase: Balance = currency::deposit(1,68); + pub const MetadataDepositPerByte: Balance = currency::deposit(0, 1); +} + +/// We allow root and Chain council to execute privileged asset operations. +pub type AssetsForceOrigin = EitherOfDiverse< + EnsureRoot, + EitherOfDiverse< + pallet_collective::EnsureProportionMoreThan, + governance::custom_origins::GeneralAdmin, + >, +>; + +// Required for runtime benchmarks +pallet_assets::runtime_benchmarks_enabled! { + pub struct BenchmarkHelper; + impl pallet_assets::BenchmarkHelper for BenchmarkHelper + where + AssetIdParameter: From, + { + fn create_asset_id_parameter(id: u32) -> AssetIdParameter { + (id as u128).into() + } + } +} + +// Foreign assets +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type Currency = Balances; + type ForceOrigin = AssetsForceOrigin; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type AssetAccountDeposit = ConstU128<{ currency::deposit(1, 18) }>; + type WeightInfo = pallet_assets::weights::SubstrateWeight; + type RemoveItemsLimit = ConstU32<{ REMOVE_ITEMS_LIMIT }>; + type AssetIdParameter = Compact; + type CreateOrigin = AsEnsureOriginWithArg>; + type CallbackHandle = (); + pallet_assets::runtime_benchmarks_enabled! { + type BenchmarkHelper = BenchmarkHelper; + } +} + +// Local assets +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type Currency = Balances; + type ForceOrigin = AssetsForceOrigin; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type AssetAccountDeposit = ConstU128<{ currency::deposit(1, 18) }>; + type WeightInfo = pallet_assets::weights::SubstrateWeight; + type RemoveItemsLimit = ConstU32<{ REMOVE_ITEMS_LIMIT }>; + type AssetIdParameter = Compact; + type CreateOrigin = AsEnsureOriginWithArg>; + type CallbackHandle = (); + pallet_assets::runtime_benchmarks_enabled! { + type BenchmarkHelper = BenchmarkHelper; + } +} + +// We instruct how to register the Assets +// In this case, we tell it to Create an Asset in pallet-assets +pub struct AssetRegistrar; +use frame_support::{pallet_prelude::DispatchResult, transactional}; + +impl pallet_asset_manager::AssetRegistrar for AssetRegistrar { + #[transactional] + fn create_foreign_asset( + asset: AssetId, + min_balance: Balance, + metadata: AssetRegistrarMetadata, + is_sufficient: bool, + ) -> DispatchResult { + Assets::force_create( + RuntimeOrigin::root(), + asset.into(), + AssetManager::account_id(), + is_sufficient, + min_balance, + )?; + + // TODO uncomment when we feel comfortable + /* + // The asset has been created. Let's put the revert code in the precompile address + let precompile_address = Runtime::asset_id_to_account(ASSET_PRECOMPILE_ADDRESS_PREFIX, asset); + pallet_evm::AccountCodes::::insert( + precompile_address, + vec![0x60, 0x00, 0x60, 0x00, 0xfd], + );*/ + + // Lastly, the metadata + Assets::force_set_metadata( + RuntimeOrigin::root(), + asset.into(), + metadata.name, + metadata.symbol, + metadata.decimals, + metadata.is_frozen, + ) + } + + #[transactional] + fn create_local_asset( + asset: AssetId, + _creator: AccountId, + min_balance: Balance, + is_sufficient: bool, + owner: AccountId, + ) -> DispatchResult { + // We create with root, because we need to decide whether we want to create the asset + // as sufficient. Take into account this does not hold any reserved amount + // in pallet-assets + LocalAssets::force_create( + RuntimeOrigin::root(), + asset.into(), + owner, + is_sufficient, + min_balance, + )?; + + // No metadata needs to be set, as this can be set through regular calls + + // TODO: should we put the revert code? + // The asset has been created. Let's put the revert code in the precompile address + let precompile_address: H160 = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, asset).into(); + pallet_evm::AccountCodes::::insert( + precompile_address, + vec![0x60, 0x00, 0x60, 0x00, 0xfd], + ); + Ok(()) + } + + #[transactional] + fn destroy_foreign_asset(asset: AssetId) -> DispatchResult { + // First destroy the asset + Assets::start_destroy(RuntimeOrigin::root(), asset.into())?; + + // We remove the EVM revert code + // This does not panick even if there is no code in the address + let precompile_address: H160 = + Runtime::asset_id_to_account(FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, asset).into(); + pallet_evm::AccountCodes::::remove(precompile_address); + Ok(()) + } + + #[transactional] + fn destroy_local_asset(asset: AssetId) -> DispatchResult { + // First destroy the asset + LocalAssets::start_destroy(RuntimeOrigin::root(), asset.into())?; + + // We remove the EVM revert code + // This does not panick even if there is no code in the address + let precompile_address: H160 = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, asset).into(); + pallet_evm::AccountCodes::::remove(precompile_address); + Ok(()) + } + + fn destroy_asset_dispatch_info_weight(asset: AssetId) -> Weight { + // For us both of them (Foreign and Local) have the same annotated weight for a given + // witness + // We need to take the dispatch info from the destroy call, which is already annotated in + // the assets pallet + // Additionally, we need to add a DB write for removing the precompile revert code in the + // EVM + + // This is the dispatch info of destroy + let call_weight = RuntimeCall::Assets( + pallet_assets::Call::::start_destroy { + id: asset.into(), + }, + ) + .get_dispatch_info() + .weight; + + // This is the db write + call_weight.saturating_add(::DbWeight::get().writes(1)) + } +} + +pub struct LocalAssetIdCreator; +impl pallet_asset_manager::LocalAssetIdCreator for LocalAssetIdCreator { + fn create_asset_id_from_metadata(local_asset_counter: u128) -> AssetId { + // Our means of converting a local asset counter to an assetId + // We basically hash (local asset counter) + let mut result: [u8; 16] = [0u8; 16]; + let hash: H256 = + local_asset_counter.using_encoded(::Hashing::hash); + result.copy_from_slice(&hash.as_fixed_bytes()[0..16]); + u128::from_le_bytes(result) + } +} + +#[derive(Clone, Default, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub struct AssetRegistrarMetadata { + pub name: Vec, + pub symbol: Vec, + pub decimals: u8, + pub is_frozen: bool, +} + +pub type ForeignAssetModifierOrigin = EitherOfDiverse< + EnsureRoot, + EitherOfDiverse< + pallet_collective::EnsureProportionMoreThan, + governance::custom_origins::GeneralAdmin, + >, +>; +pub type LocalAssetModifierOrigin = EitherOfDiverse< + EnsureRoot, + EitherOfDiverse< + pallet_collective::EnsureProportionMoreThan, + governance::custom_origins::GeneralAdmin, + >, +>; + +impl pallet_asset_manager::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type AssetRegistrarMetadata = AssetRegistrarMetadata; + type ForeignAssetType = xcm_config::AssetType; + type AssetRegistrar = AssetRegistrar; + type ForeignAssetModifierOrigin = ForeignAssetModifierOrigin; + type LocalAssetModifierOrigin = LocalAssetModifierOrigin; + type LocalAssetIdCreator = LocalAssetIdCreator; + type Currency = Balances; + type LocalAssetDeposit = AssetDeposit; + type WeightInfo = pallet_asset_manager::weights::SubstrateWeight; +} + +// Instruct how to go from an H160 to an AssetID +// We just take the lowest 128 bits +impl AccountIdAssetIdConversion for Runtime { + /// The way to convert an account to assetId is by ensuring that the prefix is 0XFFFFFFFF + /// and by taking the lowest 128 bits as the assetId + fn account_to_asset_id(account: AccountId) -> Option<(Vec, AssetId)> { + let h160_account: H160 = account.into(); + let mut data = [0u8; 16]; + let (prefix_part, id_part) = h160_account.as_fixed_bytes().split_at(4); + if prefix_part == FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX + || prefix_part == LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX + { + data.copy_from_slice(id_part); + let asset_id: AssetId = u128::from_be_bytes(data).into(); + Some((prefix_part.to_vec(), asset_id)) + } else { + None + } + } + + // The opposite conversion + fn asset_id_to_account(prefix: &[u8], asset_id: AssetId) -> AccountId { + let mut data = [0u8; 20]; + data[0..4].copy_from_slice(prefix); + data[4..20].copy_from_slice(&asset_id.to_be_bytes()); + AccountId::from(data) + } +} diff --git a/tracing/2402/runtime/moonbase/src/governance/councils.rs b/tracing/2402/runtime/moonbase/src/governance/councils.rs new file mode 100644 index 0000000..2baf41a --- /dev/null +++ b/tracing/2402/runtime/moonbase/src/governance/councils.rs @@ -0,0 +1,88 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Councils for Gov1 and Gov2 + +use super::*; + +pub type CouncilInstance = pallet_collective::Instance1; +pub type TechCommitteeInstance = pallet_collective::Instance2; +pub type TreasuryCouncilInstance = pallet_collective::Instance3; +pub type OpenTechCommitteeInstance = pallet_collective::Instance4; + +impl pallet_collective::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Proposal = RuntimeCall; + /// The maximum amount of time (in blocks) for council members to vote on motions. + /// Motions may end in fewer blocks if enough votes are cast to determine the result. + type MotionDuration = ConstU32<{ 3 * DAYS }>; + /// The maximum number of proposals that can be open in the council at once. + type MaxProposals = ConstU32<100>; + /// The maximum number of council members. + type MaxMembers = ConstU32<100>; + type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote; + type WeightInfo = pallet_collective::weights::SubstrateWeight; + type SetMembersOrigin = referenda::GeneralAdminOrRoot; +} + +impl pallet_collective::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Proposal = RuntimeCall; + /// The maximum amount of time (in blocks) for technical committee members to vote on motions. + /// Motions may end in fewer blocks if enough votes are cast to determine the result. + type MotionDuration = ConstU32<{ 3 * DAYS }>; + /// The maximum number of proposals that can be open in the technical committee at once. + type MaxProposals = ConstU32<100>; + /// The maximum number of technical committee members. + type MaxMembers = ConstU32<100>; + type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote; + type WeightInfo = pallet_collective::weights::SubstrateWeight; + type SetMembersOrigin = referenda::GeneralAdminOrRoot; +} + +impl pallet_collective::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Proposal = RuntimeCall; + /// The maximum amount of time (in blocks) for treasury council members to vote on motions. + /// Motions may end in fewer blocks if enough votes are cast to determine the result. + type MotionDuration = ConstU32<{ 3 * DAYS }>; + /// The maximum number of proposals that can be open in the treasury council at once. + type MaxProposals = ConstU32<20>; + /// The maximum number of treasury council members. + type MaxMembers = ConstU32<9>; + type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote; + type WeightInfo = pallet_collective::weights::SubstrateWeight; + type SetMembersOrigin = referenda::GeneralAdminOrRoot; +} + +impl pallet_collective::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Proposal = RuntimeCall; + /// The maximum amount of time (in blocks) for technical committee members to vote on motions. + /// Motions may end in fewer blocks if enough votes are cast to determine the result. + type MotionDuration = ConstU32<{ 14 * DAYS }>; + /// The maximum number of proposals that can be open in the technical committee at once. + type MaxProposals = ConstU32<100>; + /// The maximum number of technical committee members. + type MaxMembers = ConstU32<100>; + type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote; + type WeightInfo = pallet_collective::weights::SubstrateWeight; + type SetMembersOrigin = referenda::GeneralAdminOrRoot; +} diff --git a/tracing/2402/runtime/moonbase/src/governance/democracy.rs b/tracing/2402/runtime/moonbase/src/governance/democracy.rs new file mode 100644 index 0000000..6f58287 --- /dev/null +++ b/tracing/2402/runtime/moonbase/src/governance/democracy.rs @@ -0,0 +1,76 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Democracy config for Gov1 + +use super::councils::*; +use crate::*; + +// The purpose of this offset is to ensure that a democratic proposal will not apply in the same +// block as a round change. +const ENACTMENT_OFFSET: u32 = 300; + +impl pallet_democracy::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type EnactmentPeriod = ConstU32<{ 1 * DAYS + ENACTMENT_OFFSET }>; + type LaunchPeriod = ConstU32<{ 1 * DAYS }>; + type VotingPeriod = ConstU32<{ 5 * DAYS }>; + type VoteLockingPeriod = ConstU32<{ 1 * DAYS }>; + type FastTrackVotingPeriod = ConstU32<{ 4 * HOURS }>; + type MinimumDeposit = ConstU128<{ 4 * currency::UNIT * currency::SUPPLY_FACTOR }>; + /// To decide what their next motion is. + type ExternalOrigin = + pallet_collective::EnsureProportionAtLeast; + /// To have the next scheduled referendum be a straight majority-carries vote. + type ExternalMajorityOrigin = + pallet_collective::EnsureProportionAtLeast; + /// To have the next scheduled referendum be a straight default-carries (NTB) vote. + type ExternalDefaultOrigin = + pallet_collective::EnsureProportionAtLeast; + /// To allow a shorter voting/enactment period for external proposals. + type FastTrackOrigin = + pallet_collective::EnsureProportionAtLeast; + /// To instant fast track. + type InstantOrigin = + pallet_collective::EnsureProportionAtLeast; + // To cancel a proposal which has been passed. + type CancellationOrigin = EitherOfDiverse< + EnsureRoot, + pallet_collective::EnsureProportionAtLeast, + >; + // To cancel a proposal before it has been passed. + type CancelProposalOrigin = EitherOfDiverse< + EnsureRoot, + pallet_collective::EnsureProportionAtLeast, + >; + type BlacklistOrigin = EnsureRoot; + // Any single technical committee member may veto a coming council proposal, however they can + // only do it once and it lasts only for the cooloff period. + type VetoOrigin = pallet_collective::EnsureMember; + type CooloffPeriod = ConstU32<{ 7 * DAYS }>; + type Slash = (); + type InstantAllowed = ConstBool; + type Scheduler = Scheduler; + type MaxVotes = ConstU32<100>; + type PalletsOrigin = OriginCaller; + type WeightInfo = pallet_democracy::weights::SubstrateWeight; + type MaxProposals = ConstU32<100>; + type Preimages = Preimage; + type MaxDeposits = ConstU32<100>; + type MaxBlacklisted = ConstU32<100>; + type SubmitOrigin = EnsureSigned; +} diff --git a/tracing/2402/runtime/moonbase/src/governance/mod.rs b/tracing/2402/runtime/moonbase/src/governance/mod.rs new file mode 100644 index 0000000..0367cdf --- /dev/null +++ b/tracing/2402/runtime/moonbase/src/governance/mod.rs @@ -0,0 +1,30 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Governance configurations + +pub mod councils; +mod democracy; +pub mod referenda; + +use super::*; + +mod origins; +pub use origins::{ + custom_origins, GeneralAdmin, ReferendumCanceller, ReferendumKiller, WhitelistedCaller, +}; +mod tracks; +pub use tracks::TracksInfo; diff --git a/tracing/2402/runtime/moonbase/src/governance/origins.rs b/tracing/2402/runtime/moonbase/src/governance/origins.rs new file mode 100644 index 0000000..20d0829 --- /dev/null +++ b/tracing/2402/runtime/moonbase/src/governance/origins.rs @@ -0,0 +1,80 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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. + +//! Custom origins for governance interventions. +pub use custom_origins::*; + +#[frame_support::pallet] +pub mod custom_origins { + use frame_support::pallet_prelude::*; + use strum_macros::EnumString; + + #[pallet::config] + pub trait Config: frame_system::Config {} + + #[pallet::pallet] + pub struct Pallet(_); + + #[derive( + PartialEq, Eq, Clone, MaxEncodedLen, Encode, Decode, TypeInfo, RuntimeDebug, EnumString, + )] + #[strum(serialize_all = "snake_case")] + #[pallet::origin] + pub enum Origin { + /// Origin able to dispatch a whitelisted call. + WhitelistedCaller, + /// General admin + GeneralAdmin, + /// Origin able to cancel referenda. + ReferendumCanceller, + /// Origin able to kill referenda. + ReferendumKiller, + } + + macro_rules! decl_unit_ensures { + ( $name:ident: $success_type:ty = $success:expr ) => { + pub struct $name; + impl> + From> + EnsureOrigin for $name + { + type Success = $success_type; + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + Origin::$name => Ok($success), + r => Err(O::from(r)), + }) + } + #[cfg(feature = "runtime-benchmarks")] + fn try_successful_origin() -> Result { + Ok(O::from(Origin::$name)) + } + } + }; + ( $name:ident ) => { decl_unit_ensures! { $name : () = () } }; + ( $name:ident: $success_type:ty = $success:expr, $( $rest:tt )* ) => { + decl_unit_ensures! { $name: $success_type = $success } + decl_unit_ensures! { $( $rest )* } + }; + ( $name:ident, $( $rest:tt )* ) => { + decl_unit_ensures! { $name } + decl_unit_ensures! { $( $rest )* } + }; + () => {} + } + decl_unit_ensures!( + ReferendumCanceller, + ReferendumKiller, + WhitelistedCaller, + GeneralAdmin + ); +} diff --git a/tracing/2402/runtime/moonbase/src/governance/referenda.rs b/tracing/2402/runtime/moonbase/src/governance/referenda.rs new file mode 100644 index 0000000..abf26ba --- /dev/null +++ b/tracing/2402/runtime/moonbase/src/governance/referenda.rs @@ -0,0 +1,97 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! # Gov2 config +//! Includes runtime configs for these substrate pallets: +//! 1. pallet-conviction-voting +//! 2. pallet-whitelist +//! 3. pallet-referenda + +use super::*; +use crate::currency::*; +use frame_support::traits::{EitherOf, MapSuccess}; +use frame_system::EnsureRootWithSuccess; +use sp_runtime::traits::Replace; + +parameter_types! { + pub const VoteLockingPeriod: BlockNumber = 1 * DAYS; +} + +impl pallet_conviction_voting::Config for Runtime { + type WeightInfo = pallet_conviction_voting::weights::SubstrateWeight; + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type Polls = Referenda; + type MaxTurnout = frame_support::traits::TotalIssuanceOf; + // Maximum number of concurrent votes an account may have + type MaxVotes = ConstU32<20>; + // Minimum period of vote locking + type VoteLockingPeriod = VoteLockingPeriod; +} + +parameter_types! { + pub const AlarmInterval: BlockNumber = 1; + pub const SubmissionDeposit: Balance = 10 * UNIT * SUPPLY_FACTOR; + pub const UndecidingTimeout: BlockNumber = 14 * DAYS; +} + +pub type GeneralAdminOrRoot = EitherOf, origins::GeneralAdmin>; + +impl custom_origins::Config for Runtime {} + +// The purpose of this pallet is to queue calls to be dispatched as by root later => the Dispatch +// origin corresponds to the Gov2 Whitelist track. +impl pallet_whitelist::Config for Runtime { + type WeightInfo = pallet_whitelist::weights::SubstrateWeight; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type WhitelistOrigin = EitherOf< + EnsureRootWithSuccess>, + MapSuccess< + pallet_collective::EnsureProportionAtLeast< + Self::AccountId, + OpenTechCommitteeInstance, + 5, + 9, + >, + Replace>, + >, + >; + type DispatchWhitelistedOrigin = EitherOf, WhitelistedCaller>; + type Preimages = Preimage; +} + +pallet_referenda::impl_tracksinfo_get!(TracksInfo, Balance, BlockNumber); + +impl pallet_referenda::Config for Runtime { + type WeightInfo = pallet_referenda::weights::SubstrateWeight; + type RuntimeCall = RuntimeCall; + type RuntimeEvent = RuntimeEvent; + type Scheduler = Scheduler; + type Currency = Balances; + type SubmitOrigin = frame_system::EnsureSigned; + type CancelOrigin = EitherOf, ReferendumCanceller>; + type KillOrigin = EitherOf, ReferendumKiller>; + type Slash = Treasury; + type Votes = pallet_conviction_voting::VotesOf; + type Tally = pallet_conviction_voting::TallyOf; + type SubmissionDeposit = SubmissionDeposit; + type MaxQueued = ConstU32<100>; + type UndecidingTimeout = UndecidingTimeout; + type AlarmInterval = AlarmInterval; + type Tracks = TracksInfo; + type Preimages = Preimage; +} diff --git a/tracing/2402/runtime/moonbase/src/governance/tracks.rs b/tracing/2402/runtime/moonbase/src/governance/tracks.rs new file mode 100644 index 0000000..1b0bd31 --- /dev/null +++ b/tracing/2402/runtime/moonbase/src/governance/tracks.rs @@ -0,0 +1,179 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +//! Track configurations for governance. + +use super::*; +use crate::currency::{KILOUNIT, SUPPLY_FACTOR, UNIT}; +use sp_std::str::FromStr; + +const fn percent(x: i32) -> sp_runtime::FixedI64 { + sp_runtime::FixedI64::from_rational(x as u128, 100) +} +const fn permill(x: i32) -> sp_runtime::FixedI64 { + sp_runtime::FixedI64::from_rational(x as u128, 1000) +} + +use pallet_referenda::Curve; +const TRACKS_DATA: [(u16, pallet_referenda::TrackInfo); 5] = [ + ( + 0, + pallet_referenda::TrackInfo { + // Name of this track. + name: "root", + // A limit for the number of referenda on this track that can be being decided at once. + // For Root origin this should generally be just one. + max_deciding: 5, + // Amount that must be placed on deposit before a decision can be made. + decision_deposit: 100 * KILOUNIT * SUPPLY_FACTOR, + // Amount of time this must be submitted for before a decision can be made. + prepare_period: 1 * DAYS, + // Amount of time that a decision may take to be approved prior to cancellation. + decision_period: 14 * DAYS, + // Amount of time that the approval criteria must hold before it can be approved. + confirm_period: 1 * DAYS, + // Minimum amount of time that an approved proposal must be in the dispatch queue. + min_enactment_period: 1 * DAYS, + // Minimum aye votes as percentage of overall conviction-weighted votes needed for + // approval as a function of time into decision period. + min_approval: Curve::make_reciprocal(4, 14, percent(80), percent(50), percent(100)), + // Minimum pre-conviction aye-votes ("support") as percentage of overall population that + // is needed for approval as a function of time into decision period. + min_support: Curve::make_linear(14, 14, permill(5), percent(25)), + }, + ), + ( + 1, + pallet_referenda::TrackInfo { + name: "whitelisted_caller", + max_deciding: 100, + decision_deposit: 10 * KILOUNIT * SUPPLY_FACTOR, + prepare_period: 10 * MINUTES, + decision_period: 14 * DAYS, + confirm_period: 10 * MINUTES, + min_enactment_period: 30 * MINUTES, + min_approval: Curve::make_reciprocal(1, 14, percent(96), percent(50), percent(100)), + min_support: Curve::make_reciprocal(1, 14 * 24, percent(1), percent(0), percent(2)), + }, + ), + ( + 2, + pallet_referenda::TrackInfo { + name: "general_admin", + max_deciding: 10, + decision_deposit: 500 * UNIT * SUPPLY_FACTOR, + prepare_period: 1 * HOURS, + decision_period: 14 * DAYS, + confirm_period: 1 * DAYS, + min_enactment_period: 1 * DAYS, + min_approval: Curve::make_reciprocal(4, 14, percent(80), percent(50), percent(100)), + min_support: Curve::make_reciprocal(7, 14, percent(10), percent(0), percent(50)), + }, + ), + ( + 3, + pallet_referenda::TrackInfo { + name: "referendum_canceller", + max_deciding: 20, + decision_deposit: 10 * KILOUNIT * SUPPLY_FACTOR, + prepare_period: 1 * HOURS, + decision_period: 14 * DAYS, + confirm_period: 3 * HOURS, + min_enactment_period: 10 * MINUTES, + min_approval: Curve::make_reciprocal(1, 14, percent(96), percent(50), percent(100)), + min_support: Curve::make_reciprocal(1, 14, percent(1), percent(0), percent(50)), + }, + ), + ( + 4, + pallet_referenda::TrackInfo { + name: "referendum_killer", + max_deciding: 100, + decision_deposit: 20 * KILOUNIT * SUPPLY_FACTOR, + prepare_period: 1 * HOURS, + decision_period: 14 * DAYS, + confirm_period: 3 * HOURS, + min_enactment_period: 10 * MINUTES, + min_approval: Curve::make_reciprocal(1, 14, percent(96), percent(50), percent(100)), + min_support: Curve::make_reciprocal(1, 14, percent(1), percent(0), percent(10)), + }, + ), +]; + +pub struct TracksInfo; +impl pallet_referenda::TracksInfo for TracksInfo { + type Id = u16; + type RuntimeOrigin = ::PalletsOrigin; + fn tracks() -> &'static [(Self::Id, pallet_referenda::TrackInfo)] { + &TRACKS_DATA[..] + } + fn track_for(id: &Self::RuntimeOrigin) -> Result { + if let Ok(system_origin) = frame_system::RawOrigin::try_from(id.clone()) { + match system_origin { + frame_system::RawOrigin::Root => { + if let Some((track_id, _)) = Self::tracks() + .into_iter() + .find(|(_, track)| track.name == "root") + { + Ok(*track_id) + } else { + Err(()) + } + } + _ => Err(()), + } + } else if let Ok(custom_origin) = custom_origins::Origin::try_from(id.clone()) { + if let Some((track_id, _)) = Self::tracks().into_iter().find(|(_, track)| { + if let Ok(track_custom_origin) = custom_origins::Origin::from_str(track.name) { + track_custom_origin == custom_origin + } else { + false + } + }) { + Ok(*track_id) + } else { + Err(()) + } + } else { + Err(()) + } + } +} + +#[test] +/// To ensure voters are always locked into their vote +fn vote_locking_always_longer_than_enactment_period() { + for (_, track) in TRACKS_DATA { + assert!( + ::VoteLockingPeriod::get() + >= track.min_enactment_period, + "Track {} has enactment period {} < vote locking period {}", + track.name, + track.min_enactment_period, + ::VoteLockingPeriod::get(), + ); + } +} + +#[test] +fn all_tracks_have_origins() { + for (_, track) in TRACKS_DATA { + // check name.into() is successful either converts into "root" or custom origin + let track_is_root = track.name == "root"; + let track_has_custom_origin = custom_origins::Origin::from_str(track.name).is_ok(); + assert!(track_is_root || track_has_custom_origin); + } +} diff --git a/tracing/2402/runtime/moonbase/src/lib.rs b/tracing/2402/runtime/moonbase/src/lib.rs new file mode 100644 index 0000000..8e2e562 --- /dev/null +++ b/tracing/2402/runtime/moonbase/src/lib.rs @@ -0,0 +1,1690 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! The Moonbase Runtime. +//! +//! Primary features of this runtime include: +//! * Ethereum compatibility +//! * Moonbase tokenomics + +#![cfg_attr(not(feature = "std"), no_std)] +// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. +#![recursion_limit = "256"] + +// Make the WASM binary available. +#[cfg(feature = "std")] +include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); + +use cumulus_pallet_parachain_system::{RelayChainStateProof, RelaychainDataProvider}; +use cumulus_primitives_core::relay_chain; +use fp_rpc::TransactionStatus; + +use account::AccountId20; + +// Re-export required by get! macro. +pub use frame_support::traits::Get; +use frame_support::{ + construct_runtime, + dispatch::{DispatchClass, GetDispatchInfo}, + ensure, + pallet_prelude::DispatchResult, + parameter_types, + traits::{ + ConstBool, ConstU128, ConstU16, ConstU32, ConstU64, ConstU8, Contains, + Currency as CurrencyT, EitherOfDiverse, EqualPrivilegeOnly, FindAuthor, Imbalance, + InstanceFilter, OffchainWorker, OnFinalize, OnIdle, OnInitialize, OnRuntimeUpgrade, + OnUnbalanced, + }, + weights::{ + constants::{RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND}, + ConstantMultiplier, Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, + WeightToFeePolynomial, + }, + PalletId, +}; + +#[cfg(feature = "std")] +pub use fp_evm::GenesisAccount; +use frame_system::{EnsureRoot, EnsureSigned}; +pub use moonbeam_core_primitives::{ + AccountId, AccountIndex, Address, AssetId, Balance, BlockNumber, DigestItem, Hash, Header, + Index, Signature, +}; +use moonbeam_rpc_primitives_txpool::TxPoolResponse; +pub use pallet_author_slot_filter::EligibilityValue; +use pallet_balances::NegativeImbalance; +use pallet_ethereum::Call::transact; +use pallet_ethereum::{PostLogContent, Transaction as EthereumTransaction}; +use pallet_evm::{ + Account as EVMAccount, EVMCurrencyAdapter, EnsureAddressNever, EnsureAddressRoot, + FeeCalculator, GasWeightMapping, OnChargeEVMTransaction as OnChargeEVMTransactionT, Runner, +}; +pub use pallet_parachain_staking::{InflationInfo, Range}; +use pallet_transaction_payment::{CurrencyAdapter, Multiplier, TargetedFeeAdjustment}; +use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; +use scale_info::TypeInfo; +use sp_api::impl_runtime_apis; +use sp_core::{OpaqueMetadata, H160, H256, U256}; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, + traits::{ + BlakeTwo256, Block as BlockT, DispatchInfoOf, Dispatchable, IdentityLookup, + PostDispatchInfoOf, UniqueSaturatedInto, Zero, + }, + transaction_validity::{ + InvalidTransaction, TransactionSource, TransactionValidity, TransactionValidityError, + }, + ApplyExtrinsicResult, FixedPointNumber, Perbill, Permill, Perquintill, +}; +use sp_std::{ + convert::{From, Into}, + prelude::*, +}; +#[cfg(feature = "std")] +use sp_version::NativeVersion; +use sp_version::RuntimeVersion; + +use nimbus_primitives::CanAuthor; + +mod precompiles; +pub use precompiles::{ + MoonbasePrecompiles, PrecompileName, FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, +}; + +use smallvec::smallvec; + +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; + +pub type Precompiles = MoonbasePrecompiles; + +pub mod asset_config; +pub mod governance; +pub mod xcm_config; +use governance::councils::*; + +/// UNIT, the native token, uses 18 decimals of precision. +pub mod currency { + use super::Balance; + + // Provide a common factor between runtimes based on a supply of 10_000_000 tokens. + pub const SUPPLY_FACTOR: Balance = 1; + + pub const WEI: Balance = 1; + pub const KILOWEI: Balance = 1_000; + pub const MEGAWEI: Balance = 1_000_000; + pub const GIGAWEI: Balance = 1_000_000_000; + pub const MICROUNIT: Balance = 1_000_000_000_000; + pub const MILLIUNIT: Balance = 1_000_000_000_000_000; + pub const UNIT: Balance = 1_000_000_000_000_000_000; + pub const KILOUNIT: Balance = 1_000_000_000_000_000_000_000; + + pub const TRANSACTION_BYTE_FEE: Balance = 1 * GIGAWEI * SUPPLY_FACTOR; + pub const STORAGE_BYTE_FEE: Balance = 100 * MICROUNIT * SUPPLY_FACTOR; + pub const WEIGHT_FEE: Balance = 50 * KILOWEI * SUPPLY_FACTOR; + + pub const fn deposit(items: u32, bytes: u32) -> Balance { + items as Balance * 1 * UNIT * SUPPLY_FACTOR + (bytes as Balance) * STORAGE_BYTE_FEE + } +} + +/// Maximum weight per block +pub const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND, u64::MAX) + .saturating_div(2) + .set_proof_size(cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64); + +pub const MILLISECS_PER_BLOCK: u64 = 12000; +pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); +pub const HOURS: BlockNumber = MINUTES * 60; +pub const DAYS: BlockNumber = HOURS * 24; +pub const WEEKS: BlockNumber = DAYS * 7; +/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know +/// the specifics of the runtime. They can then be made to be agnostic over specific formats +/// of data like extrinsics, allowing for them to continue syncing the network through upgrades +/// to even the core data structures. +pub mod opaque { + use super::*; + + pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; + pub type Block = generic::Block; + + impl_opaque_keys! { + pub struct SessionKeys { + pub nimbus: AuthorInherent, + pub vrf: session_keys_primitives::VrfSessionKey, + } + } +} + +/// This runtime version. +/// The spec_version is composed of 2x2 digits. The first 2 digits represent major changes +/// that can't be skipped, such as data migration upgrades. The last 2 digits represent minor +/// changes which can be skipped. +#[sp_version::runtime_version] +pub const VERSION: RuntimeVersion = RuntimeVersion { + spec_name: create_runtime_str!("moonbase"), + impl_name: create_runtime_str!("moonbase"), + authoring_version: 4, + spec_version: 2402, + impl_version: 0, + apis: RUNTIME_API_VERSIONS, + transaction_version: 2, + state_version: 0, +}; + +/// The version information used to identify this runtime when compiled natively. +#[cfg(feature = "std")] +pub fn native_version() -> NativeVersion { + NativeVersion { + runtime_version: VERSION, + can_author_with: Default::default(), + } +} + +const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); +pub const NORMAL_WEIGHT: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_mul(3).saturating_div(4); +// Here we assume Ethereum's base fee of 21000 gas and convert to weight, but we +// subtract roughly the cost of a balance transfer from it (about 1/3 the cost) +// and some cost to account for per-byte-fee. +// TODO: we should use benchmarking's overhead feature to measure this +pub const EXTRINSIC_BASE_WEIGHT: Weight = Weight::from_parts(10000 * WEIGHT_PER_GAS, 0); + +pub struct RuntimeBlockWeights; +impl Get for RuntimeBlockWeights { + fn get() -> frame_system::limits::BlockWeights { + frame_system::limits::BlockWeights::builder() + .for_class(DispatchClass::Normal, |weights| { + weights.base_extrinsic = EXTRINSIC_BASE_WEIGHT; + weights.max_total = NORMAL_WEIGHT.into(); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = MAXIMUM_BLOCK_WEIGHT.into(); + weights.reserved = (MAXIMUM_BLOCK_WEIGHT - NORMAL_WEIGHT).into(); + }) + .avg_block_initialization(Perbill::from_percent(10)) + .build() + .expect("Provided BlockWeight definitions are valid, qed") + } +} + +parameter_types! { + pub const Version: RuntimeVersion = VERSION; + /// TODO: this is left here so that `impl_runtime_apis_plus_common` will find the same type for + /// `BlockWeights` in all runtimes. It can probably be removed once the custom + /// `RuntimeBlockWeights` has been pushed to each runtime. + pub BlockWeights: frame_system::limits::BlockWeights = RuntimeBlockWeights::get(); + /// We allow for 5 MB blocks. + pub BlockLength: frame_system::limits::BlockLength = frame_system::limits::BlockLength + ::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); +} + +impl frame_system::Config for Runtime { + /// The identifier used to distinguish between accounts. + type AccountId = AccountId; + /// The aggregated dispatch type that is available for extrinsics. + type RuntimeCall = RuntimeCall; + /// The lookup mechanism to get account ID from whatever is passed in dispatchers. + type Lookup = IdentityLookup; + /// The index type for storing how many extrinsics an account has signed. + type Index = Index; + /// The index type for blocks. + type BlockNumber = BlockNumber; + /// The type for hashing blocks and tries. + type Hash = Hash; + /// The hashing algorithm used. + type Hashing = BlakeTwo256; + /// The header type. + type Header = generic::Header; + /// The ubiquitous event type. + type RuntimeEvent = RuntimeEvent; + /// The ubiquitous origin type. + type RuntimeOrigin = RuntimeOrigin; + /// Maximum number of block number to block hash mappings to keep (oldest pruned first). + type BlockHashCount = ConstU32<256>; + /// Maximum weight of each block. With a default weight system of 1byte == 1weight, 4mb is ok. + type BlockWeights = RuntimeBlockWeights; + /// Maximum size of all encoded transactions (in bytes) that are allowed in one block. + type BlockLength = BlockLength; + /// Runtime version. + type Version = Version; + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = RocksDbWeight; + type BaseCallFilter = MaintenanceMode; + type SystemWeightInfo = (); + /// This is used as an identifier of the chain. 42 is the generic substrate prefix. + type SS58Prefix = ConstU16<1287>; + type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +impl pallet_utility::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type PalletsOrigin = OriginCaller; + type WeightInfo = pallet_utility::weights::SubstrateWeight; +} + +impl pallet_timestamp::Config for Runtime { + /// A timestamp: milliseconds since the unix epoch. + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = ConstU64<6000>; + type WeightInfo = pallet_timestamp::weights::SubstrateWeight; +} + +impl pallet_balances::Config for Runtime { + type MaxReserves = ConstU32<50>; + type ReserveIdentifier = [u8; 4]; + type MaxLocks = ConstU32<50>; + /// The type for recording an account's balance. + type Balance = Balance; + /// The ubiquitous event type. + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ConstU128<0>; + type AccountStore = System; + type WeightInfo = pallet_balances::weights::SubstrateWeight; +} + +pub struct DealWithFees(sp_std::marker::PhantomData); +impl OnUnbalanced> for DealWithFees +where + R: pallet_balances::Config + pallet_treasury::Config, + pallet_treasury::Pallet: OnUnbalanced>, +{ + // this seems to be called for substrate-based transactions + fn on_unbalanceds(mut fees_then_tips: impl Iterator>) { + if let Some(fees) = fees_then_tips.next() { + // for fees, 80% are burned, 20% to the treasury + let (_, to_treasury) = fees.ration(80, 20); + // Balances pallet automatically burns dropped Negative Imbalances by decreasing + // total_supply accordingly + as OnUnbalanced<_>>::on_unbalanced(to_treasury); + + // handle tip if there is one + if let Some(tip) = fees_then_tips.next() { + // for now we use the same burn/treasury strategy used for regular fees + let (_, to_treasury) = tip.ration(80, 20); + as OnUnbalanced<_>>::on_unbalanced(to_treasury); + } + } + } + + // this is called from pallet_evm for Ethereum-based transactions + // (technically, it calls on_unbalanced, which calls this when non-zero) + fn on_nonzero_unbalanced(amount: NegativeImbalance) { + // Balances pallet automatically burns dropped Negative Imbalances by decreasing + // total_supply accordingly + let (_, to_treasury) = amount.ration(80, 20); + as OnUnbalanced<_>>::on_unbalanced(to_treasury); + } +} + +pub struct LengthToFee; +impl WeightToFeePolynomial for LengthToFee { + type Balance = Balance; + + fn polynomial() -> WeightToFeeCoefficients { + smallvec![ + WeightToFeeCoefficient { + degree: 1, + coeff_frac: Perbill::zero(), + coeff_integer: currency::TRANSACTION_BYTE_FEE, + negative: false, + }, + WeightToFeeCoefficient { + degree: 3, + coeff_frac: Perbill::zero(), + coeff_integer: 1 * currency::SUPPLY_FACTOR, + negative: false, + }, + ] + } +} + +impl pallet_transaction_payment::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnChargeTransaction = CurrencyAdapter>; + type OperationalFeeMultiplier = ConstU8<5>; + type WeightToFee = ConstantMultiplier>; + type LengthToFee = LengthToFee; + type FeeMultiplierUpdate = FastAdjustingFeeUpdate; +} + +impl pallet_sudo::Config for Runtime { + type RuntimeCall = RuntimeCall; + type RuntimeEvent = RuntimeEvent; +} + +impl pallet_ethereum_chain_id::Config for Runtime {} + +/// Current approximation of the gas/s consumption considering +/// EVM execution over compiled WASM (on 4.4Ghz CPU). +/// Given the 500ms Weight, from which 75% only are used for transactions, +/// the total EVM execution gas limit is: GAS_PER_SECOND * 0.500 * 0.75 ~= 15_000_000. +pub const GAS_PER_SECOND: u64 = 40_000_000; + +/// Approximate ratio of the amount of Weight per Gas. +/// u64 works for approximations because Weight is a very small unit compared to gas. +pub const WEIGHT_PER_GAS: u64 = WEIGHT_REF_TIME_PER_SECOND / GAS_PER_SECOND; + +parameter_types! { + pub BlockGasLimit: U256 + = U256::from(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT.ref_time() / WEIGHT_PER_GAS); + /// The portion of the `NORMAL_DISPATCH_RATIO` that we adjust the fees with. Blocks filled less + /// than this will decrease the weight and more will increase. + pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25); + /// The adjustment variable of the runtime. Higher values will cause `TargetBlockFullness` to + /// change the fees more rapidly. This fast multiplier responds by doubling/halving in + /// approximately one hour at extreme block congestion levels. + pub AdjustmentVariable: Multiplier = Multiplier::saturating_from_rational(4, 1_000); + /// Minimum amount of the multiplier. This value cannot be too low. A test case should ensure + /// that combined with `AdjustmentVariable`, we can recover from the minimum. + /// See `multiplier_can_grow_from_zero` in integration_tests.rs. + pub MinimumMultiplier: Multiplier = Multiplier::saturating_from_rational(1, 10); + /// Maximum multiplier. We pick a value that is expensive but not impossibly so; it should act + /// as a safety net. + pub MaximumMultiplier: Multiplier = Multiplier::from(100_000u128); + pub PrecompilesValue: MoonbasePrecompiles = MoonbasePrecompiles::<_>::new(); + pub WeightPerGas: Weight = Weight::from_parts(WEIGHT_PER_GAS, 0); + /// The amount of gas per pov. A ratio of 4 if we convert ref_time to gas and we compare + /// it with the pov_size for a block. E.g. + /// ceil( + /// (max_extrinsic.ref_time() / max_extrinsic.proof_size()) / WEIGHT_PER_GAS + /// ) + pub const GasLimitPovSizeRatio: u64 = 4; +} + +pub struct TransactionPaymentAsGasPrice; +impl FeeCalculator for TransactionPaymentAsGasPrice { + fn min_gas_price() -> (U256, Weight) { + // TODO: transaction-payment differs from EIP-1559 in that its tip and length fees are not + // scaled by the multiplier, which means its multiplier will be overstated when + // applied to an ethereum transaction + // note: transaction-payment uses both a congestion modifier (next_fee_multiplier, which is + // updated once per block in on_finalize) and a 'WeightToFee' implementation. Our + // runtime implements this as a 'ConstantModifier', so we can get away with a simple + // multiplication here. + // It is imperative that `saturating_mul_int` be performed as late as possible in the + // expression since it involves fixed point multiplication with a division by a fixed + // divisor. This leads to truncation and subsequent precision loss if performed too early. + // This can lead to min_gas_price being same across blocks even if the multiplier changes. + // There's still some precision loss when the final `gas_price` (used_gas * min_gas_price) + // is computed in frontier, but that's currently unavoidable. + let min_gas_price = TransactionPayment::next_fee_multiplier() + .saturating_mul_int(currency::WEIGHT_FEE.saturating_mul(WEIGHT_PER_GAS as u128)); + ( + min_gas_price.into(), + ::DbWeight::get().reads(1), + ) + } +} + +/// A "Fast" TargetedFeeAdjustment. Parameters chosen based on model described here: +/// https://research.web3.foundation/en/latest/polkadot/overview/2-token-economics.html#-1.-fast-adjusting-mechanism // editorconfig-checker-disable-line +/// +/// The adjustment algorithm boils down to: +/// +/// diff = (previous_block_weight - target) / maximum_block_weight +/// next_multiplier = prev_multiplier * (1 + (v * diff) + ((v * diff)^2 / 2)) +/// assert(next_multiplier > min) +/// where: v is AdjustmentVariable +/// target is TargetBlockFullness +/// min is MinimumMultiplier +pub type FastAdjustingFeeUpdate = TargetedFeeAdjustment< + R, + TargetBlockFullness, + AdjustmentVariable, + MinimumMultiplier, + MaximumMultiplier, +>; + +/// The author inherent provides an AccountId, but pallet evm needs an H160. +/// This simple adapter makes the conversion for any types T, U such that T: Into +pub struct FindAuthorAdapter(sp_std::marker::PhantomData<(T, U, Inner)>); + +impl FindAuthor for FindAuthorAdapter +where + T: Into, + Inner: FindAuthor, +{ + fn find_author<'a, I>(digests: I) -> Option + where + I: 'a + IntoIterator, + { + Inner::find_author(digests).map(Into::into) + } +} + +moonbeam_runtime_common::impl_on_charge_evm_transaction!(); + +impl pallet_evm::Config for Runtime { + type FeeCalculator = TransactionPaymentAsGasPrice; + type GasWeightMapping = pallet_evm::FixedGasWeightMapping; + type WeightPerGas = WeightPerGas; + type BlockHashMapping = pallet_ethereum::EthereumBlockHashMapping; + type CallOrigin = EnsureAddressRoot; + type WithdrawOrigin = EnsureAddressNever; + type AddressMapping = moonbeam_runtime_common::IntoAddressMapping; + type Currency = Balances; + type RuntimeEvent = RuntimeEvent; + type Runner = pallet_evm::runner::stack::Runner; + type PrecompilesType = MoonbasePrecompiles; + type PrecompilesValue = PrecompilesValue; + type ChainId = EthereumChainId; + type OnChargeTransaction = OnChargeEVMTransaction>; + type BlockGasLimit = BlockGasLimit; + type FindAuthor = FindAuthorAdapter; + type OnCreate = (); + type GasLimitPovSizeRatio = GasLimitPovSizeRatio; + type Timestamp = Timestamp; + type WeightInfo = pallet_evm::weights::SubstrateWeight; +} + +parameter_types! { + pub MaximumSchedulerWeight: Weight = NORMAL_DISPATCH_RATIO * RuntimeBlockWeights::get().max_block; + pub const NoPreimagePostponement: Option = Some(10); +} + +impl pallet_scheduler::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeOrigin = RuntimeOrigin; + type PalletsOrigin = OriginCaller; + type RuntimeCall = RuntimeCall; + type MaximumWeight = MaximumSchedulerWeight; + type ScheduleOrigin = EnsureRoot; + type MaxScheduledPerBlock = ConstU32<50>; + type WeightInfo = pallet_scheduler::weights::SubstrateWeight; + type OriginPrivilegeCmp = EqualPrivilegeOnly; + type Preimages = Preimage; +} + +impl pallet_preimage::Config for Runtime { + type WeightInfo = pallet_preimage::weights::SubstrateWeight; + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type ManagerOrigin = EnsureRoot; + type BaseDeposit = ConstU128<{ 5 * currency::UNIT * currency::SUPPLY_FACTOR }>; + type ByteDeposit = ConstU128<{ currency::STORAGE_BYTE_FEE }>; +} + +parameter_types! { + pub const ProposalBond: Permill = Permill::from_percent(5); + pub const TreasuryId: PalletId = PalletId(*b"pc/trsry"); +} + +type TreasuryApproveOrigin = EitherOfDiverse< + EnsureRoot, + pallet_collective::EnsureProportionAtLeast, +>; + +type TreasuryRejectOrigin = EitherOfDiverse< + EnsureRoot, + pallet_collective::EnsureProportionMoreThan, +>; + +impl pallet_treasury::Config for Runtime { + type PalletId = TreasuryId; + type Currency = Balances; + // At least three-fifths majority of the council is required (or root) to approve a proposal + type ApproveOrigin = TreasuryApproveOrigin; + // More than half of the council is required (or root) to reject a proposal + type RejectOrigin = TreasuryRejectOrigin; + type RuntimeEvent = RuntimeEvent; + // If spending proposal rejected, transfer proposer bond to treasury + type OnSlash = Treasury; + type ProposalBond = ProposalBond; + type ProposalBondMinimum = ConstU128<{ 1 * currency::UNIT * currency::SUPPLY_FACTOR }>; + type SpendPeriod = ConstU32<{ 6 * DAYS }>; + type Burn = (); + type BurnDestination = (); + type MaxApprovals = ConstU32<100>; + type WeightInfo = pallet_treasury::weights::SubstrateWeight; + type SpendFunds = (); + type ProposalBondMaximum = (); + type SpendOrigin = frame_support::traits::NeverEnsureOrigin; // Same as Polkadot +} + +type IdentityForceOrigin = EitherOfDiverse< + EnsureRoot, + EitherOfDiverse< + pallet_collective::EnsureProportionMoreThan, + governance::custom_origins::GeneralAdmin, + >, +>; +type IdentityRegistrarOrigin = EitherOfDiverse< + EnsureRoot, + EitherOfDiverse< + pallet_collective::EnsureProportionMoreThan, + governance::custom_origins::GeneralAdmin, + >, +>; + +impl pallet_identity::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + // Add one item in storage and take 258 bytes + type BasicDeposit = ConstU128<{ currency::deposit(1, 258) }>; + // Not add any item to the storage but takes 66 bytes + type FieldDeposit = ConstU128<{ currency::deposit(0, 66) }>; + // Add one item in storage and take 53 bytes + type SubAccountDeposit = ConstU128<{ currency::deposit(1, 53) }>; + type MaxSubAccounts = ConstU32<100>; + type MaxAdditionalFields = ConstU32<100>; + type MaxRegistrars = ConstU32<20>; + type Slashed = Treasury; + type ForceOrigin = IdentityForceOrigin; + type RegistrarOrigin = IdentityRegistrarOrigin; + type WeightInfo = pallet_identity::weights::SubstrateWeight; +} + +pub struct TransactionConverter; + +impl fp_rpc::ConvertTransaction for TransactionConverter { + fn convert_transaction(&self, transaction: pallet_ethereum::Transaction) -> UncheckedExtrinsic { + UncheckedExtrinsic::new_unsigned( + pallet_ethereum::Call::::transact { transaction }.into(), + ) + } +} + +impl fp_rpc::ConvertTransaction for TransactionConverter { + fn convert_transaction( + &self, + transaction: pallet_ethereum::Transaction, + ) -> opaque::UncheckedExtrinsic { + let extrinsic = UncheckedExtrinsic::new_unsigned( + pallet_ethereum::Call::::transact { transaction }.into(), + ); + let encoded = extrinsic.encode(); + opaque::UncheckedExtrinsic::decode(&mut &encoded[..]) + .expect("Encoded extrinsic is always valid") + } +} + +parameter_types! { + pub const PostBlockAndTxnHashes: PostLogContent = PostLogContent::BlockAndTxnHashes; +} + +impl pallet_ethereum::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type StateRoot = pallet_ethereum::IntermediateStateRoot; + type PostLogContent = PostBlockAndTxnHashes; + type ExtraDataLength = ConstU32<30>; +} + +pub struct EthereumXcmEnsureProxy; +impl xcm_primitives::EnsureProxy for EthereumXcmEnsureProxy { + fn ensure_ok(delegator: AccountId, delegatee: AccountId) -> Result<(), &'static str> { + // The EVM implicitely contains an Any proxy, so we only allow for "Any" proxies + let def: pallet_proxy::ProxyDefinition = + pallet_proxy::Pallet::::find_proxy( + &delegator, + &delegatee, + Some(ProxyType::Any), + ) + .map_err(|_| "proxy error: expected `ProxyType::Any`")?; + // We only allow to use it for delay zero proxies, as the call will immediatly be executed + ensure!(def.delay.is_zero(), "proxy delay is Non-zero`"); + Ok(()) + } +} + +impl pallet_ethereum_xcm::Config for Runtime { + type InvalidEvmTransactionError = pallet_ethereum::InvalidTransactionWrapper; + type ValidatedTransaction = pallet_ethereum::ValidatedTransaction; + type XcmEthereumOrigin = pallet_ethereum_xcm::EnsureXcmEthereumTransaction; + type ReservedXcmpWeight = ReservedXcmpWeight; + type EnsureProxy = EthereumXcmEnsureProxy; + type ControllerOrigin = EnsureRoot; +} + +parameter_types! { + pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); + pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); +} + +impl cumulus_pallet_parachain_system::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnSystemEvent = (); + type SelfParaId = ParachainInfo; + type DmpMessageHandler = MaintenanceMode; + type ReservedDmpWeight = ReservedDmpWeight; + type OutboundXcmpMessageSource = XcmpQueue; + type XcmpMessageHandler = XcmpQueue; + type ReservedXcmpWeight = ReservedXcmpWeight; + type CheckAssociatedRelayNumber = cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; +} + +impl parachain_info::Config for Runtime {} + +pub struct OnNewRound; +impl pallet_parachain_staking::OnNewRound for OnNewRound { + fn on_new_round(round_index: pallet_parachain_staking::RoundIndex) -> Weight { + MoonbeamOrbiters::on_new_round(round_index) + } +} +pub struct PayoutCollatorOrOrbiterReward; +impl pallet_parachain_staking::PayoutCollatorReward for PayoutCollatorOrOrbiterReward { + fn payout_collator_reward( + for_round: pallet_parachain_staking::RoundIndex, + collator_id: AccountId, + amount: Balance, + ) -> Weight { + let extra_weight = if MoonbeamOrbiters::is_orbiter(for_round, collator_id) { + MoonbeamOrbiters::distribute_rewards(for_round, collator_id, amount) + } else { + ParachainStaking::mint_collator_reward(for_round, collator_id, amount) + }; + + ::DbWeight::get() + .reads(1) + .saturating_add(extra_weight) + } +} + +type MonetaryGovernanceOrigin = + EitherOfDiverse, governance::custom_origins::GeneralAdmin>; + +impl pallet_parachain_staking::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type MonetaryGovernanceOrigin = MonetaryGovernanceOrigin; + /// Minimum round length is 2 minutes (10 * 12 second block times) + type MinBlocksPerRound = ConstU32<10>; + /// Rounds before the collator leaving the candidates request can be executed + type LeaveCandidatesDelay = ConstU32<2>; + /// Rounds before the candidate bond increase/decrease can be executed + type CandidateBondLessDelay = ConstU32<2>; + /// Rounds before the delegator exit can be executed + type LeaveDelegatorsDelay = ConstU32<2>; + /// Rounds before the delegator revocation can be executed + type RevokeDelegationDelay = ConstU32<2>; + /// Rounds before the delegator bond increase/decrease can be executed + type DelegationBondLessDelay = ConstU32<2>; + /// Rounds before the reward is paid + type RewardPaymentDelay = ConstU32<2>; + /// Minimum collators selected per round, default at genesis and minimum forever after + type MinSelectedCandidates = ConstU32<8>; + /// Maximum top delegations per candidate + type MaxTopDelegationsPerCandidate = ConstU32<300>; + /// Maximum bottom delegations per candidate + type MaxBottomDelegationsPerCandidate = ConstU32<50>; + /// Maximum delegations per delegator + type MaxDelegationsPerDelegator = ConstU32<100>; + /// Minimum stake required to be reserved to be a candidate + type MinCandidateStk = ConstU128<{ 500 * currency::UNIT * currency::SUPPLY_FACTOR }>; + /// Minimum stake required to be reserved to be a delegator + type MinDelegation = ConstU128<{ 1 * currency::UNIT * currency::SUPPLY_FACTOR }>; + /// Minimum stake required to be reserved to be a delegator + type MinDelegatorStk = ConstU128<{ 1 * currency::UNIT * currency::SUPPLY_FACTOR }>; + type BlockAuthor = AuthorInherent; + type OnCollatorPayout = (); + type PayoutCollatorReward = PayoutCollatorOrOrbiterReward; + type OnNewRound = OnNewRound; + type WeightInfo = pallet_parachain_staking::weights::SubstrateWeight; +} + +impl pallet_author_inherent::Config for Runtime { + type SlotBeacon = RelaychainDataProvider; + type AccountLookup = MoonbeamOrbiters; + type CanAuthor = AuthorFilter; + type WeightInfo = pallet_author_inherent::weights::SubstrateWeight; +} + +impl pallet_author_slot_filter::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RandomnessSource = Randomness; + type PotentialAuthors = ParachainStaking; + type WeightInfo = pallet_author_slot_filter::weights::SubstrateWeight; +} + +parameter_types! { + pub const InitializationPayment: Perbill = Perbill::from_percent(30); + pub const RelaySignaturesThreshold: Perbill = Perbill::from_percent(100); + pub const SignatureNetworkIdentifier: &'static [u8] = b"moonbase-"; + +} + +impl pallet_crowdloan_rewards::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Initialized = ConstBool; + type InitializationPayment = InitializationPayment; + type MaxInitContributors = ConstU32<500>; + // TODO to be revisited + type MinimumReward = ConstU128<0>; + type RewardCurrency = Balances; + type RelayChainAccountId = [u8; 32]; + type RewardAddressAssociateOrigin = EnsureSigned; + type RewardAddressChangeOrigin = EnsureSigned; + type RewardAddressRelayVoteThreshold = RelaySignaturesThreshold; + type SignatureNetworkIdentifier = SignatureNetworkIdentifier; + type VestingBlockNumber = cumulus_primitives_core::relay_chain::BlockNumber; + type VestingBlockProvider = RelaychainDataProvider; + type WeightInfo = pallet_crowdloan_rewards::weights::SubstrateWeight; +} + +// This is a simple session key manager. It should probably either work with, or be replaced +// entirely by pallet sessions +impl pallet_author_mapping::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type DepositCurrency = Balances; + type DepositAmount = ConstU128<{ 100 * currency::UNIT * currency::SUPPLY_FACTOR }>; + type Keys = session_keys_primitives::VrfId; + type WeightInfo = pallet_author_mapping::weights::SubstrateWeight; +} + +/// The type used to represent the kinds of proxying allowed. +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +#[derive( + Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, MaxEncodedLen, TypeInfo, +)] +pub enum ProxyType { + /// All calls can be proxied. This is the trivial/most permissive filter. + Any = 0, + /// Only extrinsics that do not transfer funds. + NonTransfer = 1, + /// Only extrinsics related to governance (democracy and collectives). + Governance = 2, + /// Only extrinsics related to staking. + Staking = 3, + /// Allow to veto an announced proxy call. + CancelProxy = 4, + /// Allow extrinsic related to Balances. + Balances = 5, + /// Allow extrinsic related to AuthorMapping. + AuthorMapping = 6, + /// Allow extrinsic related to IdentityJudgement. + IdentityJudgement = 7, +} + +impl Default for ProxyType { + fn default() -> Self { + Self::Any + } +} + +fn is_governance_precompile(precompile_name: &precompiles::PrecompileName) -> bool { + matches!( + precompile_name, + PrecompileName::DemocracyPrecompile + | PrecompileName::CouncilInstance + | PrecompileName::TechCommitteeInstance + | PrecompileName::TreasuryCouncilInstance + | PrecompileName::ReferendaPrecompile + | PrecompileName::ConvictionVotingPrecompile + | PrecompileName::PreimagePrecompile + | PrecompileName::OpenTechCommitteeInstance, + ) +} + +// Be careful: Each time this filter is modified, the substrate filter must also be modified +// consistently. +impl pallet_evm_precompile_proxy::EvmProxyCallFilter for ProxyType { + fn is_evm_proxy_call_allowed( + &self, + call: &pallet_evm_precompile_proxy::EvmSubCall, + recipient_has_code: bool, + gas: u64, + ) -> precompile_utils::EvmResult { + Ok(match self { + ProxyType::Any => true, + ProxyType::NonTransfer => { + call.value == U256::zero() + && match PrecompileName::from_address(call.to.0) { + Some( + PrecompileName::AuthorMappingPrecompile + | PrecompileName::ParachainStakingPrecompile, + ) => true, + Some(ref precompile) if is_governance_precompile(precompile) => true, + _ => false, + } + } + ProxyType::Governance => { + call.value == U256::zero() + && matches!( + PrecompileName::from_address(call.to.0), + Some(ref precompile) if is_governance_precompile(precompile) + ) + } + ProxyType::Staking => { + call.value == U256::zero() + && matches!( + PrecompileName::from_address(call.to.0), + Some( + PrecompileName::AuthorMappingPrecompile + | PrecompileName::ParachainStakingPrecompile + ) + ) + } + // The proxy precompile does not contain method cancel_proxy + ProxyType::CancelProxy => false, + ProxyType::Balances => { + // Allow only "simple" accounts as recipient (no code nor precompile). + // Note: Checking the presence of the code is not enough because some precompiles + // have no code. + !recipient_has_code + && !precompile_utils::precompile_set::is_precompile_or_fail::( + call.to.0, gas, + )? + } + ProxyType::AuthorMapping => { + call.value == U256::zero() + && matches!( + PrecompileName::from_address(call.to.0), + Some(PrecompileName::AuthorMappingPrecompile) + ) + } + // There is no identity precompile + ProxyType::IdentityJudgement => false, + }) + } +} + +// Be careful: Each time this filter is modified, the EVM filter must also be modified consistently. +impl InstanceFilter for ProxyType { + fn filter(&self, c: &RuntimeCall) -> bool { + match self { + ProxyType::Any => true, + ProxyType::NonTransfer => { + matches!( + c, + RuntimeCall::System(..) + | RuntimeCall::ParachainSystem(..) + | RuntimeCall::Timestamp(..) + | RuntimeCall::ParachainStaking(..) + | RuntimeCall::Democracy(..) + | RuntimeCall::Referenda(..) + | RuntimeCall::Preimage(..) + | RuntimeCall::ConvictionVoting(..) + | RuntimeCall::CouncilCollective(..) + | RuntimeCall::TreasuryCouncilCollective(..) + | RuntimeCall::TechCommitteeCollective(..) + | RuntimeCall::OpenTechCommitteeCollective(..) + | RuntimeCall::Identity(..) + | RuntimeCall::Utility(..) + | RuntimeCall::Proxy(..) | RuntimeCall::AuthorMapping(..) + | RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::claim { .. } + ) + ) + } + ProxyType::Governance => matches!( + c, + RuntimeCall::Democracy(..) + | RuntimeCall::Referenda(..) + | RuntimeCall::Preimage(..) + | RuntimeCall::ConvictionVoting(..) + | RuntimeCall::CouncilCollective(..) + | RuntimeCall::TreasuryCouncilCollective(..) + | RuntimeCall::TechCommitteeCollective(..) + | RuntimeCall::OpenTechCommitteeCollective(..) + | RuntimeCall::Utility(..) + ), + ProxyType::Staking => matches!( + c, + RuntimeCall::ParachainStaking(..) + | RuntimeCall::Utility(..) + | RuntimeCall::AuthorMapping(..) + | RuntimeCall::MoonbeamOrbiters(..) + ), + ProxyType::CancelProxy => matches!( + c, + RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) + ), + ProxyType::Balances => { + matches!(c, RuntimeCall::Balances(..) | RuntimeCall::Utility(..)) + } + ProxyType::AuthorMapping => matches!(c, RuntimeCall::AuthorMapping(..)), + ProxyType::IdentityJudgement => matches!( + c, + RuntimeCall::Identity(pallet_identity::Call::provide_judgement { .. }) + | RuntimeCall::Utility(..) + ), + } + } + + fn is_superset(&self, o: &Self) -> bool { + match (self, o) { + (x, y) if x == y => true, + (ProxyType::Any, _) => true, + (_, ProxyType::Any) => false, + _ => false, + } + } +} + +impl pallet_proxy::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type Currency = Balances; + type ProxyType = ProxyType; + // One storage item; key size 32, value size 8 + type ProxyDepositBase = ConstU128<{ currency::deposit(1, 8) }>; + // Additional storage item size of 21 bytes (20 bytes AccountId + 1 byte sizeof(ProxyType)). + type ProxyDepositFactor = ConstU128<{ currency::deposit(0, 21) }>; + type MaxProxies = ConstU32<32>; + type WeightInfo = pallet_proxy::weights::SubstrateWeight; + type MaxPending = ConstU32<32>; + type CallHasher = BlakeTwo256; + type AnnouncementDepositBase = ConstU128<{ currency::deposit(1, 8) }>; + // Additional storage item size of 56 bytes: + // - 20 bytes AccountId + // - 32 bytes Hasher (Blake2256) + // - 4 bytes BlockNumber (u32) + type AnnouncementDepositFactor = ConstU128<{ currency::deposit(0, 56) }>; +} + +impl pallet_migrations::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + // TODO wire up our correct list of migrations here. Maybe this shouldn't be in + // `moonbeam_runtime_common`. + type MigrationsList = ( + moonbeam_runtime_common::migrations::CommonMigrations< + Runtime, + CouncilCollective, + TechCommitteeCollective, + >, + moonbeam_runtime_common::migrations::ReferendaMigrations< + Runtime, + CouncilCollective, + TechCommitteeCollective, + >, + ); + type XcmExecutionManager = XcmExecutionManager; + type WeightInfo = pallet_migrations::weights::SubstrateWeight; +} + +/// Maintenance mode Call filter +pub struct MaintenanceFilter; +impl Contains for MaintenanceFilter { + fn contains(c: &RuntimeCall) -> bool { + match c { + RuntimeCall::Assets(_) => false, + RuntimeCall::LocalAssets(_) => false, + RuntimeCall::Balances(_) => false, + RuntimeCall::CrowdloanRewards(_) => false, + RuntimeCall::Ethereum(_) => false, + RuntimeCall::EVM(_) => false, + RuntimeCall::Identity(_) => false, + RuntimeCall::XTokens(_) => false, + RuntimeCall::ParachainStaking(_) => false, + RuntimeCall::MoonbeamOrbiters(_) => false, + RuntimeCall::PolkadotXcm(_) => false, + RuntimeCall::Treasury(_) => false, + RuntimeCall::XcmTransactor(_) => false, + RuntimeCall::EthereumXcm(_) => false, + _ => true, + } + } +} + +/// Normal Call Filter +/// We dont allow to create nor mint assets, this for now is disabled +/// We only allow transfers. For now creation of assets will go through +/// asset-manager, while minting/burning only happens through xcm messages +/// This can change in the future +pub struct NormalFilter; +impl Contains for NormalFilter { + fn contains(c: &RuntimeCall) -> bool { + match c { + RuntimeCall::Assets(method) => match method { + pallet_assets::Call::transfer { .. } => true, + pallet_assets::Call::transfer_keep_alive { .. } => true, + pallet_assets::Call::approve_transfer { .. } => true, + pallet_assets::Call::transfer_approved { .. } => true, + pallet_assets::Call::cancel_approval { .. } => true, + pallet_assets::Call::destroy_accounts { .. } => true, + pallet_assets::Call::destroy_approvals { .. } => true, + pallet_assets::Call::finish_destroy { .. } => true, + _ => false, + }, + // We want to disable create, as we dont want users to be choosing the + // assetId of their choice + // We also disable destroy, as we want to route destroy through the + // asset-manager, which guarantees the removal both at the EVM and + // substrate side of things + RuntimeCall::LocalAssets(method) => match method { + pallet_assets::Call::create { .. } => false, + pallet_assets::Call::start_destroy { .. } => false, + _ => true, + }, + // We filter anonymous proxy as they make "reserve" inconsistent + // See: https://github.com/paritytech/substrate/blob/37cca710eed3dadd4ed5364c7686608f5175cce1/frame/proxy/src/lib.rs#L270 // editorconfig-checker-disable-line + RuntimeCall::Proxy(method) => match method { + pallet_proxy::Call::create_pure { .. } => false, + pallet_proxy::Call::kill_pure { .. } => false, + _ => true, + }, + // Filtering the EVM prevents possible re-entrancy from the precompiles which could + // lead to unexpected scenarios. + // See https://github.com/PureStake/sr-moonbeam/issues/30 + // Note: It is also assumed that EVM calls are only allowed through `Origin::Root` so + // this can be seen as an additional security + RuntimeCall::EVM(_) => false, + _ => true, + } + } +} + +use cumulus_primitives_core::{relay_chain::BlockNumber as RelayBlockNumber, DmpMessageHandler}; + +pub struct XcmExecutionManager; +impl xcm_primitives::PauseXcmExecution for XcmExecutionManager { + fn suspend_xcm_execution() -> DispatchResult { + XcmpQueue::suspend_xcm_execution(RuntimeOrigin::root()) + } + fn resume_xcm_execution() -> DispatchResult { + XcmpQueue::resume_xcm_execution(RuntimeOrigin::root()) + } +} + +pub struct NormalDmpHandler; +impl DmpMessageHandler for NormalDmpHandler { + // This implementation makes messages be queued + // Since the limit is 0, messages are queued for next iteration + fn handle_dmp_messages( + iter: impl Iterator)>, + limit: Weight, + ) -> Weight { + (if Migrations::should_pause_xcm() { + DmpQueue::handle_dmp_messages(iter, Weight::zero()) + } else { + DmpQueue::handle_dmp_messages(iter, limit) + }) + ::DbWeight::get().reads(1) + } +} + +pub struct MaintenanceDmpHandler; +impl DmpMessageHandler for MaintenanceDmpHandler { + // This implementation makes messages be queued + // Since the limit is 0, messages are queued for next iteration + fn handle_dmp_messages( + iter: impl Iterator)>, + _limit: Weight, + ) -> Weight { + DmpQueue::handle_dmp_messages(iter, Weight::zero()) + } +} + +/// The hooks we wnat to run in Maintenance Mode +pub struct MaintenanceHooks; + +impl OnInitialize for MaintenanceHooks { + fn on_initialize(n: BlockNumber) -> Weight { + AllPalletsWithSystem::on_initialize(n) + } +} + +// return 0 +// For some reason using empty tuple () isnt working +// There exist only two pallets that use onIdle and these are xcmp and dmp queues +// For some reason putting an empty tumple does not work (transaction never finishes) +// We use an empty onIdle, if on the future we want one of the pallets to execute it +// we need to provide it here +impl OnIdle for MaintenanceHooks { + fn on_idle(_n: BlockNumber, _max_weight: Weight) -> Weight { + Weight::zero() + } +} + +impl OnRuntimeUpgrade for MaintenanceHooks { + fn on_runtime_upgrade() -> Weight { + AllPalletsWithSystem::on_runtime_upgrade() + } + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, &'static str> { + AllPalletsWithSystem::pre_upgrade() + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(state: Vec) -> Result<(), &'static str> { + AllPalletsWithSystem::post_upgrade(state) + } +} + +impl OnFinalize for MaintenanceHooks { + fn on_finalize(n: BlockNumber) { + AllPalletsWithSystem::on_finalize(n) + } +} + +impl OffchainWorker for MaintenanceHooks { + fn offchain_worker(n: BlockNumber) { + AllPalletsWithSystem::offchain_worker(n) + } +} + +impl pallet_maintenance_mode::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type NormalCallFilter = NormalFilter; + type MaintenanceCallFilter = MaintenanceFilter; + type MaintenanceOrigin = + pallet_collective::EnsureProportionAtLeast; + type XcmExecutionManager = XcmExecutionManager; + type NormalDmpHandler = NormalDmpHandler; + type MaintenanceDmpHandler = MaintenanceDmpHandler; + // We use AllPalletsWithSystem because we dont want to change the hooks in normal + // operation + type NormalExecutiveHooks = AllPalletsWithSystem; + type MaintenanceExecutiveHooks = MaintenanceHooks; +} + +impl pallet_proxy_genesis_companion::Config for Runtime { + type ProxyType = ProxyType; +} + +parameter_types! { + pub OrbiterReserveIdentifier: [u8; 4] = [b'o', b'r', b'b', b'i']; +} + +type AddCollatorOrigin = + EitherOfDiverse, governance::custom_origins::GeneralAdmin>; +type DelCollatorOrigin = + EitherOfDiverse, governance::custom_origins::GeneralAdmin>; + +impl pallet_moonbeam_orbiters::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type AccountLookup = AuthorMapping; + type AddCollatorOrigin = AddCollatorOrigin; + type Currency = Balances; + type DelCollatorOrigin = DelCollatorOrigin; + /// Maximum number of orbiters per collator + type MaxPoolSize = ConstU32<8>; + /// Maximum number of round to keep on storage + type MaxRoundArchive = ConstU32<4>; + type OrbiterReserveIdentifier = OrbiterReserveIdentifier; + type RotatePeriod = ConstU32<3>; + /// Round index type. + type RoundIndex = pallet_parachain_staking::RoundIndex; + type WeightInfo = pallet_moonbeam_orbiters::weights::SubstrateWeight; +} + +/// Only callable after `set_validation_data` is called which forms this proof the same way +fn relay_chain_state_proof() -> RelayChainStateProof { + let relay_storage_root = ParachainSystem::validation_data() + .expect("set in `set_validation_data`") + .relay_parent_storage_root; + let relay_chain_state = + ParachainSystem::relay_state_proof().expect("set in `set_validation_data`"); + RelayChainStateProof::new(ParachainInfo::get(), relay_storage_root, relay_chain_state) + .expect("Invalid relay chain state proof, already constructed in `set_validation_data`") +} + +pub struct BabeDataGetter; +impl pallet_randomness::GetBabeData> for BabeDataGetter { + // Tolerate panic here because only ever called in inherent (so can be omitted) + fn get_epoch_index() -> u64 { + if cfg!(feature = "runtime-benchmarks") { + // storage reads as per actual reads + let _relay_storage_root = ParachainSystem::validation_data(); + let _relay_chain_state = ParachainSystem::relay_state_proof(); + const BENCHMARKING_NEW_EPOCH: u64 = 10u64; + return BENCHMARKING_NEW_EPOCH; + } + relay_chain_state_proof() + .read_optional_entry(relay_chain::well_known_keys::EPOCH_INDEX) + .ok() + .flatten() + .expect("expected to be able to read epoch index from relay chain state proof") + } + fn get_epoch_randomness() -> Option { + if cfg!(feature = "runtime-benchmarks") { + // storage reads as per actual reads + let _relay_storage_root = ParachainSystem::validation_data(); + let _relay_chain_state = ParachainSystem::relay_state_proof(); + let benchmarking_babe_output = Hash::default(); + return Some(benchmarking_babe_output); + } + relay_chain_state_proof() + .read_optional_entry(relay_chain::well_known_keys::ONE_EPOCH_AGO_RANDOMNESS) + .ok() + .flatten() + } +} + +impl pallet_randomness::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type AddressMapping = moonbeam_runtime_common::IntoAddressMapping; + type Currency = Balances; + type BabeDataGetter = BabeDataGetter; + type VrfKeyLookup = AuthorMapping; + type Deposit = ConstU128<{ 1 * currency::UNIT * currency::SUPPLY_FACTOR }>; + type MaxRandomWords = ConstU8<100>; + type MinBlockDelay = ConstU32<2>; + type MaxBlockDelay = ConstU32<2_000>; + type BlockExpirationDelay = ConstU32<10_000>; + type EpochExpirationDelay = ConstU64<10_000>; + type WeightInfo = pallet_randomness::weights::SubstrateWeight; +} + +impl pallet_root_testing::Config for Runtime {} + +parameter_types! { + // One storage item; key size is 32 + 20; value is size 4+4+16+20 bytes = 44 bytes. + pub const DepositBase: Balance = currency::deposit(1, 96); + // Additional storage item size of 20 bytes. + pub const DepositFactor: Balance = currency::deposit(0, 20); + pub const MaxSignatories: u32 = 100; +} + +impl pallet_multisig::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type Currency = Balances; + type DepositBase = DepositBase; + type DepositFactor = DepositFactor; + type MaxSignatories = MaxSignatories; + type WeightInfo = pallet_multisig::weights::SubstrateWeight; +} + +construct_runtime! { + pub enum Runtime where + Block = Block, + NodeBlock = opaque::Block, + UncheckedExtrinsic = UncheckedExtrinsic + { + System: frame_system::{Pallet, Call, Storage, Config, Event} = 0, + Utility: pallet_utility::{Pallet, Call, Event} = 1, + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 2, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 3, + Sudo: pallet_sudo::{Pallet, Call, Config, Storage, Event} = 4, + // Previously 5: pallet_randomness_collective_flip + ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Storage, Inherent, Event} = 6, + TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Config, Event} = 7, + ParachainInfo: parachain_info::{Pallet, Storage, Config} = 8, + EthereumChainId: pallet_ethereum_chain_id::{Pallet, Storage, Config} = 9, + EVM: pallet_evm::{Pallet, Config, Call, Storage, Event} = 10, + Ethereum: pallet_ethereum::{Pallet, Call, Storage, Event, Origin, Config} = 11, + ParachainStaking: pallet_parachain_staking::{Pallet, Call, Storage, Event, Config} = 12, + Scheduler: pallet_scheduler::{Pallet, Storage, Event, Call} = 13, + Democracy: pallet_democracy::{Pallet, Storage, Config, Event, Call} = 14, + CouncilCollective: + pallet_collective::::{Pallet, Call, Storage, Event, Origin, Config} = 15, + TechCommitteeCollective: + pallet_collective::::{Pallet, Call, Storage, Event, Origin, Config} = 16, + Treasury: pallet_treasury::{Pallet, Storage, Config, Event, Call} = 17, + AuthorInherent: pallet_author_inherent::{Pallet, Call, Storage, Inherent} = 18, + AuthorFilter: pallet_author_slot_filter::{Pallet, Call, Storage, Event, Config} = 19, + CrowdloanRewards: pallet_crowdloan_rewards::{Pallet, Call, Config, Storage, Event} = 20, + AuthorMapping: pallet_author_mapping::{Pallet, Call, Config, Storage, Event} = 21, + Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 22, + MaintenanceMode: pallet_maintenance_mode::{Pallet, Call, Config, Storage, Event} = 23, + Identity: pallet_identity::{Pallet, Call, Storage, Event} = 24, + XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 25, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 26, + DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 27, + PolkadotXcm: pallet_xcm::{Pallet, Call, Storage, Event, Origin, Config} = 28, + Assets: pallet_assets::{Pallet, Call, Storage, Event} = 29, + XTokens: orml_xtokens::{Pallet, Call, Storage, Event} = 30, + AssetManager: pallet_asset_manager::{Pallet, Call, Storage, Event} = 31, + Migrations: pallet_migrations::{Pallet, Call, Storage, Config, Event} = 32, + XcmTransactor: pallet_xcm_transactor::{Pallet, Call, Storage, Event} = 33, + ProxyGenesisCompanion: pallet_proxy_genesis_companion::{Pallet, Config} = 34, + LocalAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 36, + MoonbeamOrbiters: pallet_moonbeam_orbiters::{Pallet, Call, Storage, Event} = 37, + EthereumXcm: pallet_ethereum_xcm::{Pallet, Call, Storage, Origin} = 38, + Randomness: pallet_randomness::{Pallet, Call, Storage, Event, Inherent} = 39, + TreasuryCouncilCollective: + pallet_collective::::{Pallet, Call, Storage, Event, Origin, Config} = 40, + ConvictionVoting: pallet_conviction_voting::{Pallet, Call, Storage, Event} = 41, + Referenda: pallet_referenda::{Pallet, Call, Storage, Event} = 42, + Origins: governance::custom_origins::{Origin} = 43, + Preimage: pallet_preimage::{Pallet, Call, Storage, Event} = 44, + Whitelist: pallet_whitelist::{Pallet, Call, Storage, Event} = 45, + OpenTechCommitteeCollective: + pallet_collective::::{Pallet, Call, Storage, Event, Origin, Config} = 46, + RootTesting: pallet_root_testing::{Pallet, Call, Storage} = 47, + Erc20XcmBridge: pallet_erc20_xcm_bridge::{Pallet} = 48, + Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 49, + } +} + +/// Block type as expected by this runtime. +pub type Block = generic::Block; +/// A Block signed with a Justification +pub type SignedBlock = generic::SignedBlock; +/// BlockId type as expected by this runtime. +pub type BlockId = generic::BlockId; + +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + frame_system::CheckNonZeroSender, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckEra, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, +); +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = + fp_self_contained::UncheckedExtrinsic; +/// Extrinsic type that has already been checked. +pub type CheckedExtrinsic = + fp_self_contained::CheckedExtrinsic; +/// Executive: handles dispatch to the various pallets. +pub type Executive = frame_executive::Executive< + Runtime, + Block, + frame_system::ChainContext, + Runtime, + pallet_maintenance_mode::ExecutiveHooks, +>; + +// All of our runtimes share most of their Runtime API implementations. +// We use a macro to implement this common part and add runtime-specific additional implementations. +// This macro expands to : +// ``` +// impl_runtime_apis! { +// // All impl blocks shared between all runtimes. +// +// // Specific impls provided to the `impl_runtime_apis_plus_common!` macro. +// } +// ``` +moonbeam_runtime_common::impl_runtime_apis_plus_common! { + impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + xt: ::Extrinsic, + block_hash: ::Hash, + ) -> TransactionValidity { + // Filtered calls should not enter the tx pool as they'll fail if inserted. + // If this call is not allowed, we return early. + if !::BaseCallFilter::contains(&xt.0.function) { + return InvalidTransaction::Call.into(); + } + + // This runtime uses Substrate's pallet transaction payment. This + // makes the chain feel like a standard Substrate chain when submitting + // frame transactions and using Substrate ecosystem tools. It has the downside that + // transaction are not prioritized by gas_price. The following code reprioritizes + // transactions to overcome this. + // + // A more elegant, ethereum-first solution is + // a pallet that replaces pallet transaction payment, and allows users + // to directly specify a gas price rather than computing an effective one. + // #HopefullySomeday + + // First we pass the transactions to the standard FRAME executive. This calculates all the + // necessary tags, longevity and other properties that we will leave unchanged. + // This also assigns some priority that we don't care about and will overwrite next. + let mut intermediate_valid = Executive::validate_transaction(source, xt.clone(), block_hash)?; + + let dispatch_info = xt.get_dispatch_info(); + + // If this is a pallet ethereum transaction, then its priority is already set + // according to effective priority fee from pallet ethereum. If it is any other kind of + // transaction, we modify its priority. The goal is to arrive at a similar metric used + // by pallet ethereum, which means we derive a fee-per-gas from the txn's tip and + // weight. + Ok(match &xt.0.function { + RuntimeCall::Ethereum(transact { .. }) => intermediate_valid, + _ if dispatch_info.class != DispatchClass::Normal => intermediate_valid, + _ => { + let tip = match xt.0.signature { + None => 0, + Some((_, _, ref signed_extra)) => { + // Yuck, this depends on the index of charge transaction in Signed Extra + let charge_transaction = &signed_extra.7; + charge_transaction.tip() + } + }; + + let effective_gas = + ::GasWeightMapping::weight_to_gas( + dispatch_info.weight + ); + let tip_per_gas = if effective_gas > 0 { + tip.saturating_div(effective_gas as u128) + } else { + 0 + }; + + // Overwrite the original prioritization with this ethereum one + intermediate_valid.priority = tip_per_gas as u64; + intermediate_valid + } + }) + } + } +} + +// Check the timestamp and parachain inherents +struct CheckInherents; + +impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { + fn check_inherents( + block: &Block, + relay_state_proof: &RelayChainStateProof, + ) -> sp_inherents::CheckInherentsResult { + let relay_chain_slot = relay_state_proof + .read_slot() + .expect("Could not read the relay chain slot from the proof"); + + let inherent_data = + cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( + relay_chain_slot, + sp_std::time::Duration::from_secs(6), + ) + .create_inherent_data() + .expect("Could not create the timestamp inherent data"); + + inherent_data.check_extrinsics(&block) + } +} + +// Nimbus's Executive wrapper allows relay validators to verify the seal digest +cumulus_pallet_parachain_system::register_validate_block!( + Runtime = Runtime, + BlockExecutor = pallet_author_inherent::BlockExecutor::, + CheckInherents = CheckInherents, +); + +moonbeam_runtime_common::impl_self_contained_call!(); + +// Shorthand for a Get field of a pallet Config. +#[macro_export] +macro_rules! get { + ($pallet:ident, $name:ident, $type:ty) => { + <<$crate::Runtime as $pallet::Config>::$name as $crate::Get<$type>>::get() + }; +} + +#[cfg(test)] +mod tests { + use super::{currency::*, *}; + + #[test] + // Helps us to identify a Pallet Call in case it exceeds the 1kb limit. + // Hint: this should be a rare case. If that happens, one or more of the dispatchable arguments + // need to be Boxed. + fn call_max_size() { + const CALL_ALIGN: u32 = 1024; + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!(std::mem::size_of::>() <= CALL_ALIGN as usize); + assert!(std::mem::size_of::>() <= CALL_ALIGN as usize); + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!(std::mem::size_of::>() <= CALL_ALIGN as usize); + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!(std::mem::size_of::>() <= CALL_ALIGN as usize); + assert!(std::mem::size_of::>() <= CALL_ALIGN as usize); + assert!(std::mem::size_of::>() <= CALL_ALIGN as usize); + assert!(std::mem::size_of::>() <= CALL_ALIGN as usize); + assert!( + std::mem::size_of::>() + <= CALL_ALIGN as usize + ); + } + + #[test] + fn currency_constants_are_correct() { + assert_eq!(SUPPLY_FACTOR, 1); + + // txn fees + assert_eq!(TRANSACTION_BYTE_FEE, Balance::from(1 * GIGAWEI)); + assert_eq!( + get!(pallet_transaction_payment, OperationalFeeMultiplier, u8), + 5_u8 + ); + assert_eq!(STORAGE_BYTE_FEE, Balance::from(100 * MICROUNIT)); + + // democracy minimums + assert_eq!( + get!(pallet_democracy, MinimumDeposit, u128), + Balance::from(4 * UNIT) + ); + assert_eq!( + get!(pallet_preimage, ByteDeposit, u128), + Balance::from(100 * MICROUNIT) + ); + assert_eq!( + get!(pallet_treasury, ProposalBondMinimum, u128), + Balance::from(1 * UNIT) + ); + + // pallet_identity deposits + assert_eq!( + get!(pallet_identity, BasicDeposit, u128), + Balance::from(1 * UNIT + 25800 * MICROUNIT) + ); + assert_eq!( + get!(pallet_identity, FieldDeposit, u128), + Balance::from(6600 * MICROUNIT) + ); + assert_eq!( + get!(pallet_identity, SubAccountDeposit, u128), + Balance::from(1 * UNIT + 5300 * MICROUNIT) + ); + + // staking minimums + assert_eq!( + get!(pallet_parachain_staking, MinCandidateStk, u128), + Balance::from(500 * UNIT) + ); + assert_eq!( + get!(pallet_parachain_staking, MinDelegation, u128), + Balance::from(1 * UNIT) + ); + assert_eq!( + get!(pallet_parachain_staking, MinDelegatorStk, u128), + Balance::from(1 * UNIT) + ); + + // crowdloan min reward + assert_eq!( + get!(pallet_crowdloan_rewards, MinimumReward, u128), + Balance::from(0u128) + ); + + // deposit for AuthorMapping + assert_eq!( + get!(pallet_author_mapping, DepositAmount, u128), + Balance::from(100 * UNIT) + ); + + // proxy deposits + assert_eq!( + get!(pallet_proxy, ProxyDepositBase, u128), + Balance::from(1 * UNIT + 800 * MICROUNIT) + ); + assert_eq!( + get!(pallet_proxy, ProxyDepositFactor, u128), + Balance::from(2100 * MICROUNIT) + ); + assert_eq!( + get!(pallet_proxy, AnnouncementDepositBase, u128), + Balance::from(1 * UNIT + 800 * MICROUNIT) + ); + assert_eq!( + get!(pallet_proxy, AnnouncementDepositFactor, u128), + Balance::from(5600 * MICROUNIT) + ); + } + + #[test] + // Required migration is + // pallet_parachain_staking::migrations::IncreaseMaxTopDelegationsPerCandidate + // Purpose of this test is to remind of required migration if constant is ever changed + fn updating_maximum_delegators_per_candidate_requires_configuring_required_migration() { + assert_eq!( + get!(pallet_parachain_staking, MaxTopDelegationsPerCandidate, u32), + 300 + ); + assert_eq!( + get!( + pallet_parachain_staking, + MaxBottomDelegationsPerCandidate, + u32 + ), + 50 + ); + } + + #[test] + fn test_proxy_type_can_be_decoded_from_valid_values() { + let test_cases = vec![ + // (input, expected) + (0u8, ProxyType::Any), + (1, ProxyType::NonTransfer), + (2, ProxyType::Governance), + (3, ProxyType::Staking), + (4, ProxyType::CancelProxy), + (5, ProxyType::Balances), + (6, ProxyType::AuthorMapping), + (7, ProxyType::IdentityJudgement), + ]; + + for (input, expected) in test_cases { + let actual = ProxyType::decode(&mut input.to_le_bytes().as_slice()); + assert_eq!( + Ok(expected), + actual, + "failed decoding ProxyType for value '{}'", + input + ); + } + } + + #[test] + fn configured_base_extrinsic_weight_is_evm_compatible() { + let min_ethereum_transaction_weight = WeightPerGas::get() * 21_000; + let base_extrinsic = ::BlockWeights::get() + .get(frame_support::dispatch::DispatchClass::Normal) + .base_extrinsic; + assert!(base_extrinsic.ref_time() <= min_ethereum_transaction_weight.ref_time()); + } +} diff --git a/tracing/2402/runtime/moonbase/src/precompiles.rs b/tracing/2402/runtime/moonbase/src/precompiles.rs new file mode 100644 index 0000000..29b0651 --- /dev/null +++ b/tracing/2402/runtime/moonbase/src/precompiles.rs @@ -0,0 +1,261 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +use crate::{ + asset_config::{ForeignAssetInstance, LocalAssetInstance}, + xcm_config::XcmExecutorConfig, + CouncilInstance, OpenTechCommitteeInstance, TechCommitteeInstance, TreasuryCouncilInstance, +}; +use frame_support::parameter_types; +use moonbeam_relay_encoder::westend::WestendEncoder; +use pallet_evm_precompile_author_mapping::AuthorMappingPrecompile; +use pallet_evm_precompile_balances_erc20::{Erc20BalancesPrecompile, Erc20Metadata}; +use pallet_evm_precompile_batch::BatchPrecompile; +use pallet_evm_precompile_blake2::Blake2F; +use pallet_evm_precompile_bn128::{Bn128Add, Bn128Mul, Bn128Pairing}; +use pallet_evm_precompile_call_permit::CallPermitPrecompile; +use pallet_evm_precompile_collective::CollectivePrecompile; +use pallet_evm_precompile_conviction_voting::ConvictionVotingPrecompile; +use pallet_evm_precompile_crowdloan_rewards::CrowdloanRewardsPrecompile; +use pallet_evm_precompile_democracy::DemocracyPrecompile; +use pallet_evm_precompile_gmp::GmpPrecompile; +use pallet_evm_precompile_modexp::Modexp; +use pallet_evm_precompile_parachain_staking::ParachainStakingPrecompile; +use pallet_evm_precompile_preimage::PreimagePrecompile; +use pallet_evm_precompile_proxy::{OnlyIsProxyAndProxy, ProxyPrecompile}; +use pallet_evm_precompile_randomness::RandomnessPrecompile; +use pallet_evm_precompile_referenda::ReferendaPrecompile; +use pallet_evm_precompile_registry::PrecompileRegistry; +use pallet_evm_precompile_relay_encoder::RelayEncoderPrecompile; +use pallet_evm_precompile_sha3fips::Sha3FIPS256; +use pallet_evm_precompile_simple::{ECRecover, ECRecoverPublicKey, Identity, Ripemd160, Sha256}; +use pallet_evm_precompile_xcm_transactor::{ + v1::XcmTransactorPrecompileV1, v2::XcmTransactorPrecompileV2, +}; +use pallet_evm_precompile_xcm_utils::{AllExceptXcmExecute, XcmUtilsPrecompile}; +use pallet_evm_precompile_xtokens::XtokensPrecompile; +use pallet_evm_precompileset_assets_erc20::{Erc20AssetsPrecompileSet, IsForeign, IsLocal}; +use precompile_utils::precompile_set::*; + +/// ERC20 metadata for the native token. +pub struct NativeErc20Metadata; + +impl Erc20Metadata for NativeErc20Metadata { + /// Returns the name of the token. + fn name() -> &'static str { + "DEV token" + } + + /// Returns the symbol of the token. + fn symbol() -> &'static str { + "DEV" + } + + /// Returns the decimals places of the token. + fn decimals() -> u8 { + 18 + } + + /// Must return `true` only if it represents the main native currency of + /// the network. It must be the currency used in `pallet_evm`. + fn is_native_currency() -> bool { + true + } +} + +/// The asset precompile address prefix. Addresses that match against this prefix will be routed +/// to Erc20AssetsPrecompileSet being marked as foreign +pub const FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX: &[u8] = &[255u8; 4]; +/// The asset precompile address prefix. Addresses that match against this prefix will be routed +/// to Erc20AssetsPrecompileSet being marked as local +pub const LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX: &[u8] = &[255u8, 255u8, 255u8, 254u8]; + +parameter_types! { + pub ForeignAssetPrefix: &'static [u8] = FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX; + pub LocalAssetPrefix: &'static [u8] = LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX; +} + +type EthereumPrecompilesChecks = (AcceptDelegateCall, CallableByContract, CallableByPrecompile); + +#[precompile_utils::precompile_name_from_address] +type MoonbasePrecompilesAt = ( + // Ethereum precompiles: + // We allow DELEGATECALL to stay compliant with Ethereum behavior. + PrecompileAt, ECRecover, EthereumPrecompilesChecks>, + PrecompileAt, Sha256, EthereumPrecompilesChecks>, + PrecompileAt, Ripemd160, EthereumPrecompilesChecks>, + PrecompileAt, Identity, EthereumPrecompilesChecks>, + PrecompileAt, Modexp, EthereumPrecompilesChecks>, + PrecompileAt, Bn128Add, EthereumPrecompilesChecks>, + PrecompileAt, Bn128Mul, EthereumPrecompilesChecks>, + PrecompileAt, Bn128Pairing, EthereumPrecompilesChecks>, + PrecompileAt, Blake2F, EthereumPrecompilesChecks>, + // Non-Moonbeam specific nor Ethereum precompiles : + PrecompileAt, Sha3FIPS256, (CallableByContract, CallableByPrecompile)>, + RemovedPrecompileAt>, // Dispatch + PrecompileAt, ECRecoverPublicKey, (CallableByContract, CallableByPrecompile)>, + // Moonbeam specific precompiles: + PrecompileAt< + AddressU64<2048>, + ParachainStakingPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2049>, + CrowdloanRewardsPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2050>, + Erc20BalancesPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2051>, + DemocracyPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2052>, + XtokensPrecompile, + ( + SubcallWithMaxNesting<1>, + CallableByContract, + CallableByPrecompile, + ), + >, + PrecompileAt< + AddressU64<2053>, + RelayEncoderPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2054>, + XcmTransactorPrecompileV1, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2055>, + AuthorMappingPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2056>, + BatchPrecompile, + ( + SubcallWithMaxNesting<2>, + // Batch is the only precompile allowed to call Batch. + CallableByPrecompile>>, + ), + >, + PrecompileAt< + AddressU64<2057>, + RandomnessPrecompile, + (SubcallWithMaxNesting<0>, CallableByContract), + >, + PrecompileAt< + AddressU64<2058>, + CallPermitPrecompile, + (SubcallWithMaxNesting<0>, CallableByContract), + >, + PrecompileAt< + AddressU64<2059>, + ProxyPrecompile, + ( + CallableByContract>, + SubcallWithMaxNesting<0>, + // Batch is the only precompile allowed to call Proxy. + CallableByPrecompile>>, + ), + >, + PrecompileAt< + AddressU64<2060>, + XcmUtilsPrecompile, + CallableByContract>, + >, + PrecompileAt< + AddressU64<2061>, + XcmTransactorPrecompileV2, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2062>, + CollectivePrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2063>, + CollectivePrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2064>, + CollectivePrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2065>, + ReferendaPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2066>, + ConvictionVotingPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2067>, + PreimagePrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2068>, + CollectivePrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2069>, + PrecompileRegistry, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt, GmpPrecompile, SubcallWithMaxNesting<0>>, +); + +/// The PrecompileSet installed in the Moonbase runtime. +/// We include the nine Istanbul precompiles +/// (https://github.com/ethereum/go-ethereum/blob/3c46f557/core/vm/contracts.go#L69) +/// The following distribution has been decided for the precompiles +/// 0-1023: Ethereum Mainnet Precompiles +/// 1024-2047 Precompiles that are not in Ethereum Mainnet but are neither Moonbeam specific +/// 2048-4095 Moonbeam specific precompiles +pub type MoonbasePrecompiles = PrecompileSetBuilder< + R, + ( + // Skip precompiles if out of range. + PrecompilesInRangeInclusive<(AddressU64<1>, AddressU64<4095>), MoonbasePrecompilesAt>, + // Prefixed precompile sets (XC20) + PrecompileSetStartingWith< + ForeignAssetPrefix, + Erc20AssetsPrecompileSet, + (CallableByContract, CallableByPrecompile), + >, + PrecompileSetStartingWith< + LocalAssetPrefix, + Erc20AssetsPrecompileSet, + (CallableByContract, CallableByPrecompile), + >, + ), +>; diff --git a/tracing/2402/runtime/moonbase/src/xcm_config.rs b/tracing/2402/runtime/moonbase/src/xcm_config.rs new file mode 100644 index 0000000..7b61183 --- /dev/null +++ b/tracing/2402/runtime/moonbase/src/xcm_config.rs @@ -0,0 +1,698 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! XCM configuration for Moonbase. +//! + +use super::{ + governance, AccountId, AssetId, AssetManager, Assets, Balance, Balances, DealWithFees, + Erc20XcmBridge, LocalAssets, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, + RuntimeEvent, RuntimeOrigin, Treasury, XcmpQueue, FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, +}; + +use pallet_evm_precompileset_assets_erc20::AccountIdAssetIdConversion; +use sp_runtime::{ + traits::{Hash as THash, PostDispatchInfoOf}, + DispatchErrorWithPostInfo, +}; + +use frame_support::{ + dispatch::Weight, + parameter_types, + traits::{EitherOfDiverse, Everything, Nothing, PalletInfoAccess}, +}; + +use frame_system::{EnsureRoot, RawOrigin}; +use sp_core::{ConstU32, H160, H256}; + +use xcm_builder::{ + AccountKey20Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, + AllowTopLevelPaidExecutionFrom, AsPrefixedGeneralIndex, ConvertedConcreteId, + CurrencyAdapter as XcmCurrencyAdapter, EnsureXcmOrigin, FungiblesAdapter, NoChecking, + ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountKey20AsNative, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, + WeightInfoBounds, WithComputedOrigin, +}; + +use xcm::latest::prelude::*; +use xcm_executor::traits::{CallDispatcher, JustTry}; + +use orml_xcm_support::MultiNativeAsset; +use xcm_primitives::{ + AbsoluteAndRelativeReserve, AccountIdToCurrencyId, AccountIdToMultiLocation, AsAssetType, + FirstAssetTrader, SignedToAccountId20, UtilityAvailableCalls, UtilityEncodeCall, XcmTransact, +}; + +use parity_scale_codec::{Decode, Encode}; +use scale_info::TypeInfo; + +use sp_std::{ + convert::{From, Into, TryFrom}, + prelude::*, +}; + +use orml_traits::parameter_type_with_key; + +use crate::governance::referenda::GeneralAdminOrRoot; + +parameter_types! { + // The network Id of the relay + pub const RelayNetwork: NetworkId = NetworkId::Westend; + // The relay chain Origin type + pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); + // The universal location within the global consensus system + pub UniversalLocation: InteriorMultiLocation = + X2(GlobalConsensus(RelayNetwork::get()), Parachain(ParachainInfo::parachain_id().into())); + + + // Self Reserve location, defines the multilocation identifiying the self-reserve currency + // This is used to match it also against our Balances pallet when we receive such + // a MultiLocation: (Self Balances pallet index) + // We use the RELATIVE multilocation + pub SelfReserve: MultiLocation = MultiLocation { + parents:0, + interior: Junctions::X1( + PalletInstance(::index() as u8) + ) + }; + + // This is the relative view of our local assets. + // Indentified by thix prefix + generalIndex(assetId) + // We use the RELATIVE multilocation + pub LocalAssetsPalletLocation: MultiLocation = MultiLocation { + parents:0, + interior: Junctions::X1( + PalletInstance(::index() as u8) + ) + }; +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the default `AccountId`. + ParentIsPreset, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // If we receive a MultiLocation of type AccountKey20, just generate a native account + AccountKey20Aliases, + // Generate remote accounts according to polkadot standards + xcm_builder::HashedDescriptionDescribeFamilyAllTerminal, +); + +/// Wrapper type around `LocationToAccountId` to convert an `AccountId` to type `H160`. +pub struct LocationToH160; +impl xcm_executor::traits::Convert for LocationToH160 { + fn convert(location: MultiLocation) -> Result { + >::convert( + location, + ) + .map(Into::into) + } +} + +// The non-reserve fungible transactor type +// It will use pallet-assets, and the Id will be matched against AsAssetType +// This is intended to match FOREIGN ASSETS +pub type ForeignFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + Assets, + // Use this currency when it is a fungible asset matching the given location or name: + ( + ConvertedConcreteId< + AssetId, + Balance, + AsAssetType, + JustTry, + >, + ), + // Do a simple punn to convert an AccountId20 MultiLocation into a native chain account ID: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont allow teleports. + NoChecking, + // We dont track any teleports + (), +>; + +/// The transactor for our own chain currency. +pub type LocalAssetTransactor = XcmCurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching any of the locations in + // SelfReserveRepresentations + xcm_builder::IsConcrete, + // We can convert the MultiLocations with our converter above: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont allow teleport + (), +>; + +/// Means for transacting local assets that are not the native currency +/// This transactor uses the new reanchor logic +pub type LocalFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + LocalAssets, + // Use this currency when it is a fungible asset matching the given location or name: + ( + ConvertedConcreteId< + AssetId, + Balance, + // This just tells to convert an assetId into a GeneralIndex junction prepended + // by LocalAssetsPalletLocation + AsPrefixedGeneralIndex, + JustTry, + >, + ), + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont want to allow teleporting assets + NoChecking, + // The account to use for tracking teleports. + (), +>; + +// We use all transactors +// These correspond to +// SelfReserve asset, both pre and post 0.9.16 +// Foreign assets +// Local assets, both pre and post 0.9.16 +// We can remove the Old reanchor once +// we import https://github.com/open-web3-stack/open-runtime-module-library/pull/708 +pub type AssetTransactors = ( + LocalAssetTransactor, + ForeignFungiblesTransactor, + LocalFungiblesTransactor, + Erc20XcmBridge, +); + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can +/// biases the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain which they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when + // recognised. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognised. + SiblingParachainAsNative, + // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. + pallet_xcm::XcmPassthrough, + // Xcm Origins defined by a Multilocation of type AccountKey20 can be converted to a 20 byte- + // account local origin + SignedAccountKey20AsNative, +); + +parameter_types! { + /// Maximum number of instructions in a single XCM fragment. A sanity check against + /// weight caculations getting too crazy. + pub MaxInstructions: u32 = 100; +} + +/// Xcm Weigher shared between multiple Xcm-related configs. +pub type XcmWeigher = WeightInfoBounds< + moonbeam_xcm_benchmarks::weights::XcmWeight, + RuntimeCall, + MaxInstructions, +>; + +pub type XcmBarrier = ( + // Weight that is paid for may be consumed. + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, +); + +parameter_types! { + /// Xcm fees will go to the treasury account + pub XcmFeesAccount: AccountId = Treasury::account_id(); +} + +/// This is the struct that will handle the revenue from xcm fees +/// We do not burn anything because we want to mimic exactly what +/// the sovereign account has +pub type XcmFeesToAccount = xcm_primitives::XcmFeesToAccount< + Assets, + ( + ConvertedConcreteId< + AssetId, + Balance, + AsAssetType, + JustTry, + >, + ), + AccountId, + XcmFeesAccount, +>; + +// Our implementation of the Moonbeam Call +// Attachs the right origin in case the call is made to pallet-ethereum-xcm +#[cfg(not(feature = "evm-tracing"))] +moonbeam_runtime_common::impl_moonbeam_xcm_call!(); +#[cfg(feature = "evm-tracing")] +moonbeam_runtime_common::impl_moonbeam_xcm_call_tracing!(); + +moonbeam_runtime_common::impl_evm_runner_precompile_or_eth_xcm!(); + +pub struct SafeCallFilter; +impl frame_support::traits::Contains for SafeCallFilter { + fn contains(_call: &RuntimeCall) -> bool { + // TODO review + // This needs to be addressed at EVM level + true + } +} + +parameter_types! { + pub const MaxAssetsIntoHolding: u32 = xcm_primitives::MAX_ASSETS; +} + +pub struct XcmExecutorConfig; +impl xcm_executor::Config for XcmExecutorConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + // How to withdraw and deposit an asset. + type AssetTransactor = AssetTransactors; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + // Filter to the reserve withdraw operations + // Whenever the reserve matches the relative or absolute value + // of our chain, we always return the relative reserve + type IsReserve = MultiNativeAsset>; + type IsTeleporter = (); // No teleport + type UniversalLocation = UniversalLocation; + type Barrier = XcmBarrier; + type Weigher = XcmWeigher; + // We use two traders + // When we receive the relative representation of the self-reserve asset, + // we use UsingComponents and the local way of handling fees + // When we receive a non-reserve asset, we use AssetManager to fetch how many + // units per second we should charge + type Trader = ( + UsingComponents< + ::WeightToFee, + SelfReserve, + AccountId, + Balances, + DealWithFees, + >, + FirstAssetTrader, + ); + type ResponseHandler = PolkadotXcm; + type SubscriptionService = PolkadotXcm; + type AssetTrap = pallet_erc20_xcm_bridge::AssetTrapWrapper; + type AssetClaims = PolkadotXcm; + type CallDispatcher = MoonbeamCall; + type PalletInstancesInfo = crate::AllPalletsWithSystem; + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type AssetLocker = (); + type AssetExchanger = (); + type FeeManager = (); + type MessageExporter = (); + type UniversalAliases = Nothing; + type SafeCallFilter = SafeCallFilter; + type AssetIsBurnable = Everything; +} + +// Converts a Signed Local Origin into a MultiLocation +pub type LocalOriginToLocation = SignedToAccountId20; + +/// The means for routing XCM messages which are not for local execution into the right message +/// queues. +pub type XcmRouter = ( + // Two routers - use UMP to communicate with the relay chain: + cumulus_primitives_utility::ParentAsUmp, + // ..and XCMP to communicate with the sibling chains. + XcmpQueue, +); + +type XcmExecutor = pallet_erc20_xcm_bridge::XcmExecutorWrapper< + RuntimeCall, + xcm_executor::XcmExecutor, +>; + +#[cfg(feature = "runtime-benchmarks")] +parameter_types! { + pub ReachableDest: Option = Some(Parent.into()); +} + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = Everything; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Nothing; + type XcmReserveTransferFilter = Everything; + type Weigher = XcmWeigher; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; + type Currency = Balances; + type CurrencyMatcher = (); + type TrustedLockers = (); + type SovereignAccountOf = LocationToAccountId; + type MaxLockers = ConstU32<8>; + // TODO pallet-xcm weights + type WeightInfo = pallet_xcm::TestWeightInfo; + #[cfg(feature = "runtime-benchmarks")] + type ReachableDest = ReachableDest; +} + +impl cumulus_pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +impl cumulus_pallet_xcmp_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; + type ChannelInfo = ParachainSystem; + type VersionWrapper = PolkadotXcm; + type ExecuteOverweightOrigin = EnsureRoot; + type ControllerOrigin = EnsureRoot; + type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; + type WeightInfo = cumulus_pallet_xcmp_queue::weights::SubstrateWeight; + type PriceForSiblingDelivery = (); +} + +impl cumulus_pallet_dmp_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; + type ExecuteOverweightOrigin = EnsureRoot; +} + +// Our AssetType. For now we only handle Xcm Assets +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum AssetType { + Xcm(MultiLocation), +} +impl Default for AssetType { + fn default() -> Self { + Self::Xcm(MultiLocation::here()) + } +} + +impl From for AssetType { + fn from(location: MultiLocation) -> Self { + Self::Xcm(location) + } +} + +impl Into> for AssetType { + fn into(self) -> Option { + match self { + Self::Xcm(location) => Some(location), + } + } +} + +// Implementation on how to retrieve the AssetId from an AssetType +// We take it +impl From for AssetId { + fn from(asset: AssetType) -> AssetId { + match asset { + AssetType::Xcm(id) => { + let mut result: [u8; 16] = [0u8; 16]; + let hash: H256 = id.using_encoded(::Hashing::hash); + result.copy_from_slice(&hash.as_fixed_bytes()[0..16]); + u128::from_le_bytes(result) + } + } + } +} + +// Our currencyId. We distinguish for now between SelfReserve, and Others, defined by their Id. +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum CurrencyId { + // Our native token + SelfReserve, + // Assets representing other chains native tokens + ForeignAsset(AssetId), + // Our local assets + LocalAssetReserve(AssetId), + // Erc20 token + Erc20 { contract_address: H160 }, +} + +impl AccountIdToCurrencyId for Runtime { + fn account_to_currency_id(account: AccountId) -> Option { + Some(match account { + // the self-reserve currency is identified by the pallet-balances address + a if a == H160::from_low_u64_be(2050).into() => CurrencyId::SelfReserve, + // the rest of the currencies, by their corresponding erc20 address + _ => match Runtime::account_to_asset_id(account) { + // We distinguish by prefix, and depending on it we create either + // Foreign or Local + Some((prefix, asset_id)) => { + if prefix == FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX.to_vec() { + CurrencyId::ForeignAsset(asset_id) + } else { + CurrencyId::LocalAssetReserve(asset_id) + } + } + // If no known prefix is identified, we consider that it's a "real" erc20 token + // (i.e. managed by a real smart contract) + None => CurrencyId::Erc20 { + contract_address: account.into(), + }, + }, + }) + } +} + +// How to convert from CurrencyId to MultiLocation +pub struct CurrencyIdtoMultiLocation(sp_std::marker::PhantomData); +impl sp_runtime::traits::Convert> + for CurrencyIdtoMultiLocation +where + AssetXConverter: xcm_executor::traits::Convert, +{ + fn convert(currency: CurrencyId) -> Option { + match currency { + CurrencyId::SelfReserve => { + let multi: MultiLocation = SelfReserve::get(); + Some(multi) + } + CurrencyId::ForeignAsset(asset) => AssetXConverter::reverse_ref(asset).ok(), + CurrencyId::LocalAssetReserve(asset) => { + let mut location = LocalAssetsPalletLocation::get(); + location.push_interior(Junction::GeneralIndex(asset)).ok(); + Some(location) + } + CurrencyId::Erc20 { contract_address } => { + let mut location = Erc20XcmBridgePalletLocation::get(); + location + .push_interior(Junction::AccountKey20 { + key: contract_address.0, + network: None, + }) + .ok(); + Some(location) + } + } + } +} + +parameter_types! { + pub const BaseXcmWeight: Weight + = Weight::from_parts(200_000_000u64, 0); + pub const MaxAssetsForTransfer: usize = 2; + // This is how we are going to detect whether the asset is a Reserve asset + // This however is the chain part only + pub SelfLocation: MultiLocation = MultiLocation::here(); + // We need this to be able to catch when someone is trying to execute a non- + // cross-chain transfer in xtokens through the absolute path way + pub SelfLocationAbsolute: MultiLocation = MultiLocation { + parents:1, + interior: Junctions::X1( + Parachain(ParachainInfo::parachain_id().into()) + ) + }; + +} + +parameter_type_with_key! { + pub ParachainMinFee: |_location: MultiLocation| -> Option { + Some(u128::MAX) + }; +} + +impl orml_xtokens::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type CurrencyId = CurrencyId; + type AccountIdToMultiLocation = AccountIdToMultiLocation; + type CurrencyIdConvert = + CurrencyIdtoMultiLocation>; + type XcmExecutor = XcmExecutor; + type SelfLocation = SelfLocation; + type Weigher = XcmWeigher; + type BaseXcmWeight = BaseXcmWeight; + type UniversalLocation = UniversalLocation; + type MaxAssetsForTransfer = MaxAssetsForTransfer; + type MinXcmFee = ParachainMinFee; + type MultiLocationsFilter = Everything; + type ReserveProvider = AbsoluteAndRelativeReserve; +} + +// 1 WND/ROC should be enough +parameter_types! { + pub MaxHrmpRelayFee: MultiAsset = (MultiLocation::parent(), 1_000_000_000_000u128).into(); +} + +// For now we only allow to transact in the relay, although this might change in the future +// Transactors just defines the chains in which we allow transactions to be issued through +// xcm +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum Transactors { + Relay, +} + +// Default for benchmarking +#[cfg(feature = "runtime-benchmarks")] +impl Default for Transactors { + fn default() -> Self { + Transactors::Relay + } +} + +impl TryFrom for Transactors { + type Error = (); + fn try_from(value: u8) -> Result { + match value { + 0u8 => Ok(Transactors::Relay), + _ => Err(()), + } + } +} + +impl UtilityEncodeCall for Transactors { + fn encode_call(self, call: UtilityAvailableCalls) -> Vec { + match self { + // Shall we use westend for moonbase? The tests are probably based on rococo + // but moonbase-alpha is attached to westend-runtime I think + Transactors::Relay => moonbeam_relay_encoder::westend::WestendEncoder.encode_call(call), + } + } +} + +impl XcmTransact for Transactors { + fn destination(self) -> MultiLocation { + match self { + Transactors::Relay => MultiLocation::parent(), + } + } +} + +pub type DerivativeAddressRegistrationOrigin = + EitherOfDiverse, governance::custom_origins::GeneralAdmin>; + +impl pallet_xcm_transactor::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type Transactor = Transactors; + type DerivativeAddressRegistrationOrigin = DerivativeAddressRegistrationOrigin; + type SovereignAccountDispatcherOrigin = EnsureRoot; + type CurrencyId = CurrencyId; + type AccountIdToMultiLocation = AccountIdToMultiLocation; + type CurrencyIdToMultiLocation = + CurrencyIdtoMultiLocation>; + type XcmSender = XcmRouter; + type SelfLocation = SelfLocation; + type Weigher = XcmWeigher; + type UniversalLocation = UniversalLocation; + type BaseXcmWeight = BaseXcmWeight; + type AssetTransactor = AssetTransactors; + type ReserveProvider = AbsoluteAndRelativeReserve; + type WeightInfo = pallet_xcm_transactor::weights::SubstrateWeight; + type HrmpManipulatorOrigin = GeneralAdminOrRoot; + type MaxHrmpFee = xcm_builder::Case; + type HrmpEncoder = moonbeam_relay_encoder::westend::WestendEncoder; +} + +parameter_types! { + // This is the relative view of erc20 assets. + // Identified by this prefix + AccountKey20(contractAddress) + // We use the RELATIVE multilocation + pub Erc20XcmBridgePalletLocation: MultiLocation = MultiLocation { + parents:0, + interior: Junctions::X1( + PalletInstance(::index() as u8) + ) + }; + + // To be able to support almost all erc20 implementations, + // we provide a sufficiently hight gas limit. + pub Erc20XcmBridgeTransferGasLimit: u64 = 80_000; +} + +impl pallet_erc20_xcm_bridge::Config for Runtime { + type AccountIdConverter = LocationToH160; + type Erc20MultilocationPrefix = Erc20XcmBridgePalletLocation; + type Erc20TransferGasLimit = Erc20XcmBridgeTransferGasLimit; + type EvmRunner = EvmRunnerPrecompileOrEthXcm; +} + +#[cfg(feature = "runtime-benchmarks")] +mod testing { + use super::*; + + /// This From exists for benchmarking purposes. It has the potential side-effect of calling + /// AssetManager::set_asset_type_asset_id() and should NOT be used in any production code. + impl From for CurrencyId { + fn from(location: MultiLocation) -> CurrencyId { + use xcm_executor::traits::Convert as XConvert; + use xcm_primitives::AssetTypeGetter; + + // If it does not exist, for benchmarking purposes, we create the association + let asset_id = if let Ok(asset_id) = + AsAssetType::::convert_ref(&location) + { + asset_id + } else { + let asset_type = AssetType::Xcm(location); + let asset_id: AssetId = asset_type.clone().into(); + AssetManager::set_asset_type_asset_id(asset_type, asset_id); + asset_id + }; + + CurrencyId::ForeignAsset(asset_id) + } + } +} diff --git a/tracing/2402/runtime/moonbase/tests/common/mod.rs b/tracing/2402/runtime/moonbase/tests/common/mod.rs new file mode 100644 index 0000000..0a9782c --- /dev/null +++ b/tracing/2402/runtime/moonbase/tests/common/mod.rs @@ -0,0 +1,402 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +#![allow(dead_code)] + +use cumulus_primitives_parachain_inherent::ParachainInherentData; +use fp_evm::GenesisAccount; +use frame_support::{ + assert_ok, + dispatch::Dispatchable, + traits::{GenesisBuild, OnFinalize, OnInitialize}, +}; +use moonbase_runtime::{asset_config::AssetRegistrarMetadata, xcm_config::AssetType}; +pub use moonbase_runtime::{ + currency::{GIGAWEI, SUPPLY_FACTOR, UNIT, WEI}, + AccountId, AssetId, AssetManager, Assets, AuthorInherent, Balance, Balances, CrowdloanRewards, + Ethereum, Executive, Header, InflationInfo, LocalAssets, ParachainStaking, Range, Runtime, + RuntimeCall, RuntimeEvent, System, TransactionConverter, TransactionPaymentAsGasPrice, + UncheckedExtrinsic, HOURS, WEEKS, +}; +use nimbus_primitives::{NimbusId, NIMBUS_ENGINE_ID}; +use sp_core::{Encode, H160}; +use sp_runtime::{Digest, DigestItem, Perbill, Percent}; + +use std::collections::BTreeMap; + +use fp_rpc::ConvertTransaction; +use pallet_transaction_payment::Multiplier; + +// A valid signed Alice transfer. +pub const VALID_ETH_TX: &str = + "02f86d8205018085174876e80085e8d4a5100082520894f24ff3a9cf04c71dbc94d0b566f7a27b9456\ + 6cac8080c001a0e1094e1a52520a75c0255db96132076dd0f1263089f838bea548cbdbfc64a4d19f031c\ + 92a8cb04e2d68d20a6158d542a07ac440cc8d07b6e36af02db046d92df"; + +// An invalid signed Alice transfer with a gas limit artifically set to 0. +pub const INVALID_ETH_TX: &str = + "f86180843b9aca00809412cb274aad8251c875c0bf6872b67d9983e53fdd01801ca00e28ba2dd3c5a\ + 3fd467d4afd7aefb4a34b373314fff470bb9db743a84d674a0aa06e5994f2d07eafe1c37b4ce5471ca\ + ecec29011f6f5bf0b1a552c55ea348df35f"; + +pub fn rpc_run_to_block(n: u32) { + while System::block_number() < n { + Ethereum::on_finalize(System::block_number()); + System::set_block_number(System::block_number() + 1); + Ethereum::on_initialize(System::block_number()); + } +} + +/// Utility function that advances the chain to the desired block number. +/// If an author is provided, that author information is injected to all the blocks in the meantime. +pub fn run_to_block(n: u32, author: Option) { + // Finalize the first block + Ethereum::on_finalize(System::block_number()); + AuthorInherent::on_finalize(System::block_number()); + while System::block_number() < n { + // Set the new block number and author + match author { + Some(ref author) => { + let pre_digest = Digest { + logs: vec![DigestItem::PreRuntime(NIMBUS_ENGINE_ID, author.encode())], + }; + System::reset_events(); + System::initialize( + &(System::block_number() + 1), + &System::parent_hash(), + &pre_digest, + ); + } + None => { + System::set_block_number(System::block_number() + 1); + } + } + + // Initialize the new block + AuthorInherent::on_initialize(System::block_number()); + ParachainStaking::on_initialize(System::block_number()); + Ethereum::on_initialize(System::block_number()); + + // Finalize the block + Ethereum::on_finalize(System::block_number()); + AuthorInherent::on_finalize(System::block_number()); + ParachainStaking::on_finalize(System::block_number()); + } +} + +pub fn last_event() -> RuntimeEvent { + System::events().pop().expect("Event expected").event +} + +// Test struct with the purpose of initializing xcm assets +#[derive(Clone)] +pub struct XcmAssetInitialization { + pub asset_type: AssetType, + pub metadata: AssetRegistrarMetadata, + pub balances: Vec<(AccountId, Balance)>, + pub is_sufficient: bool, +} + +pub struct ExtBuilder { + // endowed accounts with balances + balances: Vec<(AccountId, Balance)>, + // [asset, Vec, owner] + local_assets: Vec<(AssetId, Vec<(AccountId, Balance)>, AccountId)>, + // [collator, amount] + collators: Vec<(AccountId, Balance)>, + // [delegator, collator, nomination_amount] + delegations: Vec<(AccountId, AccountId, Balance, Percent)>, + // per-round inflation config + inflation: InflationInfo, + // AuthorId -> AccoutId mappings + mappings: Vec<(NimbusId, AccountId)>, + // Crowdloan fund + crowdloan_fund: Balance, + // Chain id + chain_id: u64, + // EVM genesis accounts + evm_accounts: BTreeMap, + // [assettype, metadata, Vec] + xcm_assets: Vec, + safe_xcm_version: Option, +} + +impl Default for ExtBuilder { + fn default() -> ExtBuilder { + ExtBuilder { + balances: vec![], + delegations: vec![], + local_assets: vec![], + collators: vec![], + inflation: InflationInfo { + expect: Range { + min: 100_000 * UNIT, + ideal: 200_000 * UNIT, + max: 500_000 * UNIT, + }, + // not used + annual: Range { + min: Perbill::from_percent(50), + ideal: Perbill::from_percent(50), + max: Perbill::from_percent(50), + }, + // unrealistically high parameterization, only for testing + round: Range { + min: Perbill::from_percent(5), + ideal: Perbill::from_percent(5), + max: Perbill::from_percent(5), + }, + }, + mappings: vec![], + crowdloan_fund: 0, + chain_id: CHAIN_ID, + evm_accounts: BTreeMap::new(), + xcm_assets: vec![], + safe_xcm_version: None, + } + } +} + +impl ExtBuilder { + pub fn with_evm_accounts(mut self, accounts: BTreeMap) -> Self { + self.evm_accounts = accounts; + self + } + + pub fn with_balances(mut self, balances: Vec<(AccountId, Balance)>) -> Self { + self.balances = balances; + self + } + + pub fn with_collators(mut self, collators: Vec<(AccountId, Balance)>) -> Self { + self.collators = collators; + self + } + + pub fn with_delegations(mut self, delegations: Vec<(AccountId, AccountId, Balance)>) -> Self { + self.delegations = delegations + .into_iter() + .map(|d| (d.0, d.1, d.2, Percent::zero())) + .collect(); + self + } + + pub fn with_local_assets( + mut self, + local_assets: Vec<(AssetId, Vec<(AccountId, Balance)>, AccountId)>, + ) -> Self { + self.local_assets = local_assets; + self + } + + pub fn with_xcm_assets(mut self, xcm_assets: Vec) -> Self { + self.xcm_assets = xcm_assets; + self + } + + pub fn with_crowdloan_fund(mut self, crowdloan_fund: Balance) -> Self { + self.crowdloan_fund = crowdloan_fund; + self + } + + pub fn with_mappings(mut self, mappings: Vec<(NimbusId, AccountId)>) -> Self { + self.mappings = mappings; + self + } + + pub fn with_safe_xcm_version(mut self, safe_xcm_version: u32) -> Self { + self.safe_xcm_version = Some(safe_xcm_version); + self + } + + #[allow(dead_code)] + pub fn with_inflation(mut self, inflation: InflationInfo) -> Self { + self.inflation = inflation; + self + } + + pub fn build(self) -> sp_io::TestExternalities { + let mut t = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap(); + + pallet_balances::GenesisConfig:: { + balances: self.balances, + } + .assimilate_storage(&mut t) + .unwrap(); + + pallet_parachain_staking::GenesisConfig:: { + candidates: self.collators, + delegations: self.delegations, + inflation_config: self.inflation, + collator_commission: Perbill::from_percent(20), + parachain_bond_reserve_percent: Percent::from_percent(30), + blocks_per_round: 2 * HOURS, + num_selected_candidates: 8, + } + .assimilate_storage(&mut t) + .unwrap(); + + pallet_crowdloan_rewards::GenesisConfig:: { + funded_amount: self.crowdloan_fund, + } + .assimilate_storage(&mut t) + .unwrap(); + + pallet_author_mapping::GenesisConfig:: { + mappings: self.mappings, + } + .assimilate_storage(&mut t) + .unwrap(); + + >::assimilate_storage( + &pallet_ethereum_chain_id::GenesisConfig { + chain_id: self.chain_id, + }, + &mut t, + ) + .unwrap(); + + >::assimilate_storage( + &pallet_evm::GenesisConfig { + accounts: self.evm_accounts, + }, + &mut t, + ) + .unwrap(); + + >::assimilate_storage( + &pallet_ethereum::GenesisConfig {}, + &mut t, + ) + .unwrap(); + + >::assimilate_storage( + &pallet_xcm::GenesisConfig { + safe_xcm_version: self.safe_xcm_version, + }, + &mut t, + ) + .unwrap(); + + >::assimilate_storage( + &pallet_transaction_payment::GenesisConfig { + multiplier: Multiplier::from(8u128), + }, + &mut t, + ) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + + let local_assets = self.local_assets.clone(); + let xcm_assets = self.xcm_assets.clone(); + + ext.execute_with(|| { + // If any local assets specified, we create them here + for (asset_id, balances, owner) in local_assets.clone() { + LocalAssets::force_create(root_origin(), asset_id.into(), owner, true, 1).unwrap(); + for (account, balance) in balances { + LocalAssets::mint(origin_of(owner.into()), asset_id.into(), account, balance) + .unwrap(); + } + } + // If any xcm assets specified, we register them here + for xcm_asset_initialization in xcm_assets { + let asset_id: AssetId = xcm_asset_initialization.asset_type.clone().into(); + AssetManager::register_foreign_asset( + root_origin(), + xcm_asset_initialization.asset_type, + xcm_asset_initialization.metadata, + 1, + xcm_asset_initialization.is_sufficient, + ) + .unwrap(); + for (account, balance) in xcm_asset_initialization.balances { + Assets::mint( + origin_of(AssetManager::account_id()), + asset_id.into(), + account, + balance, + ) + .unwrap(); + } + } + System::set_block_number(1); + }); + ext + } +} + +pub const CHAIN_ID: u64 = 1281; +pub const ALICE: [u8; 20] = [4u8; 20]; +pub const ALICE_NIMBUS: [u8; 32] = [4u8; 32]; +pub const BOB: [u8; 20] = [5u8; 20]; +pub const CHARLIE: [u8; 20] = [6u8; 20]; +pub const DAVE: [u8; 20] = [7u8; 20]; +pub const EVM_CONTRACT: [u8; 20] = [8u8; 20]; + +pub fn origin_of(account_id: AccountId) -> ::RuntimeOrigin { + ::RuntimeOrigin::signed(account_id) +} + +pub fn inherent_origin() -> ::RuntimeOrigin { + ::RuntimeOrigin::none() +} + +pub fn root_origin() -> ::RuntimeOrigin { + ::RuntimeOrigin::root() +} + +/// Mock the inherent that sets validation data in ParachainSystem, which +/// contains the `relay_chain_block_number`, which is used in `author-filter` as a +/// source of randomness to filter valid authors at each block. +pub fn set_parachain_inherent_data() { + use cumulus_primitives_core::PersistedValidationData; + use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; + let (relay_parent_storage_root, relay_chain_state) = + RelayStateSproofBuilder::default().into_state_root_and_proof(); + let vfp = PersistedValidationData { + relay_parent_number: 1u32, + relay_parent_storage_root, + ..Default::default() + }; + let parachain_inherent_data = ParachainInherentData { + validation_data: vfp, + relay_chain_state: relay_chain_state, + downward_messages: Default::default(), + horizontal_messages: Default::default(), + }; + assert_ok!(RuntimeCall::ParachainSystem( + cumulus_pallet_parachain_system::Call::::set_validation_data { + data: parachain_inherent_data + } + ) + .dispatch(inherent_origin())); +} + +pub fn unchecked_eth_tx(raw_hex_tx: &str) -> UncheckedExtrinsic { + let converter = TransactionConverter; + converter.convert_transaction(ethereum_transaction(raw_hex_tx)) +} + +pub fn ethereum_transaction(raw_hex_tx: &str) -> pallet_ethereum::Transaction { + let bytes = hex::decode(raw_hex_tx).expect("Transaction bytes."); + let transaction = ethereum::EnvelopedDecodable::decode(&bytes[..]); + assert!(transaction.is_ok()); + transaction.unwrap() +} diff --git a/tracing/2402/runtime/moonbase/tests/evm_tracing.rs b/tracing/2402/runtime/moonbase/tests/evm_tracing.rs new file mode 100644 index 0000000..b0f967d --- /dev/null +++ b/tracing/2402/runtime/moonbase/tests/evm_tracing.rs @@ -0,0 +1,94 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Moonbase EVM tracing Integration Tests + +mod common; + +#[cfg(test)] +#[cfg(feature = "evm-tracing")] +mod tests { + use super::common::*; + + use pallet_evm::AddressMapping; + use sp_core::H160; + + use moonbeam_rpc_primitives_debug::runtime_decl_for_debug_runtime_api::DebugRuntimeApi; + use std::str::FromStr; + + #[test] + fn debug_runtime_api_trace_transaction() { + let alith = ::AddressMapping::into_account_id( + H160::from_str("6be02d1d3665660d22ff9624b7be0551ee1ac91b") + .expect("internal H160 is valid; qed"), + ); + ExtBuilder::default() + .with_balances(vec![ + (alith, 2_000 * UNIT), + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .build() + .execute_with(|| { + let non_eth_uxt = UncheckedExtrinsic::new_unsigned( + pallet_balances::Call::::transfer { + dest: AccountId::from(BOB), + value: 1 * UNIT, + } + .into(), + ); + let transaction = ethereum_transaction(VALID_ETH_TX); + let eth_uxt = unchecked_eth_tx(VALID_ETH_TX); + assert!(Runtime::trace_transaction( + vec![non_eth_uxt.clone(), eth_uxt, non_eth_uxt.clone()], + &transaction + ) + .is_ok()); + }); + } + + #[test] + fn debug_runtime_api_trace_block() { + let alith = ::AddressMapping::into_account_id( + H160::from_str("6be02d1d3665660d22ff9624b7be0551ee1ac91b") + .expect("internal H160 is valid; qed"), + ); + ExtBuilder::default() + .with_balances(vec![ + (alith, 2_000 * UNIT), + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .build() + .execute_with(|| { + let non_eth_uxt = UncheckedExtrinsic::new_unsigned( + pallet_balances::Call::::transfer { + dest: AccountId::from(BOB), + value: 1 * UNIT, + } + .into(), + ); + let eth_uxt = unchecked_eth_tx(VALID_ETH_TX); + let eth_tx = ethereum_transaction(VALID_ETH_TX); + let eth_extrinsic_hash = eth_tx.hash(); + assert!(Runtime::trace_block( + vec![non_eth_uxt.clone(), eth_uxt.clone(), non_eth_uxt, eth_uxt], + vec![eth_extrinsic_hash, eth_extrinsic_hash] + ) + .is_ok()); + }); + } +} diff --git a/tracing/2402/runtime/moonbase/tests/integration_test.rs b/tracing/2402/runtime/moonbase/tests/integration_test.rs new file mode 100644 index 0000000..778e92e --- /dev/null +++ b/tracing/2402/runtime/moonbase/tests/integration_test.rs @@ -0,0 +1,3542 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Moonbase Runtime Integration Tests + +mod common; +use common::*; + +use pallet_balances::NegativeImbalance; +use precompile_utils::{ + precompile_set::{is_precompile_or_fail, IsActivePrecompile}, + prelude::*, + testing::*, +}; + +use fp_evm::{Context, IsPrecompileResult}; +use frame_support::{ + assert_noop, assert_ok, + dispatch::{DispatchClass, Dispatchable}, + traits::{ + fungible::Inspect, fungibles::Inspect as FungiblesInspect, Currency as CurrencyT, + EnsureOrigin, PalletInfo, StorageInfo, StorageInfoTrait, + }, + weights::{constants::WEIGHT_REF_TIME_PER_SECOND, Weight}, + StorageHasher, Twox128, +}; +use moonbase_runtime::{ + asset_config::AssetRegistrarMetadata, + asset_config::LocalAssetInstance, + get, + xcm_config::{AssetType, SelfReserve}, + AccountId, AssetId, AssetManager, Assets, Balances, CouncilCollective, CrowdloanRewards, + LocalAssets, OpenTechCommitteeCollective, ParachainStaking, PolkadotXcm, Precompiles, Runtime, + RuntimeBlockWeights, RuntimeCall, RuntimeEvent, System, TechCommitteeCollective, + TransactionPayment, TreasuryCouncilCollective, XTokens, XcmTransactor, + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, +}; +use polkadot_parachain::primitives::Sibling; +use precompile_utils::testing::MockHandle; +use std::str::from_utf8; +use xcm_builder::{ParentIsPreset, SiblingParachainConvertsVia}; +use xcm_executor::traits::Convert as XcmConvert; + +use moonbeam_xcm_benchmarks::weights::XcmWeight; +use nimbus_primitives::NimbusId; +use pallet_evm::PrecompileSet; +use pallet_evm_precompileset_assets_erc20::{ + AccountIdAssetIdConversion, IsLocal, SELECTOR_LOG_APPROVAL, SELECTOR_LOG_TRANSFER, +}; +use pallet_transaction_payment::Multiplier; +use pallet_xcm_transactor::{Currency, CurrencyPayment, HrmpOperation, TransactWeights}; +use parity_scale_codec::Encode; +use sha3::{Digest, Keccak256}; +use sp_core::{crypto::UncheckedFrom, ByteArray, Pair, H160, H256, U256}; +use sp_runtime::{traits::Convert, DispatchError, ModuleError, TokenError}; +use xcm::latest::prelude::*; + +type AuthorMappingPCall = + pallet_evm_precompile_author_mapping::AuthorMappingPrecompileCall; +type BatchPCall = pallet_evm_precompile_batch::BatchPrecompileCall; +type CrowdloanRewardsPCall = + pallet_evm_precompile_crowdloan_rewards::CrowdloanRewardsPrecompileCall; +type XcmUtilsPCall = pallet_evm_precompile_xcm_utils::XcmUtilsPrecompileCall< + Runtime, + moonbase_runtime::xcm_config::XcmExecutorConfig, +>; +type XtokensPCall = pallet_evm_precompile_xtokens::XtokensPrecompileCall; +type LocalAssetsPCall = pallet_evm_precompileset_assets_erc20::Erc20AssetsPrecompileSetCall< + Runtime, + IsLocal, + LocalAssetInstance, +>; +type XcmTransactorV1PCall = + pallet_evm_precompile_xcm_transactor::v1::XcmTransactorPrecompileV1Call; +type XcmTransactorV2PCall = + pallet_evm_precompile_xcm_transactor::v2::XcmTransactorPrecompileV2Call; + +// TODO: can we construct a const U256...? +const BASE_FEE_GENISIS: u128 = 10 * GIGAWEI; + +#[test] +fn xcmp_queue_controller_origin_is_root() { + // important for the XcmExecutionManager impl of PauseExecution which uses root origin + // to suspend/resume XCM execution in xcmp_queue::on_idle + assert_ok!( + ::ControllerOrigin::ensure_origin(root_origin()) + ); +} + +#[test] +fn fast_track_available() { + assert!(get!(pallet_democracy, InstantAllowed, bool)); +} + +#[test] +fn verify_pallet_prefixes() { + fn is_pallet_prefix(name: &str) { + // Compares the unhashed pallet prefix in the `StorageInstance` implementation by every + // storage item in the pallet P. This pallet prefix is used in conjunction with the + // item name to get the unique storage key: hash(PalletPrefix) + hash(StorageName) + // https://github.com/paritytech/substrate/blob/master/frame/support/procedural/src/pallet/ + // expand/storage.rs#L389-L401 + assert_eq!( + ::PalletInfo::name::

(), + Some(name) + ); + } + // TODO: use StorageInfoTrait from https://github.com/paritytech/substrate/pull/9246 + // This is now available with polkadot-v0.9.9 dependencies + is_pallet_prefix::("System"); + is_pallet_prefix::("Utility"); + is_pallet_prefix::("ParachainSystem"); + is_pallet_prefix::("TransactionPayment"); + is_pallet_prefix::("ParachainInfo"); + is_pallet_prefix::("EthereumChainId"); + is_pallet_prefix::("EVM"); + is_pallet_prefix::("Ethereum"); + is_pallet_prefix::("ParachainStaking"); + is_pallet_prefix::("Scheduler"); + is_pallet_prefix::("Democracy"); + is_pallet_prefix::("CouncilCollective"); + is_pallet_prefix::("TechCommitteeCollective"); + is_pallet_prefix::("Treasury"); + is_pallet_prefix::( + "OpenTechCommitteeCollective", + ); + is_pallet_prefix::("AuthorInherent"); + is_pallet_prefix::("AuthorFilter"); + is_pallet_prefix::("CrowdloanRewards"); + is_pallet_prefix::("AuthorMapping"); + is_pallet_prefix::("MaintenanceMode"); + is_pallet_prefix::("Identity"); + is_pallet_prefix::("XcmpQueue"); + is_pallet_prefix::("CumulusXcm"); + is_pallet_prefix::("DmpQueue"); + is_pallet_prefix::("PolkadotXcm"); + is_pallet_prefix::("Assets"); + is_pallet_prefix::("XTokens"); + is_pallet_prefix::("AssetManager"); + is_pallet_prefix::("Migrations"); + is_pallet_prefix::("XcmTransactor"); + is_pallet_prefix::("ProxyGenesisCompanion"); + is_pallet_prefix::("LocalAssets"); + is_pallet_prefix::("MoonbeamOrbiters"); + is_pallet_prefix::("EthereumXcm"); + is_pallet_prefix::("Randomness"); + is_pallet_prefix::("TreasuryCouncilCollective"); + + let prefix = |pallet_name, storage_name| { + let mut res = [0u8; 32]; + res[0..16].copy_from_slice(&Twox128::hash(pallet_name)); + res[16..32].copy_from_slice(&Twox128::hash(storage_name)); + res.to_vec() + }; + assert_eq!( + ::storage_info(), + vec![ + StorageInfo { + pallet_name: b"Timestamp".to_vec(), + storage_name: b"Now".to_vec(), + prefix: prefix(b"Timestamp", b"Now"), + max_values: Some(1), + max_size: Some(8), + }, + StorageInfo { + pallet_name: b"Timestamp".to_vec(), + storage_name: b"DidUpdate".to_vec(), + prefix: prefix(b"Timestamp", b"DidUpdate"), + max_values: Some(1), + max_size: Some(1), + } + ] + ); + assert_eq!( + ::storage_info(), + vec![ + StorageInfo { + pallet_name: b"Balances".to_vec(), + storage_name: b"TotalIssuance".to_vec(), + prefix: prefix(b"Balances", b"TotalIssuance"), + max_values: Some(1), + max_size: Some(16), + }, + StorageInfo { + pallet_name: b"Balances".to_vec(), + storage_name: b"InactiveIssuance".to_vec(), + prefix: prefix(b"Balances", b"InactiveIssuance"), + max_values: Some(1), + max_size: Some(16), + }, + StorageInfo { + pallet_name: b"Balances".to_vec(), + storage_name: b"Account".to_vec(), + prefix: prefix(b"Balances", b"Account"), + max_values: None, + max_size: Some(100), + }, + StorageInfo { + pallet_name: b"Balances".to_vec(), + storage_name: b"Locks".to_vec(), + prefix: prefix(b"Balances", b"Locks"), + max_values: None, + max_size: Some(1287), + }, + StorageInfo { + pallet_name: b"Balances".to_vec(), + storage_name: b"Reserves".to_vec(), + prefix: prefix(b"Balances", b"Reserves"), + max_values: None, + max_size: Some(1037), + }, + ] + ); + assert_eq!( + ::storage_info(), + vec![StorageInfo { + pallet_name: b"Sudo".to_vec(), + storage_name: b"Key".to_vec(), + prefix: prefix(b"Sudo", b"Key"), + max_values: Some(1), + max_size: Some(20), + }] + ); + assert_eq!( + ::storage_info(), + vec![ + StorageInfo { + pallet_name: b"Proxy".to_vec(), + storage_name: b"Proxies".to_vec(), + prefix: prefix(b"Proxy", b"Proxies"), + max_values: None, + max_size: Some(845), + }, + StorageInfo { + pallet_name: b"Proxy".to_vec(), + storage_name: b"Announcements".to_vec(), + prefix: prefix(b"Proxy", b"Announcements"), + max_values: None, + max_size: Some(1837), + } + ] + ); + assert_eq!( + ::storage_info(), + vec![StorageInfo { + pallet_name: b"MaintenanceMode".to_vec(), + storage_name: b"MaintenanceMode".to_vec(), + prefix: prefix(b"MaintenanceMode", b"MaintenanceMode"), + max_values: Some(1), + max_size: None, + },] + ); +} + +#[test] +fn test_collectives_storage_item_prefixes() { + for StorageInfo { pallet_name, .. } in + ::storage_info() + { + assert_eq!(pallet_name, b"CouncilCollective".to_vec()); + } + + for StorageInfo { pallet_name, .. } in + ::storage_info() + { + assert_eq!(pallet_name, b"TechCommitteeCollective".to_vec()); + } + + for StorageInfo { pallet_name, .. } in + ::storage_info() + { + assert_eq!(pallet_name, b"TreasuryCouncilCollective".to_vec()); + } + + for StorageInfo { pallet_name, .. } in + ::storage_info() + { + assert_eq!(pallet_name, b"OpenTechCommitteeCollective".to_vec()); + } +} + +#[test] +fn collective_set_members_root_origin_works() { + ExtBuilder::default().build().execute_with(|| { + // CouncilCollective + assert_ok!(CouncilCollective::set_members( + ::RuntimeOrigin::root(), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + )); + // TechCommitteeCollective + assert_ok!(TechCommitteeCollective::set_members( + ::RuntimeOrigin::root(), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + )); + // TreasuryCouncilCollective + assert_ok!(TreasuryCouncilCollective::set_members( + ::RuntimeOrigin::root(), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + )); + // OpenTechCommitteeCollective + assert_ok!(OpenTechCommitteeCollective::set_members( + ::RuntimeOrigin::root(), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + )); + }); +} + +#[test] +fn collective_set_members_general_admin_origin_works() { + use moonbase_runtime::{ + governance::custom_origins::Origin as CustomOrigin, OriginCaller, Utility, + }; + + ExtBuilder::default().build().execute_with(|| { + let root_caller = ::RuntimeOrigin::root(); + let alice = AccountId::from(ALICE); + + // CouncilCollective + let _ = Utility::dispatch_as( + root_caller.clone(), + Box::new(OriginCaller::Origins(CustomOrigin::GeneralAdmin)), + Box::new( + pallet_collective::Call::::set_members { + new_members: vec![alice, AccountId::from(BOB)], + prime: Some(alice), + old_count: 2, + } + .into(), + ), + ); + // TechCommitteeCollective + let _ = Utility::dispatch_as( + root_caller.clone(), + Box::new(OriginCaller::Origins(CustomOrigin::GeneralAdmin)), + Box::new( + pallet_collective::Call::::set_members { + new_members: vec![alice, AccountId::from(BOB)], + prime: Some(alice), + old_count: 2, + } + .into(), + ), + ); + // TreasuryCouncilCollective + let _ = Utility::dispatch_as( + root_caller.clone(), + Box::new(OriginCaller::Origins(CustomOrigin::GeneralAdmin)), + Box::new( + pallet_collective::Call::::set_members { + new_members: vec![alice, AccountId::from(BOB)], + prime: Some(alice), + old_count: 2, + } + .into(), + ), + ); + // OpenTechCommitteeCollective + let _ = Utility::dispatch_as( + root_caller, + Box::new(OriginCaller::Origins(CustomOrigin::GeneralAdmin)), + Box::new( + pallet_collective::Call::::set_members { + new_members: vec![alice, AccountId::from(BOB)], + prime: Some(alice), + old_count: 2, + } + .into(), + ), + ); + + assert_eq!( + System::events() + .into_iter() + .filter_map(|r| { + match r.event { + RuntimeEvent::Utility(pallet_utility::Event::DispatchedAs { result }) + if result.is_ok() => + { + Some(true) + } + _ => None, + } + }) + .collect::>() + .len(), + 4 + ) + }); +} + +#[test] +fn collective_set_members_signed_origin_does_not_work() { + let alice = AccountId::from(ALICE); + ExtBuilder::default().build().execute_with(|| { + // CouncilCollective + assert!(CouncilCollective::set_members( + ::RuntimeOrigin::signed(alice), + vec![alice, AccountId::from(BOB)], + Some(alice), + 2 + ) + .is_err()); + // TechCommitteeCollective + assert!(TechCommitteeCollective::set_members( + ::RuntimeOrigin::signed(alice), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + ) + .is_err()); + // TreasuryCouncilCollective + assert!(TreasuryCouncilCollective::set_members( + ::RuntimeOrigin::signed(alice), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + ) + .is_err()); + // OpenTechCommitteeCollective + assert!(OpenTechCommitteeCollective::set_members( + ::RuntimeOrigin::signed(alice), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + ) + .is_err()); + }); +} + +#[test] +fn verify_pallet_indices() { + fn is_pallet_index(index: usize) { + assert_eq!( + ::PalletInfo::index::

(), + Some(index) + ); + } + is_pallet_index::(0); + is_pallet_index::(1); + is_pallet_index::(2); + is_pallet_index::(3); + is_pallet_index::(4); + is_pallet_index::(6); + is_pallet_index::(7); + is_pallet_index::(8); + is_pallet_index::(9); + is_pallet_index::(10); + is_pallet_index::(11); + is_pallet_index::(12); + is_pallet_index::(13); + is_pallet_index::(14); + is_pallet_index::(15); + is_pallet_index::(16); + is_pallet_index::(17); + is_pallet_index::(18); + is_pallet_index::(19); + is_pallet_index::(20); + is_pallet_index::(21); + is_pallet_index::(22); + is_pallet_index::(23); + is_pallet_index::(24); + is_pallet_index::(25); + is_pallet_index::(26); + is_pallet_index::(27); + is_pallet_index::(28); + is_pallet_index::(29); + is_pallet_index::(30); + is_pallet_index::(31); + is_pallet_index::(32); + is_pallet_index::(33); + is_pallet_index::(34); + is_pallet_index::(36); + is_pallet_index::(37); + is_pallet_index::(38); + is_pallet_index::(39); + is_pallet_index::(40); + is_pallet_index::(46); +} + +#[test] +fn verify_reserved_indices() { + use frame_support::metadata::*; + let metadata = moonbase_runtime::Runtime::metadata(); + let metadata = match metadata.1 { + RuntimeMetadata::V14(metadata) => metadata, + _ => panic!("metadata has been bumped, test needs to be updated"), + }; + // 35: BaseFee + let reserved = vec![35]; + let existing = metadata + .pallets + .iter() + .map(|p| p.index) + .collect::>(); + assert!(reserved.iter().all(|index| !existing.contains(index))); +} + +#[test] +fn verify_proxy_type_indices() { + assert_eq!(moonbase_runtime::ProxyType::Any as u8, 0); + assert_eq!(moonbase_runtime::ProxyType::NonTransfer as u8, 1); + assert_eq!(moonbase_runtime::ProxyType::Governance as u8, 2); + assert_eq!(moonbase_runtime::ProxyType::Staking as u8, 3); + assert_eq!(moonbase_runtime::ProxyType::CancelProxy as u8, 4); + assert_eq!(moonbase_runtime::ProxyType::Balances as u8, 5); + assert_eq!(moonbase_runtime::ProxyType::AuthorMapping as u8, 6); + assert_eq!(moonbase_runtime::ProxyType::IdentityJudgement as u8, 7); +} + +#[test] +fn join_collator_candidates() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 2_000 * UNIT), + (AccountId::from(CHARLIE), 1_100 * UNIT), + (AccountId::from(DAVE), 1_000 * UNIT), + ]) + .with_collators(vec![ + (AccountId::from(ALICE), 1_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_delegations(vec![ + (AccountId::from(CHARLIE), AccountId::from(ALICE), 50 * UNIT), + (AccountId::from(CHARLIE), AccountId::from(BOB), 50 * UNIT), + ]) + .build() + .execute_with(|| { + assert_noop!( + ParachainStaking::join_candidates( + origin_of(AccountId::from(ALICE)), + 1_000 * UNIT, + 2u32 + ), + pallet_parachain_staking::Error::::CandidateExists + ); + assert_noop!( + ParachainStaking::join_candidates( + origin_of(AccountId::from(CHARLIE)), + 1_000 * UNIT, + 2u32 + ), + pallet_parachain_staking::Error::::DelegatorExists + ); + assert!(System::events().is_empty()); + assert_ok!(ParachainStaking::join_candidates( + origin_of(AccountId::from(DAVE)), + 1_000 * UNIT, + 2u32 + )); + assert_eq!( + last_event(), + RuntimeEvent::ParachainStaking( + pallet_parachain_staking::Event::JoinedCollatorCandidates { + account: AccountId::from(DAVE), + amount_locked: 1_000 * UNIT, + new_total_amt_locked: 3_100 * UNIT + } + ) + ); + let candidates = ParachainStaking::candidate_pool(); + assert_eq!(candidates.0[0].owner, AccountId::from(ALICE)); + assert_eq!(candidates.0[0].amount, 1_050 * UNIT); + assert_eq!(candidates.0[1].owner, AccountId::from(BOB)); + assert_eq!(candidates.0[1].amount, 1_050 * UNIT); + assert_eq!(candidates.0[2].owner, AccountId::from(DAVE)); + assert_eq!(candidates.0[2].amount, 1_000 * UNIT); + }); +} + +#[test] +fn transfer_through_evm_to_stake() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 2_000 * UNIT)]) + .build() + .execute_with(|| { + // Charlie has no balance => fails to stake + assert_noop!( + ParachainStaking::join_candidates( + origin_of(AccountId::from(CHARLIE)), + 1_000 * UNIT, + 0u32 + ), + DispatchError::Module(ModuleError { + index: 12, + error: [8, 0, 0, 0], + message: Some("InsufficientBalance") + }) + ); + + // Alice transfer from free balance 2000 UNIT to Bob + assert_ok!(Balances::transfer( + origin_of(AccountId::from(ALICE)), + AccountId::from(BOB), + 2_000 * UNIT, + )); + assert_eq!(Balances::free_balance(AccountId::from(BOB)), 2_000 * UNIT); + + let gas_limit = 100000u64; + // Bob transfers 1000 UNIT to Charlie via EVM + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(BOB), + target: H160::from(CHARLIE), + input: Vec::new(), + value: (1_000 * UNIT).into(), + gas_limit, + max_fee_per_gas: U256::from(BASE_FEE_GENISIS), + max_priority_fee_per_gas: None, + nonce: None, + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + assert_eq!( + Balances::free_balance(AccountId::from(CHARLIE)), + 1_000 * UNIT, + ); + + // Charlie can stake now + assert_ok!(ParachainStaking::join_candidates( + origin_of(AccountId::from(CHARLIE)), + 1_000 * UNIT, + 0u32, + ),); + let candidates = ParachainStaking::candidate_pool(); + assert_eq!(candidates.0[0].owner, AccountId::from(CHARLIE)); + assert_eq!(candidates.0[0].amount, 1_000 * UNIT); + }); +} + +#[test] +fn reward_block_authors() { + ExtBuilder::default() + .with_balances(vec![ + // Alice gets 100 extra tokens for her mapping deposit + (AccountId::from(ALICE), 2_100 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 500 * UNIT, + )]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + for x in 2..1199 { + run_to_block(x, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + } + // no rewards doled out yet + assert_eq!( + Balances::usable_balance(AccountId::from(ALICE)), + 1_000 * UNIT, + ); + assert_eq!(Balances::usable_balance(AccountId::from(BOB)), 500 * UNIT,); + run_to_block(1201, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + // rewards minted and distributed + assert_eq!( + Balances::usable_balance(AccountId::from(ALICE)), + 1113666666584000000000, + ); + assert_eq!( + Balances::usable_balance(AccountId::from(BOB)), + 541333333292000000000, + ); + }); +} + +#[test] +fn reward_block_authors_with_parachain_bond_reserved() { + ExtBuilder::default() + .with_balances(vec![ + // Alice gets 100 extra tokens for her mapping deposit + (AccountId::from(ALICE), 2_100 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + (AccountId::from(CHARLIE), UNIT), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 500 * UNIT, + )]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + assert_ok!(ParachainStaking::set_parachain_bond_account( + root_origin(), + AccountId::from(CHARLIE), + ),); + for x in 2..1199 { + run_to_block(x, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + } + // no rewards doled out yet + assert_eq!( + Balances::usable_balance(AccountId::from(ALICE)), + 1_000 * UNIT, + ); + assert_eq!(Balances::usable_balance(AccountId::from(BOB)), 500 * UNIT,); + assert_eq!(Balances::usable_balance(AccountId::from(CHARLIE)), UNIT,); + run_to_block(1201, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + // rewards minted and distributed + assert_eq!( + Balances::usable_balance(AccountId::from(ALICE)), + 1082693333281650000000, + ); + assert_eq!( + Balances::usable_balance(AccountId::from(BOB)), + 525841666640825000000, + ); + // 30% reserved for parachain bond + assert_eq!( + Balances::usable_balance(AccountId::from(CHARLIE)), + 47515000000000000000, + ); + }); +} + +#[test] +fn initialize_crowdloan_addresses_with_batch_and_pay() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * UNIT) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * UNIT + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [5u8; 32].into(), + Some(AccountId::from(DAVE)), + 1_500_000 * UNIT + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + // 30 percent initial payout + assert_eq!(Balances::balance(&AccountId::from(CHARLIE)), 450_000 * UNIT); + // 30 percent initial payout + assert_eq!(Balances::balance(&AccountId::from(DAVE)), 450_000 * UNIT); + let expected = RuntimeEvent::Utility(pallet_utility::Event::BatchCompleted); + assert_eq!(last_event(), expected); + // This one should fail, as we already filled our data + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch { + calls: vec![RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![([4u8; 32].into(), Some(AccountId::from(ALICE)), 432000)] + } + )] + }) + .dispatch(root_origin()) + ); + let expected_fail = RuntimeEvent::Utility(pallet_utility::Event::BatchInterrupted { + index: 0, + error: DispatchError::Module(ModuleError { + index: 20, + error: [8, 0, 0, 0], + message: None, + }), + }); + assert_eq!(last_event(), expected_fail); + // Claim 1 block. + assert_ok!(CrowdloanRewards::claim(origin_of(AccountId::from(CHARLIE)))); + assert_ok!(CrowdloanRewards::claim(origin_of(AccountId::from(DAVE)))); + + let vesting_period = 4 * WEEKS as u128; + let per_block = (1_050_000 * UNIT) / vesting_period; + + assert_eq!( + CrowdloanRewards::accounts_payable(&AccountId::from(CHARLIE)) + .unwrap() + .claimed_reward, + (450_000 * UNIT) + per_block + ); + assert_eq!( + CrowdloanRewards::accounts_payable(&AccountId::from(DAVE)) + .unwrap() + .claimed_reward, + (450_000 * UNIT) + per_block + ); + // The total claimed reward should be equal to the account balance at this point. + assert_eq!( + Balances::balance(&AccountId::from(CHARLIE)), + (450_000 * UNIT) + per_block + ); + assert_eq!( + Balances::balance(&AccountId::from(DAVE)), + (450_000 * UNIT) + per_block + ); + assert_noop!( + CrowdloanRewards::claim(origin_of(AccountId::from(ALICE))), + pallet_crowdloan_rewards::Error::::NoAssociatedClaim + ); + }); +} + +#[test] +fn initialize_crowdloan_address_and_change_with_relay_key_sig() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * UNIT) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + + let (pair1, _) = sp_core::sr25519::Pair::generate(); + let (pair2, _) = sp_core::sr25519::Pair::generate(); + + let public1 = pair1.public(); + let public2 = pair2.public(); + + // signature: + // WRAP_BYTES|| NetworkIdentifier|| new_account || previous_account || WRAP_BYTES + let mut message = pallet_crowdloan_rewards::WRAPPED_BYTES_PREFIX.to_vec(); + message.append(&mut b"moonbase-".to_vec()); + message.append(&mut AccountId::from(DAVE).encode()); + message.append(&mut AccountId::from(CHARLIE).encode()); + message.append(&mut pallet_crowdloan_rewards::WRAPPED_BYTES_POSTFIX.to_vec()); + + let signature1 = pair1.sign(&message); + let signature2 = pair2.sign(&message); + + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + // two relay accounts pointing at the same reward account + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + public1.into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * UNIT + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + public2.into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * UNIT + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + // 30 percent initial payout + assert_eq!(Balances::balance(&AccountId::from(CHARLIE)), 900_000 * UNIT); + + // this should fail, as we are only providing one signature + assert_noop!( + CrowdloanRewards::change_association_with_relay_keys( + origin_of(AccountId::from(CHARLIE)), + AccountId::from(DAVE), + AccountId::from(CHARLIE), + vec![(public1.into(), signature1.clone().into())] + ), + pallet_crowdloan_rewards::Error::::InsufficientNumberOfValidProofs + ); + + // this should be valid + assert_ok!(CrowdloanRewards::change_association_with_relay_keys( + origin_of(AccountId::from(CHARLIE)), + AccountId::from(DAVE), + AccountId::from(CHARLIE), + vec![ + (public1.into(), signature1.into()), + (public2.into(), signature2.into()) + ] + )); + + assert_eq!( + CrowdloanRewards::accounts_payable(&AccountId::from(DAVE)) + .unwrap() + .claimed_reward, + (900_000 * UNIT) + ); + }); +} + +#[test] +fn claim_via_precompile() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * UNIT) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * UNIT + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [5u8; 32].into(), + Some(AccountId::from(DAVE)), + 1_500_000 * UNIT + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + + // 30 percent initial payout + assert_eq!(Balances::balance(&AccountId::from(CHARLIE)), 450_000 * UNIT); + // 30 percent initial payout + assert_eq!(Balances::balance(&AccountId::from(DAVE)), 450_000 * UNIT); + + let crowdloan_precompile_address = H160::from_low_u64_be(2049); + + // Alice uses the crowdloan precompile to claim through the EVM + let gas_limit = 100000u64; + let gas_price: U256 = BASE_FEE_GENISIS.into(); + + // Construct the call data (selector, amount) + let mut call_data = Vec::::from([0u8; 4]); + call_data[0..4].copy_from_slice(&Keccak256::digest(b"claim()")[0..4]); + + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(CHARLIE), + target: crowdloan_precompile_address, + input: call_data, + value: U256::zero(), // No value sent in EVM + gas_limit, + max_fee_per_gas: gas_price, + max_priority_fee_per_gas: None, + nonce: None, // Use the next nonce + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + let vesting_period = 4 * WEEKS as u128; + let per_block = (1_050_000 * UNIT) / vesting_period; + + assert_eq!( + CrowdloanRewards::accounts_payable(&AccountId::from(CHARLIE)) + .unwrap() + .claimed_reward, + (450_000 * UNIT) + per_block + ); + }) +} + +#[test] +fn is_contributor_via_precompile() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * UNIT) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * UNIT + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [5u8; 32].into(), + Some(AccountId::from(DAVE)), + 1_500_000 * UNIT + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + + let crowdloan_precompile_address = H160::from_low_u64_be(2049); + + // Assert precompile reports Bob is not a contributor + Precompiles::new() + .prepare_test( + ALICE, + crowdloan_precompile_address, + CrowdloanRewardsPCall::is_contributor { + contributor: Address(BOB.into()), + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(false); + + // Assert precompile reports Charlie is a nominator + Precompiles::new() + .prepare_test( + ALICE, + crowdloan_precompile_address, + CrowdloanRewardsPCall::is_contributor { + contributor: Address(CHARLIE.into()), + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(true); + }) +} + +#[test] +fn reward_info_via_precompile() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * UNIT) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * UNIT + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [5u8; 32].into(), + Some(AccountId::from(DAVE)), + 1_500_000 * UNIT + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + + let crowdloan_precompile_address = H160::from_low_u64_be(2049); + + let expected_total: U256 = (1_500_000 * UNIT).into(); + let expected_claimed: U256 = (450_000 * UNIT).into(); + + // Assert precompile reports correct Charlie reward info. + Precompiles::new() + .prepare_test( + ALICE, + crowdloan_precompile_address, + CrowdloanRewardsPCall::reward_info { + contributor: Address(AccountId::from(CHARLIE).into()), + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns((expected_total, expected_claimed)); + }) +} + +#[test] +fn update_reward_address_via_precompile() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * UNIT) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * UNIT + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [5u8; 32].into(), + Some(AccountId::from(DAVE)), + 1_500_000 * UNIT + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + + let crowdloan_precompile_address = H160::from_low_u64_be(2049); + + // Charlie uses the crowdloan precompile to update address through the EVM + let gas_limit = 100000u64; + let gas_price: U256 = BASE_FEE_GENISIS.into(); + + // Construct the input data to check if Bob is a contributor + let mut call_data = Vec::::from([0u8; 36]); + call_data[0..4] + .copy_from_slice(&Keccak256::digest(b"update_reward_address(address)")[0..4]); + call_data[16..36].copy_from_slice(&ALICE); + + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(CHARLIE), + target: crowdloan_precompile_address, + input: call_data, + value: U256::zero(), // No value sent in EVM + gas_limit, + max_fee_per_gas: gas_price, + max_priority_fee_per_gas: None, + nonce: None, // Use the next nonce + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + assert!(CrowdloanRewards::accounts_payable(&AccountId::from(CHARLIE)).is_none()); + assert_eq!( + CrowdloanRewards::accounts_payable(&AccountId::from(ALICE)) + .unwrap() + .claimed_reward, + (450_000 * UNIT) + ); + }) +} + +#[test] +fn asset_can_be_registered() { + ExtBuilder::default().build().execute_with(|| { + let source_location = AssetType::Xcm(MultiLocation::parent()); + let source_id: moonbase_runtime::AssetId = source_location.clone().into(); + let asset_metadata = AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }; + assert_ok!(AssetManager::register_foreign_asset( + moonbase_runtime::RuntimeOrigin::root(), + source_location, + asset_metadata, + 1u128, + true, + )); + assert!(AssetManager::asset_id_type(source_id).is_some()); + }); +} + +#[test] +fn local_assets_cannot_be_create_by_signed_origins() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT * SUPPLY_FACTOR), + (AccountId::from(BOB), 1_000 * UNIT * SUPPLY_FACTOR), + ]) + .build() + .execute_with(|| { + assert_noop!( + RuntimeCall::LocalAssets( + pallet_assets::Call::::create { + id: 11u128.into(), + admin: AccountId::from(ALICE), + min_balance: 1u128 + } + ) + .dispatch(::RuntimeOrigin::signed( + AccountId::from(ALICE) + )), + frame_system::Error::::CallFiltered + ); + }); +} + +#[test] +fn asset_erc20_precompiles_supply_and_balance() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * UNIT)], + AccountId::from(ALICE), + )]) + .build() + .execute_with(|| { + // Assert the asset has been created with the correct supply + assert_eq!(LocalAssets::total_supply(0u128), 1_000 * UNIT); + + // Convert the assetId to its corresponding precompile address + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Access totalSupply through precompile. + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::total_supply {}, + ) + .expect_cost(3000) + .expect_no_logs() + .execute_returns(U256::from(1000 * UNIT)); + + // Access balanceOf through precompile + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(ALICE.into()), + }, + ) + .expect_cost(3000) + .expect_no_logs() + .execute_returns(U256::from(1000 * UNIT)); + }); +} + +#[test] +fn asset_erc20_precompiles_transfer() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * UNIT)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Transfer tokens from Alice to Bob, 400 UNIT. + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::transfer { + to: Address(BOB.into()), + value: { 400 * UNIT }.into(), + }, + ) + .expect_cost(25775) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::from(ALICE), + H160::from(BOB), + solidity::encode_event_data(U256::from(400 * UNIT)), + )) + .execute_returns(true); + + // Make sure BOB has 400 UNIT + Precompiles::new() + .prepare_test( + BOB, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(BOB.into()), + }, + ) + .expect_cost(3000) + .expect_no_logs() + .execute_returns(U256::from(400 * UNIT)); + }); +} + +#[test] +fn asset_erc20_precompiles_approve() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * UNIT)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Aprove Bob for spending 400 UNIT from Alice + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::approve { + spender: Address(BOB.into()), + value: { 400 * UNIT }.into(), + }, + ) + .expect_cost(16048) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_APPROVAL, + H160::from(ALICE), + H160::from(BOB), + solidity::encode_event_data(U256::from(400 * UNIT)), + )) + .execute_returns(true); + + // Transfer tokens from Alice to Charlie by using BOB as origin + Precompiles::new() + .prepare_test( + BOB, + asset_precompile_address, + LocalAssetsPCall::transfer_from { + from: Address(ALICE.into()), + to: Address(CHARLIE.into()), + value: { 400 * UNIT }.into(), + }, + ) + .expect_cost(33145) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::from(ALICE), + H160::from(CHARLIE), + solidity::encode_event_data(U256::from(400 * UNIT)), + )) + .execute_returns(true); + + // Make sure CHARLIE has 400 UNIT + Precompiles::new() + .prepare_test( + CHARLIE, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(CHARLIE.into()), + }, + ) + .expect_cost(3000) + .expect_no_logs() + .execute_returns(U256::from(400 * UNIT)); + }); +} + +#[test] +fn asset_erc20_precompiles_mint_burn() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * UNIT)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Mint 1000 MOVRS to BOB + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::mint { + to: Address(BOB.into()), + value: { 1000 * UNIT }.into(), + }, + ) + .expect_cost(14932) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::default(), + H160::from(BOB), + solidity::encode_event_data(U256::from(1_000 * UNIT)), + )) + .execute_returns(true); + + // Assert the asset has been minted + assert_eq!(LocalAssets::total_supply(0u128), 2_000 * UNIT); + assert_eq!( + LocalAssets::balance(0u128, AccountId::from(BOB)), + 1_000 * UNIT + ); + + // Burn tokens + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::burn { + from: Address(BOB.into()), + value: { 500 * UNIT }.into(), + }, + ) + .expect_cost(15172) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::from(BOB), + H160::default(), + solidity::encode_event_data(U256::from(500 * UNIT)), + )) + .execute_returns(true); + + // Assert the asset has been burnt + assert_eq!(LocalAssets::total_supply(0u128), 1_500 * UNIT); + assert_eq!( + LocalAssets::balance(0u128, AccountId::from(BOB)), + 500 * UNIT + ); + }); +} + +#[test] +fn asset_erc20_precompiles_freeze_thaw_account() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * UNIT)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Freeze Account + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::freeze { + account: Address(ALICE.into()), + }, + ) + .expect_cost(8783) + .expect_no_logs() + .execute_returns(true); + + // Assert account is frozen + assert_eq!( + LocalAssets::can_withdraw(0u128, &AccountId::from(ALICE), 1).into_result(), + Err(TokenError::Frozen.into()) + ); + + // Thaw Account + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::thaw { + account: Address(ALICE.into()), + }, + ) + .expect_cost(8803) + .expect_no_logs() + .execute_returns(true); + + // Assert account is not frozen + assert!(LocalAssets::can_withdraw(0u128, &AccountId::from(ALICE), 1) + .into_result() + .is_ok()); + }); +} + +#[test] +fn asset_erc20_precompiles_freeze_thaw_asset() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * UNIT)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Freeze Asset + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::freeze_asset {}, + ) + .expect_cost(7623) + .expect_no_logs() + .execute_returns(true); + + // Assert account is frozen + assert_eq!( + LocalAssets::can_withdraw(0u128, &AccountId::from(ALICE), 1).into_result(), + Err(TokenError::Frozen.into()) + ); + + // Thaw Asset + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::thaw_asset {}, + ) + .expect_cost(7634) + .expect_no_logs() + .execute_returns(true); + }); +} + +#[test] +fn asset_erc20_precompiles_freeze_transfer_ownership() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * UNIT)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Transfer ownerhsip of an asset + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::transfer_ownership { + owner: Address(BOB.into()), + }, + ) + .expect_cost(8706) + .expect_no_logs() + .execute_returns(true); + }); +} + +#[test] +fn asset_erc20_precompiles_freeze_set_team() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * UNIT)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Set Bob as issuer, admin and freezer + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::set_team { + admin: Address(BOB.into()), + issuer: Address(BOB.into()), + freezer: Address(BOB.into()), + }, + ) + .expect_cost(7657) + .expect_no_logs() + .execute_returns(true); + + // Bob should be able to mint, freeze, and thaw + assert_ok!(LocalAssets::mint( + origin_of(AccountId::from(BOB)), + 0u128.into(), + AccountId::from(BOB), + 1_000 * UNIT + )); + assert_ok!(LocalAssets::freeze( + origin_of(AccountId::from(BOB)), + 0u128.into(), + AccountId::from(ALICE) + )); + assert_ok!(LocalAssets::thaw( + origin_of(AccountId::from(BOB)), + 0u128.into(), + AccountId::from(ALICE) + )); + }); +} + +#[test] +fn xcm_asset_erc20_precompiles_supply_and_balance() { + ExtBuilder::default() + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000 * UNIT)], + is_sufficient: true, + }]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .build() + .execute_with(|| { + // We have the assetId that corresponds to the relay chain registered + let relay_asset_id: AssetId = AssetType::Xcm(MultiLocation::parent()).into(); + + // Its address is + let asset_precompile_address = Runtime::asset_id_to_account( + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + relay_asset_id, + ); + + // Assert the asset has been created with the correct supply + assert_eq!(Assets::total_supply(relay_asset_id), 1_000 * UNIT); + + // Access totalSupply through precompile. Important that the context is correct + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::total_supply {}, + ) + .expect_cost(2000) + .expect_no_logs() + .execute_returns(U256::from(1000 * UNIT)); + + // Access balanceOf through precompile + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(ALICE.into()), + }, + ) + .expect_cost(2000) + .expect_no_logs() + .execute_returns(U256::from(1000 * UNIT)); + }); +} + +#[test] +fn xcm_asset_erc20_precompiles_transfer() { + ExtBuilder::default() + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000 * UNIT)], + is_sufficient: true, + }]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .build() + .execute_with(|| { + // We have the assetId that corresponds to the relay chain registered + let relay_asset_id: AssetId = AssetType::Xcm(MultiLocation::parent()).into(); + + // Its address is + let asset_precompile_address = Runtime::asset_id_to_account( + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + relay_asset_id, + ); + + // Transfer tokens from Alice to Bob, 400 UNIT. + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::transfer { + to: Address(BOB.into()), + value: { 400 * UNIT }.into(), + }, + ) + .expect_cost(24775) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::from(ALICE), + H160::from(BOB), + solidity::encode_event_data(U256::from(400 * UNIT)), + )) + .execute_returns(true); + + // Make sure BOB has 400 UNIT + Precompiles::new() + .prepare_test( + BOB, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(BOB.into()), + }, + ) + .expect_cost(2000) + .expect_no_logs() + .execute_returns(U256::from(400 * UNIT)); + }); +} + +#[test] +fn xcm_asset_erc20_precompiles_approve() { + ExtBuilder::default() + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000 * UNIT)], + is_sufficient: true, + }]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .build() + .execute_with(|| { + // We have the assetId that corresponds to the relay chain registered + let relay_asset_id: AssetId = AssetType::Xcm(MultiLocation::parent()).into(); + + // Its address is + let asset_precompile_address = Runtime::asset_id_to_account( + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + relay_asset_id, + ); + + // Aprove Bob for spending 400 UNIT from Alice + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::approve { + spender: Address(BOB.into()), + value: { 400 * UNIT }.into(), + }, + ) + .expect_cost(15048) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_APPROVAL, + H160::from(ALICE), + H160::from(BOB), + solidity::encode_event_data(U256::from(400 * UNIT)), + )) + .execute_returns(true); + + // Transfer tokens from Alice to Charlie by using BOB as origin + Precompiles::new() + .prepare_test( + BOB, + asset_precompile_address, + LocalAssetsPCall::transfer_from { + from: Address(ALICE.into()), + to: Address(CHARLIE.into()), + value: { 400 * UNIT }.into(), + }, + ) + .expect_cost(32145) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::from(ALICE), + H160::from(CHARLIE), + solidity::encode_event_data(U256::from(400 * UNIT)), + )) + .execute_returns(true); + + // Make sure CHARLIE has 400 UNIT + Precompiles::new() + .prepare_test( + CHARLIE, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(CHARLIE.into()), + }, + ) + .expect_cost(2000) + .expect_no_logs() + .execute_returns(U256::from(400 * UNIT)); + }); +} + +#[test] +fn xtokens_precompiles_transfer() { + ExtBuilder::default() + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000_000_000_000_000)], + is_sufficient: true, + }]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + let xtokens_precompile_address = H160::from_low_u64_be(2052); + + // We have the assetId that corresponds to the relay chain registered + let relay_asset_id: AssetId = AssetType::Xcm(MultiLocation::parent()).into(); + + // Its address is + let asset_precompile_address = Runtime::asset_id_to_account( + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + relay_asset_id, + ); + + // Alice has 1000 tokens. She should be able to send through precompile + let destination = MultiLocation::new( + 1, + Junctions::X1(Junction::AccountId32 { + network: None, + id: [1u8; 32], + }), + ); + + // We use the address of the asset as an identifier of the asset we want to transfer + Precompiles::new() + .prepare_test( + ALICE, + xtokens_precompile_address, + XtokensPCall::transfer { + currency_address: Address(asset_precompile_address.into()), + amount: 500_000_000_000_000u128.into(), + destination, + weight: 4_000_000, + }, + ) + .expect_cost(57639) + .expect_no_logs() + .execute_returns(()) + }) +} + +#[test] +fn xtokens_precompiles_transfer_multiasset() { + ExtBuilder::default() + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000_000_000_000_000)], + is_sufficient: true, + }]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + let xtokens_precompile_address = H160::from_low_u64_be(2052); + + // Alice has 1000 tokens. She should be able to send through precompile + let destination = MultiLocation::new( + 1, + Junctions::X1(Junction::AccountId32 { + network: None, + id: [1u8; 32], + }), + ); + + // This time we transfer it through TransferMultiAsset + // Instead of the address, we encode directly the multilocation referencing the asset + Precompiles::new() + .prepare_test( + ALICE, + xtokens_precompile_address, + XtokensPCall::transfer_multiasset { + // We want to transfer the relay token + asset: MultiLocation::parent(), + amount: 500_000_000_000_000u128.into(), + destination, + weight: 4_000_000, + }, + ) + .expect_cost(57639) + .expect_no_logs() + .execute_returns(()); + }) +} + +#[test] +fn xtokens_precompiles_transfer_native() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + let xtokens_precompile_address = H160::from_low_u64_be(2052); + + // Its address is + let asset_precompile_address = H160::from_low_u64_be(2050); + + // Alice has 1000 tokens. She should be able to send through precompile + let destination = MultiLocation::new( + 1, + Junctions::X1(Junction::AccountId32 { + network: None, + id: [1u8; 32], + }), + ); + + // We use the address of the asset as an identifier of the asset we want to transfer + Precompiles::new() + .prepare_test( + ALICE, + xtokens_precompile_address, + XtokensPCall::transfer { + currency_address: Address(asset_precompile_address), + amount: { 500 * UNIT }.into(), + destination: destination.clone(), + weight: 4_000_000, + }, + ) + .expect_cost(16000) + .expect_no_logs() + .execute_returns(()); + }) +} + +#[test] +fn xtokens_precompile_transfer_local_asset() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * UNIT)], + AccountId::from(ALICE), + )]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + let xtokens_precompile_address = H160::from_low_u64_be(2052); + + // Its address is + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128).into(); + + // Alice has 1000 tokens. She should be able to send through precompile + let destination = MultiLocation::new( + 1, + Junctions::X1(Junction::AccountId32 { + network: None, + id: [1u8; 32], + }), + ); + + // We use the address of the asset as an identifier of the asset we want to transfer + Precompiles::new() + .prepare_test( + ALICE, + xtokens_precompile_address, + XtokensPCall::transfer { + currency_address: Address(asset_precompile_address), + amount: { 500 * UNIT }.into(), + destination: destination.clone(), + weight: 4_000_000, + }, + ) + .expect_cost(16000) + .expect_no_logs() + .execute_returns(()); + }) +} + +fn run_with_system_weight(w: Weight, mut assertions: F) +where + F: FnMut() -> (), +{ + let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap() + .into(); + t.execute_with(|| { + System::set_block_consumed_resources(w, 0); + assertions() + }); +} + +#[test] +#[rustfmt::skip] +fn length_fee_is_sensible() { + use sp_runtime::testing::TestXt; + + // tests that length fee is sensible for a few hypothetical transactions + ExtBuilder::default().build().execute_with(|| { + let call = frame_system::Call::remark:: { remark: vec![] }; + let uxt: TestXt<_, ()> = TestXt::new(call, Some((1u64, ()))); + + let calc_fee = |len: u32| -> Balance { + moonbase_runtime::TransactionPayment::query_fee_details(uxt.clone(), len) + .inclusion_fee + .expect("fee should be calculated") + .len_fee + }; + + // editorconfig-checker-disable + // left: cost of length fee, right: size in bytes + // /------------- proportional component: O(N * 1B) + // | /- exponential component: O(N ** 3) + // | | + assert_eq!( 1_000_000_001, calc_fee(1)); + assert_eq!( 10_000_001_000, calc_fee(10)); + assert_eq!( 100_001_000_000, calc_fee(100)); + assert_eq!( 1_001_000_000_000, calc_fee(1_000)); + assert_eq!( 11_000_000_000_000, calc_fee(10_000)); // inflection point + assert_eq!( 1_100_000_000_000_000, calc_fee(100_000)); + assert_eq!( 1_001_000_000_000_000_000, calc_fee(1_000_000)); // one UNIT, ~ 1MB + assert_eq!( 1_000_010_000_000_000_000_000, calc_fee(10_000_000)); + assert_eq!(1_000_000_100_000_000_000_000_000, calc_fee(100_000_000)); + // editorconfig-checker-enable + }); +} + +#[test] +fn multiplier_can_grow_from_zero() { + use frame_support::traits::Get; + + let minimum_multiplier = moonbase_runtime::MinimumMultiplier::get(); + let target = moonbase_runtime::TargetBlockFullness::get() + * RuntimeBlockWeights::get() + .get(DispatchClass::Normal) + .max_total + .unwrap(); + // if the min is too small, then this will not change, and we are doomed forever. + // the weight is 1/100th bigger than target. + run_with_system_weight(target * 101 / 100, || { + let next = moonbase_runtime::FastAdjustingFeeUpdate::::convert(minimum_multiplier); + assert!( + next > minimum_multiplier, + "{:?} !>= {:?}", + next, + minimum_multiplier + ); + }) +} + +#[test] +fn ethereum_invalid_transaction() { + ExtBuilder::default().build().execute_with(|| { + // Ensure an extrinsic not containing enough gas limit to store the transaction + // on chain is rejected. + assert_eq!( + Executive::apply_extrinsic(unchecked_eth_tx(INVALID_ETH_TX)), + Err( + sp_runtime::transaction_validity::TransactionValidityError::Invalid( + sp_runtime::transaction_validity::InvalidTransaction::Custom(3u8) + ) + ) + ); + }); +} + +#[test] +fn transfer_ed_0_substrate() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), (1 * UNIT) + (1 * WEI)), + (AccountId::from(BOB), 0), + ]) + .build() + .execute_with(|| { + // Substrate transfer + assert_ok!(Balances::transfer( + origin_of(AccountId::from(ALICE)), + AccountId::from(BOB), + 1 * UNIT, + )); + // 1 WEI is left in the account + assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 1 * WEI); + }); +} + +#[test] +fn initial_gas_fee_is_correct() { + use fp_evm::FeeCalculator; + + ExtBuilder::default().build().execute_with(|| { + let multiplier = TransactionPayment::next_fee_multiplier(); + assert_eq!(multiplier, Multiplier::from(8u128)); + + assert_eq!( + TransactionPaymentAsGasPrice::min_gas_price(), + ( + 10_000_000_000u128.into(), + Weight::from_parts(25_000_000u64, 0) + ) + ); + }); +} + +#[test] +fn transfer_ed_0_evm() { + ExtBuilder::default() + .with_balances(vec![ + ( + AccountId::from(ALICE), + ((1 * UNIT) + (21_000 * BASE_FEE_GENISIS)) + (1 * WEI), + ), + (AccountId::from(BOB), 0), + ]) + .build() + .execute_with(|| { + // EVM transfer + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(ALICE), + target: H160::from(BOB), + input: Vec::new(), + value: (1 * UNIT).into(), + gas_limit: 21_000u64, + max_fee_per_gas: U256::from(BASE_FEE_GENISIS), + max_priority_fee_per_gas: None, + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + // 1 WEI is left in the account + assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 1 * WEI,); + }); +} + +#[test] +fn refund_ed_0_evm() { + ExtBuilder::default() + .with_balances(vec![ + ( + AccountId::from(ALICE), + ((1 * UNIT) + (21_777 * BASE_FEE_GENISIS)), + ), + (AccountId::from(BOB), 0), + ]) + .build() + .execute_with(|| { + // EVM transfer that zeroes ALICE + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(ALICE), + target: H160::from(BOB), + input: Vec::new(), + value: (1 * UNIT).into(), + gas_limit: 21_777u64, + max_fee_per_gas: U256::from(BASE_FEE_GENISIS), + max_priority_fee_per_gas: None, + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + // ALICE is refunded + assert_eq!( + Balances::free_balance(AccountId::from(ALICE)), + 777 * BASE_FEE_GENISIS, + ); + }); +} + +#[test] +fn author_does_not_receive_priority_fee() { + ExtBuilder::default() + .with_balances(vec![( + AccountId::from(BOB), + (1 * UNIT) + (21_000 * (500 * GIGAWEI)), + )]) + .build() + .execute_with(|| { + // Some block author as seen by pallet-evm. + let author = AccountId::from(>::find_author()); + // Currently the default impl of the evm uses `deposit_into_existing`. + // If we were to use this implementation, and for an author to receive eventual tips, + // the account needs to be somehow initialized, otherwise the deposit would fail. + Balances::make_free_balance_be(&author, 100 * UNIT); + + // EVM transfer. + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(BOB), + target: H160::from(ALICE), + input: Vec::new(), + value: (1 * UNIT).into(), + gas_limit: 21_000u64, + max_fee_per_gas: U256::from(300 * GIGAWEI), + max_priority_fee_per_gas: Some(U256::from(200 * GIGAWEI)), + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + // Author free balance didn't change. + assert_eq!(Balances::free_balance(author), 100 * UNIT,); + }); +} + +#[test] +fn total_issuance_after_evm_transaction_with_priority_fee() { + ExtBuilder::default() + .with_balances(vec![( + AccountId::from(BOB), + (1 * UNIT) + (21_000 * (2 * BASE_FEE_GENISIS)), + )]) + .build() + .execute_with(|| { + let issuance_before = ::Currency::total_issuance(); + // EVM transfer. + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(BOB), + target: H160::from(ALICE), + input: Vec::new(), + value: (1 * UNIT).into(), + gas_limit: 21_000u64, + max_fee_per_gas: U256::from(2 * BASE_FEE_GENISIS), + max_priority_fee_per_gas: Some(U256::from(BASE_FEE_GENISIS)), + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + let issuance_after = ::Currency::total_issuance(); + // Fee is 1 * base_fee + tip. + let fee = ((2 * BASE_FEE_GENISIS) * 21_000) as f64; + // 80% was burned. + let expected_burn = (fee * 0.8) as u128; + assert_eq!(issuance_after, issuance_before - expected_burn,); + // 20% was sent to treasury. + let expected_treasury = (fee * 0.2) as u128; + assert_eq!(moonbase_runtime::Treasury::pot(), expected_treasury); + }); +} + +#[test] +fn total_issuance_after_evm_transaction_without_priority_fee() { + use fp_evm::FeeCalculator; + ExtBuilder::default() + .with_balances(vec![( + AccountId::from(BOB), + (1 * UNIT) + (21_000 * (2 * BASE_FEE_GENISIS)), + )]) + .build() + .execute_with(|| { + let issuance_before = ::Currency::total_issuance(); + // EVM transfer. + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(BOB), + target: H160::from(ALICE), + input: Vec::new(), + value: (1 * UNIT).into(), + gas_limit: 21_000u64, + max_fee_per_gas: U256::from(BASE_FEE_GENISIS), + max_priority_fee_per_gas: None, + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + let issuance_after = ::Currency::total_issuance(); + // Fee is 1 GWEI base fee. + let base_fee = TransactionPaymentAsGasPrice::min_gas_price().0; + assert_eq!(base_fee.as_u128(), BASE_FEE_GENISIS); // hint in case following asserts fail + let fee = (base_fee.as_u128() * 21_000u128) as f64; + // 80% was burned. + let expected_burn = (fee * 0.8) as u128; + assert_eq!(issuance_after, issuance_before - expected_burn,); + // 20% was sent to treasury. + let expected_treasury = (fee * 0.2) as u128; + assert_eq!(moonbase_runtime::Treasury::pot(), expected_treasury); + }); +} + +#[test] +fn root_can_change_default_xcm_vers() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000_000_000_000_000)], + is_sufficient: true, + }]) + .build() + .execute_with(|| { + let source_location = AssetType::Xcm(MultiLocation::parent()); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: [1u8; 32], + }), + }; + let source_id: moonbase_runtime::AssetId = source_location.clone().into(); + // Default XCM version is not set yet, so xtokens should fail because it does not + // know with which version to send + assert_noop!( + XTokens::transfer( + origin_of(AccountId::from(ALICE)), + moonbase_runtime::xcm_config::CurrencyId::ForeignAsset(source_id), + 100_000_000_000_000, + Box::new(xcm::VersionedMultiLocation::V3(dest.clone())), + WeightLimit::Limited(4000000000.into()) + ), + orml_xtokens::Error::::XcmExecutionFailed + ); + + // Root sets the defaultXcm + assert_ok!(PolkadotXcm::force_default_xcm_version( + root_origin(), + Some(2) + )); + + // Now transferring does not fail + assert_ok!(XTokens::transfer( + origin_of(AccountId::from(ALICE)), + moonbase_runtime::xcm_config::CurrencyId::ForeignAsset(source_id), + 100_000_000_000_000, + Box::new(xcm::VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(4000000000.into()) + )); + }) +} + +#[test] +fn transactor_cannot_use_more_than_max_weight() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000_000_000_000_000)], + is_sufficient: true, + }]) + .build() + .execute_with(|| { + let source_location = AssetType::Xcm(MultiLocation::parent()); + let source_id: moonbase_runtime::AssetId = source_location.clone().into(); + assert_ok!(XcmTransactor::register( + root_origin(), + AccountId::from(ALICE), + 0, + )); + + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + root_origin(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + // Relay charges 1000 for every instruction, and we have 3, so 3000 + 3000.into(), + 20000.into(), + None + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + root_origin(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + 1, + )); + + assert_noop!( + XcmTransactor::transact_through_derivative( + origin_of(AccountId::from(ALICE)), + moonbase_runtime::xcm_config::Transactors::Relay, + 0, + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new( + xcm::VersionedMultiLocation::V3(MultiLocation::parent()) + )), + fee_amount: None + }, + vec![], + // 20000 is the max + TransactWeights { + transact_required_weight_at_most: 17001.into(), + overall_weight: None + } + ), + pallet_xcm_transactor::Error::::MaxWeightTransactReached + ); + assert_noop!( + XcmTransactor::transact_through_derivative( + origin_of(AccountId::from(ALICE)), + moonbase_runtime::xcm_config::Transactors::Relay, + 0, + CurrencyPayment { + currency: Currency::AsCurrencyId( + moonbase_runtime::xcm_config::CurrencyId::ForeignAsset(source_id) + ), + fee_amount: None + }, + vec![], + // 20000 is the max + TransactWeights { + transact_required_weight_at_most: 17001.into(), + overall_weight: None + } + ), + pallet_xcm_transactor::Error::::MaxWeightTransactReached + ); + }) +} + +#[test] +fn root_can_use_hrmp_manage() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .build() + .execute_with(|| { + // It fails sending, because the router does not work in test mode + // But all rest checks pass + assert_noop!( + XcmTransactor::hrmp_manage( + root_origin(), + HrmpOperation::Accept { + para_id: 2000u32.into() + }, + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new( + xcm::VersionedMultiLocation::V3(MultiLocation::parent()) + )), + fee_amount: Some(10000) + }, + // 20000 is the max + TransactWeights { + transact_required_weight_at_most: 17001.into(), + overall_weight: Some(20000.into()) + } + ), + pallet_xcm_transactor::Error::::ErrorValidating + ); + }) +} + +#[test] +fn transact_through_signed_precompile_works_v1() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + // Destination + let dest = MultiLocation::parent(); + + let fee_payer_asset = MultiLocation::parent(); + + let bytes = vec![1u8, 2u8, 3u8]; + + let xcm_transactor_v1_precompile_address = H160::from_low_u64_be(2054); + + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + root_origin(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + // Relay charges 1000 for every instruction, and we have 3, so 3000 + 3000.into(), + Weight::from_parts(200_000, (xcm_primitives::DEFAULT_PROOF_SIZE) + 4000), + Some(4000.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + root_origin(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + 1, + )); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_transactor_v1_precompile_address, + XcmTransactorV1PCall::transact_through_signed_multilocation { + dest, + fee_asset: fee_payer_asset, + weight: 15000, + call: bytes.into(), + }, + ) + .expect_cost(18737) + .expect_no_logs() + .execute_returns(()); + }); +} + +#[test] +fn transact_through_signed_precompile_works_v2() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + // Destination + let dest = MultiLocation::parent(); + + let fee_payer_asset = MultiLocation::parent(); + + let bytes = vec![1u8, 2u8, 3u8]; + + let total_weight = 1_000_000_000u64; + + let xcm_transactor_v2_precompile_address = H160::from_low_u64_be(2061); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_transactor_v2_precompile_address, + XcmTransactorV2PCall::transact_through_signed_multilocation { + dest, + fee_asset: fee_payer_asset, + weight: 4_000_000, + call: bytes.into(), + fee_amount: u128::from(total_weight).into(), + overall_weight: total_weight, + }, + ) + .expect_cost(18737) + .expect_no_logs() + .execute_returns(()); + }); +} + +#[test] +fn transact_through_signed_cannot_send_to_local_chain() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + // Destination + let dest = MultiLocation::here(); + + let fee_payer_asset = MultiLocation::parent(); + + let bytes = vec![1u8, 2u8, 3u8]; + + let total_weight = 1_000_000_000u64; + + let xcm_transactor_v2_precompile_address = H160::from_low_u64_be(2061); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_transactor_v2_precompile_address, + XcmTransactorV2PCall::transact_through_signed_multilocation { + dest, + fee_asset: fee_payer_asset, + weight: 4_000_000, + call: bytes.into(), + fee_amount: u128::from(total_weight).into(), + overall_weight: total_weight, + }, + ) + .execute_reverts(|output| { + from_utf8(&output) + .unwrap() + .contains("Dispatched call failed with error:") + && from_utf8(&output).unwrap().contains("ErrorValidating") + }); + }); +} + +// Test to ensure we can use either in crowdloan rewards without worrying for migrations +#[test] +fn account_id_32_encodes_like_32_byte_u8_slice() { + let account_as_account_id_32: sp_runtime::AccountId32 = [1u8; 32].into(); + let account_as_slice = [1u8; 32]; + assert_eq!(account_as_account_id_32.encode(), account_as_slice.encode()); +} + +#[test] +fn author_mapping_precompile_associate_update_and_clear() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .build() + .execute_with(|| { + let author_mapping_precompile_address = H160::from_low_u64_be(2055); + let first_nimbus_id: NimbusId = + sp_core::sr25519::Public::unchecked_from([1u8; 32]).into(); + let first_vrf_id: session_keys_primitives::VrfId = + sp_core::sr25519::Public::unchecked_from([1u8; 32]).into(); + let second_nimbus_id: NimbusId = + sp_core::sr25519::Public::unchecked_from([2u8; 32]).into(); + let second_vrf_id: session_keys_primitives::VrfId = + sp_core::sr25519::Public::unchecked_from([2u8; 32]).into(); + + // Associate it + Precompiles::new() + .prepare_test( + ALICE, + author_mapping_precompile_address, + AuthorMappingPCall::add_association { + nimbus_id: [1u8; 32].into(), + }, + ) + .expect_cost(15595) + .expect_no_logs() + .execute_returns(()); + + let expected_associate_event = + RuntimeEvent::AuthorMapping(pallet_author_mapping::Event::KeysRegistered { + nimbus_id: first_nimbus_id.clone(), + account_id: AccountId::from(ALICE), + keys: first_vrf_id.clone(), + }); + assert_eq!(last_event(), expected_associate_event); + + // Update it + Precompiles::new() + .prepare_test( + ALICE, + author_mapping_precompile_address, + AuthorMappingPCall::update_association { + old_nimbus_id: [1u8; 32].into(), + new_nimbus_id: [2u8; 32].into(), + }, + ) + .expect_cost(15217) + .expect_no_logs() + .execute_returns(()); + + let expected_update_event = + RuntimeEvent::AuthorMapping(pallet_author_mapping::Event::KeysRotated { + new_nimbus_id: second_nimbus_id.clone(), + account_id: AccountId::from(ALICE), + new_keys: second_vrf_id.clone(), + }); + assert_eq!(last_event(), expected_update_event); + + // Clear it + Precompiles::new() + .prepare_test( + ALICE, + author_mapping_precompile_address, + AuthorMappingPCall::clear_association { + nimbus_id: [2u8; 32].into(), + }, + ) + .expect_cost(15631) + .expect_no_logs() + .execute_returns(()); + + let expected_clear_event = + RuntimeEvent::AuthorMapping(pallet_author_mapping::Event::KeysRemoved { + nimbus_id: second_nimbus_id, + account_id: AccountId::from(ALICE), + keys: second_vrf_id, + }); + assert_eq!(last_event(), expected_clear_event); + }); +} + +#[test] +fn author_mapping_register_and_set_keys() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .build() + .execute_with(|| { + let author_mapping_precompile_address = H160::from_low_u64_be(2055); + let first_nimbus_id: NimbusId = + sp_core::sr25519::Public::unchecked_from([1u8; 32]).into(); + let first_vrf_key: session_keys_primitives::VrfId = + sp_core::sr25519::Public::unchecked_from([3u8; 32]).into(); + let second_nimbus_id: NimbusId = + sp_core::sr25519::Public::unchecked_from([2u8; 32]).into(); + let second_vrf_key: session_keys_primitives::VrfId = + sp_core::sr25519::Public::unchecked_from([4u8; 32]).into(); + + // Associate it + Precompiles::new() + .prepare_test( + ALICE, + author_mapping_precompile_address, + AuthorMappingPCall::set_keys { + keys: solidity::encode_arguments(( + H256::from([1u8; 32]), + H256::from([3u8; 32]), + )) + .into(), + }, + ) + .expect_cost(16365) + .expect_no_logs() + .execute_returns(()); + + let expected_associate_event = + RuntimeEvent::AuthorMapping(pallet_author_mapping::Event::KeysRegistered { + nimbus_id: first_nimbus_id.clone(), + account_id: AccountId::from(ALICE), + keys: first_vrf_key.clone(), + }); + assert_eq!(last_event(), expected_associate_event); + + // Update it + Precompiles::new() + .prepare_test( + ALICE, + author_mapping_precompile_address, + AuthorMappingPCall::set_keys { + keys: solidity::encode_arguments(( + H256::from([2u8; 32]), + H256::from([4u8; 32]), + )) + .into(), + }, + ) + .expect_cost(16365) + .expect_no_logs() + .execute_returns(()); + + let expected_update_event = + RuntimeEvent::AuthorMapping(pallet_author_mapping::Event::KeysRotated { + new_nimbus_id: second_nimbus_id.clone(), + account_id: AccountId::from(ALICE), + new_keys: second_vrf_key.clone(), + }); + assert_eq!(last_event(), expected_update_event); + }); +} + +#[test] +fn test_xcm_utils_ml_tp_account() { + ExtBuilder::default().build().execute_with(|| { + let xcm_utils_precompile_address = H160::from_low_u64_be(2060); + let expected_address_parent: H160 = + ParentIsPreset::::convert_ref(MultiLocation::parent()) + .unwrap() + .into(); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_utils_precompile_address, + XcmUtilsPCall::multilocation_to_address { + multilocation: MultiLocation::parent(), + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(Address(expected_address_parent)); + + let parachain_2000_multilocation = MultiLocation::new(1, X1(Parachain(2000))); + let expected_address_parachain: H160 = + SiblingParachainConvertsVia::::convert_ref( + parachain_2000_multilocation.clone(), + ) + .unwrap() + .into(); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_utils_precompile_address, + XcmUtilsPCall::multilocation_to_address { + multilocation: parachain_2000_multilocation, + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(Address(expected_address_parachain)); + + let alice_in_parachain_2000_multilocation = MultiLocation::new( + 1, + X2( + Parachain(2000), + AccountKey20 { + network: None, + key: ALICE, + }, + ), + ); + let expected_address_alice_in_parachain_2000: H160 = + xcm_builder::HashedDescriptionDescribeFamilyAllTerminal::::convert_ref( + alice_in_parachain_2000_multilocation.clone(), + ) + .unwrap() + .into(); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_utils_precompile_address, + XcmUtilsPCall::multilocation_to_address { + multilocation: alice_in_parachain_2000_multilocation, + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(Address(expected_address_alice_in_parachain_2000)); + }); +} + +#[test] +fn test_xcm_utils_weight_message() { + ExtBuilder::default().build().execute_with(|| { + let xcm_utils_precompile_address = H160::from_low_u64_be(2060); + let expected_weight = + XcmWeight::::clear_origin().ref_time(); + + let message: Vec = xcm::VersionedXcm::<()>::V3(Xcm(vec![ClearOrigin])).encode(); + + let input = XcmUtilsPCall::weight_message { + message: message.into(), + }; + + Precompiles::new() + .prepare_test(ALICE, xcm_utils_precompile_address, input) + .expect_cost(0) + .expect_no_logs() + .execute_returns(expected_weight); + }); +} + +#[test] +fn test_xcm_utils_get_units_per_second() { + ExtBuilder::default().build().execute_with(|| { + let xcm_utils_precompile_address = H160::from_low_u64_be(2060); + let multilocation = SelfReserve::get(); + + let input = XcmUtilsPCall::get_units_per_second { multilocation }; + + let expected_units = + WEIGHT_REF_TIME_PER_SECOND as u128 * moonbase_runtime::currency::WEIGHT_FEE; + + Precompiles::new() + .prepare_test(ALICE, xcm_utils_precompile_address, input) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(expected_units); + }); +} + +#[test] +fn precompile_existence() { + ExtBuilder::default().build().execute_with(|| { + let precompiles = Precompiles::new(); + let precompile_addresses: std::collections::BTreeSet<_> = vec![ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 1024, 1025, 1026, 2048, 2049, 2050, 2051, 2052, 2053, 2054, + 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, + 2069, 2070, + ] + .into_iter() + .map(H160::from_low_u64_be) + .collect(); + + for i in 0..3000 { + let address = H160::from_low_u64_be(i); + + if precompile_addresses.contains(&address) { + assert!( + is_precompile_or_fail::(address, 100_000u64).expect("to be ok"), + "is_precompile({}) should return true", + i + ); + + assert!( + precompiles + .execute(&mut MockHandle::new( + address, + Context { + address, + caller: H160::zero(), + apparent_value: U256::zero() + } + ),) + .is_some(), + "execute({},..) should return Some(_)", + i + ); + } else { + assert!( + !is_precompile_or_fail::(address, 100_000u64).expect("to be ok"), + "is_precompile({}) should return false", + i + ); + + assert!( + precompiles + .execute(&mut MockHandle::new( + address, + Context { + address, + caller: H160::zero(), + apparent_value: U256::zero() + } + ),) + .is_none(), + "execute({},..) should return None", + i + ); + } + } + }); +} + +#[test] +fn removed_precompiles() { + ExtBuilder::default().build().execute_with(|| { + let precompiles = Precompiles::new(); + let removed_precompiles = [1025]; + + for i in 1..3000 { + let address = H160::from_low_u64_be(i); + + if !is_precompile_or_fail::(address, 100_000u64).expect("to be ok") { + continue; + } + + if !removed_precompiles.contains(&i) { + assert!( + match precompiles.is_active_precompile(address, 100_000u64) { + IsPrecompileResult::Answer { is_precompile, .. } => is_precompile, + _ => false, + }, + "{i} should be an active precompile" + ); + continue; + } + + assert!( + !match precompiles.is_active_precompile(address, 100_000u64) { + IsPrecompileResult::Answer { is_precompile, .. } => is_precompile, + _ => false, + }, + "{i} shouldn't be an active precompile" + ); + + precompiles + .prepare_test(Alice, address, []) + .execute_reverts(|out| out == b"Removed precompile"); + } + }) +} + +#[test] +fn substrate_based_fees_zero_txn_costs_only_base_extrinsic() { + use frame_support::dispatch::{DispatchInfo, Pays}; + use moonbase_runtime::{currency, EXTRINSIC_BASE_WEIGHT}; + + ExtBuilder::default().build().execute_with(|| { + let size_bytes = 0; + let tip = 0; + let dispatch_info = DispatchInfo { + weight: Weight::zero(), + class: DispatchClass::Normal, + pays_fee: Pays::Yes, + }; + + assert_eq!( + TransactionPayment::compute_fee(size_bytes, &dispatch_info, tip), + EXTRINSIC_BASE_WEIGHT.ref_time() as u128 * currency::WEIGHT_FEE, + ); + }); +} + +#[test] +fn deal_with_fees_handles_tip() { + use frame_support::traits::OnUnbalanced; + use moonbase_runtime::{DealWithFees, Treasury}; + + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 10_000)]) + .build() + .execute_with(|| { + // Alice has 10_000, which makes inital supply 10_000. + // drop()ing the NegativeImbalance below will cause the total_supply to be decreased + // incorrectly (since there was never a withdraw to begin with), which in this case has + // the desired effect of showing that currency was burned. + let total_supply_before = Balances::total_issuance(); + assert_eq!(total_supply_before, 10_000); + + let fees_then_tips = vec![ + NegativeImbalance::::new(100), + NegativeImbalance::::new(1_000), + ]; + DealWithFees::on_unbalanceds(fees_then_tips.into_iter()); + + // treasury should have received 20% + assert_eq!(Balances::free_balance(&Treasury::account_id()), 220); + + // verify 80% burned + let total_supply_after = Balances::total_issuance(); + assert_eq!(total_supply_before - total_supply_after, 880); + }); +} + +#[test] +fn evm_revert_substrate_events() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .build() + .execute_with(|| { + let batch_precompile_address = H160::from_low_u64_be(2056); + + // Batch a transfer followed by an invalid call to batch. + // Thus BatchAll will revert the transfer. + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::call { + source: ALICE.into(), + target: batch_precompile_address, + input: BatchPCall::batch_all { + to: vec![Address(BOB.into()), Address(batch_precompile_address)].into(), + value: vec![U256::from(1 * UNIT), U256::zero()].into(), + call_data: vec![].into(), + gas_limit: vec![].into() + } + .into(), + value: U256::zero(), // No value sent in EVM + gas_limit: 500_000, + max_fee_per_gas: U256::from(BASE_FEE_GENISIS), + max_priority_fee_per_gas: None, + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + let transfer_count = System::events() + .iter() + .filter(|r| match r.event { + RuntimeEvent::Balances(pallet_balances::Event::Transfer { .. }) => true, + _ => false, + }) + .count(); + + assert_eq!(transfer_count, 0, "there should be no transfer event"); + }); +} + +#[test] +fn evm_success_keeps_substrate_events() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .build() + .execute_with(|| { + let batch_precompile_address = H160::from_low_u64_be(2056); + + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::call { + source: ALICE.into(), + target: batch_precompile_address, + input: BatchPCall::batch_all { + to: vec![Address(BOB.into())].into(), + value: vec![U256::from(1 * UNIT)].into(), + call_data: vec![].into(), + gas_limit: vec![].into() + } + .into(), + value: U256::zero(), // No value sent in EVM + gas_limit: 500_000, + max_fee_per_gas: U256::from(BASE_FEE_GENISIS), + max_priority_fee_per_gas: None, + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + let transfer_count = System::events() + .iter() + .filter(|r| match r.event { + RuntimeEvent::Balances(pallet_balances::Event::Transfer { .. }) => true, + _ => false, + }) + .count(); + + assert_eq!(transfer_count, 1, "there should be 1 transfer event"); + }); +} + +#[test] +fn validate_transaction_fails_on_filtered_call() { + use sp_runtime::transaction_validity::{ + InvalidTransaction, TransactionSource, TransactionValidityError, + }; + use sp_transaction_pool::runtime_api::runtime_decl_for_tagged_transaction_queue::TaggedTransactionQueueV3; // editorconfig-checker-disable-line + + ExtBuilder::default().build().execute_with(|| { + let xt = UncheckedExtrinsic::new_unsigned( + pallet_evm::Call::::call { + source: Default::default(), + target: H160::default(), + input: Vec::new(), + value: Default::default(), + gas_limit: Default::default(), + max_fee_per_gas: Default::default(), + max_priority_fee_per_gas: Default::default(), + nonce: Default::default(), + access_list: Default::default(), + } + .into(), + ); + + assert_eq!( + Runtime::validate_transaction(TransactionSource::External, xt, Default::default(),), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); + }); +} + +#[cfg(test)] +mod fee_tests { + use super::*; + use fp_evm::FeeCalculator; + use frame_support::{ + traits::{ConstU128, OnFinalize}, + weights::{ConstantMultiplier, WeightToFee}, + }; + use moonbase_runtime::{ + currency, BlockWeights, FastAdjustingFeeUpdate, LengthToFee, MinimumMultiplier, + TargetBlockFullness, NORMAL_WEIGHT, WEIGHT_PER_GAS, + }; + use sp_runtime::{FixedPointNumber, Perbill}; + + fn run_with_system_weight(w: Weight, mut assertions: F) + where + F: FnMut() -> (), + { + let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap() + .into(); + t.execute_with(|| { + System::set_block_consumed_resources(w, 0); + assertions() + }); + } + + #[test] + fn test_multiplier_can_grow_from_zero() { + let minimum_multiplier = MinimumMultiplier::get(); + let target = TargetBlockFullness::get() + * BlockWeights::get() + .get(DispatchClass::Normal) + .max_total + .unwrap(); + // if the min is too small, then this will not change, and we are doomed forever. + // the weight is 1/100th bigger than target. + run_with_system_weight(target * 101 / 100, || { + let next = FastAdjustingFeeUpdate::::convert(minimum_multiplier); + assert!( + next > minimum_multiplier, + "{:?} !>= {:?}", + next, + minimum_multiplier + ); + }) + } + + #[test] + fn test_fee_calculation() { + let base_extrinsic = BlockWeights::get() + .get(DispatchClass::Normal) + .base_extrinsic; + let multiplier = sp_runtime::FixedU128::from_float(0.999000000000000000); + let extrinsic_len = 100u32; + let extrinsic_weight = 5_000u64; + let tip = 42u128; + type WeightToFeeImpl = + ConstantMultiplier>; + type LengthToFeeImpl = LengthToFee; + + // base_fee + (multiplier * extrinsic_weight_fee) + extrinsic_length_fee + tip + let expected_fee = + WeightToFeeImpl::weight_to_fee(&base_extrinsic) + + multiplier.saturating_mul_int(WeightToFeeImpl::weight_to_fee( + &Weight::from_parts(extrinsic_weight, 1), + )) + LengthToFeeImpl::weight_to_fee(&Weight::from_parts(extrinsic_len as u64, 1)) + + tip; + + let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap() + .into(); + t.execute_with(|| { + pallet_transaction_payment::NextFeeMultiplier::::set(multiplier); + let actual_fee = TransactionPayment::compute_fee( + extrinsic_len, + &frame_support::dispatch::DispatchInfo { + class: DispatchClass::Normal, + pays_fee: frame_support::dispatch::Pays::Yes, + weight: Weight::from_parts(extrinsic_weight, 1), + }, + tip, + ); + + assert_eq!( + expected_fee, + actual_fee, + "The actual fee did not match the expected fee, diff {}", + actual_fee - expected_fee + ); + }); + } + + #[test] + fn test_min_gas_price_is_deterministic() { + let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap() + .into(); + t.execute_with(|| { + let multiplier = sp_runtime::FixedU128::from_u32(1); + pallet_transaction_payment::NextFeeMultiplier::::set(multiplier); + let actual = TransactionPaymentAsGasPrice::min_gas_price().0; + let expected: U256 = multiplier + .saturating_mul_int(currency::WEIGHT_FEE.saturating_mul(WEIGHT_PER_GAS as u128)) + .into(); + + assert_eq!(expected, actual); + }); + } + + #[test] + fn test_min_gas_price_has_no_precision_loss_from_saturating_mul_int() { + let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap() + .into(); + t.execute_with(|| { + let multiplier_1 = sp_runtime::FixedU128::from_float(0.999593900000000000); + let multiplier_2 = sp_runtime::FixedU128::from_float(0.999593200000000000); + + pallet_transaction_payment::NextFeeMultiplier::::set(multiplier_1); + let a = TransactionPaymentAsGasPrice::min_gas_price(); + pallet_transaction_payment::NextFeeMultiplier::::set(multiplier_2); + let b = TransactionPaymentAsGasPrice::min_gas_price(); + + assert_ne!( + a, b, + "both gas prices were equal, unexpected precision loss incurred" + ); + }); + } + + #[test] + fn test_fee_scenarios() { + use sp_runtime::FixedU128; + let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap() + .into(); + t.execute_with(|| { + let weight_fee_per_gas = currency::WEIGHT_FEE.saturating_mul(WEIGHT_PER_GAS as u128); + let sim = |start_gas_price: u128, fullness: Perbill, num_blocks: u64| -> U256 { + let start_multiplier = + FixedU128::from_rational(start_gas_price, weight_fee_per_gas); + pallet_transaction_payment::NextFeeMultiplier::::set(start_multiplier); + + let block_weight = NORMAL_WEIGHT * fullness; + + for i in 0..num_blocks { + System::set_block_number(i as u32); + System::set_block_consumed_resources(block_weight, 0); + TransactionPayment::on_finalize(i as u32); + } + + TransactionPaymentAsGasPrice::min_gas_price().0 + }; + + assert_eq!( + sim(1_000_000_000, Perbill::from_percent(0), 1), + U256::from(999_000_500), + ); + assert_eq!( + sim(1_000_000_000, Perbill::from_percent(25), 1), + U256::from(1_000_000_000), + ); + assert_eq!( + sim(1_000_000_000, Perbill::from_percent(50), 1), + U256::from(1_001_000_500), + ); + assert_eq!( + sim(1_000_000_000, Perbill::from_percent(100), 1), + U256::from(1_003_004_500), + ); + + // 1 "real" hour (at 12-second blocks) + assert_eq!( + sim(1_000_000_000, Perbill::from_percent(0), 300), + U256::from(740_818_257), + ); + assert_eq!( + sim(1_000_000_000, Perbill::from_percent(25), 300), + U256::from(1_000_000_000), + ); + assert_eq!( + sim(1_000_000_000, Perbill::from_percent(50), 300), + U256::from(1_349_858_740), + ); + assert_eq!( + sim(1_000_000_000, Perbill::from_percent(100), 300), + U256::from(2_459_599_798u128), + ); + + // 1 "real" day (at 12-second blocks) + assert_eq!( + sim(1_000_000_000, Perbill::from_percent(0), 7200), + U256::from(125_000_000), // lower bound enforced + ); + assert_eq!( + sim(1_000_000_000, Perbill::from_percent(25), 7200), + U256::from(1_000_000_000), + ); + assert_eq!( + sim(1_000_000_000, Perbill::from_percent(50), 7200), + U256::from(1_339_429_158_283u128), + ); + assert_eq!( + sim(1_000_000_000, Perbill::from_percent(100), 7200), + U256::from(125_000_000_000_000u128), // upper bound enforced + ); + }); + } +} diff --git a/tracing/2402/runtime/moonbase/tests/runtime_apis.rs b/tracing/2402/runtime/moonbase/tests/runtime_apis.rs new file mode 100644 index 0000000..86c21d0 --- /dev/null +++ b/tracing/2402/runtime/moonbase/tests/runtime_apis.rs @@ -0,0 +1,397 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Moonbase Runtime Api Integration Tests + +mod common; +use common::*; + +use fp_evm::GenesisAccount; +use frame_support::assert_ok; +use nimbus_primitives::NimbusId; +use pallet_evm::{Account as EVMAccount, AddressMapping, FeeCalculator}; +use sp_core::{ByteArray, H160, H256, U256}; + +use fp_rpc::runtime_decl_for_ethereum_runtime_rpc_api::EthereumRuntimeRPCApi; +use moonbeam_rpc_primitives_txpool::runtime_decl_for_tx_pool_runtime_api::TxPoolRuntimeApi; +use nimbus_primitives::runtime_decl_for_nimbus_api::NimbusApi; +use std::{collections::BTreeMap, str::FromStr}; + +#[test] +fn ethereum_runtime_rpc_api_chain_id() { + ExtBuilder::default().build().execute_with(|| { + assert_eq!(Runtime::chain_id(), CHAIN_ID); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_account_basic() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 2_000 * UNIT)]) + .build() + .execute_with(|| { + assert_eq!( + Runtime::account_basic(H160::from(ALICE)), + EVMAccount { + balance: U256::from(2_000 * UNIT), + nonce: U256::zero() + } + ); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_gas_price() { + ExtBuilder::default().build().execute_with(|| { + assert_eq!( + Runtime::gas_price(), + TransactionPaymentAsGasPrice::min_gas_price().0 + ); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_account_code_at() { + let address = H160::from(EVM_CONTRACT); + let code: Vec = vec![1, 2, 3, 4, 5]; + ExtBuilder::default() + .with_evm_accounts({ + let mut map = BTreeMap::new(); + map.insert( + address, + GenesisAccount { + balance: U256::zero(), + code: code.clone(), + nonce: Default::default(), + storage: Default::default(), + }, + ); + map + }) + .build() + .execute_with(|| { + assert_eq!(Runtime::account_code_at(address), code); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_author() { + ExtBuilder::default() + .with_collators(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 500 * UNIT, + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + run_to_block(2, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + assert_eq!(Runtime::author(), H160::from(ALICE)); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_storage_at() { + let address = H160::from(EVM_CONTRACT); + let mut key = [0u8; 32]; + key[31..32].copy_from_slice(&[6u8][..]); + let mut value = [0u8; 32]; + value[31..32].copy_from_slice(&[7u8][..]); + let item = H256::from_slice(&key[..]); + let mut storage: BTreeMap = BTreeMap::new(); + storage.insert(H256::from_slice(&key[..]), item); + ExtBuilder::default() + .with_evm_accounts({ + let mut map = BTreeMap::new(); + map.insert( + address, + GenesisAccount { + balance: U256::zero(), + code: Vec::new(), + nonce: Default::default(), + storage: storage.clone(), + }, + ); + map + }) + .build() + .execute_with(|| { + assert_eq!(Runtime::storage_at(address, U256::from(6)), item); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_call() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 2_000 * UNIT), + ]) + .build() + .execute_with(|| { + let execution_result = Runtime::call( + H160::from(ALICE), // from + H160::from(BOB), // to + Vec::new(), // data + U256::from(1000u64), // value + U256::from(100000u64), // gas_limit + None, // max_fee_per_gas + None, // max_priority_fee_per_gas + None, // nonce + false, // estimate + None, // access_list + ); + assert!(execution_result.is_ok()); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_create() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 2_000 * UNIT)]) + .build() + .execute_with(|| { + let execution_result = Runtime::create( + H160::from(ALICE), // from + vec![0, 1, 1, 0], // data + U256::zero(), // value + U256::from(100000u64), // gas_limit + None, // max_fee_per_gas + None, // max_priority_fee_per_gas + None, // nonce + false, // estimate + None, // access_list + ); + assert!(execution_result.is_ok()); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_current_transaction_statuses() { + let alith = ::AddressMapping::into_account_id( + H160::from_str("f24ff3a9cf04c71dbc94d0b566f7a27b94566cac") + .expect("internal H160 is valid; qed"), + ); + ExtBuilder::default() + .with_collators(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (alith, 2_000 * UNIT), + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 500 * UNIT, + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + let _result = Executive::apply_extrinsic(unchecked_eth_tx(VALID_ETH_TX)); + rpc_run_to_block(2); + let statuses = + Runtime::current_transaction_statuses().expect("Transaction statuses result."); + assert_eq!(statuses.len(), 1); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_current_block() { + ExtBuilder::default() + .with_collators(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 500 * UNIT, + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + rpc_run_to_block(2); + let block = Runtime::current_block().expect("Block result."); + assert_eq!(block.header.number, U256::from(1u8)); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_current_receipts() { + let alith = ::AddressMapping::into_account_id( + H160::from_str("f24ff3a9cf04c71dbc94d0b566f7a27b94566cac") + .expect("internal H160 is valid; qed"), + ); + ExtBuilder::default() + .with_collators(vec![(AccountId::from(ALICE), 1_000 * UNIT)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (alith, 2_000 * UNIT), + (AccountId::from(ALICE), 2_000 * UNIT), + (AccountId::from(BOB), 1_000 * UNIT), + ]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 500 * UNIT, + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + let _result = Executive::apply_extrinsic(unchecked_eth_tx(VALID_ETH_TX)); + rpc_run_to_block(2); + let receipts = Runtime::current_receipts().expect("Receipts result."); + assert_eq!(receipts.len(), 1); + }); +} + +#[test] +fn txpool_runtime_api_extrinsic_filter() { + ExtBuilder::default().build().execute_with(|| { + let non_eth_uxt = UncheckedExtrinsic::new_unsigned( + pallet_balances::Call::::transfer { + dest: AccountId::from(BOB), + value: 1 * UNIT, + } + .into(), + ); + + let eth_uxt = unchecked_eth_tx(VALID_ETH_TX); + let txpool = >::extrinsic_filter( + vec![eth_uxt.clone(), non_eth_uxt.clone()], + vec![unchecked_eth_tx(VALID_ETH_TX), non_eth_uxt], + ); + assert_eq!(txpool.ready.len(), 1); + assert_eq!(txpool.future.len(), 1); + }); +} + +#[test] +fn can_author_when_selected_is_empty() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 20_000_000 * UNIT), + (AccountId::from(BOB), 10_000_000 * UNIT), + ]) + .with_collators(vec![(AccountId::from(ALICE), 2_000_000 * UNIT)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + run_to_block(2, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + + assert_eq!(ParachainStaking::candidate_pool().0.len(), 1); + + let slot_number = 0; + let parent = Header { + digest: Default::default(), + extrinsics_root: Default::default(), + number: Default::default(), + parent_hash: Default::default(), + state_root: Default::default(), + }; + + // Base case: ALICE can author blocks when she is the only candidate + let can_author_block = Runtime::can_author( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + slot_number, + &parent, + ); + + assert!(can_author_block); + + // Remove ALICE from candidate pool, leaving the candidate_pool empty + assert_ok!(ParachainStaking::go_offline(origin_of(AccountId::from( + ALICE + )))); + + // Need to fast forward to right before the next session, which is when selected candidates + // will be updated. We want to test the creation of the first block of the next session. + run_to_block(1799, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + + assert_eq!(ParachainStaking::candidate_pool().0.len(), 0); + + let slot_number = 0; + let parent = Header { + digest: Default::default(), + extrinsics_root: Default::default(), + number: 1799, + parent_hash: Default::default(), + state_root: Default::default(), + }; + + let can_author_block = Runtime::can_author( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + slot_number, + &parent, + ); + + assert!(can_author_block); + + // Check that it works as expected after session update + run_to_block(1800, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + + assert_eq!(ParachainStaking::candidate_pool().0.len(), 0); + + let slot_number = 0; + let parent = Header { + digest: Default::default(), + extrinsics_root: Default::default(), + number: 1800, + parent_hash: Default::default(), + state_root: Default::default(), + }; + + let can_author_block = Runtime::can_author( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + slot_number, + &parent, + ); + + assert!(can_author_block); + }); +} + +// Some Priority-related test ideas +// 1. Eth balance transfer with various gas prices. Priority == gas price +// 2. Eth contract call with various gas prices. Priority == gas price +// 3. System remark with no tip -> calculate expected priority from gas weight mapping +// 4. System remark with tip. +// 5. Operational dispatch has higher priority than normal for otherwise same transactions diff --git a/tracing/2402/runtime/moonbase/tests/xcm_mock/mod.rs b/tracing/2402/runtime/moonbase/tests/xcm_mock/mod.rs new file mode 100644 index 0000000..13b302f --- /dev/null +++ b/tracing/2402/runtime/moonbase/tests/xcm_mock/mod.rs @@ -0,0 +1,256 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +pub mod parachain; +pub mod relay_chain; +pub mod statemint_like; +use cumulus_primitives_core::ParaId; +use sp_runtime::traits::AccountIdConversion; +use sp_runtime::AccountId32; +use xcm_simulator::{decl_test_network, decl_test_parachain, decl_test_relay_chain}; + +use polkadot_runtime_parachains::configuration::{ + GenesisConfig as ConfigurationGenesisConfig, HostConfiguration, +}; +use polkadot_runtime_parachains::paras::{ + GenesisConfig as ParasGenesisConfig, ParaGenesisArgs, ParaKind, +}; + +use sp_core::{H160, U256}; +use std::{collections::BTreeMap, str::FromStr}; + +pub const PARAALICE: [u8; 20] = [1u8; 20]; +pub const RELAYALICE: AccountId32 = AccountId32::new([0u8; 32]); + +pub fn para_a_account() -> AccountId32 { + ParaId::from(1).into_account_truncating() +} + +pub fn para_b_account() -> AccountId32 { + ParaId::from(2).into_account_truncating() +} + +pub fn para_a_account_20() -> parachain::AccountId { + ParaId::from(1).into_account_truncating() +} + +pub fn evm_account() -> H160 { + H160::from_str("1000000000000000000000000000000000000001").unwrap() +} + +pub fn mock_para_genesis_info() -> ParaGenesisArgs { + ParaGenesisArgs { + genesis_head: vec![1u8].into(), + validation_code: vec![1u8].into(), + para_kind: ParaKind::Parachain, + } +} + +pub fn mock_relay_config() -> HostConfiguration { + HostConfiguration:: { + hrmp_channel_max_capacity: u32::MAX, + hrmp_channel_max_total_size: u32::MAX, + hrmp_max_parachain_inbound_channels: 10, + hrmp_max_parachain_outbound_channels: 10, + hrmp_channel_max_message_size: u32::MAX, + max_downward_message_size: u32::MAX, + ..Default::default() + } +} + +decl_test_parachain! { + pub struct ParaA { + Runtime = parachain::Runtime, + XcmpMessageHandler = parachain::MsgQueue, + DmpMessageHandler = parachain::MsgQueue, + new_ext = para_ext(1), + } +} + +decl_test_parachain! { + pub struct ParaB { + Runtime = parachain::Runtime, + XcmpMessageHandler = parachain::MsgQueue, + DmpMessageHandler = parachain::MsgQueue, + new_ext = para_ext(2), + } +} + +decl_test_parachain! { + pub struct ParaC { + Runtime = parachain::Runtime, + XcmpMessageHandler = parachain::MsgQueue, + DmpMessageHandler = parachain::MsgQueue, + new_ext = para_ext(3), + } +} + +decl_test_parachain! { + pub struct Statemint { + Runtime = statemint_like::Runtime, + XcmpMessageHandler = statemint_like::MsgQueue, + DmpMessageHandler = statemint_like::MsgQueue, + new_ext = statemint_ext(4), + } +} + +decl_test_relay_chain! { + pub struct Relay { + Runtime = relay_chain::Runtime, + XcmConfig = relay_chain::XcmConfig, + new_ext = relay_ext(vec![1, 2, 3, 4]), + } +} + +decl_test_network! { + pub struct MockNet { + relay_chain = Relay, + parachains = vec![ + (1, ParaA), + (2, ParaB), + (3, ParaC), + (4, Statemint), + ], + } +} + +pub const INITIAL_BALANCE: u128 = 10_000_000_000_000_000; + +pub const INITIAL_EVM_BALANCE: u128 = 0; +pub const INITIAL_EVM_NONCE: u32 = 1; + +pub fn para_ext(para_id: u32) -> sp_io::TestExternalities { + use parachain::{MsgQueue, Runtime, System}; + + let mut t = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap(); + + pallet_balances::GenesisConfig:: { + balances: vec![(PARAALICE.into(), INITIAL_BALANCE)], + } + .assimilate_storage(&mut t) + .unwrap(); + + // EVM accounts are self-sufficient. + let mut evm_accounts = BTreeMap::new(); + evm_accounts.insert( + evm_account(), + fp_evm::GenesisAccount { + nonce: U256::from(INITIAL_EVM_NONCE), + balance: U256::from(INITIAL_EVM_BALANCE), + storage: Default::default(), + code: vec![ + 0x00, // STOP + ], + }, + ); + + frame_support::traits::GenesisBuild::::assimilate_storage( + &pallet_evm::GenesisConfig { + accounts: evm_accounts, + }, + &mut t, + ) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| { + System::set_block_number(1); + MsgQueue::set_para_id(para_id.into()); + }); + ext +} + +pub fn statemint_ext(para_id: u32) -> sp_io::TestExternalities { + use statemint_like::{MsgQueue, Runtime, System}; + + let mut t = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap(); + + pallet_balances::GenesisConfig:: { + balances: vec![(RELAYALICE.into(), INITIAL_BALANCE)], + } + .assimilate_storage(&mut t) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| { + System::set_block_number(1); + MsgQueue::set_para_id(para_id.into()); + }); + ext +} + +pub fn relay_ext(paras: Vec) -> sp_io::TestExternalities { + use relay_chain::{Runtime, System}; + + let mut t = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap(); + + pallet_balances::GenesisConfig:: { + balances: vec![(RELAYALICE, INITIAL_BALANCE)], + } + .assimilate_storage(&mut t) + .unwrap(); + + let para_genesis: Vec<(ParaId, ParaGenesisArgs)> = paras + .iter() + .map(|¶_id| (para_id.into(), mock_para_genesis_info())) + .collect(); + + frame_support::traits::GenesisBuild::::assimilate_storage( + &ConfigurationGenesisConfig { + config: mock_relay_config(), + }, + &mut t, + ) + .unwrap(); + + frame_support::traits::GenesisBuild::::assimilate_storage( + &ParasGenesisConfig { + paras: para_genesis, + }, + &mut t, + ) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| { + System::set_block_number(1); + }); + ext +} +pub type RelayChainPalletXcm = pallet_xcm::Pallet; +pub type Hrmp = polkadot_runtime_parachains::hrmp::Pallet; + +pub type StatemintBalances = pallet_balances::Pallet; +pub type StatemintChainPalletXcm = pallet_xcm::Pallet; +pub type StatemintAssets = pallet_assets::Pallet; + +pub type ParachainPalletXcm = pallet_xcm::Pallet; +pub type Assets = pallet_assets::Pallet; +pub type LocalAssets = pallet_assets::Pallet; + +pub type Balances = pallet_balances::Pallet; +pub type Treasury = pallet_treasury::Pallet; +pub type AssetManager = pallet_asset_manager::Pallet; +pub type XTokens = orml_xtokens::Pallet; +pub type RelayBalances = pallet_balances::Pallet; +pub type ParaBalances = pallet_balances::Pallet; +pub type XcmTransactor = pallet_xcm_transactor::Pallet; diff --git a/tracing/2402/runtime/moonbase/tests/xcm_mock/parachain.rs b/tracing/2402/runtime/moonbase/tests/xcm_mock/parachain.rs new file mode 100644 index 0000000..b2d8e01 --- /dev/null +++ b/tracing/2402/runtime/moonbase/tests/xcm_mock/parachain.rs @@ -0,0 +1,1194 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +//! Parachain runtime mock. + +use frame_support::{ + codec::MaxEncodedLen, + construct_runtime, + dispatch::GetDispatchInfo, + ensure, parameter_types, + traits::{ + AsEnsureOriginWithArg, ConstU32, Everything, Get, InstanceFilter, Nothing, PalletInfoAccess, + }, + weights::Weight, + PalletId, +}; + +use frame_system::{EnsureNever, EnsureRoot}; +use parity_scale_codec::{Decode, Encode}; +use sp_core::H256; +use sp_runtime::{ + traits::{BlakeTwo256, Hash, IdentityLookup, Zero}, + Permill, +}; +use sp_std::{convert::TryFrom, prelude::*}; +use xcm::{latest::prelude::*, Version as XcmVersion, VersionedXcm}; + +use cumulus_primitives_core::relay_chain::HrmpChannelId; +use orml_traits::parameter_type_with_key; +use pallet_ethereum::PostLogContent; +use polkadot_core_primitives::BlockNumber as RelayBlockNumber; +use polkadot_parachain::primitives::{Id as ParaId, Sibling}; +use xcm::latest::{ + AssetId as XcmAssetId, Error as XcmError, ExecuteXcm, + Junction::{PalletInstance, Parachain}, + Junctions, MultiLocation, NetworkId, Outcome, Xcm, +}; +use xcm_builder::{ + AccountKey20Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, + AllowTopLevelPaidExecutionFrom, AsPrefixedGeneralIndex, ConvertedConcreteId, + CurrencyAdapter as XcmCurrencyAdapter, EnsureXcmOrigin, FixedRateOfFungible, FixedWeightBounds, + FungiblesAdapter, IsConcrete, NoChecking, ParentAsSuperuser, ParentIsPreset, + RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountKey20AsNative, SovereignSignedViaLocation, TakeWeightCredit, WithComputedOrigin, +}; +use xcm_executor::{traits::JustTry, Config, XcmExecutor}; + +use scale_info::TypeInfo; +use xcm_simulator::{ + DmpMessageHandlerT as DmpMessageHandler, XcmpMessageFormat, + XcmpMessageHandlerT as XcmpMessageHandler, +}; + +pub type AccountId = moonbeam_core_primitives::AccountId; +pub type Balance = u128; +pub type AssetId = u128; +pub type BlockNumber = u32; + +parameter_types! { + pub const BlockHashCount: u32 = 250; +} + +impl frame_system::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Index = u64; + type BlockNumber = BlockNumber; + type Hash = H256; + type Hashing = ::sp_runtime::traits::BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = sp_runtime::generic::Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type BlockWeights = (); + type BlockLength = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = (); + type BaseCallFilter = Everything; + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +parameter_types! { + pub ExistentialDeposit: Balance = 0; + pub const MaxLocks: u32 = 50; + pub const MaxReserves: u32 = 50; +} + +impl pallet_balances::Config for Runtime { + type MaxLocks = MaxLocks; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxReserves = MaxReserves; + type ReserveIdentifier = [u8; 8]; +} + +pub type ForeignAssetInstance = (); +pub type LocalAssetInstance = pallet_assets::Instance1; + +parameter_types! { + pub const AssetDeposit: Balance = 10; // Does not really matter as this will be only called by root + pub const ApprovalDeposit: Balance = 0; + pub const AssetsStringLimit: u32 = 50; + pub const MetadataDepositBase: Balance = 0; + pub const MetadataDepositPerByte: Balance = 0; + pub const AssetAccountDeposit: Balance = 0; +} + +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type Currency = Balances; + type ForceOrigin = EnsureRoot; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type AssetAccountDeposit = AssetAccountDeposit; + type WeightInfo = pallet_assets::weights::SubstrateWeight; + type RemoveItemsLimit = ConstU32<656>; + type AssetIdParameter = AssetId; + type CreateOrigin = AsEnsureOriginWithArg>; + type CallbackHandle = (); +} + +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type Currency = Balances; + type ForceOrigin = EnsureRoot; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type AssetAccountDeposit = AssetAccountDeposit; + type WeightInfo = pallet_assets::weights::SubstrateWeight; + type RemoveItemsLimit = ConstU32<656>; + type AssetIdParameter = AssetId; + type CreateOrigin = AsEnsureOriginWithArg>; + type CallbackHandle = (); +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the default `AccountId`. + ParentIsPreset, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + AccountKey20Aliases, + // The rest of multilocations convert via hashing it + xcm_builder::HashedDescriptionDescribeFamilyAllTerminal, +); + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can +/// biases the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain which they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when + // recognised. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognised. + SiblingParachainAsNative, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, + // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. + pallet_xcm::XcmPassthrough, + SignedAccountKey20AsNative, +); + +parameter_types! { + pub const UnitWeightCost: Weight = Weight::from_parts(1u64, 1u64); + pub MaxInstructions: u32 = 100; +} + +// Instructing how incoming xcm assets will be handled +pub type ForeignFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + Assets, + // Use this currency when it is a fungible asset matching any of the locations in + // SelfReserveRepresentations + ( + ConvertedConcreteId< + AssetId, + Balance, + xcm_primitives::AsAssetType, + JustTry, + >, + ), + // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont allow teleports. + NoChecking, + // We dont track any teleports + (), +>; + +/// The transactor for our own chain currency. +pub type LocalAssetTransactor = XcmCurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching any of the locations in + // SelfReserveRepresentations + IsConcrete, + // We can convert the MultiLocations with our converter above: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont allow teleport + (), +>; + +/// Means for transacting local assets besides the native currency on this chain. +pub type LocalFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + LocalAssets, + // Use this currency when it is a fungible asset matching the given location or name: + ( + ConvertedConcreteId< + AssetId, + Balance, + AsPrefixedGeneralIndex, + JustTry, + >, + ), + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont want to allow teleporting assets + NoChecking, + // The account to use for tracking teleports. + (), +>; + +// These will be our transactors +// We use both transactors +pub type AssetTransactors = ( + LocalAssetTransactor, + ForeignFungiblesTransactor, + LocalFungiblesTransactor, +); + +pub type XcmRouter = super::ParachainXcmRouter; + +pub type XcmBarrier = ( + // Weight that is paid for may be consumed. + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, +); + +parameter_types! { + /// Xcm fees will go to the treasury account + pub XcmFeesAccount: AccountId = Treasury::account_id(); +} + +/// This is the struct that will handle the revenue from xcm fees +pub type XcmFeesToAccount_ = xcm_primitives::XcmFeesToAccount< + Assets, + ( + ConvertedConcreteId< + AssetId, + Balance, + xcm_primitives::AsAssetType, + JustTry, + >, + ), + AccountId, + XcmFeesAccount, +>; + +parameter_types! { + // We cannot skip the native trader for some specific tests, so we will have to work with + // a native trader that charges same number of units as weight + // We use both the old and new anchoring logics + pub ParaTokensPerSecond: (XcmAssetId, u128, u128) = ( + Concrete(SelfReserve::get()), + 1000000000000, + 0, + ); +} + +parameter_types! { + pub const RelayNetwork: NetworkId = NetworkId::Polkadot; + pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); + pub UniversalLocation: InteriorMultiLocation = + X2(GlobalConsensus(RelayNetwork::get()), Parachain(MsgQueue::parachain_id().into())); + + // New Self Reserve location, defines the multilocation identifiying the self-reserve currency + // This is used to match it also against our Balances pallet when we receive such + // a MultiLocation: (Self Balances pallet index) + pub SelfReserve: MultiLocation = MultiLocation { + parents:0, + interior: Junctions::X1( + PalletInstance(::index() as u8) + ) + }; + + pub LocalAssetsPalletLocation: MultiLocation = MultiLocation { + parents:0, + interior: Junctions::X1( + PalletInstance(::index() as u8) + ) + }; + pub const MaxAssetsIntoHolding: u32 = 64; +} + +use frame_system::RawOrigin; +use sp_runtime::traits::PostDispatchInfoOf; +use sp_runtime::DispatchErrorWithPostInfo; +use xcm_executor::traits::CallDispatcher; +moonbeam_runtime_common::impl_moonbeam_xcm_call!(); + +pub struct XcmConfig; +impl Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = AssetTransactors; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + type IsReserve = orml_xcm_support::MultiNativeAsset< + xcm_primitives::AbsoluteAndRelativeReserve, + >; + type IsTeleporter = (); + type UniversalLocation = UniversalLocation; + type Barrier = XcmBarrier; + type Weigher = FixedWeightBounds; + // We use three traders + // When we receive either representation of the self-reserve asset, + // When we receive a non-reserve asset, we use AssetManager to fetch how many + // units per second we should charge + type Trader = ( + FixedRateOfFungible, + xcm_primitives::FirstAssetTrader, + ); + + type ResponseHandler = PolkadotXcm; + type SubscriptionService = PolkadotXcm; + type AssetTrap = PolkadotXcm; + type AssetClaims = PolkadotXcm; + type CallDispatcher = MoonbeamCall; + type AssetLocker = (); + type AssetExchanger = (); + type PalletInstancesInfo = (); + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type FeeManager = (); + type MessageExporter = (); + type UniversalAliases = Nothing; + type SafeCallFilter = Everything; + type AssetIsBurnable = Everything; +} + +impl cumulus_pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +// Our currencyId. We distinguish for now between SelfReserve, and Others, defined by their Id. +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum CurrencyId { + SelfReserve, + ForeignAsset(AssetId), + LocalAssetReserve(AssetId), +} + +// How to convert from CurrencyId to MultiLocation +pub struct CurrencyIdtoMultiLocation(sp_std::marker::PhantomData); +impl sp_runtime::traits::Convert> + for CurrencyIdtoMultiLocation +where + AssetXConverter: xcm_executor::traits::Convert, +{ + fn convert(currency: CurrencyId) -> Option { + match currency { + CurrencyId::SelfReserve => { + // For now and until Xtokens is adapted to handle 0.9.16 version we use + // the old anchoring here + // This is not a problem in either cases, since the view of the destination + // chain does not change + // TODO! change this to NewAnchoringSelfReserve once xtokens is adapted for it + let multi: MultiLocation = SelfReserve::get(); + Some(multi) + } + CurrencyId::ForeignAsset(asset) => AssetXConverter::reverse_ref(asset).ok(), + CurrencyId::LocalAssetReserve(asset) => { + let mut location = LocalAssetsPalletLocation::get(); + location.push_interior(Junction::GeneralIndex(asset)).ok(); + Some(location) + } + } + } +} + +parameter_types! { + pub const BaseXcmWeight: Weight = Weight::from_parts(100u64, 100u64); + pub const MaxAssetsForTransfer: usize = 2; + pub SelfLocation: MultiLocation = MultiLocation::here(); + pub SelfLocationAbsolute: MultiLocation = MultiLocation { + parents:1, + interior: Junctions::X1( + Parachain(MsgQueue::parachain_id().into()) + ) + }; +} + +parameter_type_with_key! { + pub ParachainMinFee: |_location: MultiLocation| -> Option { + Some(u128::MAX) + }; +} + +// The XCM message wrapper wrapper +impl orml_xtokens::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type CurrencyId = CurrencyId; + type AccountIdToMultiLocation = xcm_primitives::AccountIdToMultiLocation; + type CurrencyIdConvert = + CurrencyIdtoMultiLocation>; + type XcmExecutor = XcmExecutor; + type SelfLocation = SelfLocation; + type Weigher = xcm_builder::FixedWeightBounds; + type BaseXcmWeight = BaseXcmWeight; + type UniversalLocation = UniversalLocation; + type MaxAssetsForTransfer = MaxAssetsForTransfer; + type MinXcmFee = ParachainMinFee; + type MultiLocationsFilter = Everything; + type ReserveProvider = xcm_primitives::AbsoluteAndRelativeReserve; +} + +parameter_types! { + pub const ProposalBond: Permill = Permill::from_percent(5); + pub const ProposalBondMinimum: Balance = 0; + pub const SpendPeriod: u32 = 0; + pub const TreasuryId: PalletId = PalletId(*b"pc/trsry"); + pub const MaxApprovals: u32 = 100; +} + +impl pallet_treasury::Config for Runtime { + type PalletId = TreasuryId; + type Currency = Balances; + type ApproveOrigin = EnsureRoot; + type RejectOrigin = EnsureRoot; + type RuntimeEvent = RuntimeEvent; + type OnSlash = Treasury; + type ProposalBond = ProposalBond; + type ProposalBondMinimum = ProposalBondMinimum; + type SpendPeriod = SpendPeriod; + type Burn = (); + type BurnDestination = (); + type MaxApprovals = MaxApprovals; + type WeightInfo = (); + type SpendFunds = (); + type ProposalBondMaximum = (); + type SpendOrigin = frame_support::traits::NeverEnsureOrigin; // Same as Polkadot +} + +#[frame_support::pallet] +pub mod mock_msg_queue { + use super::*; + use frame_support::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + type XcmExecutor: ExecuteXcm; + } + + #[pallet::call] + impl Pallet {} + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::storage] + #[pallet::getter(fn parachain_id)] + pub(super) type ParachainId = StorageValue<_, ParaId, ValueQuery>; + + impl Get for Pallet { + fn get() -> ParaId { + Self::parachain_id() + } + } + + pub type MessageId = [u8; 32]; + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + // XCMP + /// Some XCM was executed OK. + Success(Option), + /// Some XCM failed. + Fail(Option, XcmError), + /// Bad XCM version used. + BadVersion(Option), + /// Bad XCM format used. + BadFormat(Option), + + // DMP + /// Downward message is invalid XCM. + InvalidFormat(MessageId), + /// Downward message is unsupported version of XCM. + UnsupportedVersion(MessageId), + /// Downward message executed with the given outcome. + ExecutedDownward(MessageId, Outcome), + } + + impl Pallet { + pub fn set_para_id(para_id: ParaId) { + ParachainId::::put(para_id); + } + + fn handle_xcmp_message( + sender: ParaId, + _sent_at: RelayBlockNumber, + xcm: VersionedXcm, + max_weight: Weight, + ) -> Result { + let hash = Encode::using_encoded(&xcm, T::Hashing::hash); + let (result, event) = match Xcm::::try_from(xcm) { + Ok(xcm) => { + let location = MultiLocation::new(1, Junctions::X1(Parachain(sender.into()))); + let mut id = [0u8; 32]; + id.copy_from_slice(hash.as_ref()); + match T::XcmExecutor::execute_xcm(location, xcm, id, max_weight) { + Outcome::Error(e) => (Err(e.clone()), Event::Fail(Some(hash), e)), + Outcome::Complete(w) => (Ok(w), Event::Success(Some(hash))), + // As far as the caller is concerned, this was dispatched without error, so + // we just report the weight used. + Outcome::Incomplete(w, e) => (Ok(w), Event::Fail(Some(hash), e)), + } + } + Err(()) => ( + Err(XcmError::UnhandledXcmVersion), + Event::BadVersion(Some(hash)), + ), + }; + Self::deposit_event(event); + result + } + } + + impl XcmpMessageHandler for Pallet { + fn handle_xcmp_messages<'a, I: Iterator>( + iter: I, + max_weight: Weight, + ) -> Weight { + for (sender, sent_at, data) in iter { + let mut data_ref = data; + let _ = XcmpMessageFormat::decode(&mut data_ref) + .expect("Simulator encodes with versioned xcm format; qed"); + + let mut remaining_fragments = &data_ref[..]; + while !remaining_fragments.is_empty() { + if let Ok(xcm) = + VersionedXcm::::decode(&mut remaining_fragments) + { + let _ = Self::handle_xcmp_message(sender, sent_at, xcm, max_weight); + } else { + debug_assert!(false, "Invalid incoming XCMP message data"); + } + } + } + max_weight + } + } + + impl DmpMessageHandler for Pallet { + fn handle_dmp_messages( + iter: impl Iterator)>, + limit: Weight, + ) -> Weight { + for (_i, (_sent_at, data)) in iter.enumerate() { + let id = sp_io::hashing::blake2_256(&data[..]); + let maybe_msg = VersionedXcm::::decode(&mut &data[..]) + .map(Xcm::::try_from); + match maybe_msg { + Err(_) => { + Self::deposit_event(Event::InvalidFormat(id)); + } + Ok(Err(())) => { + Self::deposit_event(Event::UnsupportedVersion(id)); + } + Ok(Ok(x)) => { + let outcome = T::XcmExecutor::execute_xcm(Parent, x, id, limit); + + Self::deposit_event(Event::ExecutedDownward(id, outcome)); + } + } + } + limit + } + } +} + +// Pallet to provide the version, used to test runtime upgrade version changes +#[frame_support::pallet] +pub mod mock_version_changer { + use super::*; + use frame_support::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + } + + #[pallet::call] + impl Pallet {} + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::storage] + #[pallet::getter(fn current_version)] + pub(super) type CurrentVersion = StorageValue<_, XcmVersion, ValueQuery>; + + impl Get for Pallet { + fn get() -> XcmVersion { + Self::current_version() + } + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + // XCMP + /// Some XCM was executed OK. + VersionChanged(XcmVersion), + } + + impl Pallet { + pub fn set_version(version: XcmVersion) { + CurrentVersion::::put(version); + Self::deposit_event(Event::VersionChanged(version)); + } + } +} + +impl mock_msg_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +impl mock_version_changer::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} + +pub type LocalOriginToLocation = + xcm_primitives::SignedToAccountId20; + +parameter_types! { + pub MatcherLocation: MultiLocation = MultiLocation::here(); +} +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = frame_support::traits::Nothing; + type XcmExecutor = XcmExecutor; + // Do not allow teleports + type XcmTeleportFilter = Nothing; + type XcmReserveTransferFilter = Everything; + type Weigher = FixedWeightBounds; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + // We use a custom one to test runtime ugprades + type AdvertisedXcmVersion = XcmVersioner; + type Currency = Balances; + type CurrencyMatcher = IsConcrete; + type TrustedLockers = (); + type SovereignAccountOf = (); + type MaxLockers = ConstU32<8>; + type WeightInfo = pallet_xcm::TestWeightInfo; +} + +// Our AssetType. For now we only handle Xcm Assets +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum AssetType { + Xcm(MultiLocation), +} +impl Default for AssetType { + fn default() -> Self { + Self::Xcm(MultiLocation::here()) + } +} + +impl From for AssetType { + fn from(location: MultiLocation) -> Self { + Self::Xcm(location) + } +} + +impl Into> for AssetType { + fn into(self) -> Option { + match self { + Self::Xcm(location) => Some(location), + } + } +} + +// Implementation on how to retrieve the AssetId from an AssetType +// We simply hash the AssetType and take the lowest 128 bits +impl From for AssetId { + fn from(asset: AssetType) -> AssetId { + match asset { + AssetType::Xcm(id) => { + let mut result: [u8; 16] = [0u8; 16]; + let hash: H256 = id.using_encoded(::Hashing::hash); + result.copy_from_slice(&hash.as_fixed_bytes()[0..16]); + u128::from_le_bytes(result) + } + } + } +} + +// We instruct how to register the Assets +// In this case, we tell it to Create an Asset in pallet-assets +pub struct AssetRegistrar; +use frame_support::pallet_prelude::DispatchResult; +impl pallet_asset_manager::AssetRegistrar for AssetRegistrar { + fn create_foreign_asset( + asset: AssetId, + min_balance: Balance, + metadata: AssetMetadata, + is_sufficient: bool, + ) -> DispatchResult { + Assets::force_create( + RuntimeOrigin::root(), + asset, + AssetManager::account_id(), + is_sufficient, + min_balance, + )?; + + Assets::force_set_metadata( + RuntimeOrigin::root(), + asset, + metadata.name, + metadata.symbol, + metadata.decimals, + false, + ) + } + + fn create_local_asset( + asset: AssetId, + _creator: AccountId, + min_balance: Balance, + is_sufficient: bool, + owner: AccountId, + ) -> DispatchResult { + LocalAssets::force_create( + RuntimeOrigin::root(), + asset, + owner, + is_sufficient, + min_balance, + )?; + + // TODO uncomment when we feel comfortable + /* + // The asset has been created. Let's put the revert code in the precompile address + let precompile_address = Runtime::asset_id_to_account(ASSET_PRECOMPILE_ADDRESS_PREFIX, asset); + pallet_evm::AccountCodes::::insert( + precompile_address, + vec![0x60, 0x00, 0x60, 0x00, 0xfd], + );*/ + Ok(()) + } + + fn destroy_foreign_asset(asset: AssetId) -> DispatchResult { + // Mark the asset as destroying + Assets::start_destroy(RuntimeOrigin::root(), asset.into())?; + + Ok(()) + } + + fn destroy_local_asset(asset: AssetId) -> DispatchResult { + // Mark the asset as destroying + LocalAssets::start_destroy(RuntimeOrigin::root(), asset.into())?; + + Ok(()) + } + + fn destroy_asset_dispatch_info_weight(asset: AssetId) -> Weight { + RuntimeCall::Assets( + pallet_assets::Call::::start_destroy { + id: asset.into(), + }, + ) + .get_dispatch_info() + .weight + } +} + +#[derive(Clone, Default, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub struct AssetMetadata { + pub name: Vec, + pub symbol: Vec, + pub decimals: u8, +} + +pub struct LocalAssetIdCreator; +impl pallet_asset_manager::LocalAssetIdCreator for LocalAssetIdCreator { + fn create_asset_id_from_metadata(local_asset_counter: u128) -> AssetId { + // Our means of converting a local asset counter to an assetId + // We basically hash (local asset counter) + let mut result: [u8; 16] = [0u8; 16]; + let hash: H256 = + local_asset_counter.using_encoded(::Hashing::hash); + result.copy_from_slice(&hash.as_fixed_bytes()[0..16]); + u128::from_le_bytes(result) + } +} + +impl pallet_asset_manager::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type AssetRegistrarMetadata = AssetMetadata; + type ForeignAssetType = AssetType; + type AssetRegistrar = AssetRegistrar; + type ForeignAssetModifierOrigin = EnsureRoot; + type LocalAssetModifierOrigin = EnsureRoot; + type LocalAssetIdCreator = LocalAssetIdCreator; + type Currency = Balances; + type LocalAssetDeposit = AssetDeposit; + type WeightInfo = (); +} + +// 1 ROC/WND should be enough +parameter_types! { + pub MaxHrmpRelayFee: MultiAsset = (MultiLocation::parent(), 1_000_000_000_000u128).into(); +} + +impl pallet_xcm_transactor::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type Transactor = MockTransactors; + type DerivativeAddressRegistrationOrigin = EnsureRoot; + type SovereignAccountDispatcherOrigin = frame_system::EnsureRoot; + type CurrencyId = CurrencyId; + type AccountIdToMultiLocation = xcm_primitives::AccountIdToMultiLocation; + type CurrencyIdToMultiLocation = + CurrencyIdtoMultiLocation>; + type SelfLocation = SelfLocation; + type Weigher = xcm_builder::FixedWeightBounds; + type UniversalLocation = UniversalLocation; + type XcmSender = XcmRouter; + type BaseXcmWeight = BaseXcmWeight; + type AssetTransactor = AssetTransactors; + type ReserveProvider = xcm_primitives::AbsoluteAndRelativeReserve; + type WeightInfo = (); + type HrmpManipulatorOrigin = EnsureRoot; + type MaxHrmpFee = xcm_builder::Case; + type HrmpEncoder = MockHrmpEncoder; +} + +parameter_types! { + pub const MinimumPeriod: u64 = 1000; +} +impl pallet_timestamp::Config for Runtime { + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); +} + +use sp_core::U256; + +const MAX_POV_SIZE: u64 = 5 * 1024 * 1024; + +parameter_types! { + pub BlockGasLimit: U256 = U256::from(u64::MAX); + pub WeightPerGas: Weight = Weight::from_parts(1, 0); + pub GasLimitPovSizeRatio: u64 = { + let block_gas_limit = BlockGasLimit::get().min(u64::MAX.into()).low_u64(); + block_gas_limit.saturating_div(MAX_POV_SIZE) + }; +} + +impl pallet_evm::Config for Runtime { + type FeeCalculator = (); + type GasWeightMapping = pallet_evm::FixedGasWeightMapping; + type WeightPerGas = WeightPerGas; + + type CallOrigin = pallet_evm::EnsureAddressRoot; + type WithdrawOrigin = pallet_evm::EnsureAddressNever; + + type AddressMapping = moonbeam_runtime_common::IntoAddressMapping; + type Currency = Balances; + type Runner = pallet_evm::runner::stack::Runner; + + type RuntimeEvent = RuntimeEvent; + type PrecompilesType = (); + type PrecompilesValue = (); + type ChainId = (); + type BlockGasLimit = BlockGasLimit; + type OnChargeTransaction = (); + type BlockHashMapping = pallet_evm::SubstrateBlockHashMapping; + type FindAuthor = (); + type OnCreate = (); + type GasLimitPovSizeRatio = GasLimitPovSizeRatio; + type Timestamp = Timestamp; + type WeightInfo = pallet_evm::weights::SubstrateWeight; +} + +pub struct NormalFilter; +impl frame_support::traits::Contains for NormalFilter { + fn contains(c: &RuntimeCall) -> bool { + match c { + _ => true, + } + } +} + +// We need to use the encoding from the relay mock runtime +#[derive(Encode, Decode)] +pub enum RelayCall { + #[codec(index = 5u8)] + // the index should match the position of the module in `construct_runtime!` + Utility(UtilityCall), + #[codec(index = 6u8)] + // the index should match the position of the module in `construct_runtime!` + Hrmp(HrmpCall), +} + +#[derive(Encode, Decode)] +pub enum UtilityCall { + #[codec(index = 1u8)] + AsDerivative(u16), +} + +// HRMP call encoding, needed for xcm transactor pallet +#[derive(Encode, Decode)] +pub enum HrmpCall { + #[codec(index = 0u8)] + InitOpenChannel(ParaId, u32, u32), + #[codec(index = 1u8)] + AcceptOpenChannel(ParaId), + #[codec(index = 2u8)] + CloseChannel(HrmpChannelId), + #[codec(index = 6u8)] + CancelOpenRequest(HrmpChannelId, u32), +} + +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum MockTransactors { + Relay, +} + +impl xcm_primitives::XcmTransact for MockTransactors { + fn destination(self) -> MultiLocation { + match self { + MockTransactors::Relay => MultiLocation::parent(), + } + } +} + +impl xcm_primitives::UtilityEncodeCall for MockTransactors { + fn encode_call(self, call: xcm_primitives::UtilityAvailableCalls) -> Vec { + match self { + MockTransactors::Relay => match call { + xcm_primitives::UtilityAvailableCalls::AsDerivative(a, b) => { + let mut call = + RelayCall::Utility(UtilityCall::AsDerivative(a.clone())).encode(); + call.append(&mut b.clone()); + call + } + }, + } + } +} + +pub struct MockHrmpEncoder; +impl xcm_primitives::HrmpEncodeCall for MockHrmpEncoder { + fn hrmp_encode_call( + call: xcm_primitives::HrmpAvailableCalls, + ) -> Result, xcm::latest::Error> { + match call { + xcm_primitives::HrmpAvailableCalls::InitOpenChannel(a, b, c) => Ok(RelayCall::Hrmp( + HrmpCall::InitOpenChannel(a.clone(), b.clone(), c.clone()), + ) + .encode()), + xcm_primitives::HrmpAvailableCalls::AcceptOpenChannel(a) => { + Ok(RelayCall::Hrmp(HrmpCall::AcceptOpenChannel(a.clone())).encode()) + } + xcm_primitives::HrmpAvailableCalls::CloseChannel(a) => { + Ok(RelayCall::Hrmp(HrmpCall::CloseChannel(a.clone())).encode()) + } + xcm_primitives::HrmpAvailableCalls::CancelOpenRequest(a, b) => { + Ok(RelayCall::Hrmp(HrmpCall::CancelOpenRequest(a.clone(), b.clone())).encode()) + } + } + } +} + +parameter_types! { + pub const PostBlockAndTxnHashes: PostLogContent = PostLogContent::BlockAndTxnHashes; +} + +impl pallet_ethereum::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type StateRoot = pallet_ethereum::IntermediateStateRoot; + type PostLogContent = PostBlockAndTxnHashes; + type ExtraDataLength = ConstU32<30>; +} +parameter_types! { + pub ReservedXcmpWeight: Weight = Weight::from_parts(u64::max_value(), 0); +} + +#[derive( + Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, MaxEncodedLen, TypeInfo, +)] +pub enum ProxyType { + NotAllowed = 0, + Any = 1, +} + +impl pallet_evm_precompile_proxy::EvmProxyCallFilter for ProxyType {} + +impl InstanceFilter for ProxyType { + fn filter(&self, _c: &RuntimeCall) -> bool { + match self { + ProxyType::NotAllowed => false, + ProxyType::Any => true, + } + } + fn is_superset(&self, _o: &Self) -> bool { + false + } +} + +impl Default for ProxyType { + fn default() -> Self { + Self::NotAllowed + } +} + +parameter_types! { + pub const ProxyCost: u64 = 1; +} + +impl pallet_proxy::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type Currency = Balances; + type ProxyType = ProxyType; + type ProxyDepositBase = ProxyCost; + type ProxyDepositFactor = ProxyCost; + type MaxProxies = ConstU32<32>; + type WeightInfo = pallet_proxy::weights::SubstrateWeight; + type MaxPending = ConstU32<32>; + type CallHasher = BlakeTwo256; + type AnnouncementDepositBase = ProxyCost; + type AnnouncementDepositFactor = ProxyCost; +} + +pub struct EthereumXcmEnsureProxy; +impl xcm_primitives::EnsureProxy for EthereumXcmEnsureProxy { + fn ensure_ok(delegator: AccountId, delegatee: AccountId) -> Result<(), &'static str> { + // The EVM implicitely contains an Any proxy, so we only allow for "Any" proxies + let def: pallet_proxy::ProxyDefinition = + pallet_proxy::Pallet::::find_proxy( + &delegator, + &delegatee, + Some(ProxyType::Any), + ) + .map_err(|_| "proxy error: expected `ProxyType::Any`")?; + // We only allow to use it for delay zero proxies, as the call will iMmediatly be executed + ensure!(def.delay.is_zero(), "proxy delay is Non-zero`"); + Ok(()) + } +} + +impl pallet_ethereum_xcm::Config for Runtime { + type InvalidEvmTransactionError = pallet_ethereum::InvalidTransactionWrapper; + type ValidatedTransaction = pallet_ethereum::ValidatedTransaction; + type XcmEthereumOrigin = pallet_ethereum_xcm::EnsureXcmEthereumTransaction; + type ReservedXcmpWeight = ReservedXcmpWeight; + type EnsureProxy = EthereumXcmEnsureProxy; + type ControllerOrigin = EnsureRoot; +} + +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; + +construct_runtime!( + pub enum Runtime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Storage, Config, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + MsgQueue: mock_msg_queue::{Pallet, Storage, Event}, + XcmVersioner: mock_version_changer::{Pallet, Storage, Event}, + + PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin}, + Assets: pallet_assets::{Pallet, Call, Storage, Event}, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin}, + XTokens: orml_xtokens::{Pallet, Call, Storage, Event}, + AssetManager: pallet_asset_manager::{Pallet, Call, Storage, Event}, + XcmTransactor: pallet_xcm_transactor::{Pallet, Call, Storage, Event}, + Treasury: pallet_treasury::{Pallet, Storage, Config, Event, Call}, + LocalAssets: pallet_assets::::{Pallet, Call, Storage, Event}, + Proxy: pallet_proxy::{Pallet, Call, Storage, Event}, + + Timestamp: pallet_timestamp::{Pallet, Call, Storage}, + EVM: pallet_evm::{Pallet, Call, Storage, Config, Event}, + Ethereum: pallet_ethereum::{Pallet, Call, Storage, Event, Origin, Config}, + EthereumXcm: pallet_ethereum_xcm::{Pallet, Call, Origin}, + } +); + +pub(crate) fn para_events() -> Vec { + System::events() + .into_iter() + .map(|r| r.event) + .filter_map(|e| Some(e)) + .collect::>() +} + +use frame_support::traits::{OnFinalize, OnInitialize, OnRuntimeUpgrade}; +pub(crate) fn on_runtime_upgrade() { + PolkadotXcm::on_runtime_upgrade(); +} + +pub(crate) fn para_roll_to(n: BlockNumber) { + while System::block_number() < n { + PolkadotXcm::on_finalize(System::block_number()); + Balances::on_finalize(System::block_number()); + System::on_finalize(System::block_number()); + System::set_block_number(System::block_number() + 1); + System::on_initialize(System::block_number()); + Balances::on_initialize(System::block_number()); + PolkadotXcm::on_initialize(System::block_number()); + } +} diff --git a/tracing/2402/runtime/moonbase/tests/xcm_mock/relay_chain.rs b/tracing/2402/runtime/moonbase/tests/xcm_mock/relay_chain.rs new file mode 100644 index 0000000..f4d9e13 --- /dev/null +++ b/tracing/2402/runtime/moonbase/tests/xcm_mock/relay_chain.rs @@ -0,0 +1,349 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +//! Relay chain runtime mock. + +use frame_support::{ + construct_runtime, parameter_types, + traits::{Everything, Nothing}, +}; +use sp_core::H256; +use sp_runtime::{ + traits::{BlakeTwo256, ConstU32, IdentityLookup}, + AccountId32, +}; + +use frame_support::weights::Weight; +use polkadot_parachain::primitives::Id as ParaId; +use polkadot_runtime_parachains::{configuration, dmp, hrmp, origin, paras, shared, ump}; +use sp_runtime::transaction_validity::TransactionPriority; +use sp_runtime::Permill; +use xcm::latest::prelude::*; +use xcm_builder::{ + Account32Hash, AccountId32Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, + AllowTopLevelPaidExecutionFrom, ChildParachainAsNative, ChildParachainConvertsVia, + ChildSystemParachainAsSuperuser, CurrencyAdapter as XcmCurrencyAdapter, FixedRateOfFungible, + FixedWeightBounds, IsConcrete, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, WithComputedOrigin, +}; +use xcm_executor::{Config, XcmExecutor}; +pub type AccountId = AccountId32; +pub type Balance = u128; +pub type BlockNumber = u32; + +parameter_types! { + pub const BlockHashCount: u32 = 250; +} + +impl frame_system::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Index = u64; + type BlockNumber = BlockNumber; + type Hash = H256; + type Hashing = ::sp_runtime::traits::BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = sp_runtime::generic::Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type BlockWeights = (); + type BlockLength = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = (); + type BaseCallFilter = Everything; + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = ConstU32<16>; +} + +parameter_types! { + pub ExistentialDeposit: Balance = 1; + pub const MaxLocks: u32 = 50; + pub const MaxReserves: u32 = 50; +} + +impl pallet_balances::Config for Runtime { + type MaxLocks = MaxLocks; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxReserves = MaxReserves; + type ReserveIdentifier = [u8; 8]; +} + +impl pallet_utility::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type WeightInfo = (); + type PalletsOrigin = OriginCaller; +} + +impl shared::Config for Runtime {} + +impl configuration::Config for Runtime { + type WeightInfo = configuration::TestWeightInfo; +} + +parameter_types! { + pub KsmLocation: MultiLocation = Here.into(); + pub const KusamaNetwork: NetworkId = NetworkId::Kusama; + pub const AnyNetwork: Option = None; + pub UniversalLocation: InteriorMultiLocation = Here; +} + +pub type SovereignAccountOf = ( + ChildParachainConvertsVia, + AccountId32Aliases, + // Not enabled in the relay per se, but we enable it to test + // the transact_through_signed extrinsic + Account32Hash, +); + +pub type LocalAssetTransactor = + XcmCurrencyAdapter, SovereignAccountOf, AccountId, ()>; + +type LocalOriginConverter = ( + SovereignSignedViaLocation, + ChildParachainAsNative, + SignedAccountId32AsNative, + ChildSystemParachainAsSuperuser, +); + +parameter_types! { + pub const BaseXcmWeight: Weight = Weight::from_parts(1000u64, 1000u64); + pub KsmPerSecond: (AssetId, u128, u128) = (Concrete(KsmLocation::get()), 1, 1); + pub const MaxInstructions: u32 = 100; + pub const MaxAssetsIntoHolding: u32 = 64; + pub MatcherLocation: MultiLocation = MultiLocation::here(); +} + +pub type XcmRouter = super::RelayChainXcmRouter; + +pub type XcmBarrier = ( + // Weight that is paid for may be consumed. + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, +); + +pub struct XcmConfig; +impl Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = LocalAssetTransactor; + type OriginConverter = LocalOriginConverter; + type IsReserve = (); + type IsTeleporter = (); + type UniversalLocation = UniversalLocation; + type Barrier = XcmBarrier; + type Weigher = FixedWeightBounds; + type Trader = FixedRateOfFungible; + type ResponseHandler = XcmPallet; + type AssetTrap = XcmPallet; + type AssetClaims = XcmPallet; + type SubscriptionService = XcmPallet; + type CallDispatcher = RuntimeCall; + type AssetLocker = (); + type AssetExchanger = (); + type PalletInstancesInfo = (); + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type FeeManager = (); + type MessageExporter = (); + type UniversalAliases = Nothing; + type SafeCallFilter = Everything; + type AssetIsBurnable = Everything; +} + +pub type LocalOriginToLocation = SignedToAccountId32; + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type SendXcmOrigin = xcm_builder::EnsureXcmOrigin; + type XcmRouter = XcmRouter; + // Anyone can execute XCM messages locally... + type ExecuteXcmOrigin = xcm_builder::EnsureXcmOrigin; + type XcmExecuteFilter = Nothing; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Everything; + type XcmReserveTransferFilter = Everything; + type Weigher = FixedWeightBounds; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; + type Currency = Balances; + type CurrencyMatcher = (); + type TrustedLockers = (); + type SovereignAccountOf = (); + type MaxLockers = ConstU32<8>; + type WeightInfo = pallet_xcm::TestWeightInfo; +} + +parameter_types! { + pub const FirstMessageFactorPercent: u64 = 100; +} + +impl ump::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type UmpSink = ump::XcmSink, Runtime>; + type FirstMessageFactorPercent = FirstMessageFactorPercent; + type ExecuteOverweightOrigin = frame_system::EnsureRoot; + type WeightInfo = ump::TestWeightInfo; +} + +parameter_types! { + pub const ParasUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); +} + +/// A very dumb implementation of `EstimateNextSessionRotation`. At the moment of writing, this +/// is more to satisfy type requirements rather than to test anything. +pub struct TestNextSessionRotation; + +impl frame_support::traits::EstimateNextSessionRotation for TestNextSessionRotation { + fn average_session_length() -> u32 { + 10 + } + + fn estimate_current_session_progress(_now: u32) -> (Option, Weight) { + (None, Weight::zero()) + } + + fn estimate_next_session_rotation(_now: u32) -> (Option, Weight) { + (None, Weight::zero()) + } +} + +impl paras::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = paras::TestWeightInfo; + type UnsignedPriority = ParasUnsignedPriority; + type NextSessionRotation = TestNextSessionRotation; +} + +impl dmp::Config for Runtime {} + +impl hrmp::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type WeightInfo = TestHrmpWeightInfo; +} + +impl frame_system::offchain::SendTransactionTypes for Runtime +where + RuntimeCall: From, +{ + type Extrinsic = UncheckedExtrinsic; + type OverarchingCall = RuntimeCall; +} + +impl origin::Config for Runtime {} + +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; + +construct_runtime!( + pub enum Runtime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Storage, Config, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + ParasOrigin: origin::{Pallet, Origin}, + ParasUmp: ump::{Pallet, Call, Storage, Event}, + XcmPallet: pallet_xcm::{Pallet, Call, Storage, Event, Origin}, + Utility: pallet_utility::{Pallet, Call, Event}, + Hrmp: hrmp::{Pallet, Call, Storage, Event, Config}, + Dmp: dmp::{Pallet, Call, Storage}, + Paras: paras::{Pallet, Call, Storage, Event, Config, ValidateUnsigned}, + Configuration: configuration::{Pallet, Call, Storage, Config}, + } +); + +pub(crate) fn relay_events() -> Vec { + System::events() + .into_iter() + .map(|r| r.event) + .filter_map(|e| Some(e)) + .collect::>() +} + +use frame_support::traits::{OnFinalize, OnInitialize}; +pub(crate) fn relay_roll_to(n: BlockNumber) { + while System::block_number() < n { + XcmPallet::on_finalize(System::block_number()); + Balances::on_finalize(System::block_number()); + System::on_finalize(System::block_number()); + System::set_block_number(System::block_number() + 1); + System::on_initialize(System::block_number()); + Balances::on_initialize(System::block_number()); + XcmPallet::on_initialize(System::block_number()); + } +} + +/// A weight info that is only suitable for testing. +pub struct TestHrmpWeightInfo; + +impl hrmp::WeightInfo for TestHrmpWeightInfo { + fn hrmp_accept_open_channel() -> Weight { + Weight::from_parts(1, 0) + } + fn force_clean_hrmp(_: u32, _: u32) -> Weight { + Weight::from_parts(1, 0) + } + fn force_process_hrmp_close(_: u32) -> Weight { + Weight::from_parts(1, 0) + } + fn force_process_hrmp_open(_: u32) -> Weight { + Weight::from_parts(1, 0) + } + fn hrmp_cancel_open_request(_: u32) -> Weight { + Weight::from_parts(1, 0) + } + fn hrmp_close_channel() -> Weight { + Weight::from_parts(1, 0) + } + fn hrmp_init_open_channel() -> Weight { + Weight::from_parts(1, 0) + } + fn clean_open_channel_requests(_: u32) -> Weight { + Weight::from_parts(1, 0) + } + fn force_open_hrmp_channel() -> Weight { + Weight::from_parts(1, 0) + } +} diff --git a/tracing/2402/runtime/moonbase/tests/xcm_mock/statemint_like.rs b/tracing/2402/runtime/moonbase/tests/xcm_mock/statemint_like.rs new file mode 100644 index 0000000..9a6afde --- /dev/null +++ b/tracing/2402/runtime/moonbase/tests/xcm_mock/statemint_like.rs @@ -0,0 +1,529 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +//! Relay chain runtime mock. + +use frame_support::{ + construct_runtime, match_types, parameter_types, + traits::{AsEnsureOriginWithArg, Everything, Nothing}, + weights::Weight, +}; +use frame_system::{EnsureRoot, EnsureSigned}; + +use sp_core::H256; +use sp_runtime::{ + traits::{BlakeTwo256, ConstU32, Hash, IdentityLookup}, + AccountId32, +}; + +use polkadot_core_primitives::BlockNumber as RelayBlockNumber; + +use polkadot_parachain::primitives::Id as ParaId; +use polkadot_parachain::primitives::Sibling; +use sp_std::convert::TryFrom; +use xcm::latest::prelude::*; +use xcm::VersionedXcm; +use xcm_builder::{ + AccountId32Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, + AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, AsPrefixedGeneralIndex, + ConvertedConcreteId, CurrencyAdapter, EnsureXcmOrigin, FixedRateOfFungible, FixedWeightBounds, + FungiblesAdapter, IsConcrete, NoChecking, ParentAsSuperuser, ParentIsPreset, + RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, +}; +use xcm_executor::{traits::JustTry, Config, XcmExecutor}; +use xcm_simulator::{ + DmpMessageHandlerT as DmpMessageHandler, XcmpMessageFormat, + XcmpMessageHandlerT as XcmpMessageHandler, +}; +pub type AccountId = AccountId32; +pub type Balance = u128; +pub type AssetId = u128; +pub type BlockNumber = u32; + +parameter_types! { + pub const BlockHashCount: u32 = 250; +} + +impl frame_system::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Index = u64; + type BlockNumber = BlockNumber; + type Hash = H256; + type Hashing = ::sp_runtime::traits::BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = sp_runtime::generic::Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type BlockWeights = (); + type BlockLength = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = (); + type BaseCallFilter = Everything; + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +parameter_types! { + pub ExistentialDeposit: Balance = 1; + pub const MaxLocks: u32 = 50; + pub const MaxReserves: u32 = 50; +} + +impl pallet_balances::Config for Runtime { + type MaxLocks = MaxLocks; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxReserves = MaxReserves; + type ReserveIdentifier = [u8; 8]; +} + +parameter_types! { + pub const AssetDeposit: Balance = 0; // 1 UNIT deposit to create asset + pub const ApprovalDeposit: Balance = 0; + pub const AssetsStringLimit: u32 = 50; + /// Key = 32 bytes, Value = 36 bytes (32+1+1+1+1) + // https://github.com/paritytech/substrate/blob/069917b/frame/assets/src/lib.rs#L257L271 + pub const MetadataDepositBase: Balance = 0; + pub const MetadataDepositPerByte: Balance = 0; + pub const ExecutiveBody: BodyId = BodyId::Executive; + pub const AssetAccountDeposit: Balance = 0; +} + +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type Currency = Balances; + type ForceOrigin = EnsureRoot; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type AssetAccountDeposit = AssetAccountDeposit; + type WeightInfo = (); + type RemoveItemsLimit = ConstU32<656>; + type AssetIdParameter = AssetId; + type CreateOrigin = AsEnsureOriginWithArg>; + type CallbackHandle = (); +} + +parameter_types! { + pub const KsmLocation: MultiLocation = MultiLocation::parent(); + pub const RelayNetwork: NetworkId = NetworkId::Kusama; + pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); + pub UniversalLocation: InteriorMultiLocation = + X2(GlobalConsensus(RelayNetwork::get()), Parachain(MsgQueue::parachain_id().into())); + pub Local: MultiLocation = Here.into(); + pub CheckingAccount: AccountId = PolkadotXcm::check_account(); + pub KsmPerSecond: (xcm::latest::prelude::AssetId, u128, u128) = + (Concrete(KsmLocation::get()), 1, 1); +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the default `AccountId`. + ParentIsPreset, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // Straight up local `AccountId32` origins just alias directly to `AccountId`. + AccountId32Aliases, +); + +/// Means for transacting the native currency on this chain. +pub type CurrencyTransactor = CurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We don't track any teleports of `Balances`. + (), +>; + +/// Means for transacting assets besides the native currency on this chain. +pub type FungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + Assets, + // Use this currency when it is a fungible asset matching the given location or name: + ConvertedConcreteId< + AssetId, + Balance, + AsPrefixedGeneralIndex, + JustTry, + >, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We only want to allow teleports of known assets. We use non-zero issuance as an indication + // that this asset is known. + NoChecking, + // The account to use for tracking teleports. + CheckingAccount, +>; +/// Means for transacting assets on this chain. +pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor); + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can +/// biases the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain which they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when + // recognised. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognised. + SiblingParachainAsNative, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, + // Native signed account converter; this just converts an `AccountId32` origin into a normal + // `Origin::Signed` origin of the same 32-byte value. + SignedAccountId32AsNative, + // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. + pallet_xcm::XcmPassthrough, +); + +parameter_types! { + // One XCM operation is 1_000_000_000 weight - almost certainly a conservative estimate. + pub UnitWeightCost: Weight = Weight::from_parts(100u64, 100u64); + pub const MaxInstructions: u32 = 100; +} + +match_types! { + pub type ParentOrParentsExecutivePlurality: impl Contains = { + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) } + }; +} +match_types! { + pub type ParentOrSiblings: impl Contains = { + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(_) } + }; +} + +pub type Barrier = ( + TakeWeightCredit, + AllowTopLevelPaidExecutionFrom, + // Parent and its exec plurality get free execution + AllowUnpaidExecutionFrom, + // Expected responses are OK. + AllowKnownQueryResponses, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, +); + +parameter_types! { + pub MatcherLocation: MultiLocation = MultiLocation::here(); + pub const MaxAssetsIntoHolding: u32 = 64; +} + +pub struct XcmConfig; +impl Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = AssetTransactors; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + type IsReserve = + orml_xcm_support::MultiNativeAsset; + type IsTeleporter = (); + type UniversalLocation = UniversalLocation; + type Barrier = Barrier; + type Weigher = FixedWeightBounds; + type Trader = FixedRateOfFungible; + type ResponseHandler = PolkadotXcm; + type AssetTrap = PolkadotXcm; + type AssetClaims = PolkadotXcm; + type SubscriptionService = PolkadotXcm; + type CallDispatcher = RuntimeCall; + type AssetLocker = (); + type AssetExchanger = (); + type PalletInstancesInfo = (); + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type FeeManager = (); + type MessageExporter = (); + type UniversalAliases = Nothing; + type SafeCallFilter = Everything; + type AssetIsBurnable = Everything; +} + +/// No local origins on this chain are allowed to dispatch XCM sends/executions. +pub type LocalOriginToLocation = SignedToAccountId32; + +pub type XcmRouter = super::ParachainXcmRouter; + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = Nothing; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Everything; + type XcmReserveTransferFilter = Everything; + type Weigher = FixedWeightBounds; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; + type Currency = Balances; + type CurrencyMatcher = IsConcrete; + type TrustedLockers = (); + type SovereignAccountOf = (); + type MaxLockers = ConstU32<8>; + type WeightInfo = pallet_xcm::TestWeightInfo; +} + +impl cumulus_pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +#[frame_support::pallet] +pub mod mock_msg_queue { + use super::*; + use frame_support::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + type XcmExecutor: ExecuteXcm; + } + + #[pallet::call] + impl Pallet {} + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::storage] + #[pallet::getter(fn parachain_id)] + pub(super) type ParachainId = StorageValue<_, ParaId, ValueQuery>; + + impl Get for Pallet { + fn get() -> ParaId { + Self::parachain_id() + } + } + + pub type MessageId = [u8; 32]; + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + // XCMP + /// Some XCM was executed OK. + Success(Option), + /// Some XCM failed. + Fail(Option, XcmError), + /// Bad XCM version used. + BadVersion(Option), + /// Bad XCM format used. + BadFormat(Option), + + // DMP + /// Downward message is invalid XCM. + InvalidFormat(MessageId), + /// Downward message is unsupported version of XCM. + UnsupportedVersion(MessageId), + /// Downward message executed with the given outcome. + ExecutedDownward(MessageId, Outcome), + } + + impl Pallet { + pub fn set_para_id(para_id: ParaId) { + ParachainId::::put(para_id); + } + + fn handle_xcmp_message( + sender: ParaId, + _sent_at: RelayBlockNumber, + xcm: VersionedXcm, + max_weight: Weight, + ) -> Result { + let hash = Encode::using_encoded(&xcm, T::Hashing::hash); + let (result, event) = match Xcm::::try_from(xcm) { + Ok(xcm) => { + let location = MultiLocation::new(1, Junctions::X1(Parachain(sender.into()))); + let mut id = [0u8; 32]; + id.copy_from_slice(hash.as_ref()); + match T::XcmExecutor::execute_xcm(location, xcm, id, max_weight) { + Outcome::Error(e) => (Err(e.clone()), Event::Fail(Some(hash), e)), + Outcome::Complete(w) => (Ok(w), Event::Success(Some(hash))), + // As far as the caller is concerned, this was dispatched without error, so + // we just report the weight used. + Outcome::Incomplete(w, e) => (Ok(w), Event::Fail(Some(hash), e)), + } + } + Err(()) => ( + Err(XcmError::UnhandledXcmVersion), + Event::BadVersion(Some(hash)), + ), + }; + Self::deposit_event(event); + result + } + } + + impl XcmpMessageHandler for Pallet { + fn handle_xcmp_messages<'a, I: Iterator>( + iter: I, + max_weight: Weight, + ) -> Weight { + for (sender, sent_at, data) in iter { + let mut data_ref = data; + let _ = XcmpMessageFormat::decode(&mut data_ref) + .expect("Simulator encodes with versioned xcm format; qed"); + + let mut remaining_fragments = &data_ref[..]; + while !remaining_fragments.is_empty() { + if let Ok(xcm) = + VersionedXcm::::decode(&mut remaining_fragments) + { + let _ = Self::handle_xcmp_message(sender, sent_at, xcm, max_weight); + } else { + debug_assert!(false, "Invalid incoming XCMP message data"); + } + } + } + max_weight + } + } + + impl DmpMessageHandler for Pallet { + fn handle_dmp_messages( + iter: impl Iterator)>, + limit: Weight, + ) -> Weight { + for (_i, (_sent_at, data)) in iter.enumerate() { + let id = sp_io::hashing::blake2_256(&data[..]); + let maybe_msg = VersionedXcm::::decode(&mut &data[..]) + .map(Xcm::::try_from); + match maybe_msg { + Err(_) => { + Self::deposit_event(Event::InvalidFormat(id)); + } + Ok(Err(())) => { + Self::deposit_event(Event::UnsupportedVersion(id)); + } + Ok(Ok(x)) => { + let outcome = T::XcmExecutor::execute_xcm(Parent, x, id, limit); + + Self::deposit_event(Event::ExecutedDownward(id, outcome)); + } + } + } + limit + } + } +} +impl mock_msg_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +// Pallet to cover test cases for change https://github.com/paritytech/cumulus/pull/831 +#[frame_support::pallet] +pub mod mock_statemint_prefix { + use super::*; + use frame_support::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + } + + #[pallet::call] + impl Pallet {} + + #[pallet::pallet] + #[pallet::without_storage_info] + pub struct Pallet(_); + + #[pallet::storage] + #[pallet::getter(fn current_prefix)] + pub(super) type CurrentPrefix = StorageValue<_, MultiLocation, ValueQuery>; + + impl Get for Pallet { + fn get() -> MultiLocation { + Self::current_prefix() + } + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + // Changed Prefix + PrefixChanged(MultiLocation), + } + + impl Pallet { + pub fn set_prefix(prefix: MultiLocation) { + CurrentPrefix::::put(&prefix); + Self::deposit_event(Event::PrefixChanged(prefix)); + } + } +} + +impl mock_statemint_prefix::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} + +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; +construct_runtime!( + pub enum Runtime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Storage, Config, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + PolkadotXcm: pallet_xcm::{Pallet, Call, Storage, Event, Origin}, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin}, + MsgQueue: mock_msg_queue::{Pallet, Storage, Event}, + Assets: pallet_assets::{Pallet, Storage, Event}, + PrefixChanger: mock_statemint_prefix::{Pallet, Storage, Event}, + + } +); diff --git a/tracing/2402/runtime/moonbase/tests/xcm_tests.rs b/tracing/2402/runtime/moonbase/tests/xcm_tests.rs new file mode 100644 index 0000000..522a5c8 --- /dev/null +++ b/tracing/2402/runtime/moonbase/tests/xcm_tests.rs @@ -0,0 +1,3332 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Moonbase Runtime Xcm Tests + +mod xcm_mock; +use frame_support::{ + assert_ok, + dispatch::Weight, + traits::{ConstU32, PalletInfo, PalletInfoAccess}, + weights::constants::WEIGHT_REF_TIME_PER_SECOND, + BoundedVec, +}; +use pallet_asset_manager::LocalAssetIdCreator; +use pallet_xcm_transactor::{ + Currency, CurrencyPayment, HrmpInitParams, HrmpOperation, TransactWeights, +}; +use sp_std::boxed::Box; +use xcm::latest::prelude::*; +use xcm::{VersionedMultiLocation, WrapVersion}; +use xcm_builder::HashedDescriptionDescribeFamilyAllTerminal; +use xcm_executor::traits::Convert; +use xcm_mock::*; +use xcm_primitives::{UtilityEncodeCall, DEFAULT_PROOF_SIZE}; +use xcm_simulator::TestExt; +mod common; +use common::ExtBuilder; +use cumulus_primitives_core::relay_chain::HrmpChannelId; +// Send a relay asset (like DOT) to a parachain A +#[test] +fn receive_relay_asset_from_relay() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + // Verify that parachain received the asset + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 123); + }); +} + +// Send relay asset (like DOT) back from Parachain A to relaychain +#[test] +fn send_relay_asset_to_relay() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + // Register relay asset in paraA + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + // Free execution + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + let dest: MultiLocation = Junction::AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + + // First send relay chain asset to Parachain like in previous test + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // Free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 123); + }); + + // Lets gather the balance before sending back money + let mut balance_before_sending = 0; + Relay::execute_with(|| { + balance_before_sending = RelayBalances::free_balance(&RELAYALICE); + }); + + // We now send back some money to the relay + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: RELAYALICE.into(), + }), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 123, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // The balances in paraAlice should have been substracted + ParaA::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 0); + }); + + // Balances in the relay should have been received + Relay::execute_with(|| { + // Free execution,x full amount received + assert!(RelayBalances::free_balance(&RELAYALICE) > balance_before_sending); + }); +} + +#[test] +fn send_relay_asset_to_para_b() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + // Register asset in paraA. Free execution + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata.clone(), + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location.clone(), + 0u128, + 0 + )); + }); + + // Register asset in paraB. Free execution + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // First send relay chain asset to Parachain A like in previous test + let dest: MultiLocation = Junction::AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // Free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 123); + }); + + // Now send relay asset from para A to para B + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // Para A balances should have been substracted + ParaA::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 23); + }); + + // Para B balances should have been credited + ParaB::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); +} + +#[test] +fn send_para_a_asset_to_para_b() { + MockNet::reset(); + + // this represents the asset in paraA + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + // Register asset in paraB. Free execution + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Send para A asset from para A to para B + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaA::execute_with(|| { + // Free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(800000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // Native token is substracted in paraA + ParaA::execute_with(|| { + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + // Asset is minted in paraB + ParaB::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); +} + +#[test] +fn send_para_a_asset_from_para_b_to_para_c() { + MockNet::reset(); + + // Represents para A asset + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + // Register para A asset in parachain B. Free execution + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata.clone(), + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location.clone(), + 0u128, + 0 + )); + }); + + // Register para A asset in parachain C. Free execution + ParaC::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Send para A asset to para B + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // Para A balances have been substracted + ParaA::execute_with(|| { + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + // Para B balances have been credited + ParaB::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); + + // Send para A asset from para B to para C + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(3), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaB::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // The message passed through parachainA so we needed to pay since its the native token + ParaC::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 96); + }); +} + +#[test] +fn send_para_a_asset_to_para_b_and_back_to_para_a() { + MockNet::reset(); + + // Para A asset + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + // Register para A asset in para B + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Send para A asset to para B + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // Balances have been substracted + ParaA::execute_with(|| { + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + // Para B balances have been credited + ParaB::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); + + // Send back para A asset to para A + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(1), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + ParaB::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + // Weight used is 4 + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 4 + ); + }); +} + +#[test] +fn send_para_a_asset_to_para_b_and_back_to_para_a_with_new_reanchoring() { + MockNet::reset(); + + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // Para A asset has been credited + ParaA::execute_with(|| { + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + ParaB::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); + + // This time we will force the new reanchoring by manually sending the + // Message through polkadotXCM pallet + + let dest = MultiLocation { + parents: 1, + interior: X1(Parachain(1)), + }; + + let reanchored_para_a_balances = MultiLocation::new(0, X1(PalletInstance(1u8))); + + let message = xcm::VersionedXcm::<()>::V3(Xcm(vec![ + WithdrawAsset((reanchored_para_a_balances.clone(), 100).into()), + ClearOrigin, + BuyExecution { + fees: (reanchored_para_a_balances, 100).into(), + weight_limit: Limited(80.into()), + }, + DepositAsset { + assets: All.into(), + beneficiary: MultiLocation::new( + 0, + X1(AccountKey20 { + network: None, + key: PARAALICE, + }), + ), + }, + ])); + ParaB::execute_with(|| { + // Send a message to the sovereign account in ParaA to withdraw + // and deposit asset + assert_ok!(ParachainPalletXcm::send( + parachain::RuntimeOrigin::root(), + Box::new(dest.into()), + Box::new(message), + )); + }); + + ParaA::execute_with(|| { + // Weight used is 4 + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 4 + ); + }); +} + +#[test] +fn receive_relay_asset_with_trader() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + // This time we are gonna put a rather high number of units per second + // we know later we will divide by 1e12 + // Lets put 1e6 as units per second + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 2500000000000u128, + 0 + )); + }); + + let dest: MultiLocation = Junction::AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + // We are sending 100 tokens from relay. + // Amount spent in fees is Units per second * weight / 1_000_000_000_000 (weight per second) + // weight is 4 since we are executing 4 instructions with a unitweightcost of 1. + // Units per second should be 2_500_000_000_000_000 + // Therefore with no refund, we should receive 10 tokens less + // Native trader fails for this, and we use the asset trader + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 100).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // non-free execution, not full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 90); + // Fee should have been received by treasury + assert_eq!(Assets::balance(source_id, &Treasury::account_id()), 10); + }); +} + +#[test] +fn send_para_a_asset_to_para_b_with_trader() { + MockNet::reset(); + + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 2500000000000u128, + 0 + )); + }); + + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + // In destination chain, we only need 4 weight + // We put 10 weight, 6 of which should be refunded and 4 of which should go to treasury + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(10u64, DEFAULT_PROOF_SIZE)) + )); + }); + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + // We are sending 100 tokens from para A. + // Amount spent in fees is Units per second * weight / 1_000_000_000_000 (weight per second) + // weight is 4 since we are executing 4 instructions with a unitweightcost of 1. + // Units per second should be 2_500_000_000_000_000 + // Since we set 10 weight in destination chain, 25 will be charged upfront + // 15 of those will be refunded, while 10 will go to treasury as the true weight used + // will be 4 + ParaB::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 90); + // Fee should have been received by treasury + assert_eq!(Assets::balance(source_id, &Treasury::account_id()), 10); + }); +} + +#[test] +fn send_para_a_asset_to_para_b_with_trader_and_fee() { + MockNet::reset(); + + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + // With these units per second, 80K weight convrets to 1 asset unit + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 12500000u128, + 0 + )); + }); + + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + // we use transfer_with_fee + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer_with_fee( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + 1, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(800000u64, DEFAULT_PROOF_SIZE)) + )); + }); + ParaA::execute_with(|| { + // 100 tokens transferred plus 1 taken from fees + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 - 1 + ); + }); + + ParaB::execute_with(|| { + // free execution, full amount received because trully the xcm instruction does not cost + // what it is specified + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 101); + }); +} + +#[test] +fn error_when_not_paying_enough() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + let dest: MultiLocation = Junction::AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + // This time we are gonna put a rather high number of units per second + // we know later we will divide by 1e12 + // Lets put 1e6 as units per second + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 2500000000000u128, + 0 + )); + }); + + // We are sending 100 tokens from relay. + // If we set the dest weight to be 1e7, we know the buy_execution will spend 1e7*1e6/1e12 = 10 + // Therefore with no refund, we should receive 10 tokens less + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 5).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // amount not received as it is not paying enough + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 0); + }); +} + +#[test] +fn transact_through_derivative_multilocation() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 1u128, + 0 + )); + + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + // Relay charges 1000 for every instruction, and we have 3, so 3000 + 3000.into(), + 20000000000.into(), + None + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + WEIGHT_REF_TIME_PER_SECOND as u128, + )); + }); + + // Let's construct the call to know how much weight it is going to require + + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + // 4000000000 transact + 3000 correspond to 4000003000 tokens. 100 more for the transfer call + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 4000003100u128).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003100); + }); + + // Register address + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::register( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + 0, + )); + }); + + // Send to registered address + + let registered_address = derivative_account_id(para_a_account(), 0); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: registered_address.clone().into(), + }), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003000); + }); + + // What we will do now is transfer this relay tokens from the derived account to the sovereign + // again + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 4000003000); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_derivative( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::MockTransactors::Relay, + 0, + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: None + }, + // 4000000000 + 3000 we should have taken out 4000003000 tokens from the caller + encoded, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + let event_found: Option = parachain::para_events() + .iter() + .find_map(|event| match event.clone() { + parachain::RuntimeEvent::PolkadotXcm(pallet_xcm::Event::AssetsTrapped(_, _, _)) => { + Some(event.clone()) + } + _ => None, + }); + // Assert that the events do not contain the assets being trapped + assert!(event_found.is_none()); + }); + + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(®istered_address) == 0); + }); +} + +#[test] +fn transact_through_derivative_with_custom_fee_weight() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 1u128, + 0 + )); + }); + + // Let's construct the call to know how much weight it is going to require + + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + // 4000000000 transact + 3000 correspond to 4000003000 tokens. 100 more for the transfer call + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 4000003100u128).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003100); + }); + + // Register address + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::register( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + 0, + )); + }); + + // Send to registered address + + let registered_address = derivative_account_id(para_a_account(), 0); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: registered_address.clone().into(), + }), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003000); + }); + + // What we will do now is transfer this relay tokens from the derived account to the sovereign + // again + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 4000003000); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + let overall_weight = 4000003000u64; + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_derivative( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::MockTransactors::Relay, + 0, + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + // 1-1 fee weight mapping + fee_amount: Some(overall_weight as u128) + }, + // 4000000000 + 3000 we should have taken out 4000003000 tokens from the caller + encoded, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: Some(overall_weight.into()) + } + )); + let event_found: Option = parachain::para_events() + .iter() + .find_map(|event| match event.clone() { + parachain::RuntimeEvent::PolkadotXcm(pallet_xcm::Event::AssetsTrapped(_, _, _)) => { + Some(event.clone()) + } + _ => None, + }); + // Assert that the events do not contain the assets being trapped + assert!(event_found.is_none()); + }); + + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(®istered_address) == 0); + }); +} + +#[test] +fn transact_through_sovereign() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 1u128, + 0 + )); + + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + // Relay charges 1000 for every instruction, and we have 3, so 3000 + 3000.into(), + 20000000000.into(), + None + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + WEIGHT_REF_TIME_PER_SECOND as u128, + )); + }); + + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 4000003100u128).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003100); + }); + + // Register address + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::register( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + 0, + )); + }); + + // Send to registered address + let registered_address = derivative_account_id(para_a_account(), 0); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: registered_address.clone().into(), + }), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003000); + }); + + // What we will do now is transfer this relay tokens from the derived account to the sovereign + // again + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 4000003000); + 0 + }); + + // We send the xcm transact operation to parent + let dest = MultiLocation { + parents: 1, + interior: Here, + }; + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + let utility_bytes = parachain::MockTransactors::Relay.encode_call( + xcm_primitives::UtilityAvailableCalls::AsDerivative(0, encoded), + ); + + // Root can directly pass the execution byes to the sovereign + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_sovereign( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(dest)), + PARAALICE.into(), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: None + }, + utility_bytes, + OriginKind::SovereignAccount, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(®istered_address) == 0); + }); +} + +#[test] +fn transact_through_sovereign_with_custom_fee_weight() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 1u128, + 0 + )); + }); + + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 4000003100u128).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003100); + }); + + // Register address + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::register( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + 0, + )); + }); + + // Send to registered address + let registered_address = derivative_account_id(para_a_account(), 0); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: registered_address.clone().into(), + }), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003000); + }); + + // What we will do now is transfer this relay tokens from the derived account to the sovereign + // again + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 4000003000); + 0 + }); + + // We send the xcm transact operation to parent + let dest = MultiLocation { + parents: 1, + interior: Here, + }; + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + let utility_bytes = parachain::MockTransactors::Relay.encode_call( + xcm_primitives::UtilityAvailableCalls::AsDerivative(0, encoded), + ); + + let total_weight = 4000003000u64; + // Root can directly pass the execution byes to the sovereign + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_sovereign( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(dest)), + PARAALICE.into(), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + // 1-1 fee-weight mapping + fee_amount: Some(total_weight as u128) + }, + utility_bytes, + OriginKind::SovereignAccount, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: Some(total_weight.into()) + } + )); + }); + + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(®istered_address) == 0); + }); +} + +#[test] +fn test_automatic_versioning_on_runtime_upgrade_with_relay() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A and set XCM version to 1 + ParaA::execute_with(|| { + parachain::XcmVersioner::set_version(1); + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + let response = Response::Version(2); + let querier: MultiLocation = Here.into(); + + // This is irrelevant, nothing will be done with this message, + // but we need to pass a message as an argument to trigger the storage change + let mock_message: Xcm<()> = Xcm(vec![QueryResponse { + query_id: 0, + response, + max_weight: Weight::zero(), + querier: Some(querier), + }]); + // The router is mocked, and we cannot use WrapVersion in ChildParachainRouter. So we will force + // it directly here + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + + Relay::execute_with(|| { + // This sets the default version, for not known destinations + assert_ok!(RelayChainPalletXcm::force_default_xcm_version( + relay_chain::RuntimeOrigin::root(), + Some(2) + )); + + // Wrap version, which sets VersionedStorage + // This is necessary because the mock router does not use wrap_version, but + // this is not necessary in prod + assert_ok!(::wrap_version( + &Parachain(1).into(), + mock_message + )); + + // Transfer assets. Since it is an unknown destination, it will query for version + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + + // Let's advance the relay. This should trigger the subscription message + relay_chain::relay_roll_to(2); + + // queries should have been updated + assert!(RelayChainPalletXcm::query(0).is_some()); + }); + + let expected_supported_version: relay_chain::RuntimeEvent = + pallet_xcm::Event::SupportedVersionChanged( + MultiLocation { + parents: 0, + interior: X1(Parachain(1)), + }, + 1, + ) + .into(); + + Relay::execute_with(|| { + // Assert that the events vector contains the version change + assert!(relay_chain::relay_events().contains(&expected_supported_version)); + }); + + let expected_version_notified: parachain::RuntimeEvent = + pallet_xcm::Event::VersionChangeNotified( + MultiLocation { + parents: 1, + interior: Here, + }, + 2, + vec![].into(), + ) + .into(); + + // ParaA changes version to 2, and calls on_runtime_upgrade. This should notify the targets + // of the new version change + ParaA::execute_with(|| { + // Set version + parachain::XcmVersioner::set_version(2); + // Do runtime upgrade + parachain::on_runtime_upgrade(); + // Initialize block, to call on_initialize and notify targets + parachain::para_roll_to(2); + // Expect the event in the parachain + assert!(parachain::para_events().contains(&expected_version_notified)); + }); + + // This event should have been seen in the relay + let expected_supported_version_2: relay_chain::RuntimeEvent = + pallet_xcm::Event::SupportedVersionChanged( + MultiLocation { + parents: 0, + interior: X1(Parachain(1)), + }, + 2, + ) + .into(); + + Relay::execute_with(|| { + // Assert that the events vector contains the new version change + assert!(relay_chain::relay_events().contains(&expected_supported_version_2)); + }); +} + +#[test] +fn test_automatic_versioning_on_runtime_upgrade_with_para_b() { + MockNet::reset(); + + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + let response = Response::Version(2); + let querier: MultiLocation = Here.into(); + + // This is irrelevant, nothing will be done with this message, + // but we need to pass a message as an argument to trigger the storage change + let mock_message: Xcm<()> = Xcm(vec![QueryResponse { + query_id: 0, + response, + max_weight: Weight::zero(), + querier: Some(querier), + }]); + + ParaA::execute_with(|| { + // advertised version + parachain::XcmVersioner::set_version(2); + }); + + ParaB::execute_with(|| { + // Let's try with v0 + parachain::XcmVersioner::set_version(0); + + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + ParaA::execute_with(|| { + // This sets the default version, for not known destinations + assert_ok!(ParachainPalletXcm::force_default_xcm_version( + parachain::RuntimeOrigin::root(), + Some(2) + )); + // Wrap version, which sets VersionedStorage + assert_ok!(::wrap_version( + &MultiLocation::new(1, X1(Parachain(2))).into(), + mock_message + )); + + parachain::para_roll_to(2); + + // queries should have been updated + assert!(ParachainPalletXcm::query(0).is_some()); + }); + + let expected_supported_version: parachain::RuntimeEvent = + pallet_xcm::Event::SupportedVersionChanged( + MultiLocation { + parents: 1, + interior: X1(Parachain(2)), + }, + 0, + ) + .into(); + + ParaA::execute_with(|| { + // Assert that the events vector contains the version change + assert!(parachain::para_events().contains(&expected_supported_version)); + }); + + // Let's ensure talking in v0 works + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + // free execution, full amount received + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + ParaB::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); + + let expected_version_notified: parachain::RuntimeEvent = + pallet_xcm::Event::VersionChangeNotified( + MultiLocation { + parents: 1, + interior: X1(Parachain(1)), + }, + 2, + vec![].into(), + ) + .into(); + + // ParaB changes version to 2, and calls on_runtime_upgrade. This should notify the targets + // of the new version change + ParaB::execute_with(|| { + // Set version + parachain::XcmVersioner::set_version(2); + // Do runtime upgrade + parachain::on_runtime_upgrade(); + // Initialize block, to call on_initialize and notify targets + parachain::para_roll_to(2); + // Expect the event in the parachain + assert!(parachain::para_events().contains(&expected_version_notified)); + }); + + // This event should have been seen in para A + let expected_supported_version_2: parachain::RuntimeEvent = + pallet_xcm::Event::SupportedVersionChanged( + MultiLocation { + parents: 1, + interior: X1(Parachain(2)), + }, + 2, + ) + .into(); + + // Para A should have received the version change + ParaA::execute_with(|| { + // Assert that the events vector contains the new version change + assert!(parachain::para_events().contains(&expected_supported_version_2)); + }); +} + +#[test] +fn receive_asset_with_no_sufficients_not_possible_if_non_existent_account() { + MockNet::reset(); + + let fresh_account = [2u8; 20]; + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + false + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: fresh_account, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest.clone()).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + // parachain should not have received assets + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &fresh_account.into()), 0); + }); + + // Send native token to fresh_account + ParaA::execute_with(|| { + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + fresh_account.into(), + 100 + )); + }); + + // Re-send tokens + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + // parachain should have received assets + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &fresh_account.into()), 123); + }); +} + +#[test] +fn receive_assets_with_sufficients_true_allows_non_funded_account_to_receive_assets() { + MockNet::reset(); + + let fresh_account = [2u8; 20]; + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: fresh_account, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest.clone()).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + // parachain should have received assets + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &fresh_account.into()), 123); + }); +} + +#[test] +fn evm_account_receiving_assets_should_handle_sufficients_ref_count() { + MockNet::reset(); + + let mut sufficient_account = [0u8; 20]; + sufficient_account[0..20].copy_from_slice(&evm_account()[..]); + + let evm_account_id = parachain::AccountId::from(sufficient_account); + + // Evm account is self sufficient + ParaA::execute_with(|| { + assert_eq!(parachain::System::account(evm_account_id).sufficients, 1); + }); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: sufficient_account, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest.clone()).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + // Evm account sufficient ref count increased by 1. + ParaA::execute_with(|| { + assert_eq!(parachain::System::account(evm_account_id).sufficients, 2); + }); + + ParaA::execute_with(|| { + // Remove the account from the evm context. + parachain::EVM::remove_account(&evm_account()); + // Evm account sufficient ref count decreased by 1. + assert_eq!(parachain::System::account(evm_account_id).sufficients, 1); + }); +} + +#[test] +fn empty_account_should_not_be_reset() { + MockNet::reset(); + + // Test account has nonce 1 on genesis. + let mut sufficient_account = [0u8; 20]; + sufficient_account[0..20].copy_from_slice(&evm_account()[..]); + + let evm_account_id = parachain::AccountId::from(sufficient_account); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + false + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Send native token to evm_account + ParaA::execute_with(|| { + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + evm_account_id, + 100 + )); + }); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: sufficient_account, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest.clone()).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // Empty the assets from the account. + // As this makes the account go below the `min_balance`, the account is considered dead + // at eyes of pallet-assets, and the consumer reference is decreased by 1 and is now Zero. + assert_ok!(parachain::Assets::transfer( + parachain::RuntimeOrigin::signed(evm_account_id), + source_id, + PARAALICE.into(), + 123 + )); + // Verify account asset balance is Zero. + assert_eq!( + parachain::Assets::balance(source_id, &evm_account_id.into()), + 0 + ); + // Because we no longer have consumer references, we can set the balance to Zero. + // This would reset the account if our ED were to be > than Zero. + assert_ok!(ParaBalances::set_balance( + parachain::RuntimeOrigin::root(), + evm_account_id, + 0, + 0, + )); + // Verify account native balance is Zero. + assert_eq!(ParaBalances::free_balance(&evm_account_id), 0); + // Remove the account from the evm context. + // This decreases the sufficients reference by 1 and now is Zero. + parachain::EVM::remove_account(&evm_account()); + // Verify reference count. + let account = parachain::System::account(evm_account_id); + assert_eq!(account.sufficients, 0); + assert_eq!(account.consumers, 0); + assert_eq!(account.providers, 1); + // We expect the account to be alive in a Zero ED context. + assert_eq!(parachain::System::account_nonce(evm_account_id), 1); + }); +} + +#[test] +fn test_statemint_like() { + MockNet::reset(); + + let dest_para = MultiLocation::new(1, X1(Parachain(1))); + + let sov = xcm_builder::SiblingParachainConvertsVia::< + polkadot_parachain::primitives::Sibling, + statemint_like::AccountId, + >::convert_ref(dest_para) + .unwrap(); + + let statemint_asset_a_balances = MultiLocation::new( + 1, + X3( + Parachain(4), + PalletInstance(5), + xcm::latest::prelude::GeneralIndex(0u128), + ), + ); + let source_location = parachain::AssetType::Xcm(statemint_asset_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"StatemintToken".to_vec(), + symbol: b"StatemintToken".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata.clone(), + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + Statemint::execute_with(|| { + // Set new prefix + statemint_like::PrefixChanger::set_prefix( + PalletInstance(::index() as u8).into(), + ); + assert_ok!(StatemintAssets::create( + statemint_like::RuntimeOrigin::signed(RELAYALICE), + 0, + RELAYALICE, + 1 + )); + + assert_ok!(StatemintAssets::mint( + statemint_like::RuntimeOrigin::signed(RELAYALICE), + 0, + RELAYALICE, + 300000000000000 + )); + + // This is needed, since the asset is created as non-sufficient + assert_ok!(StatemintBalances::transfer( + statemint_like::RuntimeOrigin::signed(RELAYALICE), + sov, + 100000000000000 + )); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + + // Send asset with previous prefix + assert_ok!(StatemintChainPalletXcm::reserve_transfer_assets( + statemint_like::RuntimeOrigin::signed(RELAYALICE), + Box::new(MultiLocation::new(1, X1(Parachain(1))).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new( + ( + X2( + xcm::latest::prelude::PalletInstance( + ::index() as u8 + ), + xcm::latest::prelude::GeneralIndex(0), + ), + 123 + ) + .into() + ), + 0, + )); + }); + + ParaA::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 123); + }); +} + +#[test] +fn send_para_a_local_asset_to_para_b() { + ExtBuilder::default().build().execute_with(|| { + MockNet::reset(); + + let asset_id = parachain::LocalAssetIdCreator::create_asset_id_from_metadata(0); + let para_a_local_asset = MultiLocation::new( + 1, + X3(Parachain(1), PalletInstance(11u8), GeneralIndex(asset_id)), + ); + let source_location = parachain::AssetType::Xcm(para_a_local_asset); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaALocalAsset".to_vec(), + symbol: b"ParaALocalAsset".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_local_asset( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + PARAALICE.into(), + true, + 1 + )); + + assert_ok!(LocalAssets::mint( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + asset_id, + PARAALICE.into(), + 300000000000000 + )); + }); + + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::LocalAssetReserve(asset_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(800000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaB::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); + }); +} + +#[test] +fn send_para_a_local_asset_to_para_b_and_send_it_back_together_with_some_dev() { + ExtBuilder::default().build().execute_with(|| { + MockNet::reset(); + + let asset_id = parachain::LocalAssetIdCreator::create_asset_id_from_metadata(0); + let para_a_local_asset = MultiLocation::new( + 1, + X3(Parachain(1), PalletInstance(11u8), GeneralIndex(asset_id)), + ); + let source_location_local_asset = parachain::AssetType::Xcm(para_a_local_asset); + let source_id_local_asset: parachain::AssetId = source_location_local_asset.clone().into(); + + let asset_metadata_local_asset = parachain::AssetMetadata { + name: b"ParaALocalAsset".to_vec(), + symbol: b"ParaALocalAsset".to_vec(), + decimals: 12, + }; + + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location_balances = parachain::AssetType::Xcm(para_a_balances); + let source_id_balances: parachain::AssetId = source_location_balances.clone().into(); + + let asset_metadata_balances = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location_local_asset.clone(), + asset_metadata_local_asset, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location_local_asset, + 0u128, + 0 + )); + + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location_balances.clone(), + asset_metadata_balances, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location_balances, + 0u128, + 1 + )); + }); + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_local_asset( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + PARAALICE.into(), + true, + 1 + )); + + assert_ok!(LocalAssets::mint( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + asset_id, + PARAALICE.into(), + 300000000000000 + )); + }); + + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer_multicurrencies( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + vec![ + (parachain::CurrencyId::LocalAssetReserve(asset_id), 100), + (parachain::CurrencyId::SelfReserve, 1000000) + ], + 0, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(800000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + let mut alith_balance_asset_before = 0; + let mut alith_balance_native_token_before = 0; + + ParaA::execute_with(|| { + alith_balance_asset_before = LocalAssets::balance(asset_id, &PARAALICE.into()); + alith_balance_native_token_before = Balances::free_balance(&PARAALICE.into()); + }); + + let new_dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(1), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaB::execute_with(|| { + // free execution, full amount received + assert_eq!( + Assets::balance(source_id_local_asset, &PARAALICE.into()), + 100 + ); + assert_eq!( + Assets::balance(source_id_balances, &PARAALICE.into()), + 1000000 + ); + + // free execution, full amount received + assert_ok!(XTokens::transfer_multicurrencies( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + vec![ + (parachain::CurrencyId::ForeignAsset(source_id_balances), 4), + ( + parachain::CurrencyId::ForeignAsset(source_id_local_asset), + 50 + ) + ], + 0, + Box::new(VersionedMultiLocation::V3(new_dest)), + WeightLimit::Limited(Weight::from_parts(4u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + let alith_balance_asset_after = LocalAssets::balance(asset_id, &PARAALICE.into()); + let alith_balance_native_token_after = Balances::free_balance(&PARAALICE.into()); + assert_eq!(alith_balance_asset_after, alith_balance_asset_before + 50); + assert_eq!( + alith_balance_native_token_before, + alith_balance_native_token_after + ); + }); + }); +} + +#[test] +fn transact_through_signed_multilocation() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + ParaA::execute_with(|| { + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + // Relay charges 1000 for every instruction, and we have 3, so 3000 + 3000.into(), + 20000000000.into(), + // 4 instructions in transact through signed + Some(4000.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + WEIGHT_REF_TIME_PER_SECOND as u128, + )); + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the relay will see instead of us + descend_origin_multilocation + .reanchor(&MultiLocation::parent(), ancestry.interior) + .unwrap(); + + let derived = xcm_builder::Account32Hash::< + relay_chain::KusamaNetwork, + relay_chain::AccountId, + >::convert_ref(descend_origin_multilocation) + .unwrap(); + + Relay::execute_with(|| { + // free execution, full amount received + assert_ok!(RelayBalances::transfer( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + derived.clone(), + 4000004100u128, + )); + // derived account has all funds + assert!(RelayBalances::free_balance(&derived) == 4000004100); + // sovereign account has 0 funds + assert!(RelayBalances::free_balance(¶_a_account()) == 0); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + // 100 to sovereign + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: None + }, + encoded, + // 4000000000 for transfer + 4000 for XCM + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + Relay::execute_with(|| { + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(&derived) == 0); + }); +} + +#[test] +fn transact_through_signed_multilocation_custom_fee_and_weight() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + ParaA::execute_with(|| { + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the relay will see instead of us + descend_origin_multilocation + .reanchor(&MultiLocation::parent(), ancestry.interior) + .unwrap(); + + let derived = xcm_builder::Account32Hash::< + relay_chain::KusamaNetwork, + relay_chain::AccountId, + >::convert_ref(descend_origin_multilocation) + .unwrap(); + + Relay::execute_with(|| { + // free execution, full amount received + assert_ok!(RelayBalances::transfer( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + derived.clone(), + 4000004100u128, + )); + // derived account has all funds + assert!(RelayBalances::free_balance(&derived) == 4000004100); + // sovereign account has 0 funds + assert!(RelayBalances::free_balance(¶_a_account()) == 0); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + // 100 to sovereign + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + let total_weight = 4000004000u64; + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: Some(total_weight as u128) + }, + encoded, + // 4000000000 for transfer + 4000 for XCM + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: Some(total_weight.into()) + } + )); + }); + + Relay::execute_with(|| { + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(&derived) == 0); + }); +} + +#[test] +fn transact_through_signed_multilocation_para_to_para() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + let para_b_location = MultiLocation::new(1, X1(Parachain(2))); + + let para_b_balances = MultiLocation::new(1, X2(Parachain(2), PalletInstance(1u8))); + + ParaA::execute_with(|| { + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + // ParaB + Box::new(xcm::VersionedMultiLocation::V3(para_b_location.clone())), + // Para charges 1000 for every instruction, and we have 3, so 3 + 3.into(), + 20000000000.into(), + // 4 instructions in transact through signed + Some(4.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(para_b_balances.clone())), + parachain::ParaTokensPerSecond::get().1 as u128, + )); + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the paraB will see instead of us + descend_origin_multilocation + .reanchor(¶_b_location, ancestry.interior) + .unwrap(); + + let derived = HashedDescriptionDescribeFamilyAllTerminal::::convert_ref( + descend_origin_multilocation, + ) + .unwrap(); + + ParaB::execute_with(|| { + // free execution, full amount received + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + derived.clone(), + 4000000104u128, + )); + // derived account has all funds + assert!(ParaBalances::free_balance(&derived) == 4000000104); + // sovereign account has 0 funds + assert!(ParaBalances::free_balance(¶_a_account_20()) == 0); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = + ::PalletInfo::index::() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + // 100 to sovereign + dest: para_a_account_20(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(para_b_location)), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + para_b_balances + ))), + fee_amount: None + }, + encoded, + // 4000000000 for transfer + 4000 for XCM + // 1-1 to fee + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + ParaB::execute_with(|| { + assert!(ParaBalances::free_balance(&derived) == 0); + + assert!(ParaBalances::free_balance(¶_a_account_20()) == 100); + }); +} + +#[test] +fn transact_through_signed_multilocation_para_to_para_ethereum() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + let para_b_location = MultiLocation::new(1, X1(Parachain(2))); + + let para_b_balances = MultiLocation::new(1, X2(Parachain(2), PalletInstance(1u8))); + + ParaA::execute_with(|| { + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + // ParaB + Box::new(xcm::VersionedMultiLocation::V3(para_b_location.clone())), + // Para charges 1000 for every instruction, and we have 3, so 3 + 3.into(), + 20000000000.into(), + // 4 instructions in transact through signed + Some(4.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(para_b_balances.clone())), + parachain::ParaTokensPerSecond::get().1 as u128, + )); + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the paraB will see instead of us + descend_origin_multilocation + .reanchor(¶_b_location, ancestry.interior) + .unwrap(); + + let derived = HashedDescriptionDescribeFamilyAllTerminal::::convert_ref( + descend_origin_multilocation, + ) + .unwrap(); + + let mut parachain_b_alice_balances_before = 0; + ParaB::execute_with(|| { + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + derived.clone(), + 4000000104u128, + )); + // derived account has all funds + assert!(ParaBalances::free_balance(&derived) == 4000000104); + // sovereign account has 0 funds + assert!(ParaBalances::free_balance(¶_a_account_20()) == 0); + + parachain_b_alice_balances_before = ParaBalances::free_balance(&PARAALICE.into()) + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = + ::PalletInfo::index::() + .unwrap() as u8; + + encoded.push(index); + + use sp_core::U256; + // Let's do a EVM transfer + let eth_tx = + xcm_primitives::EthereumXcmTransaction::V1(xcm_primitives::EthereumXcmTransactionV1 { + gas_limit: U256::from(21000), + fee_payment: xcm_primitives::EthereumXcmFee::Auto, + action: pallet_ethereum::TransactionAction::Call(PARAALICE.into()), + value: U256::from(100), + input: BoundedVec::< + u8, + ConstU32<{ xcm_primitives::MAX_ETHEREUM_XCM_INPUT_SIZE }> + >::try_from(vec![]).unwrap(), + access_list: None, + }); + + // Then call bytes + let mut call_bytes = pallet_ethereum_xcm::Call::::transact { + xcm_transaction: eth_tx, + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(para_b_location)), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + para_b_balances + ))), + fee_amount: None + }, + encoded, + // 4000000000 for transfer + 4000 for XCM + // 1-1 to fee + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + ParaB::execute_with(|| { + // Make sure the EVM transfer went through + assert!( + ParaBalances::free_balance(&PARAALICE.into()) + == parachain_b_alice_balances_before + 100 + ); + }); +} + +#[test] +fn transact_through_signed_multilocation_para_to_para_ethereum_no_proxy_fails() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + let para_b_location = MultiLocation::new(1, X1(Parachain(2))); + + let para_b_balances = MultiLocation::new(1, X2(Parachain(2), PalletInstance(1u8))); + + ParaA::execute_with(|| { + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + // ParaB + Box::new(xcm::VersionedMultiLocation::V3(para_b_location.clone())), + // Para charges 1000 for every instruction, and we have 3, so 3 + 3.into(), + 20000000000.into(), + // 4 instructions in transact through signed + Some(4.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(para_b_balances.clone())), + parachain::ParaTokensPerSecond::get().1 as u128, + )); + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the paraB will see instead of us + descend_origin_multilocation + .reanchor(¶_b_location, ancestry.interior) + .unwrap(); + + let derived = HashedDescriptionDescribeFamilyAllTerminal::::convert_ref( + descend_origin_multilocation, + ) + .unwrap(); + + let mut parachain_b_alice_balances_before = 0; + ParaB::execute_with(|| { + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + derived.clone(), + 4000000104u128, + )); + // derived account has all funds + assert!(ParaBalances::free_balance(&derived) == 4000000104); + // sovereign account has 0 funds + assert!(ParaBalances::free_balance(¶_a_account_20()) == 0); + + parachain_b_alice_balances_before = ParaBalances::free_balance(&PARAALICE.into()) + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = + ::PalletInfo::index::() + .unwrap() as u8; + + encoded.push(index); + + use sp_core::U256; + // Let's do a EVM transfer + let eth_tx = + xcm_primitives::EthereumXcmTransaction::V1(xcm_primitives::EthereumXcmTransactionV1 { + gas_limit: U256::from(21000), + fee_payment: xcm_primitives::EthereumXcmFee::Auto, + action: pallet_ethereum::TransactionAction::Call(PARAALICE.into()), + value: U256::from(100), + input: BoundedVec::< + u8, + ConstU32<{ xcm_primitives::MAX_ETHEREUM_XCM_INPUT_SIZE }> + >::try_from(vec![]).unwrap(), + access_list: None, + }); + + // Then call bytes + let mut call_bytes = pallet_ethereum_xcm::Call::::transact_through_proxy { + transact_as: PARAALICE.into(), + xcm_transaction: eth_tx, + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(para_b_location)), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + para_b_balances + ))), + fee_amount: None + }, + encoded, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + ParaB::execute_with(|| { + // Make sure the EVM transfer wasn't executed + assert!(ParaBalances::free_balance(&PARAALICE.into()) == parachain_b_alice_balances_before); + }); +} + +#[test] +fn transact_through_signed_multilocation_para_to_para_ethereum_proxy_succeeds() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + let para_b_location = MultiLocation::new(1, X1(Parachain(2))); + + let para_b_balances = MultiLocation::new(1, X2(Parachain(2), PalletInstance(1u8))); + + ParaA::execute_with(|| { + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + // ParaB + Box::new(xcm::VersionedMultiLocation::V3(para_b_location.clone())), + // Para charges 1000 for every instruction, and we have 3, so 3 + 3.into(), + 20000000000.into(), + // 4 instructions in transact through signed + Some(4.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(para_b_balances.clone())), + parachain::ParaTokensPerSecond::get().1 as u128, + )); + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the paraB will see instead of us + descend_origin_multilocation + .reanchor(¶_b_location, ancestry.interior) + .unwrap(); + + let derived = HashedDescriptionDescribeFamilyAllTerminal::::convert_ref( + descend_origin_multilocation, + ) + .unwrap(); + + let transfer_recipient = evm_account(); + let mut transfer_recipient_balance_before = 0; + ParaB::execute_with(|| { + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + derived.clone(), + 4000000104u128, + )); + // derived account has all funds + assert!(ParaBalances::free_balance(&derived) == 4000000104); + // sovereign account has 0 funds + assert!(ParaBalances::free_balance(¶_a_account_20()) == 0); + + transfer_recipient_balance_before = ParaBalances::free_balance(&transfer_recipient.into()); + + // Add proxy ALICE -> derived + let _ = parachain::Proxy::add_proxy_delegate( + &PARAALICE.into(), + derived, + parachain::ProxyType::Any, + 0, + ); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = + ::PalletInfo::index::() + .unwrap() as u8; + + encoded.push(index); + + use sp_core::U256; + // Let's do a EVM transfer + let eth_tx = + xcm_primitives::EthereumXcmTransaction::V2(xcm_primitives::EthereumXcmTransactionV2 { + gas_limit: U256::from(21000), + action: pallet_ethereum::TransactionAction::Call(transfer_recipient.into()), + value: U256::from(100), + input: BoundedVec::< + u8, + ConstU32<{ xcm_primitives::MAX_ETHEREUM_XCM_INPUT_SIZE }> + >::try_from(vec![]).unwrap(), + access_list: None, + }); + + // Then call bytes + let mut call_bytes = pallet_ethereum_xcm::Call::::transact_through_proxy { + transact_as: PARAALICE.into(), + xcm_transaction: eth_tx, + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(para_b_location)), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + para_b_balances + ))), + fee_amount: None + }, + encoded, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + ParaB::execute_with(|| { + // Make sure the EVM transfer was executed + assert!( + ParaBalances::free_balance(&transfer_recipient.into()) + == transfer_recipient_balance_before + 100 + ); + }); +} + +#[test] +fn hrmp_init_accept_through_root() { + MockNet::reset(); + + Relay::execute_with(|| { + assert_ok!(RelayBalances::transfer( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + para_a_account(), + 1000u128 + )); + assert_ok!(RelayBalances::transfer( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + para_b_account(), + 1000u128 + )); + }); + + ParaA::execute_with(|| { + let total_fee = 1_000u128; + let total_weight: u64 = 1_000_000_000; + let tx_weight: u64 = 500_000_000; + // Root can send hrmp init channel + assert_ok!(XcmTransactor::hrmp_manage( + parachain::RuntimeOrigin::root(), + HrmpOperation::InitOpen(HrmpInitParams { + para_id: 2u32.into(), + proposed_max_capacity: 1, + proposed_max_message_size: 1 + }), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: Some(total_fee) + }, + TransactWeights { + transact_required_weight_at_most: tx_weight.into(), + overall_weight: Some(total_weight.into()) + } + )); + }); + Relay::execute_with(|| { + let expected_event: relay_chain::RuntimeEvent = + polkadot_runtime_parachains::hrmp::Event::OpenChannelRequested( + 1u32.into(), + 2u32.into(), + 1u32, + 1u32, + ) + .into(); + assert!(relay_chain::relay_events().contains(&expected_event)); + }); + ParaB::execute_with(|| { + let total_fee = 1_000u128; + let total_weight: u64 = 1_000_000_000; + let tx_weight: u64 = 500_000_000; + // Root can send hrmp init channel + assert_ok!(XcmTransactor::hrmp_manage( + parachain::RuntimeOrigin::root(), + HrmpOperation::Accept { + para_id: 1u32.into() + }, + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: Some(total_fee) + }, + TransactWeights { + transact_required_weight_at_most: tx_weight.into(), + overall_weight: Some(total_weight.into()) + } + )); + }); + + Relay::execute_with(|| { + let expected_event: relay_chain::RuntimeEvent = + polkadot_runtime_parachains::hrmp::Event::OpenChannelAccepted(1u32.into(), 2u32.into()) + .into(); + assert!(relay_chain::relay_events().contains(&expected_event)); + }); +} + +#[test] +fn hrmp_close_works() { + MockNet::reset(); + + Relay::execute_with(|| { + assert_ok!(RelayBalances::transfer( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + para_a_account(), + 1000u128 + )); + assert_ok!(Hrmp::force_open_hrmp_channel( + relay_chain::RuntimeOrigin::root(), + 1u32.into(), + 2u32.into(), + 1u32, + 1u32 + )); + assert_ok!(Hrmp::force_process_hrmp_open( + relay_chain::RuntimeOrigin::root(), + 0u32 + )); + }); + + ParaA::execute_with(|| { + let total_fee = 1_000u128; + let total_weight: u64 = 1_000_000_000; + let tx_weight: u64 = 500_000_000; + // Root can send hrmp close + assert_ok!(XcmTransactor::hrmp_manage( + parachain::RuntimeOrigin::root(), + HrmpOperation::Close(HrmpChannelId { + sender: 1u32.into(), + recipient: 2u32.into() + }), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: Some(total_fee) + }, + TransactWeights { + transact_required_weight_at_most: tx_weight.into(), + overall_weight: Some(total_weight.into()) + } + )); + }); + Relay::execute_with(|| { + let expected_event: relay_chain::RuntimeEvent = + polkadot_runtime_parachains::hrmp::Event::ChannelClosed( + 1u32.into(), + HrmpChannelId { + sender: 1u32.into(), + recipient: 2u32.into(), + }, + ) + .into(); + assert!(relay_chain::relay_events().contains(&expected_event)); + }); +} + +use parity_scale_codec::{Decode, Encode}; +use sp_io::hashing::blake2_256; + +// Helper to derive accountIds +pub fn derivative_account_id(who: sp_runtime::AccountId32, index: u16) -> sp_runtime::AccountId32 { + let entropy = (b"modlpy/utilisuba", who, index).using_encoded(blake2_256); + sp_runtime::AccountId32::decode(&mut &entropy[..]).expect("valid account id") +} diff --git a/tracing/2402/runtime/moonbeam/Cargo.toml b/tracing/2402/runtime/moonbeam/Cargo.toml new file mode 100644 index 0000000..4268773 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/Cargo.toml @@ -0,0 +1,334 @@ +[package] +name = "moonbeam-runtime" +authors = { workspace = true } +build = "build.rs" +description = "Moonbeam Runtime" +edition = "2021" +homepage = "https://moonbeam.network" +license = "GPL-3.0-only" +version = "0.8.4" + +[dependencies] +hex-literal = { workspace = true, optional = true } +log = { workspace = true } +num_enum = { workspace = true } +rlp = { workspace = true, optional = true } +serde = { workspace = true, optional = true, features = [ "derive" ] } +sha3 = { workspace = true, optional = true } +smallvec = { workspace = true } +strum = { workspace = true } +strum_macros = { workspace = true } + +# Moonbeam +account = { workspace = true } +moonbeam-core-primitives = { workspace = true } +moonbeam-relay-encoder = { workspace = true } +moonbeam-runtime-common = { workspace = true } +precompile-utils = { workspace = true } +session-keys-primitives = { workspace = true } +xcm-primitives = { workspace = true } + +# Moonbeam pallets +moonbeam-xcm-benchmarks = { workspace = true } +pallet-asset-manager = { workspace = true } +pallet-author-mapping = { workspace = true } +pallet-crowdloan-rewards = { workspace = true } +pallet-erc20-xcm-bridge = { workspace = true } +pallet-ethereum-chain-id = { workspace = true } +pallet-ethereum-xcm = { workspace = true } +pallet-maintenance-mode = { workspace = true, features = [ "xcm-support" ] } +pallet-migrations = { workspace = true } +pallet-moonbeam-orbiters = { workspace = true } +pallet-parachain-staking = { workspace = true } +pallet-proxy-genesis-companion = { workspace = true } +pallet-randomness = { workspace = true } +pallet-xcm-transactor = { workspace = true } + +# Moonbeam precompiles +pallet-evm-precompile-author-mapping = { workspace = true } +pallet-evm-precompile-balances-erc20 = { workspace = true } +pallet-evm-precompile-batch = { workspace = true } +pallet-evm-precompile-call-permit = { workspace = true } +pallet-evm-precompile-collective = { workspace = true } +pallet-evm-precompile-conviction-voting = { workspace = true } +pallet-evm-precompile-crowdloan-rewards = { workspace = true } +pallet-evm-precompile-democracy = { workspace = true } +pallet-evm-precompile-gmp = { workspace = true } +pallet-evm-precompile-parachain-staking = { workspace = true } +pallet-evm-precompile-preimage = { workspace = true } +pallet-evm-precompile-proxy = { workspace = true } +pallet-evm-precompile-randomness = { workspace = true } +pallet-evm-precompile-registry = { workspace = true } +pallet-evm-precompile-referenda = { workspace = true } +pallet-evm-precompile-relay-encoder = { workspace = true } +pallet-evm-precompile-xcm-transactor = { workspace = true } +pallet-evm-precompile-xcm-utils = { workspace = true } +pallet-evm-precompile-xtokens = { workspace = true } +pallet-evm-precompileset-assets-erc20 = { workspace = true } + +# Moonbeam tracing +evm-tracing-events = { workspace = true, optional = true } +moonbeam-evm-tracer = { workspace = true, optional = true } +moonbeam-rpc-primitives-debug = { workspace = true } +moonbeam-rpc-primitives-txpool = { workspace = true } + +# Substrate +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +pallet-assets = { workspace = true } +pallet-balances = { workspace = true } +pallet-collective = { workspace = true } +pallet-conviction-voting = { workspace = true } +pallet-democracy = { workspace = true } +pallet-identity = { workspace = true } +pallet-multisig = { workspace = true } +pallet-preimage = { workspace = true } +pallet-proxy = { workspace = true } +pallet-referenda = { workspace = true } +pallet-root-testing = { workspace = true } +pallet-scheduler = { workspace = true } +pallet-society = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } +pallet-treasury = { workspace = true } +pallet-utility = { workspace = true } +pallet-whitelist = { workspace = true } +parity-scale-codec = { workspace = true, features = [ "derive", "max-encoded-len" ] } +scale-info = { workspace = true, features = [ "derive" ] } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-core = { workspace = true } +sp-inherents = { workspace = true } +sp-io = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } + +# Frontier +fp-evm = { workspace = true } +fp-rpc = { workspace = true } +fp-self-contained = { workspace = true } +pallet-base-fee = { workspace = true } +pallet-ethereum = { workspace = true, features = [ "forbid-evm-reentrancy" ] } +pallet-evm = { workspace = true, features = [ "forbid-evm-reentrancy" ] } +pallet-evm-precompile-blake2 = { workspace = true } +pallet-evm-precompile-bn128 = { workspace = true } +pallet-evm-precompile-dispatch = { workspace = true } +pallet-evm-precompile-modexp = { workspace = true } +pallet-evm-precompile-sha3fips = { workspace = true } +pallet-evm-precompile-simple = { workspace = true } + +# Cumulus / Nimbus +cumulus-pallet-dmp-queue = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-timestamp = { workspace = true } +cumulus-primitives-utility = { workspace = true } +nimbus-primitives = { workspace = true } +pallet-author-inherent = { workspace = true } +pallet-author-slot-filter = { workspace = true } +parachain-info = { workspace = true } + +# Polkadot / XCM +orml-traits = { workspace = true } +orml-xcm-support = { workspace = true } +orml-xtokens = { workspace = true } +pallet-xcm = { workspace = true } +pallet-xcm-benchmarks = { workspace = true, optional = true } +polkadot-core-primitives = { workspace = true } +polkadot-parachain = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } + +# Benchmarking +frame-benchmarking = { workspace = true, optional = true } +frame-system-benchmarking = { workspace = true, optional = true } +frame-try-runtime = { workspace = true, optional = true } + +[build-dependencies] +substrate-wasm-builder = { workspace = true } + +[features] +default = [ "std" , "evm-tracing"] +std = [ + "account/std", + "cumulus-pallet-dmp-queue/std", + "cumulus-pallet-parachain-system/std", + "cumulus-pallet-xcm/std", + "cumulus-pallet-xcmp-queue/std", + "cumulus-primitives-core/std", + "cumulus-primitives-timestamp/std", + "evm-tracing-events/std", + "fp-evm/std", + "fp-rpc/std", + "fp-self-contained/std", + "frame-benchmarking/std", + "frame-executive/std", + "frame-support/std", + "frame-system-rpc-runtime-api/std", + "frame-system/std", + "moonbeam-core-primitives/std", + "moonbeam-evm-tracer/std", + "moonbeam-relay-encoder/std", + "moonbeam-rpc-primitives-debug/std", + "moonbeam-rpc-primitives-txpool/std", + "moonbeam-runtime-common/std", + "moonbeam-xcm-benchmarks/std", + "nimbus-primitives/std", + "orml-xtokens/std", + "pallet-asset-manager/std", + "pallet-assets/std", + "pallet-author-inherent/std", + "pallet-author-mapping/std", + "pallet-author-slot-filter/std", + "pallet-balances/std", + "pallet-base-fee/std", + "pallet-collective/std", + "pallet-conviction-voting/std", + "pallet-crowdloan-rewards/std", + "pallet-democracy/std", + "pallet-erc20-xcm-bridge/std", + "pallet-ethereum-chain-id/std", + "pallet-ethereum-xcm/std", + "pallet-ethereum/std", + "pallet-evm-precompile-author-mapping/std", + "pallet-evm-precompile-balances-erc20/std", + "pallet-evm-precompile-batch/std", + "pallet-evm-precompile-call-permit/std", + "pallet-evm-precompile-collective/std", + "pallet-evm-precompile-conviction-voting/std", + "pallet-evm-precompile-parachain-staking/std", + "pallet-evm-precompile-preimage/std", + "pallet-evm-precompile-randomness/std", + "pallet-evm-precompile-referenda/std", + "pallet-evm-precompile-relay-encoder/std", + "pallet-evm-precompile-xcm-transactor/std", + "pallet-evm-precompile-xcm-utils/std", + "pallet-evm-precompile-xtokens/std", + "pallet-evm-precompileset-assets-erc20/std", + "pallet-evm/std", + "pallet-identity/std", + "pallet-maintenance-mode/std", + "pallet-migrations/std", + "pallet-moonbeam-orbiters/std", + "pallet-multisig/std", + "pallet-parachain-staking/std", + "pallet-preimage/std", + "pallet-proxy-genesis-companion/std", + "pallet-proxy/std", + "pallet-randomness/std", + "pallet-referenda/std", + "pallet-root-testing/std", + "pallet-scheduler/std", + "pallet-society/std", + "pallet-timestamp/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-transaction-payment/std", + "pallet-treasury/std", + "pallet-utility/std", + "pallet-whitelist/std", + "pallet-xcm-transactor/std", + "pallet-xcm/std", + "parachain-info/std", + "parity-scale-codec/std", + "precompile-utils/std", + "scale-info/std", + "serde", + "session-keys-primitives/std", + "sp-api/std", + "sp-block-builder/std", + "sp-core/std", + "sp-inherents/std", + "sp-io/std", + "sp-offchain/std", + "sp-runtime/std", + "sp-session/std", + "sp-std/std", + "sp-transaction-pool/std", + "sp-version/std", + "strum/std", + "xcm-builder/std", + "xcm-executor/std", + "xcm-primitives/std", + "xcm/std", +] +evm-tracing = [ "evm-tracing-events", "moonbeam-evm-tracer", "rlp", "sha3" ] + +# Will be enabled by the `wasm-builder` when building the runtime for WASM. +runtime-wasm = [ ] + +# A feature that should be enabled when the runtime should be build for on-chain +# deployment. This will disable stuff that shouldn't be part of the on-chain wasm +# to make it smaller like logging for example. +on-chain-release-build = [ "sp-api/disable-logging" ] + +runtime-benchmarks = [ + "cumulus-pallet-parachain-system/runtime-benchmarks", + "frame-benchmarking", + "frame-support/runtime-benchmarks", + "frame-system-benchmarking/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "hex-literal", + "moonbeam-runtime-common/runtime-benchmarks", + "moonbeam-xcm-benchmarks/runtime-benchmarks", + "pallet-asset-manager/runtime-benchmarks", + "pallet-author-inherent/runtime-benchmarks", + "pallet-author-mapping/runtime-benchmarks", + "pallet-author-slot-filter/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-collective/runtime-benchmarks", + "pallet-conviction-voting/runtime-benchmarks", + "pallet-crowdloan-rewards/runtime-benchmarks", + "pallet-ethereum/runtime-benchmarks", + "pallet-ethereum-xcm/runtime-benchmarks", + "pallet-migrations/runtime-benchmarks", + "pallet-moonbeam-orbiters/runtime-benchmarks", + "pallet-parachain-staking/runtime-benchmarks", + "pallet-preimage/runtime-benchmarks", + "pallet-randomness/runtime-benchmarks", + "pallet-referenda/runtime-benchmarks", + "pallet-society/runtime-benchmarks", + "pallet-timestamp/runtime-benchmarks", + "pallet-whitelist/runtime-benchmarks", + "pallet-xcm-benchmarks", + "pallet-xcm-transactor/runtime-benchmarks", + "pallet-xcm/runtime-benchmarks", + "session-keys-primitives/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", +] + +try-runtime = [ + "fp-self-contained/try-runtime", + "frame-executive/try-runtime", + "frame-system/try-runtime", + "frame-try-runtime", + "moonbeam-runtime-common/try-runtime", + "pallet-asset-manager/try-runtime", + "pallet-author-mapping/try-runtime", + "pallet-author-slot-filter/try-runtime", + "pallet-balances/try-runtime", + "pallet-collective/try-runtime", + "pallet-conviction-voting/try-runtime", + "pallet-democracy/try-runtime", + "pallet-maintenance-mode/try-runtime", + #"pallet-crowdloan-rewards/try-runtime", + "pallet-migrations/try-runtime", + "pallet-parachain-staking/try-runtime", + "pallet-referenda/try-runtime", + "pallet-preimage/try-runtime", + "pallet-root-testing/try-runtime", + "pallet-scheduler/try-runtime", + "pallet-society/try-runtime", + "pallet-timestamp/try-runtime", + "pallet-whitelist/try-runtime", +] diff --git a/tracing/2402/runtime/moonbeam/build.rs b/tracing/2402/runtime/moonbeam/build.rs new file mode 100644 index 0000000..3934b9c --- /dev/null +++ b/tracing/2402/runtime/moonbeam/build.rs @@ -0,0 +1,25 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +use substrate_wasm_builder::WasmBuilder; + +fn main() { + WasmBuilder::new() + .with_current_project() + .export_heap_base() + .import_memory() + .build() +} diff --git a/tracing/2402/runtime/moonbeam/src/asset_config.rs b/tracing/2402/runtime/moonbeam/src/asset_config.rs new file mode 100644 index 0000000..06426b7 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/src/asset_config.rs @@ -0,0 +1,341 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Asset configuration for Moonbase. +//! + +use super::{ + currency, governance, xcm_config, AccountId, AssetId, AssetManager, Assets, Balance, Balances, + CouncilInstance, LocalAssets, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, +}; + +use frame_support::{ + dispatch::GetDispatchInfo, + parameter_types, + traits::{AsEnsureOriginWithArg, ConstU128, ConstU32, EitherOfDiverse}, + weights::Weight, +}; +use pallet_evm_precompileset_assets_erc20::AccountIdAssetIdConversion; +use sp_runtime::traits::Hash as THash; + +use frame_system::{EnsureNever, EnsureRoot}; +use sp_core::{H160, H256}; + +use parity_scale_codec::{Compact, Decode, Encode}; +use scale_info::TypeInfo; + +use sp_std::{ + convert::{From, Into}, + prelude::*, +}; + +// Number of items that can be destroyed with our configured max extrinsic proof size. +// x = (a - b) / c where: +// a: maxExtrinsic proof size +// b: base proof size for destroy_accounts in pallet_assets weights +// c: proof size for each item +// 656.87 = (3_407_872 - 8232) / 5180 +const REMOVE_ITEMS_LIMIT: u32 = 656; + +// Not to disrupt the previous asset instance, we assign () to Foreign +pub type ForeignAssetInstance = (); +pub type LocalAssetInstance = pallet_assets::Instance1; + +// For foreign assets, these parameters dont matter much +// as this will only be called by root with the forced arguments +// No deposit is substracted with those methods +// For local assets, they do matter. We use similar parameters +// to those in statemine (except for approval) +parameter_types! { + pub const AssetDeposit: Balance = 100 * currency::GLMR * currency::SUPPLY_FACTOR; + pub const ApprovalDeposit: Balance = 0; + pub const AssetsStringLimit: u32 = 50; + pub const MetadataDepositBase: Balance = currency::deposit(1,68); + pub const MetadataDepositPerByte: Balance = currency::deposit(0, 1); +} + +/// We allow root and Chain council to execute privileged asset operations. +pub type AssetsForceOrigin = EitherOfDiverse< + EnsureRoot, + EitherOfDiverse< + pallet_collective::EnsureProportionMoreThan, + governance::custom_origins::GeneralAdmin, + >, +>; + +// Required for runtime benchmarks +pallet_assets::runtime_benchmarks_enabled! { + pub struct BenchmarkHelper; + impl pallet_assets::BenchmarkHelper for BenchmarkHelper + where + AssetIdParameter: From, + { + fn create_asset_id_parameter(id: u32) -> AssetIdParameter { + (id as u128).into() + } + } +} + +// Foreign assets +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type Currency = Balances; + type ForceOrigin = AssetsForceOrigin; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type AssetAccountDeposit = ConstU128<{ currency::deposit(1, 18) }>; + type WeightInfo = pallet_assets::weights::SubstrateWeight; + type RemoveItemsLimit = ConstU32<{ REMOVE_ITEMS_LIMIT }>; + type AssetIdParameter = Compact; + type CreateOrigin = AsEnsureOriginWithArg>; + type CallbackHandle = (); + pallet_assets::runtime_benchmarks_enabled! { + type BenchmarkHelper = BenchmarkHelper; + } +} + +// Local assets +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type Currency = Balances; + type ForceOrigin = AssetsForceOrigin; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type AssetAccountDeposit = ConstU128<{ currency::deposit(1, 18) }>; + type WeightInfo = pallet_assets::weights::SubstrateWeight; + type RemoveItemsLimit = ConstU32<{ REMOVE_ITEMS_LIMIT }>; + type AssetIdParameter = Compact; + type CreateOrigin = AsEnsureOriginWithArg>; + type CallbackHandle = (); + pallet_assets::runtime_benchmarks_enabled! { + type BenchmarkHelper = BenchmarkHelper; + } +} + +// We instruct how to register the Assets +// In this case, we tell it to Create an Asset in pallet-assets +pub struct AssetRegistrar; +use frame_support::{pallet_prelude::DispatchResult, transactional}; + +impl pallet_asset_manager::AssetRegistrar for AssetRegistrar { + #[transactional] + fn create_foreign_asset( + asset: AssetId, + min_balance: Balance, + metadata: AssetRegistrarMetadata, + is_sufficient: bool, + ) -> DispatchResult { + Assets::force_create( + RuntimeOrigin::root(), + asset.into(), + AssetManager::account_id(), + is_sufficient, + min_balance, + )?; + + // TODO uncomment when we feel comfortable + /* + // The asset has been created. Let's put the revert code in the precompile address + let precompile_address = Runtime::asset_id_to_account(ASSET_PRECOMPILE_ADDRESS_PREFIX, asset); + pallet_evm::AccountCodes::::insert( + precompile_address, + vec![0x60, 0x00, 0x60, 0x00, 0xfd], + );*/ + + // Lastly, the metadata + Assets::force_set_metadata( + RuntimeOrigin::root(), + asset.into(), + metadata.name, + metadata.symbol, + metadata.decimals, + metadata.is_frozen, + ) + } + + #[transactional] + fn create_local_asset( + asset: AssetId, + _creator: AccountId, + min_balance: Balance, + is_sufficient: bool, + owner: AccountId, + ) -> DispatchResult { + // We create with root, because we need to decide whether we want to create the asset + // as sufficient. Take into account this does not hold any reserved amount + // in pallet-assets + LocalAssets::force_create( + RuntimeOrigin::root(), + asset.into(), + owner, + is_sufficient, + min_balance, + )?; + + // No metadata needs to be set, as this can be set through regular calls + + // The asset has been created. Let's put the revert code in the precompile address + let precompile_address: H160 = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, asset).into(); + pallet_evm::AccountCodes::::insert( + precompile_address, + vec![0x60, 0x00, 0x60, 0x00, 0xfd], + ); + Ok(()) + } + + #[transactional] + fn destroy_foreign_asset(asset: AssetId) -> DispatchResult { + // Mark the asset as destroying + Assets::start_destroy(RuntimeOrigin::root(), asset.into())?; + + // We remove the EVM revert code + // This does not panick even if there is no code in the address + let precompile_address: H160 = + Runtime::asset_id_to_account(FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, asset).into(); + pallet_evm::AccountCodes::::remove(precompile_address); + Ok(()) + } + + #[transactional] + fn destroy_local_asset(asset: AssetId) -> DispatchResult { + // Mark the asset as destroying + LocalAssets::start_destroy(RuntimeOrigin::root(), asset.into())?; + + // We remove the EVM revert code + // This does not panick even if there is no code in the address + let precompile_address: H160 = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, asset).into(); + pallet_evm::AccountCodes::::remove(precompile_address); + Ok(()) + } + + fn destroy_asset_dispatch_info_weight(asset: AssetId) -> Weight { + // For us both of them (Foreign and Local) have the same annotated weight for a given + // witness + // We need to take the dispatch info from the destroy call, which is already annotated in + // the assets pallet + // Additionally, we need to add a DB write for removing the precompile revert code in the + // EVM + + // This is the dispatch info of destroy + let call_weight = RuntimeCall::Assets( + pallet_assets::Call::::start_destroy { + id: asset.into(), + }, + ) + .get_dispatch_info() + .weight; + + // This is the db write + call_weight.saturating_add(::DbWeight::get().writes(1)) + } +} + +pub struct LocalAssetIdCreator; +impl pallet_asset_manager::LocalAssetIdCreator for LocalAssetIdCreator { + fn create_asset_id_from_metadata(local_asset_counter: u128) -> AssetId { + // Our means of converting a local asset counter to an assetId + // We basically hash (local asset counter) + let mut result: [u8; 16] = [0u8; 16]; + let hash: H256 = + local_asset_counter.using_encoded(::Hashing::hash); + result.copy_from_slice(&hash.as_fixed_bytes()[0..16]); + u128::from_le_bytes(result) + } +} + +#[derive(Clone, Default, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub struct AssetRegistrarMetadata { + pub name: Vec, + pub symbol: Vec, + pub decimals: u8, + pub is_frozen: bool, +} + +pub type ForeignAssetModifierOrigin = EitherOfDiverse< + EnsureRoot, + EitherOfDiverse< + pallet_collective::EnsureProportionMoreThan, + governance::custom_origins::GeneralAdmin, + >, +>; +pub type LocalAssetModifierOrigin = EitherOfDiverse< + EnsureRoot, + EitherOfDiverse< + pallet_collective::EnsureProportionMoreThan, + governance::custom_origins::GeneralAdmin, + >, +>; + +impl pallet_asset_manager::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type AssetRegistrarMetadata = AssetRegistrarMetadata; + type ForeignAssetType = xcm_config::AssetType; + type AssetRegistrar = AssetRegistrar; + type ForeignAssetModifierOrigin = ForeignAssetModifierOrigin; + type LocalAssetModifierOrigin = LocalAssetModifierOrigin; + type LocalAssetIdCreator = LocalAssetIdCreator; + type Currency = Balances; + type LocalAssetDeposit = AssetDeposit; + type WeightInfo = pallet_asset_manager::weights::SubstrateWeight; +} + +// Instruct how to go from an H160 to an AssetID +// We just take the lowest 128 bits +impl AccountIdAssetIdConversion for Runtime { + /// The way to convert an account to assetId is by ensuring that the prefix is 0XFFFFFFFF + /// and by taking the lowest 128 bits as the assetId + fn account_to_asset_id(account: AccountId) -> Option<(Vec, AssetId)> { + let h160_account: H160 = account.into(); + let mut data = [0u8; 16]; + let (prefix_part, id_part) = h160_account.as_fixed_bytes().split_at(4); + if prefix_part == FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX + || prefix_part == LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX + { + data.copy_from_slice(id_part); + let asset_id: AssetId = u128::from_be_bytes(data).into(); + Some((prefix_part.to_vec(), asset_id)) + } else { + None + } + } + + // The opposite conversion + fn asset_id_to_account(prefix: &[u8], asset_id: AssetId) -> AccountId { + let mut data = [0u8; 20]; + data[0..4].copy_from_slice(prefix); + data[4..20].copy_from_slice(&asset_id.to_be_bytes()); + AccountId::from(data) + } +} diff --git a/tracing/2402/runtime/moonbeam/src/governance/councils.rs b/tracing/2402/runtime/moonbeam/src/governance/councils.rs new file mode 100644 index 0000000..967b893 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/src/governance/councils.rs @@ -0,0 +1,88 @@ +// Copyright 2019-2023 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Councils for Gov1 and Gov2 + +use super::*; + +pub type CouncilInstance = pallet_collective::Instance1; +pub type TechCommitteeInstance = pallet_collective::Instance2; +pub type TreasuryCouncilInstance = pallet_collective::Instance3; +pub type OpenTechCommitteeInstance = pallet_collective::Instance4; + +impl pallet_collective::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Proposal = RuntimeCall; + /// The maximum amount of time (in blocks) for council members to vote on motions. + /// Motions may end in fewer blocks if enough votes are cast to determine the result. + type MotionDuration = ConstU32<{ 3 * DAYS }>; + /// The maximum number of proposals that can be open in the council at once. + type MaxProposals = ConstU32<100>; + /// The maximum number of council members. + type MaxMembers = ConstU32<100>; + type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote; + type WeightInfo = pallet_collective::weights::SubstrateWeight; + type SetMembersOrigin = referenda::GeneralAdminOrRoot; +} + +impl pallet_collective::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Proposal = RuntimeCall; + /// The maximum amount of time (in blocks) for technical committee members to vote on motions. + /// Motions may end in fewer blocks if enough votes are cast to determine the result. + type MotionDuration = ConstU32<{ 3 * DAYS }>; + /// The maximum number of proposals that can be open in the technical committee at once. + type MaxProposals = ConstU32<100>; + /// The maximum number of technical committee members. + type MaxMembers = ConstU32<100>; + type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote; + type WeightInfo = pallet_collective::weights::SubstrateWeight; + type SetMembersOrigin = referenda::GeneralAdminOrRoot; +} + +impl pallet_collective::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Proposal = RuntimeCall; + /// The maximum amount of time (in blocks) for treasury council members to vote on motions. + /// Motions may end in fewer blocks if enough votes are cast to determine the result. + type MotionDuration = ConstU32<{ 3 * DAYS }>; + /// The maximum number of proposals that can be open in the treasury council at once. + type MaxProposals = ConstU32<20>; + /// The maximum number of treasury council members. + type MaxMembers = ConstU32<9>; + type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote; + type WeightInfo = pallet_collective::weights::SubstrateWeight; + type SetMembersOrigin = referenda::GeneralAdminOrRoot; +} + +impl pallet_collective::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Proposal = RuntimeCall; + /// The maximum amount of time (in blocks) for technical committee members to vote on motions. + /// Motions may end in fewer blocks if enough votes are cast to determine the result. + type MotionDuration = ConstU32<{ 14 * DAYS }>; + /// The maximum number of proposals that can be open in the technical committee at once. + type MaxProposals = ConstU32<100>; + /// The maximum number of technical committee members. + type MaxMembers = ConstU32<100>; + type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote; + type WeightInfo = pallet_collective::weights::SubstrateWeight; + type SetMembersOrigin = referenda::GeneralAdminOrRoot; +} diff --git a/tracing/2402/runtime/moonbeam/src/governance/democracy.rs b/tracing/2402/runtime/moonbeam/src/governance/democracy.rs new file mode 100644 index 0000000..f382075 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/src/governance/democracy.rs @@ -0,0 +1,77 @@ +// Copyright 2019-2023 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Democracy config for Gov1 + +use super::councils::*; +use crate::*; + +// The purpose of this offset is to ensure that a democratic proposal will not apply in the same +// block as a round change. +const ENACTMENT_OFFSET: u32 = 900; + +impl pallet_democracy::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type EnactmentPeriod = ConstU32<{ 2 * DAYS + ENACTMENT_OFFSET }>; + type LaunchPeriod = ConstU32<{ 7 * DAYS }>; + type VotingPeriod = ConstU32<{ 14 * DAYS }>; + + type VoteLockingPeriod = ConstU32<{ 7 * DAYS }>; + type FastTrackVotingPeriod = ConstU32<{ 1 * DAYS }>; + type MinimumDeposit = ConstU128<{ 4 * currency::GLMR * currency::SUPPLY_FACTOR }>; + /// To decide what their next motion is. + type ExternalOrigin = + pallet_collective::EnsureProportionAtLeast; + /// To have the next scheduled referendum be a straight majority-carries vote. + type ExternalMajorityOrigin = + pallet_collective::EnsureProportionAtLeast; + /// To have the next scheduled referendum be a straight default-carries (NTB) vote. + type ExternalDefaultOrigin = + pallet_collective::EnsureProportionAtLeast; + /// To allow a shorter voting/enactment period for external proposals. + type FastTrackOrigin = + pallet_collective::EnsureProportionAtLeast; + /// To instant fast track. + type InstantOrigin = + pallet_collective::EnsureProportionAtLeast; + // To cancel a proposal which has been passed. + type CancellationOrigin = EitherOfDiverse< + EnsureRoot, + pallet_collective::EnsureProportionAtLeast, + >; + // To cancel a proposal before it has been passed. + type CancelProposalOrigin = EitherOfDiverse< + EnsureRoot, + pallet_collective::EnsureProportionAtLeast, + >; + type BlacklistOrigin = EnsureRoot; + // Any single technical committee member may veto a coming council proposal, however they can + // only do it once and it lasts only for the cooloff period. + type VetoOrigin = pallet_collective::EnsureMember; + type CooloffPeriod = ConstU32<{ 7 * DAYS }>; + type Slash = (); + type InstantAllowed = ConstBool; + type Scheduler = Scheduler; + type MaxVotes = ConstU32<100>; + type PalletsOrigin = OriginCaller; + type WeightInfo = pallet_democracy::weights::SubstrateWeight; + type MaxProposals = ConstU32<100>; + type Preimages = Preimage; + type MaxDeposits = ConstU32<100>; + type MaxBlacklisted = ConstU32<100>; + type SubmitOrigin = EnsureSigned; +} diff --git a/tracing/2402/runtime/moonbeam/src/governance/mod.rs b/tracing/2402/runtime/moonbeam/src/governance/mod.rs new file mode 100644 index 0000000..bc946aa --- /dev/null +++ b/tracing/2402/runtime/moonbeam/src/governance/mod.rs @@ -0,0 +1,30 @@ +// Copyright 2019-2023 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Governance configurations + +pub mod councils; +mod democracy; +pub mod referenda; + +use super::*; + +mod origins; +pub use origins::{ + custom_origins, GeneralAdmin, ReferendumCanceller, ReferendumKiller, WhitelistedCaller, +}; +mod tracks; +pub use tracks::TracksInfo; diff --git a/tracing/2402/runtime/moonbeam/src/governance/origins.rs b/tracing/2402/runtime/moonbeam/src/governance/origins.rs new file mode 100644 index 0000000..d873cc9 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/src/governance/origins.rs @@ -0,0 +1,82 @@ +// Copyright 2019-2023 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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. + +//! Custom origins for governance interventions. +#![cfg_attr(not(feature = "std"), no_std)] + +pub use custom_origins::*; + +#[frame_support::pallet] +pub mod custom_origins { + use frame_support::pallet_prelude::*; + use strum_macros::EnumString; + + #[pallet::config] + pub trait Config: frame_system::Config {} + + #[pallet::pallet] + pub struct Pallet(_); + + #[derive( + PartialEq, Eq, Clone, MaxEncodedLen, Encode, Decode, TypeInfo, RuntimeDebug, EnumString, + )] + #[strum(serialize_all = "snake_case")] + #[pallet::origin] + pub enum Origin { + /// Origin able to dispatch a whitelisted call. + WhitelistedCaller, + /// General admin + GeneralAdmin, + /// Origin able to cancel referenda. + ReferendumCanceller, + /// Origin able to kill referenda. + ReferendumKiller, + } + + macro_rules! decl_unit_ensures { + ( $name:ident: $success_type:ty = $success:expr ) => { + pub struct $name; + impl> + From> + EnsureOrigin for $name + { + type Success = $success_type; + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + Origin::$name => Ok($success), + r => Err(O::from(r)), + }) + } + #[cfg(feature = "runtime-benchmarks")] + fn try_successful_origin() -> Result { + Ok(O::from(Origin::$name)) + } + } + }; + ( $name:ident ) => { decl_unit_ensures! { $name : () = () } }; + ( $name:ident: $success_type:ty = $success:expr, $( $rest:tt )* ) => { + decl_unit_ensures! { $name: $success_type = $success } + decl_unit_ensures! { $( $rest )* } + }; + ( $name:ident, $( $rest:tt )* ) => { + decl_unit_ensures! { $name } + decl_unit_ensures! { $( $rest )* } + }; + () => {} + } + decl_unit_ensures!( + ReferendumCanceller, + ReferendumKiller, + WhitelistedCaller, + GeneralAdmin + ); +} diff --git a/tracing/2402/runtime/moonbeam/src/governance/referenda.rs b/tracing/2402/runtime/moonbeam/src/governance/referenda.rs new file mode 100644 index 0000000..aaf7f9a --- /dev/null +++ b/tracing/2402/runtime/moonbeam/src/governance/referenda.rs @@ -0,0 +1,98 @@ +// Copyright 2019-2023 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! # Gov2 config +//! Includes runtime configs for these substrate pallets: +//! 1. pallet-conviction-voting +//! 2. pallet-whitelist +//! 3. pallet-referenda + +use super::*; +use crate::currency::{GLMR, SUPPLY_FACTOR}; +use frame_support::traits::{EitherOf, MapSuccess}; +use frame_system::EnsureRootWithSuccess; +use sp_runtime::traits::Replace; + +parameter_types! { + pub const VoteLockingPeriod: BlockNumber = 1 * DAYS; +} + +impl pallet_conviction_voting::Config for Runtime { + type WeightInfo = pallet_conviction_voting::weights::SubstrateWeight; + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type Polls = Referenda; + type MaxTurnout = frame_support::traits::TotalIssuanceOf; + // Maximum number of concurrent votes an account may have + type MaxVotes = ConstU32<20>; + // Minimum period of vote locking + type VoteLockingPeriod = VoteLockingPeriod; +} + +parameter_types! { + pub const AlarmInterval: BlockNumber = 1; + pub const SubmissionDeposit: Balance = 10 * GLMR * SUPPLY_FACTOR; + pub const UndecidingTimeout: BlockNumber = 14 * DAYS; +} + +// Origin for general admin or root +pub type GeneralAdminOrRoot = EitherOf, origins::GeneralAdmin>; + +impl custom_origins::Config for Runtime {} + +// The purpose of this pallet is to queue calls to be dispatched as by root later => the Dispatch +// origin corresponds to the Gov2 Whitelist track. +impl pallet_whitelist::Config for Runtime { + type WeightInfo = pallet_whitelist::weights::SubstrateWeight; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type WhitelistOrigin = EitherOf< + EnsureRootWithSuccess>, + MapSuccess< + pallet_collective::EnsureProportionAtLeast< + Self::AccountId, + OpenTechCommitteeInstance, + 5, + 9, + >, + Replace>, + >, + >; + type DispatchWhitelistedOrigin = EitherOf, WhitelistedCaller>; + type Preimages = Preimage; +} + +pallet_referenda::impl_tracksinfo_get!(TracksInfo, Balance, BlockNumber); + +impl pallet_referenda::Config for Runtime { + type WeightInfo = pallet_referenda::weights::SubstrateWeight; + type RuntimeCall = RuntimeCall; + type RuntimeEvent = RuntimeEvent; + type Scheduler = Scheduler; + type Currency = Balances; + type SubmitOrigin = frame_system::EnsureSigned; + type CancelOrigin = EitherOf, ReferendumCanceller>; + type KillOrigin = EitherOf, ReferendumKiller>; + type Slash = Treasury; + type Votes = pallet_conviction_voting::VotesOf; + type Tally = pallet_conviction_voting::TallyOf; + type SubmissionDeposit = SubmissionDeposit; + type MaxQueued = ConstU32<100>; + type UndecidingTimeout = UndecidingTimeout; + type AlarmInterval = AlarmInterval; + type Tracks = TracksInfo; + type Preimages = Preimage; +} diff --git a/tracing/2402/runtime/moonbeam/src/governance/tracks.rs b/tracing/2402/runtime/moonbeam/src/governance/tracks.rs new file mode 100644 index 0000000..34b527c --- /dev/null +++ b/tracing/2402/runtime/moonbeam/src/governance/tracks.rs @@ -0,0 +1,179 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +//! Track configurations for governance. + +use super::*; +use crate::currency::{GLMR, KILOGLMR, SUPPLY_FACTOR}; +use sp_std::str::FromStr; + +const fn percent(x: i32) -> sp_runtime::FixedI64 { + sp_runtime::FixedI64::from_rational(x as u128, 100) +} +const fn permill(x: i32) -> sp_runtime::FixedI64 { + sp_runtime::FixedI64::from_rational(x as u128, 1000) +} + +use pallet_referenda::Curve; +const TRACKS_DATA: [(u16, pallet_referenda::TrackInfo); 5] = [ + ( + 0, + pallet_referenda::TrackInfo { + // Name of this track. + name: "root", + // A limit for the number of referenda on this track that can be being decided at once. + // For Root origin this should generally be just one. + max_deciding: 5, + // Amount that must be placed on deposit before a decision can be made. + decision_deposit: 20 * KILOGLMR * SUPPLY_FACTOR, + // Amount of time this must be submitted for before a decision can be made. + prepare_period: 1 * DAYS, + // Amount of time that a decision may take to be approved prior to cancellation. + decision_period: 14 * DAYS, + // Amount of time that the approval criteria must hold before it can be approved. + confirm_period: 1 * DAYS, + // Minimum amount of time that an approved proposal must be in the dispatch queue. + min_enactment_period: 1 * DAYS, + // Minimum aye votes as percentage of overall conviction-weighted votes needed for + // approval as a function of time into decision period. + min_approval: Curve::make_reciprocal(4, 14, percent(80), percent(50), percent(100)), + // Minimum pre-conviction aye-votes ("support") as percentage of overall population that + // is needed for approval as a function of time into decision period. + min_support: Curve::make_linear(14, 14, permill(5), percent(25)), + }, + ), + ( + 1, + pallet_referenda::TrackInfo { + name: "whitelisted_caller", + max_deciding: 100, + decision_deposit: 2 * KILOGLMR * SUPPLY_FACTOR, + prepare_period: 10 * MINUTES, + decision_period: 14 * DAYS, + confirm_period: 10 * MINUTES, + min_enactment_period: 30 * MINUTES, + min_approval: Curve::make_reciprocal(1, 14, percent(96), percent(50), percent(100)), + min_support: Curve::make_reciprocal(1, 14 * 24, percent(1), percent(0), percent(2)), + }, + ), + ( + 2, + pallet_referenda::TrackInfo { + name: "general_admin", + max_deciding: 10, + decision_deposit: 100 * GLMR * SUPPLY_FACTOR, + prepare_period: 1 * HOURS, + decision_period: 14 * DAYS, + confirm_period: 1 * DAYS, + min_enactment_period: 1 * DAYS, + min_approval: Curve::make_reciprocal(4, 14, percent(80), percent(50), percent(100)), + min_support: Curve::make_reciprocal(7, 14, percent(10), percent(0), percent(50)), + }, + ), + ( + 3, + pallet_referenda::TrackInfo { + name: "referendum_canceller", + max_deciding: 20, + decision_deposit: 2 * KILOGLMR * SUPPLY_FACTOR, + prepare_period: 1 * HOURS, + decision_period: 14 * DAYS, + confirm_period: 3 * HOURS, + min_enactment_period: 10 * MINUTES, + min_approval: Curve::make_reciprocal(1, 14, percent(96), percent(50), percent(100)), + min_support: Curve::make_reciprocal(1, 14, percent(1), percent(0), percent(10)), + }, + ), + ( + 4, + pallet_referenda::TrackInfo { + name: "referendum_killer", + max_deciding: 100, + decision_deposit: 4 * KILOGLMR * SUPPLY_FACTOR, + prepare_period: 1 * HOURS, + decision_period: 14 * DAYS, + confirm_period: 3 * HOURS, + min_enactment_period: 10 * MINUTES, + min_approval: Curve::make_reciprocal(1, 14, percent(96), percent(50), percent(100)), + min_support: Curve::make_reciprocal(1, 14, percent(1), percent(0), percent(10)), + }, + ), +]; + +pub struct TracksInfo; +impl pallet_referenda::TracksInfo for TracksInfo { + type Id = u16; + type RuntimeOrigin = ::PalletsOrigin; + fn tracks() -> &'static [(Self::Id, pallet_referenda::TrackInfo)] { + &TRACKS_DATA[..] + } + fn track_for(id: &Self::RuntimeOrigin) -> Result { + if let Ok(system_origin) = frame_system::RawOrigin::try_from(id.clone()) { + match system_origin { + frame_system::RawOrigin::Root => { + if let Some((track_id, _)) = Self::tracks() + .into_iter() + .find(|(_, track)| track.name == "root") + { + Ok(*track_id) + } else { + Err(()) + } + } + _ => Err(()), + } + } else if let Ok(custom_origin) = custom_origins::Origin::try_from(id.clone()) { + if let Some((track_id, _)) = Self::tracks().into_iter().find(|(_, track)| { + if let Ok(track_custom_origin) = custom_origins::Origin::from_str(track.name) { + track_custom_origin == custom_origin + } else { + false + } + }) { + Ok(*track_id) + } else { + Err(()) + } + } else { + Err(()) + } + } +} + +#[test] +/// To ensure voters are always locked into their vote +fn vote_locking_always_longer_than_enactment_period() { + for (_, track) in TRACKS_DATA { + assert!( + ::VoteLockingPeriod::get() + >= track.min_enactment_period, + "Track {} has enactment period {} < vote locking period {}", + track.name, + track.min_enactment_period, + ::VoteLockingPeriod::get(), + ); + } +} + +#[test] +fn all_tracks_have_origins() { + for (_, track) in TRACKS_DATA { + // check name.into() is successful either converts into "root" or custom origin + let track_is_root = track.name == "root"; + let track_has_custom_origin = custom_origins::Origin::from_str(track.name).is_ok(); + assert!(track_is_root || track_has_custom_origin); + } +} diff --git a/tracing/2402/runtime/moonbeam/src/lib.rs b/tracing/2402/runtime/moonbeam/src/lib.rs new file mode 100644 index 0000000..b8df852 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/src/lib.rs @@ -0,0 +1,1707 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! The Moonbeam Runtime. +//! +//! Primary features of this runtime include: +//! * Ethereum compatibility +//! * Moonbeam tokenomics + +#![cfg_attr(not(feature = "std"), no_std)] +// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. +#![recursion_limit = "256"] + +// Make the WASM binary available. +#[cfg(feature = "std")] +include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); + +use account::AccountId20; +use cumulus_pallet_parachain_system::{RelayChainStateProof, RelaychainDataProvider}; +use cumulus_primitives_core::relay_chain; +use fp_rpc::TransactionStatus; + +// Re-export required by get! macro. +use cumulus_primitives_core::{relay_chain::BlockNumber as RelayBlockNumber, DmpMessageHandler}; +#[cfg(feature = "std")] +pub use fp_evm::GenesisAccount; +pub use frame_support::traits::Get; +use frame_support::{ + construct_runtime, + dispatch::{DispatchClass, GetDispatchInfo}, + ensure, + pallet_prelude::DispatchResult, + parameter_types, + traits::{ + ConstBool, ConstU128, ConstU16, ConstU32, ConstU64, ConstU8, Contains, + Currency as CurrencyT, EitherOfDiverse, EqualPrivilegeOnly, Imbalance, InstanceFilter, + OffchainWorker, OnFinalize, OnIdle, OnInitialize, OnRuntimeUpgrade, OnUnbalanced, + }, + weights::{ + constants::{RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND}, + ConstantMultiplier, Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, + WeightToFeePolynomial, + }, + PalletId, +}; +use frame_system::{EnsureRoot, EnsureSigned}; +pub use moonbeam_core_primitives::{ + AccountId, AccountIndex, Address, AssetId, Balance, BlockNumber, DigestItem, Hash, Header, + Index, Signature, +}; +use moonbeam_rpc_primitives_txpool::TxPoolResponse; +use pallet_balances::NegativeImbalance; +use pallet_ethereum::Call::transact; +use pallet_ethereum::{PostLogContent, Transaction as EthereumTransaction}; +use pallet_evm::{ + Account as EVMAccount, EVMCurrencyAdapter, EnsureAddressNever, EnsureAddressRoot, + FeeCalculator, GasWeightMapping, OnChargeEVMTransaction as OnChargeEVMTransactionT, Runner, +}; +pub use pallet_parachain_staking::{InflationInfo, Range}; +use pallet_transaction_payment::{CurrencyAdapter, Multiplier, TargetedFeeAdjustment}; +use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; +use scale_info::TypeInfo; +use smallvec::smallvec; +use sp_api::impl_runtime_apis; +use sp_core::{OpaqueMetadata, H160, H256, U256}; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, + traits::{ + BlakeTwo256, Block as BlockT, DispatchInfoOf, Dispatchable, IdentityLookup, + PostDispatchInfoOf, UniqueSaturatedInto, Zero, + }, + transaction_validity::{ + InvalidTransaction, TransactionSource, TransactionValidity, TransactionValidityError, + }, + ApplyExtrinsicResult, FixedPointNumber, Perbill, Permill, Perquintill, SaturatedConversion, +}; +use sp_std::{convert::TryFrom, prelude::*}; + +#[cfg(feature = "std")] +use sp_version::NativeVersion; +use sp_version::RuntimeVersion; + +use nimbus_primitives::CanAuthor; + +mod precompiles; +pub use precompiles::{ + MoonbeamPrecompiles, PrecompileName, FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, +}; + +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; + +pub type Precompiles = MoonbeamPrecompiles; + +pub mod asset_config; +pub mod governance; +pub mod xcm_config; +use governance::councils::*; + +/// GLMR, the native token, uses 18 decimals of precision. +pub mod currency { + use super::Balance; + + // Provide a common factor between runtimes based on a supply of 10_000_000 tokens. + pub const SUPPLY_FACTOR: Balance = 100; + + pub const WEI: Balance = 1; + pub const KILOWEI: Balance = 1_000; + pub const MEGAWEI: Balance = 1_000_000; + pub const GIGAWEI: Balance = 1_000_000_000; + pub const MICROGLMR: Balance = 1_000_000_000_000; + pub const MILLIGLMR: Balance = 1_000_000_000_000_000; + pub const GLMR: Balance = 1_000_000_000_000_000_000; + pub const KILOGLMR: Balance = 1_000_000_000_000_000_000_000; + + pub const TRANSACTION_BYTE_FEE: Balance = 1 * GIGAWEI * SUPPLY_FACTOR; + pub const STORAGE_BYTE_FEE: Balance = 100 * MICROGLMR * SUPPLY_FACTOR; + pub const WEIGHT_FEE: Balance = 50 * KILOWEI * SUPPLY_FACTOR; + + pub const fn deposit(items: u32, bytes: u32) -> Balance { + items as Balance * 100 * MILLIGLMR * SUPPLY_FACTOR + (bytes as Balance) * STORAGE_BYTE_FEE + } +} + +/// Maximum weight per block +pub const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND, u64::MAX) + .saturating_div(2) + .set_proof_size(cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64); + +pub const MILLISECS_PER_BLOCK: u64 = 12000; +pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); +pub const HOURS: BlockNumber = MINUTES * 60; +pub const DAYS: BlockNumber = HOURS * 24; +pub const WEEKS: BlockNumber = DAYS * 7; +pub const MONTHS: BlockNumber = DAYS * 30; +/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know +/// the specifics of the runtime. They can then be made to be agnostic over specific formats +/// of data like extrinsics, allowing for them to continue syncing the network through upgrades +/// to even the core datastructures. +pub mod opaque { + use super::*; + + pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; + pub type Block = generic::Block; + + impl_opaque_keys! { + pub struct SessionKeys { + pub nimbus: AuthorInherent, + pub vrf: session_keys_primitives::VrfSessionKey, + } + } +} + +/// This runtime version. +/// The spec_version is composed of 2x2 digits. The first 2 digits represent major changes +/// that can't be skipped, such as data migration upgrades. The last 2 digits represent minor +/// changes which can be skipped. +#[sp_version::runtime_version] +pub const VERSION: RuntimeVersion = RuntimeVersion { + spec_name: create_runtime_str!("moonbeam"), + impl_name: create_runtime_str!("moonbeam"), + authoring_version: 3, + spec_version: 2402, + impl_version: 0, + apis: RUNTIME_API_VERSIONS, + transaction_version: 2, + state_version: 0, +}; + +/// The version information used to identify this runtime when compiled natively. +#[cfg(feature = "std")] +pub fn native_version() -> NativeVersion { + NativeVersion { + runtime_version: VERSION, + can_author_with: Default::default(), + } +} + +const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); +const NORMAL_WEIGHT: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_mul(3).saturating_div(4); +// Here we assume Ethereum's base fee of 21000 gas and convert to weight, but we +// subtract roughly the cost of a balance transfer from it (about 1/3 the cost) +// and some cost to account for per-byte-fee. +// TODO: we should use benchmarking's overhead feature to measure this +pub const EXTRINSIC_BASE_WEIGHT: Weight = Weight::from_parts(10000 * WEIGHT_PER_GAS, 0); + +pub struct RuntimeBlockWeights; +impl Get for RuntimeBlockWeights { + fn get() -> frame_system::limits::BlockWeights { + frame_system::limits::BlockWeights::builder() + .for_class(DispatchClass::Normal, |weights| { + weights.base_extrinsic = EXTRINSIC_BASE_WEIGHT; + weights.max_total = NORMAL_WEIGHT.into(); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = MAXIMUM_BLOCK_WEIGHT.into(); + weights.reserved = (MAXIMUM_BLOCK_WEIGHT - NORMAL_WEIGHT).into(); + }) + .avg_block_initialization(Perbill::from_percent(10)) + .build() + .expect("Provided BlockWeight definitions are valid, qed") + } +} + +parameter_types! { + pub const Version: RuntimeVersion = VERSION; + /// We allow for 5 MB blocks. + pub BlockLength: frame_system::limits::BlockLength = frame_system::limits::BlockLength + ::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); +} + +impl frame_system::Config for Runtime { + /// The identifier used to distinguish between accounts. + type AccountId = AccountId; + /// The aggregated dispatch type that is available for extrinsics. + type RuntimeCall = RuntimeCall; + /// The lookup mechanism to get account ID from whatever is passed in dispatchers. + type Lookup = IdentityLookup; + /// The index type for storing how many extrinsics an account has signed. + type Index = Index; + /// The index type for blocks. + type BlockNumber = BlockNumber; + /// The type for hashing blocks and tries. + type Hash = Hash; + /// The hashing algorithm used. + type Hashing = BlakeTwo256; + /// The header type. + type Header = generic::Header; + /// The ubiquitous event type. + type RuntimeEvent = RuntimeEvent; + /// The ubiquitous origin type. + type RuntimeOrigin = RuntimeOrigin; + /// Maximum number of block number to block hash mappings to keep (oldest pruned first). + type BlockHashCount = ConstU32<256>; + /// Maximum weight of each block. With a default weight system of 1byte == 1weight, 4mb is ok. + type BlockWeights = RuntimeBlockWeights; + /// Maximum size of all encoded transactions (in bytes) that are allowed in one block. + type BlockLength = BlockLength; + /// Runtime version. + type Version = Version; + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = RocksDbWeight; + type BaseCallFilter = MaintenanceMode; + type SystemWeightInfo = (); + /// This is used as an identifier of the chain. 42 is the generic substrate prefix. + type SS58Prefix = ConstU16<1284>; + type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +impl pallet_utility::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type PalletsOrigin = OriginCaller; + type WeightInfo = pallet_utility::weights::SubstrateWeight; +} + +impl pallet_timestamp::Config for Runtime { + /// A timestamp: milliseconds since the unix epoch. + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = ConstU64<6000>; + type WeightInfo = pallet_timestamp::weights::SubstrateWeight; +} + +impl pallet_balances::Config for Runtime { + type MaxReserves = ConstU32<50>; + type ReserveIdentifier = [u8; 4]; + type MaxLocks = ConstU32<50>; + /// The type for recording an account's balance. + type Balance = Balance; + /// The ubiquitous event type. + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ConstU128<0>; + type AccountStore = System; + type WeightInfo = pallet_balances::weights::SubstrateWeight; +} + +pub struct DealWithFees(sp_std::marker::PhantomData); +impl OnUnbalanced> for DealWithFees +where + R: pallet_balances::Config + pallet_treasury::Config, + pallet_treasury::Pallet: OnUnbalanced>, +{ + // this seems to be called for substrate-based transactions + fn on_unbalanceds(mut fees_then_tips: impl Iterator>) { + if let Some(fees) = fees_then_tips.next() { + // for fees, 80% are burned, 20% to the treasury + let (_, to_treasury) = fees.ration(80, 20); + // Balances pallet automatically burns dropped Negative Imbalances by decreasing + // total_supply accordingly + as OnUnbalanced<_>>::on_unbalanced(to_treasury); + + // handle tip if there is one + if let Some(tip) = fees_then_tips.next() { + // for now we use the same burn/treasury strategy used for regular fees + let (_, to_treasury) = tip.ration(80, 20); + as OnUnbalanced<_>>::on_unbalanced(to_treasury); + } + } + } + + // this is called from pallet_evm for Ethereum-based transactions + // (technically, it calls on_unbalanced, which calls this when non-zero) + fn on_nonzero_unbalanced(amount: NegativeImbalance) { + // Balances pallet automatically burns dropped Negative Imbalances by decreasing + // total_supply accordingly + let (_, to_treasury) = amount.ration(80, 20); + as OnUnbalanced<_>>::on_unbalanced(to_treasury); + } +} + +pub struct LengthToFee; +impl WeightToFeePolynomial for LengthToFee { + type Balance = Balance; + + fn polynomial() -> WeightToFeeCoefficients { + smallvec![ + WeightToFeeCoefficient { + degree: 1, + coeff_frac: Perbill::zero(), + coeff_integer: currency::TRANSACTION_BYTE_FEE, + negative: false, + }, + WeightToFeeCoefficient { + degree: 3, + coeff_frac: Perbill::zero(), + coeff_integer: 1 * currency::SUPPLY_FACTOR, + negative: false, + }, + ] + } +} + +impl pallet_transaction_payment::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnChargeTransaction = CurrencyAdapter>; + type OperationalFeeMultiplier = ConstU8<5>; + type WeightToFee = ConstantMultiplier>; + type LengthToFee = LengthToFee; + type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; +} + +impl pallet_ethereum_chain_id::Config for Runtime {} + +/// Current approximation of the gas/s consumption considering +/// EVM execution over compiled WASM (on 4.4Ghz CPU). +/// Given the 500ms Weight, from which 75% only are used for transactions, +/// the total EVM execution gas limit is: GAS_PER_SECOND * 0.500 * 0.75 ~= 15_000_000. +pub const GAS_PER_SECOND: u64 = 40_000_000; + +/// Approximate ratio of the amount of Weight per Gas. +/// u64 works for approximations because Weight is a very small unit compared to gas. +pub const WEIGHT_PER_GAS: u64 = WEIGHT_REF_TIME_PER_SECOND / GAS_PER_SECOND; + +parameter_types! { + pub BlockGasLimit: U256 + = U256::from(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT.ref_time() / WEIGHT_PER_GAS); + /// The portion of the `NORMAL_DISPATCH_RATIO` that we adjust the fees with. Blocks filled less + /// than this will decrease the weight and more will increase. + pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25); + /// The adjustment variable of the runtime. Higher values will cause `TargetBlockFullness` to + /// change the fees more rapidly. This low value causes changes to occur slowly over time. + pub AdjustmentVariable: Multiplier = Multiplier::saturating_from_rational(4, 1_000); + /// Minimum amount of the multiplier. This value cannot be too low. A test case should ensure + /// that combined with `AdjustmentVariable`, we can recover from the minimum. + /// See `multiplier_can_grow_from_zero` in integration_tests.rs. + /// This value is currently only used by pallet-transaction-payment as an assertion that the + /// next multiplier is always > min value. + pub MinimumMultiplier: Multiplier = Multiplier::from(1u128); + /// Maximum multiplier. We pick a value that is expensive but not impossibly so; it should act + /// as a safety net. + pub MaximumMultiplier: Multiplier = Multiplier::from(100_000u128); + pub PrecompilesValue: MoonbeamPrecompiles = MoonbeamPrecompiles::<_>::new(); + pub WeightPerGas: Weight = Weight::from_parts(WEIGHT_PER_GAS, 0); + /// The amount of gas per pov. A ratio of 4 if we convert ref_time to gas and we compare + /// it with the pov_size for a block. E.g. + /// ceil( + /// (max_extrinsic.ref_time() / max_extrinsic.proof_size()) / WEIGHT_PER_GAS + /// ) + pub const GasLimitPovSizeRatio: u64 = 4; +} + +pub struct TransactionPaymentAsGasPrice; +impl FeeCalculator for TransactionPaymentAsGasPrice { + fn min_gas_price() -> (U256, Weight) { + // note: transaction-payment differs from EIP-1559 in that its tip and length fees are not + // scaled by the multiplier, which means its multiplier will be overstated when + // applied to an ethereum transaction + // note: transaction-payment uses both a congestion modifier (next_fee_multiplier, which is + // updated once per block in on_finalize) and a 'WeightToFee' implementation. Our + // runtime implements this as a 'ConstantModifier', so we can get away with a simple + // multiplication here. + // It is imperative that `saturating_mul_int` be performed as late as possible in the + // expression since it involves fixed point multiplication with a division by a fixed + // divisor. This leads to truncation and subsequent precision loss if performed too early. + // This can lead to min_gas_price being same across blocks even if the multiplier changes. + // There's still some precision loss when the final `gas_price` (used_gas * min_gas_price) + // is computed in frontier, but that's currently unavoidable. + let min_gas_price = TransactionPayment::next_fee_multiplier() + .saturating_mul_int(currency::WEIGHT_FEE.saturating_mul(WEIGHT_PER_GAS as u128)); + ( + min_gas_price.into(), + ::DbWeight::get().reads(1), + ) + } +} + +/// Parameterized slow adjusting fee updated based on +/// https://w3f-research.readthedocs.io/en/latest/polkadot/overview/2-token-economics.html#-2.-slow-adjusting-mechanism // editorconfig-checker-disable-line +/// +/// The adjustment algorithm boils down to: +/// +/// diff = (previous_block_weight - target) / maximum_block_weight +/// next_multiplier = prev_multiplier * (1 + (v * diff) + ((v * diff)^2 / 2)) +/// assert(next_multiplier > min) +/// where: v is AdjustmentVariable +/// target is TargetBlockFullness +/// min is MinimumMultiplier +pub type SlowAdjustingFeeUpdate = TargetedFeeAdjustment< + R, + TargetBlockFullness, + AdjustmentVariable, + MinimumMultiplier, + MaximumMultiplier, +>; + +use frame_support::traits::FindAuthor; +//TODO It feels like this shold be able to work for any T: H160, but I tried for +// embarassingly long and couldn't figure that out. + +/// The author inherent provides a AccountId20, but pallet evm needs an H160. +/// This simple adapter makes the conversion. +pub struct FindAuthorAdapter(sp_std::marker::PhantomData); + +impl FindAuthor for FindAuthorAdapter +where + Inner: FindAuthor, +{ + fn find_author<'a, I>(digests: I) -> Option + where + I: 'a + IntoIterator, + { + Inner::find_author(digests).map(Into::into) + } +} + +moonbeam_runtime_common::impl_on_charge_evm_transaction!(); + +impl pallet_evm::Config for Runtime { + type FeeCalculator = TransactionPaymentAsGasPrice; + type GasWeightMapping = pallet_evm::FixedGasWeightMapping; + type WeightPerGas = WeightPerGas; + type BlockHashMapping = pallet_ethereum::EthereumBlockHashMapping; + type CallOrigin = EnsureAddressRoot; + type WithdrawOrigin = EnsureAddressNever; + type AddressMapping = moonbeam_runtime_common::IntoAddressMapping; + type Currency = Balances; + type RuntimeEvent = RuntimeEvent; + type Runner = pallet_evm::runner::stack::Runner; + type PrecompilesType = MoonbeamPrecompiles; + type PrecompilesValue = PrecompilesValue; + type ChainId = EthereumChainId; + type OnChargeTransaction = OnChargeEVMTransaction>; + type BlockGasLimit = BlockGasLimit; + type FindAuthor = FindAuthorAdapter; + type OnCreate = (); + type GasLimitPovSizeRatio = GasLimitPovSizeRatio; + type Timestamp = Timestamp; + type WeightInfo = pallet_evm::weights::SubstrateWeight; +} + +parameter_types! { + pub MaximumSchedulerWeight: Weight = NORMAL_DISPATCH_RATIO * RuntimeBlockWeights::get().max_block; +} + +impl pallet_scheduler::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeOrigin = RuntimeOrigin; + type PalletsOrigin = OriginCaller; + type RuntimeCall = RuntimeCall; + type MaximumWeight = MaximumSchedulerWeight; + type ScheduleOrigin = EnsureRoot; + type MaxScheduledPerBlock = ConstU32<50>; + type WeightInfo = pallet_scheduler::weights::SubstrateWeight; + type OriginPrivilegeCmp = EqualPrivilegeOnly; + type Preimages = Preimage; +} + +impl pallet_preimage::Config for Runtime { + type WeightInfo = pallet_preimage::weights::SubstrateWeight; + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type ManagerOrigin = EnsureRoot; + type BaseDeposit = ConstU128<{ 5 * currency::GLMR * currency::SUPPLY_FACTOR }>; + type ByteDeposit = ConstU128<{ currency::STORAGE_BYTE_FEE }>; +} + +parameter_types! { + pub const ProposalBond: Permill = Permill::from_percent(5); + pub const TreasuryId: PalletId = PalletId(*b"py/trsry"); +} + +type TreasuryApproveOrigin = EitherOfDiverse< + EnsureRoot, + pallet_collective::EnsureProportionAtLeast, +>; + +type TreasuryRejectOrigin = EitherOfDiverse< + EnsureRoot, + pallet_collective::EnsureProportionMoreThan, +>; + +impl pallet_treasury::Config for Runtime { + type PalletId = TreasuryId; + type Currency = Balances; + // At least three-fifths majority of the council is required (or root) to approve a proposal + type ApproveOrigin = TreasuryApproveOrigin; + // More than half of the council is required (or root) to reject a proposal + type RejectOrigin = TreasuryRejectOrigin; + type RuntimeEvent = RuntimeEvent; + // If spending proposal rejected, transfer proposer bond to treasury + type OnSlash = Treasury; + type ProposalBond = ProposalBond; + type ProposalBondMinimum = ConstU128<{ 1 * currency::GLMR * currency::SUPPLY_FACTOR }>; + type SpendPeriod = ConstU32<{ 6 * DAYS }>; + type Burn = (); + type BurnDestination = (); + type MaxApprovals = ConstU32<100>; + type WeightInfo = pallet_treasury::weights::SubstrateWeight; + type SpendFunds = (); + type ProposalBondMaximum = (); + type SpendOrigin = frame_support::traits::NeverEnsureOrigin; // Same as Polkadot +} + +type IdentityForceOrigin = EitherOfDiverse< + EnsureRoot, + EitherOfDiverse< + pallet_collective::EnsureProportionMoreThan, + governance::custom_origins::GeneralAdmin, + >, +>; +type IdentityRegistrarOrigin = EitherOfDiverse< + EnsureRoot, + EitherOfDiverse< + pallet_collective::EnsureProportionMoreThan, + governance::custom_origins::GeneralAdmin, + >, +>; + +impl pallet_identity::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + // Add one item in storage and take 258 bytes + type BasicDeposit = ConstU128<{ currency::deposit(1, 258) }>; + // Not add any item to the storage but takes 66 bytes + type FieldDeposit = ConstU128<{ currency::deposit(0, 66) }>; + // Add one item in storage and take 53 bytes + type SubAccountDeposit = ConstU128<{ currency::deposit(1, 53) }>; + type MaxSubAccounts = ConstU32<100>; + type MaxAdditionalFields = ConstU32<100>; + type MaxRegistrars = ConstU32<20>; + type Slashed = Treasury; + type ForceOrigin = IdentityForceOrigin; + type RegistrarOrigin = IdentityRegistrarOrigin; + type WeightInfo = pallet_identity::weights::SubstrateWeight; +} + +pub struct TransactionConverter; + +impl fp_rpc::ConvertTransaction for TransactionConverter { + fn convert_transaction(&self, transaction: pallet_ethereum::Transaction) -> UncheckedExtrinsic { + UncheckedExtrinsic::new_unsigned( + pallet_ethereum::Call::::transact { transaction }.into(), + ) + } +} + +impl fp_rpc::ConvertTransaction for TransactionConverter { + fn convert_transaction( + &self, + transaction: pallet_ethereum::Transaction, + ) -> opaque::UncheckedExtrinsic { + let extrinsic = UncheckedExtrinsic::new_unsigned( + pallet_ethereum::Call::::transact { transaction }.into(), + ); + let encoded = extrinsic.encode(); + opaque::UncheckedExtrinsic::decode(&mut &encoded[..]) + .expect("Encoded extrinsic is always valid") + } +} + +parameter_types! { + pub const PostBlockAndTxnHashes: PostLogContent = PostLogContent::BlockAndTxnHashes; +} + +impl pallet_ethereum::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type StateRoot = pallet_ethereum::IntermediateStateRoot; + type PostLogContent = PostBlockAndTxnHashes; + type ExtraDataLength = ConstU32<30>; +} + +impl cumulus_pallet_parachain_system::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnSystemEvent = (); + type SelfParaId = ParachainInfo; + type DmpMessageHandler = MaintenanceMode; + type ReservedDmpWeight = ReservedDmpWeight; + type OutboundXcmpMessageSource = XcmpQueue; + type XcmpMessageHandler = XcmpQueue; + type ReservedXcmpWeight = ReservedXcmpWeight; + type CheckAssociatedRelayNumber = cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; +} + +pub struct EthereumXcmEnsureProxy; +impl xcm_primitives::EnsureProxy for EthereumXcmEnsureProxy { + fn ensure_ok(delegator: AccountId, delegatee: AccountId) -> Result<(), &'static str> { + // The EVM implicitely contains an Any proxy, so we only allow for "Any" proxies + let def: pallet_proxy::ProxyDefinition = + pallet_proxy::Pallet::::find_proxy( + &delegator, + &delegatee, + Some(ProxyType::Any), + ) + .map_err(|_| "proxy error: expected `ProxyType::Any`")?; + // We only allow to use it for delay zero proxies, as the call will immediatly be executed + ensure!(def.delay.is_zero(), "proxy delay is Non-zero`"); + Ok(()) + } +} + +impl pallet_ethereum_xcm::Config for Runtime { + type InvalidEvmTransactionError = pallet_ethereum::InvalidTransactionWrapper; + type ValidatedTransaction = pallet_ethereum::ValidatedTransaction; + type XcmEthereumOrigin = pallet_ethereum_xcm::EnsureXcmEthereumTransaction; + type ReservedXcmpWeight = ReservedXcmpWeight; + type EnsureProxy = EthereumXcmEnsureProxy; + type ControllerOrigin = EnsureRoot; +} + +parameter_types! { + pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); + pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); +} + +impl parachain_info::Config for Runtime {} + +pub struct OnNewRound; +impl pallet_parachain_staking::OnNewRound for OnNewRound { + fn on_new_round(round_index: pallet_parachain_staking::RoundIndex) -> Weight { + MoonbeamOrbiters::on_new_round(round_index) + } +} +pub struct PayoutCollatorOrOrbiterReward; +impl pallet_parachain_staking::PayoutCollatorReward for PayoutCollatorOrOrbiterReward { + fn payout_collator_reward( + for_round: pallet_parachain_staking::RoundIndex, + collator_id: AccountId, + amount: Balance, + ) -> Weight { + let extra_weight = if MoonbeamOrbiters::is_orbiter(for_round, collator_id) { + MoonbeamOrbiters::distribute_rewards(for_round, collator_id, amount) + } else { + ParachainStaking::mint_collator_reward(for_round, collator_id, amount) + }; + + ::DbWeight::get() + .reads(1) + .saturating_add(extra_weight) + } +} + +type MonetaryGovernanceOrigin = + EitherOfDiverse, governance::custom_origins::GeneralAdmin>; + +impl pallet_parachain_staking::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type MonetaryGovernanceOrigin = MonetaryGovernanceOrigin; + /// Minimum round length is 2 minutes (10 * 12 second block times) + type MinBlocksPerRound = ConstU32<10>; + /// Rounds before the collator leaving the candidates request can be executed + type LeaveCandidatesDelay = ConstU32<{ 4 * 7 }>; + /// Rounds before the candidate bond increase/decrease can be executed + type CandidateBondLessDelay = ConstU32<{ 4 * 7 }>; + /// Rounds before the delegator exit can be executed + type LeaveDelegatorsDelay = ConstU32<{ 4 * 7 }>; + /// Rounds before the delegator revocation can be executed + type RevokeDelegationDelay = ConstU32<{ 4 * 7 }>; + /// Rounds before the delegator bond increase/decrease can be executed + type DelegationBondLessDelay = ConstU32<{ 4 * 7 }>; + /// Rounds before the reward is paid + type RewardPaymentDelay = ConstU32<2>; + /// Minimum collators selected per round, default at genesis and minimum forever after + type MinSelectedCandidates = ConstU32<8>; + /// Maximum top delegations per candidate + type MaxTopDelegationsPerCandidate = ConstU32<300>; + /// Maximum bottom delegations per candidate + type MaxBottomDelegationsPerCandidate = ConstU32<50>; + /// Maximum delegations per delegator + type MaxDelegationsPerDelegator = ConstU32<100>; + /// Minimum stake required to be reserved to be a candidate + type MinCandidateStk = ConstU128<{ 20_000 * currency::GLMR * currency::SUPPLY_FACTOR }>; + /// Minimum stake required to be reserved to be a delegator + type MinDelegation = ConstU128<{ 500 * currency::MILLIGLMR * currency::SUPPLY_FACTOR }>; + /// Minimum stake required to be reserved to be a delegator + type MinDelegatorStk = ConstU128<{ 500 * currency::MILLIGLMR * currency::SUPPLY_FACTOR }>; + type BlockAuthor = AuthorInherent; + type OnCollatorPayout = (); + type PayoutCollatorReward = PayoutCollatorOrOrbiterReward; + type OnNewRound = OnNewRound; + type WeightInfo = pallet_parachain_staking::weights::SubstrateWeight; +} + +impl pallet_author_inherent::Config for Runtime { + type SlotBeacon = RelaychainDataProvider; + type AccountLookup = MoonbeamOrbiters; + type CanAuthor = AuthorFilter; + type WeightInfo = pallet_author_inherent::weights::SubstrateWeight; +} + +impl pallet_author_slot_filter::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RandomnessSource = Randomness; + type PotentialAuthors = ParachainStaking; + type WeightInfo = pallet_author_slot_filter::weights::SubstrateWeight; +} + +parameter_types! { + pub const InitializationPayment: Perbill = Perbill::from_percent(30); + pub const RelaySignaturesThreshold: Perbill = Perbill::from_percent(100); + pub const SignatureNetworkIdentifier: &'static [u8] = b"moonbeam-"; +} + +impl pallet_crowdloan_rewards::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Initialized = ConstBool; + type InitializationPayment = InitializationPayment; + type MaxInitContributors = ConstU32<500>; + type MinimumReward = ConstU128<0>; + type RewardCurrency = Balances; + type RelayChainAccountId = [u8; 32]; + type RewardAddressAssociateOrigin = EnsureSigned; + type RewardAddressChangeOrigin = EnsureSigned; + type RewardAddressRelayVoteThreshold = RelaySignaturesThreshold; + type SignatureNetworkIdentifier = SignatureNetworkIdentifier; + type VestingBlockNumber = relay_chain::BlockNumber; + type VestingBlockProvider = RelaychainDataProvider; + type WeightInfo = pallet_crowdloan_rewards::weights::SubstrateWeight; +} + +// This is a simple session key manager. It should probably either work with, or be replaced +// entirely by pallet sessions +impl pallet_author_mapping::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type DepositCurrency = Balances; + type DepositAmount = ConstU128<{ 100 * currency::GLMR * currency::SUPPLY_FACTOR }>; + type Keys = session_keys_primitives::VrfId; + type WeightInfo = pallet_author_mapping::weights::SubstrateWeight; +} + +/// The type used to represent the kinds of proxying allowed. +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +#[derive( + Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, MaxEncodedLen, TypeInfo, +)] +pub enum ProxyType { + /// All calls can be proxied. This is the trivial/most permissive filter. + Any = 0, + /// Only extrinsics that do not transfer funds. + NonTransfer = 1, + /// Only extrinsics related to governance (democracy and collectives). + Governance = 2, + /// Only extrinsics related to staking. + Staking = 3, + /// Allow to veto an announced proxy call. + CancelProxy = 4, + /// Allow extrinsic related to Balances. + Balances = 5, + /// Allow extrinsic related to AuthorMapping. + AuthorMapping = 6, + /// Allow extrinsic related to IdentityJudgement. + IdentityJudgement = 7, +} + +impl Default for ProxyType { + fn default() -> Self { + Self::Any + } +} + +fn is_governance_precompile(precompile_name: &precompiles::PrecompileName) -> bool { + matches!( + precompile_name, + PrecompileName::DemocracyPrecompile + | PrecompileName::ConvictionVotingPrecompile + | PrecompileName::CouncilInstance + | PrecompileName::PreimagePrecompile + | PrecompileName::ReferendaPrecompile + | PrecompileName::TechCommitteeInstance + | PrecompileName::OpenTechCommitteeInstance + | PrecompileName::TreasuryCouncilInstance + ) +} + +// Be careful: Each time this filter is modified, the substrate filter must also be modified +// consistently. +impl pallet_evm_precompile_proxy::EvmProxyCallFilter for ProxyType { + fn is_evm_proxy_call_allowed( + &self, + call: &pallet_evm_precompile_proxy::EvmSubCall, + recipient_has_code: bool, + gas: u64, + ) -> precompile_utils::EvmResult { + Ok(match self { + ProxyType::Any => { + match PrecompileName::from_address(call.to.0) { + // Any precompile that can execute a subcall should be forbidden here, + // to ensure that unauthorized smart contract can't be called + // indirectly. + // To be safe, we only allow the precompiles we need. + Some( + PrecompileName::AuthorMappingPrecompile + | PrecompileName::ParachainStakingPrecompile, + ) => true, + Some(ref precompile) if is_governance_precompile(precompile) => true, + // All non-whitelisted precompiles are forbidden + Some(_) => false, + // Allow evm transfer to "simple" account (no code nor precompile) + // For the moment, no smart contract other than precompiles is allowed. + // In the future, we may create a dynamic whitelist to authorize some audited + // smart contracts through governance. + None => { + // If the address is not recognized, allow only evm transfert to "simple" + // accounts (no code nor precompile). + // Note: Checking the presence of the code is not enough because some + // precompiles have no code. + !recipient_has_code + && precompile_utils::precompile_set::is_precompile_or_fail::( + call.to.0, gas, + )? + } + } + } + ProxyType::NonTransfer => { + call.value == U256::zero() + && match PrecompileName::from_address(call.to.0) { + Some( + PrecompileName::AuthorMappingPrecompile + | PrecompileName::ParachainStakingPrecompile, + ) => true, + Some(ref precompile) if is_governance_precompile(precompile) => true, + _ => false, + } + } + ProxyType::Governance => { + call.value == U256::zero() + && matches!( + PrecompileName::from_address(call.to.0), + Some(ref precompile) if is_governance_precompile(precompile) + ) + } + ProxyType::Staking => { + call.value == U256::zero() + && matches!( + PrecompileName::from_address(call.to.0), + Some( + PrecompileName::AuthorMappingPrecompile + | PrecompileName::ParachainStakingPrecompile + ) + ) + } + // The proxy precompile does not contain method cancel_proxy + ProxyType::CancelProxy => false, + ProxyType::Balances => { + // Allow only "simple" accounts as recipient (no code nor precompile). + // Note: Checking the presence of the code is not enough because some precompiles + // have no code. + !recipient_has_code + && !precompile_utils::precompile_set::is_precompile_or_fail::( + call.to.0, gas, + )? + } + ProxyType::AuthorMapping => { + call.value == U256::zero() + && matches!( + PrecompileName::from_address(call.to.0), + Some(PrecompileName::AuthorMappingPrecompile) + ) + } + // There is no identity precompile + ProxyType::IdentityJudgement => false, + }) + } +} + +// Be careful: Each time this filter is modified, the EVM filter must also be modified consistently. +impl InstanceFilter for ProxyType { + fn filter(&self, c: &RuntimeCall) -> bool { + match self { + ProxyType::Any => true, + ProxyType::NonTransfer => { + matches!( + c, + RuntimeCall::System(..) + | RuntimeCall::ParachainSystem(..) + | RuntimeCall::Timestamp(..) + | RuntimeCall::ParachainStaking(..) + | RuntimeCall::Democracy(..) + | RuntimeCall::Referenda(..) + | RuntimeCall::Preimage(..) + | RuntimeCall::CouncilCollective(..) + | RuntimeCall::ConvictionVoting(..) + | RuntimeCall::TreasuryCouncilCollective(..) + | RuntimeCall::TechCommitteeCollective(..) + | RuntimeCall::OpenTechCommitteeCollective(..) + | RuntimeCall::Identity(..) + | RuntimeCall::Utility(..) + | RuntimeCall::Proxy(..) | RuntimeCall::AuthorMapping(..) + | RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::claim { .. } + ) + ) + } + ProxyType::Governance => matches!( + c, + RuntimeCall::Democracy(..) + | RuntimeCall::Referenda(..) + | RuntimeCall::Preimage(..) + | RuntimeCall::ConvictionVoting(..) + | RuntimeCall::CouncilCollective(..) + | RuntimeCall::TreasuryCouncilCollective(..) + | RuntimeCall::TechCommitteeCollective(..) + | RuntimeCall::OpenTechCommitteeCollective(..) + | RuntimeCall::Utility(..) + ), + ProxyType::Staking => matches!( + c, + RuntimeCall::ParachainStaking(..) + | RuntimeCall::Utility(..) + | RuntimeCall::AuthorMapping(..) + | RuntimeCall::MoonbeamOrbiters(..) + ), + ProxyType::CancelProxy => matches!( + c, + RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) + ), + ProxyType::Balances => { + matches!(c, RuntimeCall::Balances(..) | RuntimeCall::Utility(..)) + } + ProxyType::AuthorMapping => matches!(c, RuntimeCall::AuthorMapping(..)), + ProxyType::IdentityJudgement => matches!( + c, + RuntimeCall::Identity(pallet_identity::Call::provide_judgement { .. }) + | RuntimeCall::Utility(..) + ), + } + } + + fn is_superset(&self, o: &Self) -> bool { + match (self, o) { + (x, y) if x == y => true, + (ProxyType::Any, _) => true, + (_, ProxyType::Any) => false, + _ => false, + } + } +} + +impl pallet_proxy::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type Currency = Balances; + type ProxyType = ProxyType; + // One storage item; key size 32, value size 8 + type ProxyDepositBase = ConstU128<{ currency::deposit(1, 8) }>; + // Additional storage item size of 21 bytes (20 bytes AccountId + 1 byte sizeof(ProxyType)). + type ProxyDepositFactor = ConstU128<{ currency::deposit(0, 21) }>; + type MaxProxies = ConstU32<32>; + type WeightInfo = pallet_proxy::weights::SubstrateWeight; + type MaxPending = ConstU32<32>; + type CallHasher = BlakeTwo256; + type AnnouncementDepositBase = ConstU128<{ currency::deposit(1, 8) }>; + // Additional storage item size of 56 bytes: + // - 20 bytes AccountId + // - 32 bytes Hasher (Blake2256) + // - 4 bytes BlockNumber (u32) + type AnnouncementDepositFactor = ConstU128<{ currency::deposit(0, 56) }>; +} + +impl pallet_migrations::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type MigrationsList = moonbeam_runtime_common::migrations::CommonMigrations< + Runtime, + CouncilCollective, + TechCommitteeCollective, + >; + type XcmExecutionManager = XcmExecutionManager; + type WeightInfo = pallet_migrations::weights::SubstrateWeight; +} + +/// Maintenance mode Call filter +pub struct MaintenanceFilter; +impl Contains for MaintenanceFilter { + fn contains(c: &RuntimeCall) -> bool { + match c { + RuntimeCall::Assets(_) => false, + RuntimeCall::LocalAssets(_) => false, + RuntimeCall::Balances(_) => false, + RuntimeCall::CrowdloanRewards(_) => false, + RuntimeCall::Ethereum(_) => false, + RuntimeCall::EVM(_) => false, + RuntimeCall::Identity(_) => false, + RuntimeCall::XTokens(_) => false, + RuntimeCall::ParachainStaking(_) => false, + RuntimeCall::MoonbeamOrbiters(_) => false, + RuntimeCall::PolkadotXcm(_) => false, + RuntimeCall::Treasury(_) => false, + RuntimeCall::XcmTransactor(_) => false, + RuntimeCall::EthereumXcm(_) => false, + _ => true, + } + } +} + +/// Normal Call Filter +/// We dont allow to create nor mint assets, this for now is disabled +/// We only allow transfers. For now creation of assets will go through +/// asset-manager, while minting/burning only happens through xcm messages +/// This can change in the future +pub struct NormalFilter; +impl Contains for NormalFilter { + fn contains(c: &RuntimeCall) -> bool { + match c { + RuntimeCall::Assets(method) => match method { + pallet_assets::Call::transfer { .. } => true, + pallet_assets::Call::transfer_keep_alive { .. } => true, + pallet_assets::Call::approve_transfer { .. } => true, + pallet_assets::Call::transfer_approved { .. } => true, + pallet_assets::Call::cancel_approval { .. } => true, + pallet_assets::Call::destroy_accounts { .. } => true, + pallet_assets::Call::destroy_approvals { .. } => true, + pallet_assets::Call::finish_destroy { .. } => true, + _ => false, + }, + // We want to disable create, as we dont want users to be choosing the + // assetId of their choice + // We also disable destroy, as we want to route destroy through the + // asset-manager, which guarantees the removal both at the EVM and + // substrate side of things + RuntimeCall::LocalAssets(method) => match method { + pallet_assets::Call::create { .. } => false, + pallet_assets::Call::start_destroy { .. } => false, + _ => true, + }, + // We just want to enable this in case of live chains, since the default version + // is populated at genesis + RuntimeCall::PolkadotXcm(method) => match method { + pallet_xcm::Call::force_default_xcm_version { .. } => true, + _ => false, + }, + // We filter anonymous proxy as they make "reserve" inconsistent + // See: https://github.com/paritytech/substrate/blob/37cca710eed3dadd4ed5364c7686608f5175cce1/frame/proxy/src/lib.rs#L270 // editorconfig-checker-disable-line + RuntimeCall::Proxy(method) => match method { + pallet_proxy::Call::create_pure { .. } => false, + pallet_proxy::Call::kill_pure { .. } => false, + _ => true, + }, + // Filtering the EVM prevents possible re-entrancy from the precompiles which could + // lead to unexpected scenarios. + // See https://github.com/PureStake/sr-moonbeam/issues/30 + // Note: It is also assumed that EVM calls are only allowed through `Origin::Root` so + // this can be seen as an additional security + RuntimeCall::EVM(_) => false, + _ => true, + } + } +} + +pub struct XcmExecutionManager; +impl xcm_primitives::PauseXcmExecution for XcmExecutionManager { + fn suspend_xcm_execution() -> DispatchResult { + XcmpQueue::suspend_xcm_execution(RuntimeOrigin::root()) + } + fn resume_xcm_execution() -> DispatchResult { + XcmpQueue::resume_xcm_execution(RuntimeOrigin::root()) + } +} + +pub struct NormalDmpHandler; +impl DmpMessageHandler for NormalDmpHandler { + // This implementation makes messages be queued + // Since the limit is 0, messages are queued for next iteration + fn handle_dmp_messages( + iter: impl Iterator)>, + limit: Weight, + ) -> Weight { + (if Migrations::should_pause_xcm() { + DmpQueue::handle_dmp_messages(iter, Weight::zero()) + } else { + DmpQueue::handle_dmp_messages(iter, limit) + }) + ::DbWeight::get().reads(1) + } +} + +pub struct MaintenanceDmpHandler; +impl DmpMessageHandler for MaintenanceDmpHandler { + // This implementation makes messages be queued + // Since the limit is 0, messages are queued for next iteration + fn handle_dmp_messages( + iter: impl Iterator)>, + _limit: Weight, + ) -> Weight { + DmpQueue::handle_dmp_messages(iter, Weight::zero()) + } +} + +/// The hooks we want to run in Maintenance Mode +pub struct MaintenanceHooks; + +impl OnInitialize for MaintenanceHooks { + fn on_initialize(n: BlockNumber) -> Weight { + AllPalletsWithSystem::on_initialize(n) + } +} + +// return 0 +// For some reason using empty tuple () isnt working +// There exist only two pallets that use onIdle and these are xcmp and dmp queues +// For some reason putting an empty tumple does not work (transaction never finishes) +// We use an empty onIdle, if on the future we want one of the pallets to execute it +// we need to provide it here +impl OnIdle for MaintenanceHooks { + fn on_idle(_n: BlockNumber, _max_weight: Weight) -> Weight { + Weight::zero() + } +} + +impl OnRuntimeUpgrade for MaintenanceHooks { + fn on_runtime_upgrade() -> Weight { + AllPalletsWithSystem::on_runtime_upgrade() + } + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, &'static str> { + AllPalletsWithSystem::pre_upgrade() + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(state: Vec) -> Result<(), &'static str> { + AllPalletsWithSystem::post_upgrade(state) + } +} + +impl OnFinalize for MaintenanceHooks { + fn on_finalize(n: BlockNumber) { + AllPalletsWithSystem::on_finalize(n) + } +} + +impl OffchainWorker for MaintenanceHooks { + fn offchain_worker(n: BlockNumber) { + AllPalletsWithSystem::offchain_worker(n) + } +} + +impl pallet_maintenance_mode::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type NormalCallFilter = NormalFilter; + type MaintenanceCallFilter = MaintenanceFilter; + type MaintenanceOrigin = + pallet_collective::EnsureProportionAtLeast; + type XcmExecutionManager = XcmExecutionManager; + type NormalDmpHandler = NormalDmpHandler; + type MaintenanceDmpHandler = MaintenanceDmpHandler; + // We use AllPalletsWithSystem because we dont want to change the hooks in normal + // operation + type NormalExecutiveHooks = AllPalletsWithSystem; + type MaintenanceExecutiveHooks = MaintenanceHooks; +} + +impl pallet_proxy_genesis_companion::Config for Runtime { + type ProxyType = ProxyType; +} + +parameter_types! { + pub OrbiterReserveIdentifier: [u8; 4] = [b'o', b'r', b'b', b'i']; +} + +type AddCollatorOrigin = + EitherOfDiverse, governance::custom_origins::GeneralAdmin>; +type DelCollatorOrigin = + EitherOfDiverse, governance::custom_origins::GeneralAdmin>; + +impl pallet_moonbeam_orbiters::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type AccountLookup = AuthorMapping; + type AddCollatorOrigin = AddCollatorOrigin; + type Currency = Balances; + type DelCollatorOrigin = DelCollatorOrigin; + /// Maximum number of orbiters per collator + type MaxPoolSize = ConstU32<8>; + /// Maximum number of round to keep on storage + type MaxRoundArchive = ConstU32<4>; + type OrbiterReserveIdentifier = OrbiterReserveIdentifier; + type RotatePeriod = ConstU32<1>; + /// Round index type. + type RoundIndex = pallet_parachain_staking::RoundIndex; + type WeightInfo = pallet_moonbeam_orbiters::weights::SubstrateWeight; +} + +/// Only callable after `set_validation_data` is called which forms this proof the same way +fn relay_chain_state_proof() -> RelayChainStateProof { + let relay_storage_root = ParachainSystem::validation_data() + .expect("set in `set_validation_data`") + .relay_parent_storage_root; + let relay_chain_state = + ParachainSystem::relay_state_proof().expect("set in `set_validation_data`"); + RelayChainStateProof::new(ParachainInfo::get(), relay_storage_root, relay_chain_state) + .expect("Invalid relay chain state proof, already constructed in `set_validation_data`") +} + +pub struct BabeDataGetter; +impl pallet_randomness::GetBabeData> for BabeDataGetter { + // Tolerate panic here because only ever called in inherent (so can be omitted) + fn get_epoch_index() -> u64 { + if cfg!(feature = "runtime-benchmarks") { + // storage reads as per actual reads + let _relay_storage_root = ParachainSystem::validation_data(); + let _relay_chain_state = ParachainSystem::relay_state_proof(); + const BENCHMARKING_NEW_EPOCH: u64 = 10u64; + return BENCHMARKING_NEW_EPOCH; + } + relay_chain_state_proof() + .read_optional_entry(relay_chain::well_known_keys::EPOCH_INDEX) + .ok() + .flatten() + .expect("expected to be able to read epoch index from relay chain state proof") + } + fn get_epoch_randomness() -> Option { + if cfg!(feature = "runtime-benchmarks") { + // storage reads as per actual reads + let _relay_storage_root = ParachainSystem::validation_data(); + let _relay_chain_state = ParachainSystem::relay_state_proof(); + let benchmarking_babe_output = Hash::default(); + return Some(benchmarking_babe_output); + } + relay_chain_state_proof() + .read_optional_entry(relay_chain::well_known_keys::ONE_EPOCH_AGO_RANDOMNESS) + .ok() + .flatten() + } +} + +impl pallet_randomness::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type AddressMapping = moonbeam_runtime_common::IntoAddressMapping; + type Currency = Balances; + type BabeDataGetter = BabeDataGetter; + type VrfKeyLookup = AuthorMapping; + type Deposit = ConstU128<{ 1 * currency::GLMR * currency::SUPPLY_FACTOR }>; + type MaxRandomWords = ConstU8<100>; + type MinBlockDelay = ConstU32<2>; + type MaxBlockDelay = ConstU32<2_000>; + type BlockExpirationDelay = ConstU32<10_000>; + type EpochExpirationDelay = ConstU64<10_000>; + type WeightInfo = pallet_randomness::weights::SubstrateWeight; +} + +impl pallet_root_testing::Config for Runtime {} + +parameter_types! { + // One storage item; key size is 32 + 20; value is size 4+4+16+20 bytes = 44 bytes. + pub const DepositBase: Balance = currency::deposit(1, 96); + // Additional storage item size of 20 bytes. + pub const DepositFactor: Balance = currency::deposit(0, 20); + pub const MaxSignatories: u32 = 100; +} + +impl pallet_multisig::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type Currency = Balances; + type DepositBase = DepositBase; + type DepositFactor = DepositFactor; + type MaxSignatories = MaxSignatories; + type WeightInfo = pallet_multisig::weights::SubstrateWeight; +} + +construct_runtime! { + pub enum Runtime where + Block = Block, + NodeBlock = opaque::Block, + UncheckedExtrinsic = UncheckedExtrinsic + { + // System support stuff. + System: frame_system::{Pallet, Call, Storage, Config, Event} = 0, + ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Storage, Inherent, Event} = 1, + // Previously 2: pallet_randomness_collective_flip + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 3, + ParachainInfo: parachain_info::{Pallet, Storage, Config} = 4, + RootTesting: pallet_root_testing::{Pallet, Call, Storage} = 5, + + // Monetary stuff. + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, + TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Config, Event} = 11, + + // Consensus support. + ParachainStaking: pallet_parachain_staking::{Pallet, Call, Storage, Event, Config} = 20, + AuthorInherent: pallet_author_inherent::{Pallet, Call, Storage, Inherent} = 21, + AuthorFilter: pallet_author_slot_filter::{Pallet, Call, Storage, Event, Config} = 22, + AuthorMapping: pallet_author_mapping::{Pallet, Call, Config, Storage, Event} = 23, + MoonbeamOrbiters: pallet_moonbeam_orbiters::{Pallet, Call, Storage, Event} = 24, + + // Handy utilities. + Utility: pallet_utility::{Pallet, Call, Event} = 30, + Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 31, + MaintenanceMode: pallet_maintenance_mode::{Pallet, Call, Config, Storage, Event} = 32, + Identity: pallet_identity::{Pallet, Call, Storage, Event} = 33, + Migrations: pallet_migrations::{Pallet, Call, Storage, Config, Event} = 34, + ProxyGenesisCompanion: pallet_proxy_genesis_companion::{Pallet, Config} = 35, + Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 36, + + // Has been permanently removed for safety reasons. + // Sudo: pallet_sudo::{Pallet, Call, Config, Storage, Event} = 40, + + // Ethereum compatibility. + EthereumChainId: pallet_ethereum_chain_id::{Pallet, Storage, Config} = 50, + EVM: pallet_evm::{Pallet, Config, Call, Storage, Event} = 51, + Ethereum: pallet_ethereum::{Pallet, Call, Storage, Event, Origin, Config} = 52, + + // Governance stuff. + Scheduler: pallet_scheduler::{Pallet, Storage, Event, Call} = 60, + Democracy: pallet_democracy::{Pallet, Storage, Config, Event, Call} = 61, + Preimage: pallet_preimage::{Pallet, Call, Storage, Event} = 62, + ConvictionVoting: pallet_conviction_voting::{Pallet, Call, Storage, Event} = 63, + Referenda: pallet_referenda::{Pallet, Call, Storage, Event} = 64, + Origins: governance::custom_origins::{Origin} = 65, + Whitelist: pallet_whitelist::{Pallet, Call, Storage, Event} = 66, + + // Council stuff. + CouncilCollective: + pallet_collective::::{Pallet, Call, Storage, Event, Origin, Config} = 70, + TechCommitteeCollective: + pallet_collective::::{Pallet, Call, Storage, Event, Origin, Config} = 71, + TreasuryCouncilCollective: + pallet_collective::::{Pallet, Call, Storage, Event, Origin, Config} = 72, + OpenTechCommitteeCollective: + pallet_collective::::{Pallet, Call, Storage, Event, Origin, Config} = 73, + + // Treasury stuff. + Treasury: pallet_treasury::{Pallet, Storage, Config, Event, Call} = 80, + + // Crowdloan stuff. + CrowdloanRewards: pallet_crowdloan_rewards::{Pallet, Call, Config, Storage, Event} = 90, + + // XCM + XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Storage, Event} = 100, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 101, + DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 102, + PolkadotXcm: pallet_xcm::{Pallet, Storage, Call, Event, Origin, Config} = 103, + Assets: pallet_assets::{Pallet, Call, Storage, Event} = 104, + AssetManager: pallet_asset_manager::{Pallet, Call, Storage, Event} = 105, + XTokens: orml_xtokens::{Pallet, Call, Storage, Event} = 106, + XcmTransactor: pallet_xcm_transactor::{Pallet, Call, Storage, Event} = 107, + LocalAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 108, + EthereumXcm: pallet_ethereum_xcm::{Pallet, Call, Storage, Origin} = 109, + Erc20XcmBridge: pallet_erc20_xcm_bridge::{Pallet} = 110, + + + // Randomness + Randomness: pallet_randomness::{Pallet, Call, Storage, Event, Inherent} = 120, + } +} + +/// Block type as expected by this runtime. +pub type Block = generic::Block; +/// A Block signed with a Justification +pub type SignedBlock = generic::SignedBlock; +/// BlockId type as expected by this runtime. +pub type BlockId = generic::BlockId; + +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + frame_system::CheckNonZeroSender, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckEra, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, +); +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = + fp_self_contained::UncheckedExtrinsic; +/// Extrinsic type that has already been checked. +pub type CheckedExtrinsic = + fp_self_contained::CheckedExtrinsic; +/// Executive: handles dispatch to the various pallets. +pub type Executive = frame_executive::Executive< + Runtime, + Block, + frame_system::ChainContext, + Runtime, + pallet_maintenance_mode::ExecutiveHooks, +>; + +// All of our runtimes share most of their Runtime API implementations. +// We use a macro to implement this common part and add runtime-specific additional implementations. +// This macro expands to : +// ``` +// impl_runtime_apis! { +// // All impl blocks shared between all runtimes. +// +// // Specific impls provided to the `impl_runtime_apis_plus_common!` macro. +// } +// ``` +moonbeam_runtime_common::impl_runtime_apis_plus_common! { + impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + xt: ::Extrinsic, + block_hash: ::Hash, + ) -> TransactionValidity { + // Filtered calls should not enter the tx pool as they'll fail if inserted. + // If this call is not allowed, we return early. + if !::BaseCallFilter::contains(&xt.0.function) { + return InvalidTransaction::Call.into(); + } + + // This runtime uses Substrate's pallet transaction payment. This + // makes the chain feel like a standard Substrate chain when submitting + // frame transactions and using Substrate ecosystem tools. It has the downside that + // transaction are not prioritized by gas_price. The following code reprioritizes + // transactions to overcome this. + // + // A more elegant, ethereum-first solution is + // a pallet that replaces pallet transaction payment, and allows users + // to directly specify a gas price rather than computing an effective one. + // #HopefullySomeday + + // First we pass the transactions to the standard FRAME executive. This calculates all the + // necessary tags, longevity and other properties that we will leave unchanged. + // This also assigns some priority that we don't care about and will overwrite next. + let mut intermediate_valid = Executive::validate_transaction(source, xt.clone(), block_hash)?; + + let dispatch_info = xt.get_dispatch_info(); + + // If this is a pallet ethereum transaction, then its priority is already set + // according to gas price from pallet ethereum. If it is any other kind of transaction, + // we modify its priority. + Ok(match &xt.0.function { + RuntimeCall::Ethereum(transact { .. }) => intermediate_valid, + _ if dispatch_info.class != DispatchClass::Normal => intermediate_valid, + _ => { + let tip = match xt.0.signature { + None => 0, + Some((_, _, ref signed_extra)) => { + // Yuck, this depends on the index of charge transaction in Signed Extra + let charge_transaction = &signed_extra.7; + charge_transaction.tip() + } + }; + + // Calculate the fee that will be taken by pallet transaction payment + let fee: u64 = TransactionPayment::compute_fee( + xt.encode().len() as u32, + &dispatch_info, + tip, + ).saturated_into(); + + // Calculate how much gas this effectively uses according to the existing mapping + let effective_gas = + ::GasWeightMapping::weight_to_gas( + dispatch_info.weight + ); + + // Here we calculate an ethereum-style effective gas price using the + // current fee of the transaction. Because the weight -> gas conversion is + // lossy, we have to handle the case where a very low weight maps to zero gas. + let effective_gas_price = if effective_gas > 0 { + fee / effective_gas + } else { + // If the effective gas was zero, we just act like it was 1. + fee + }; + + // Overwrite the original prioritization with this ethereum one + intermediate_valid.priority = effective_gas_price; + intermediate_valid + } + }) + } + } +} + +// Check the timestamp and parachain inherents +struct CheckInherents; + +impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { + fn check_inherents( + block: &Block, + relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, + ) -> sp_inherents::CheckInherentsResult { + let relay_chain_slot = relay_state_proof + .read_slot() + .expect("Could not read the relay chain slot from the proof"); + + let inherent_data = + cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( + relay_chain_slot, + sp_std::time::Duration::from_secs(6), + ) + .create_inherent_data() + .expect("Could not create the timestamp inherent data"); + + inherent_data.check_extrinsics(&block) + } +} + +// Nimbus's Executive wrapper allows relay validators to verify the seal digest +cumulus_pallet_parachain_system::register_validate_block!( + Runtime = Runtime, + BlockExecutor = pallet_author_inherent::BlockExecutor::, + CheckInherents = CheckInherents, +); + +moonbeam_runtime_common::impl_self_contained_call!(); + +// Shorthand for a Get field of a pallet Config. +#[macro_export] +macro_rules! get { + ($pallet:ident, $name:ident, $type:ty) => { + <<$crate::Runtime as $pallet::Config>::$name as $crate::Get<$type>>::get() + }; +} + +#[cfg(test)] +mod tests { + use super::{currency::*, *}; + + #[test] + // Helps us to identify a Pallet Call in case it exceeds the 1kb limit. + // Hint: this should be a rare case. If that happens, one or more of the dispatchable arguments + // need to be Boxed. + fn call_max_size() { + const CALL_ALIGN: u32 = 1024; + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!(std::mem::size_of::>() <= CALL_ALIGN as usize); + assert!(std::mem::size_of::>() <= CALL_ALIGN as usize); + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!(std::mem::size_of::>() <= CALL_ALIGN as usize); + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!(std::mem::size_of::>() <= CALL_ALIGN as usize); + assert!( + std::mem::size_of::>() + <= CALL_ALIGN as usize + ); + } + + #[test] + fn currency_constants_are_correct() { + assert_eq!(SUPPLY_FACTOR, 100); + + // txn fees + assert_eq!(TRANSACTION_BYTE_FEE, Balance::from(100 * GIGAWEI)); + assert_eq!( + get!(pallet_transaction_payment, OperationalFeeMultiplier, u8), + 5_u8 + ); + assert_eq!(STORAGE_BYTE_FEE, Balance::from(10 * MILLIGLMR)); + + // democracy minimums + assert_eq!( + get!(pallet_democracy, MinimumDeposit, u128), + Balance::from(400 * GLMR) + ); + assert_eq!( + get!(pallet_preimage, ByteDeposit, u128), + Balance::from(10 * MILLIGLMR) + ); + assert_eq!( + get!(pallet_treasury, ProposalBondMinimum, u128), + Balance::from(100 * GLMR) + ); + + // pallet_identity deposits + assert_eq!( + get!(pallet_identity, BasicDeposit, u128), + Balance::from(10 * GLMR + 2580 * MILLIGLMR) + ); + assert_eq!( + get!(pallet_identity, FieldDeposit, u128), + Balance::from(660 * MILLIGLMR) + ); + assert_eq!( + get!(pallet_identity, SubAccountDeposit, u128), + Balance::from(10 * GLMR + 530 * MILLIGLMR) + ); + + // staking minimums + assert_eq!( + get!(pallet_parachain_staking, MinCandidateStk, u128), + Balance::from(2_000_000 * GLMR) + ); + assert_eq!( + get!(pallet_parachain_staking, MinDelegation, u128), + Balance::from(50 * GLMR) + ); + assert_eq!( + get!(pallet_parachain_staking, MinDelegatorStk, u128), + Balance::from(50 * GLMR) + ); + + // crowdloan min reward + assert_eq!( + get!(pallet_crowdloan_rewards, MinimumReward, u128), + Balance::from(0u128) + ); + + // deposit for AuthorMapping + assert_eq!( + get!(pallet_author_mapping, DepositAmount, u128), + Balance::from(10 * KILOGLMR) + ); + + // proxy deposits + assert_eq!( + get!(pallet_proxy, ProxyDepositBase, u128), + Balance::from(10 * GLMR + 80 * MILLIGLMR) + ); + assert_eq!( + get!(pallet_proxy, ProxyDepositFactor, u128), + Balance::from(210 * MILLIGLMR) + ); + assert_eq!( + get!(pallet_proxy, AnnouncementDepositBase, u128), + Balance::from(10 * GLMR + 80 * MILLIGLMR) + ); + assert_eq!( + get!(pallet_proxy, AnnouncementDepositFactor, u128), + Balance::from(560 * MILLIGLMR) + ); + } + + #[test] + // Required migration is + // pallet_parachain_staking::migrations::IncreaseMaxTopDelegationsPerCandidate + // Purpose of this test is to remind of required migration if constant is ever changed + fn updating_maximum_delegators_per_candidate_requires_configuring_required_migration() { + assert_eq!( + get!(pallet_parachain_staking, MaxTopDelegationsPerCandidate, u32), + 300 + ); + assert_eq!( + get!( + pallet_parachain_staking, + MaxBottomDelegationsPerCandidate, + u32 + ), + 50 + ); + } + + #[test] + fn configured_base_extrinsic_weight_is_evm_compatible() { + let min_ethereum_transaction_weight = WeightPerGas::get() * 21_000; + let base_extrinsic = ::BlockWeights::get() + .get(frame_support::dispatch::DispatchClass::Normal) + .base_extrinsic; + assert!(base_extrinsic.ref_time() <= min_ethereum_transaction_weight.ref_time()); + } +} diff --git a/tracing/2402/runtime/moonbeam/src/precompiles.rs b/tracing/2402/runtime/moonbeam/src/precompiles.rs new file mode 100644 index 0000000..8eb9373 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/src/precompiles.rs @@ -0,0 +1,264 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +use crate::{ + asset_config::{ForeignAssetInstance, LocalAssetInstance}, + xcm_config::XcmExecutorConfig, + CouncilInstance, OpenTechCommitteeInstance, TechCommitteeInstance, TreasuryCouncilInstance, +}; +use frame_support::parameter_types; +use moonbeam_relay_encoder::polkadot::PolkadotEncoder; +use pallet_evm_precompile_author_mapping::AuthorMappingPrecompile; +use pallet_evm_precompile_balances_erc20::{Erc20BalancesPrecompile, Erc20Metadata}; +use pallet_evm_precompile_batch::BatchPrecompile; +use pallet_evm_precompile_blake2::Blake2F; +use pallet_evm_precompile_bn128::{Bn128Add, Bn128Mul, Bn128Pairing}; +use pallet_evm_precompile_call_permit::CallPermitPrecompile; +use pallet_evm_precompile_collective::CollectivePrecompile; +use pallet_evm_precompile_conviction_voting::ConvictionVotingPrecompile; +use pallet_evm_precompile_crowdloan_rewards::CrowdloanRewardsPrecompile; +use pallet_evm_precompile_democracy::DemocracyPrecompile; +use pallet_evm_precompile_gmp::GmpPrecompile; +use pallet_evm_precompile_modexp::Modexp; +use pallet_evm_precompile_parachain_staking::ParachainStakingPrecompile; +use pallet_evm_precompile_preimage::PreimagePrecompile; +use pallet_evm_precompile_proxy::{OnlyIsProxyAndProxy, ProxyPrecompile}; +use pallet_evm_precompile_randomness::RandomnessPrecompile; +use pallet_evm_precompile_referenda::ReferendaPrecompile; +use pallet_evm_precompile_registry::PrecompileRegistry; +use pallet_evm_precompile_relay_encoder::RelayEncoderPrecompile; +use pallet_evm_precompile_sha3fips::Sha3FIPS256; +use pallet_evm_precompile_simple::{ECRecover, ECRecoverPublicKey, Identity, Ripemd160, Sha256}; +use pallet_evm_precompile_xcm_transactor::{ + v1::XcmTransactorPrecompileV1, v2::XcmTransactorPrecompileV2, +}; +use pallet_evm_precompile_xcm_utils::XcmUtilsPrecompile; +use pallet_evm_precompile_xtokens::XtokensPrecompile; +use pallet_evm_precompileset_assets_erc20::{Erc20AssetsPrecompileSet, IsForeign, IsLocal}; +use precompile_utils::precompile_set::*; + +pub struct NativeErc20Metadata; + +/// ERC20 metadata for the native token. +impl Erc20Metadata for NativeErc20Metadata { + /// Returns the name of the token. + fn name() -> &'static str { + "GLMR token" + } + + /// Returns the symbol of the token. + fn symbol() -> &'static str { + "GLMR" + } + + /// Returns the decimals places of the token. + fn decimals() -> u8 { + 18 + } + + /// Must return `true` only if it represents the main native currency of + /// the network. It must be the currency used in `pallet_evm`. + fn is_native_currency() -> bool { + true + } +} + +/// The asset precompile address prefix. Addresses that match against this prefix will be routed +/// to Erc20AssetsPrecompileSet being marked as foreign +pub const FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX: &[u8] = &[255u8; 4]; +/// The asset precompile address prefix. Addresses that match against this prefix will be routed +/// to Erc20AssetsPrecompileSet being marked as local +pub const LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX: &[u8] = &[255u8, 255u8, 255u8, 254u8]; + +parameter_types! { + pub ForeignAssetPrefix: &'static [u8] = FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX; + pub LocalAssetPrefix: &'static [u8] = LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX; +} + +type EthereumPrecompilesChecks = (AcceptDelegateCall, CallableByContract, CallableByPrecompile); + +#[precompile_utils::precompile_name_from_address] +type MoonbeamPrecompilesAt = ( + // Ethereum precompiles: + // We allow DELEGATECALL to stay compliant with Ethereum behavior. + PrecompileAt, ECRecover, EthereumPrecompilesChecks>, + PrecompileAt, Sha256, EthereumPrecompilesChecks>, + PrecompileAt, Ripemd160, EthereumPrecompilesChecks>, + PrecompileAt, Identity, EthereumPrecompilesChecks>, + PrecompileAt, Modexp, EthereumPrecompilesChecks>, + PrecompileAt, Bn128Add, EthereumPrecompilesChecks>, + PrecompileAt, Bn128Mul, EthereumPrecompilesChecks>, + PrecompileAt, Bn128Pairing, EthereumPrecompilesChecks>, + PrecompileAt, Blake2F, EthereumPrecompilesChecks>, + // Non-Moonbeam specific nor Ethereum precompiles : + PrecompileAt, Sha3FIPS256, (CallableByContract, CallableByPrecompile)>, + RemovedPrecompileAt>, // Dispatch + PrecompileAt, ECRecoverPublicKey, (CallableByContract, CallableByPrecompile)>, + // Moonbeam specific precompiles: + PrecompileAt< + AddressU64<2048>, + ParachainStakingPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2049>, + CrowdloanRewardsPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2050>, + Erc20BalancesPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2051>, + DemocracyPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2052>, + XtokensPrecompile, + ( + SubcallWithMaxNesting<1>, + CallableByContract, + CallableByPrecompile, + ), + >, + PrecompileAt< + AddressU64<2053>, + RelayEncoderPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2054>, + XcmTransactorPrecompileV1, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2055>, + AuthorMappingPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2056>, + BatchPrecompile, + ( + SubcallWithMaxNesting<2>, + // Batch is the only precompile allowed to call Batch. + CallableByPrecompile>>, + ), + >, + PrecompileAt< + AddressU64<2057>, + RandomnessPrecompile, + (SubcallWithMaxNesting<0>, CallableByContract), + >, + PrecompileAt< + AddressU64<2058>, + CallPermitPrecompile, + (SubcallWithMaxNesting<0>, CallableByContract), + >, + PrecompileAt< + AddressU64<2059>, + ProxyPrecompile, + ( + CallableByContract>, + SubcallWithMaxNesting<0>, + // Batch is the only precompile allowed to call Proxy. + CallableByPrecompile>>, + ), + >, + PrecompileAt< + AddressU64<2060>, + XcmUtilsPrecompile, + CallableByContract< + pallet_evm_precompile_xcm_utils::AllExceptXcmExecute, + >, + >, + PrecompileAt< + AddressU64<2061>, + XcmTransactorPrecompileV2, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2062>, + CollectivePrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2063>, + CollectivePrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2064>, + CollectivePrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2065>, + ReferendaPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2066>, + ConvictionVotingPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2067>, + PreimagePrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2068>, + CollectivePrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2069>, + PrecompileRegistry, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt, GmpPrecompile, SubcallWithMaxNesting<0>>, +); + +/// The PrecompileSet installed in the Moonbeam runtime. +/// We include the nine Istanbul precompiles +/// (https://github.com/ethereum/go-ethereum/blob/3c46f557/core/vm/contracts.go#L69) +/// as well as a special precompile for dispatching Substrate extrinsics +/// The following distribution has been decided for the precompiles +/// 0-1023: Ethereum Mainnet Precompiles +/// 1024-2047 Precompiles that are not in Ethereum Mainnet but are neither Moonbeam specific +/// 2048-4095 Moonbeam specific precompiles +pub type MoonbeamPrecompiles = PrecompileSetBuilder< + R, + ( + // Skip precompiles if out of range. + PrecompilesInRangeInclusive<(AddressU64<1>, AddressU64<4095>), MoonbeamPrecompilesAt>, + // Prefixed precompile sets (XC20) + PrecompileSetStartingWith< + ForeignAssetPrefix, + Erc20AssetsPrecompileSet, + (CallableByContract, CallableByPrecompile), + >, + PrecompileSetStartingWith< + LocalAssetPrefix, + Erc20AssetsPrecompileSet, + (CallableByContract, CallableByPrecompile), + >, + ), +>; diff --git a/tracing/2402/runtime/moonbeam/src/xcm_config.rs b/tracing/2402/runtime/moonbeam/src/xcm_config.rs new file mode 100644 index 0000000..c710f90 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/src/xcm_config.rs @@ -0,0 +1,688 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! XCM configuration for Moonbase. +//! + +use super::{ + governance, AccountId, AssetId, AssetManager, Assets, Balance, Balances, DealWithFees, + Erc20XcmBridge, LocalAssets, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, + RuntimeEvent, RuntimeOrigin, Treasury, XcmpQueue, FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, +}; + +use pallet_evm_precompileset_assets_erc20::AccountIdAssetIdConversion; +use sp_runtime::{ + traits::{Hash as THash, PostDispatchInfoOf}, + DispatchErrorWithPostInfo, +}; + +use frame_support::{ + dispatch::Weight, + parameter_types, + traits::{EitherOfDiverse, Everything, Nothing, PalletInfoAccess}, +}; + +use frame_system::{EnsureRoot, RawOrigin}; +use sp_core::{ConstU32, H160, H256}; + +use xcm_builder::{ + AccountKey20Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, + AllowTopLevelPaidExecutionFrom, AsPrefixedGeneralIndex, ConvertedConcreteId, + CurrencyAdapter as XcmCurrencyAdapter, EnsureXcmOrigin, FungiblesAdapter, NoChecking, + ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountKey20AsNative, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, + WeightInfoBounds, WithComputedOrigin, +}; + +use xcm::latest::prelude::*; +use xcm_executor::traits::{CallDispatcher, JustTry}; + +use orml_xcm_support::MultiNativeAsset; +use xcm_primitives::{ + AbsoluteAndRelativeReserve, AccountIdToCurrencyId, AccountIdToMultiLocation, AsAssetType, + FirstAssetTrader, SignedToAccountId20, UtilityAvailableCalls, UtilityEncodeCall, XcmTransact, +}; + +use parity_scale_codec::{Decode, Encode}; +use scale_info::TypeInfo; + +use sp_std::{ + convert::{From, Into, TryFrom}, + prelude::*, +}; + +use orml_traits::parameter_type_with_key; + +use crate::governance::referenda::GeneralAdminOrRoot; + +parameter_types! { + // The network Id of the relay + pub const RelayNetwork: NetworkId = NetworkId::Polkadot; + // The relay chain Origin type + pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); + pub UniversalLocation: InteriorMultiLocation = + X2(GlobalConsensus(RelayNetwork::get()), Parachain(ParachainInfo::parachain_id().into())); + // Self Reserve location, defines the multilocation identifiying the self-reserve currency + // This is used to match it also against our Balances pallet when we receive such + // a MultiLocation: (Self Balances pallet index) + // We use the RELATIVE multilocation + pub SelfReserve: MultiLocation = MultiLocation { + parents:0, + interior: Junctions::X1( + PalletInstance(::index() as u8) + ) + }; + + // This is the relative view of our local assets. + // Indentified by thix prefix + generalIndex(assetId) + // We use the RELATIVE multilocation + pub LocalAssetsPalletLocation: MultiLocation = MultiLocation { + parents:0, + interior: Junctions::X1( + PalletInstance(::index() as u8) + ) + }; +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the default `AccountId`. + ParentIsPreset, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // If we receive a MultiLocation of type AccountKey20, just generate a native account + AccountKey20Aliases, + // Generate remote accounts according to polkadot standards + xcm_builder::HashedDescriptionDescribeFamilyAllTerminal, +); + +/// Wrapper type around `LocationToAccountId` to convert an `AccountId` to type `H160`. +pub struct LocationToH160; +impl xcm_executor::traits::Convert for LocationToH160 { + fn convert(location: MultiLocation) -> Result { + >::convert( + location, + ) + .map(Into::into) + } +} + +// The non-reserve fungible transactor type +// It will use pallet-assets, and the Id will be matched against AsAssetType +pub type ForeignFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + Assets, + // Use this currency when it is a fungible asset matching the given location or name: + ( + ConvertedConcreteId< + AssetId, + Balance, + AsAssetType, + JustTry, + >, + ), + // Do a simple punn to convert an AccountId20 MultiLocation into a native chain account ID: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont allow teleports. + NoChecking, + // We dont track any teleports + (), +>; + +/// The transactor for our own chain currency. +pub type LocalAssetTransactor = XcmCurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching any of the locations in + // SelfReserveRepresentations + xcm_builder::IsConcrete, + // We can convert the MultiLocations with our converter above: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont allow teleport + (), +>; + +/// Means for transacting local assets besides the native currency on this chain. +pub type LocalFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + LocalAssets, + // Use this currency when it is a fungible asset matching the given location or name: + ( + ConvertedConcreteId< + AssetId, + Balance, + // This just tells to convert an assetId into a GeneralIndex junction prepended + // by LocalAssetsPalletLocationNewReanchor + AsPrefixedGeneralIndex, + JustTry, + >, + ), + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont want to allow teleporting assets + NoChecking, + // The account to use for tracking teleports. + (), +>; + +// We use all transactors +pub type AssetTransactors = ( + LocalAssetTransactor, + ForeignFungiblesTransactor, + LocalFungiblesTransactor, + Erc20XcmBridge, +); + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can +/// biases the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain which they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when + // recognised. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognised. + SiblingParachainAsNative, + // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. + pallet_xcm::XcmPassthrough, + // Xcm Origins defined by a Multilocation of type AccountKey20 can be converted to a 20 byte- + // account local origin + SignedAccountKey20AsNative, +); + +parameter_types! { + /// The amount of weight an XCM operation takes. This is safe overestimate. + pub UnitWeightCost: Weight = Weight::from_parts(200_000_000u64, 0); + /// Maximum number of instructions in a single XCM fragment. A sanity check against + /// weight caculations getting too crazy. + pub MaxInstructions: u32 = 100; +} + +/// Xcm Weigher shared between multiple Xcm-related configs. +pub type XcmWeigher = WeightInfoBounds< + moonbeam_xcm_benchmarks::weights::XcmWeight, + RuntimeCall, + MaxInstructions, +>; + +pub type XcmBarrier = ( + // Weight that is paid for may be consumed. + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, +); + +parameter_types! { + /// Xcm fees will go to the treasury account + pub XcmFeesAccount: AccountId = Treasury::account_id(); +} + +/// This is the struct that will handle the revenue from xcm fees +/// We do not burn anything because we want to mimic exactly what +/// the sovereign account has +pub type XcmFeesToAccount = xcm_primitives::XcmFeesToAccount< + Assets, + ( + ConvertedConcreteId< + AssetId, + Balance, + AsAssetType, + JustTry, + >, + ), + AccountId, + XcmFeesAccount, +>; + +pub struct SafeCallFilter; +impl frame_support::traits::Contains for SafeCallFilter { + fn contains(_call: &RuntimeCall) -> bool { + // TODO review + // This needs to be addressed at EVM level + true + } +} + +parameter_types! { + pub const MaxAssetsIntoHolding: u32 = xcm_primitives::MAX_ASSETS; +} + +// Our implementation of the Moonbeam Call +// Attachs the right origin in case the call is made to pallet-ethereum-xcm +#[cfg(not(feature = "evm-tracing"))] +moonbeam_runtime_common::impl_moonbeam_xcm_call!(); +#[cfg(feature = "evm-tracing")] +moonbeam_runtime_common::impl_moonbeam_xcm_call_tracing!(); + +moonbeam_runtime_common::impl_evm_runner_precompile_or_eth_xcm!(); + +pub struct XcmExecutorConfig; +impl xcm_executor::Config for XcmExecutorConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + // How to withdraw and deposit an asset. + type AssetTransactor = AssetTransactors; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + // Filter to the reserve withdraw operations + // Whenever the reserve matches the relative or absolute value + // of our chain, we always return the relative reserve + type IsReserve = MultiNativeAsset>; + type IsTeleporter = (); // No teleport + type UniversalLocation = UniversalLocation; + type Barrier = XcmBarrier; + type Weigher = XcmWeigher; + // We use two traders + // When we receive the relative representation of the self-reserve asset, + // we use UsingComponents and the local way of handling fees + // When we receive a non-reserve asset, we use AssetManager to fetch how many + // units per second we should charge + type Trader = ( + UsingComponents< + ::WeightToFee, + SelfReserve, + AccountId, + Balances, + DealWithFees, + >, + FirstAssetTrader, + ); + type ResponseHandler = PolkadotXcm; + type SubscriptionService = PolkadotXcm; + type AssetTrap = pallet_erc20_xcm_bridge::AssetTrapWrapper; + type AssetClaims = PolkadotXcm; + type CallDispatcher = MoonbeamCall; + type PalletInstancesInfo = crate::AllPalletsWithSystem; + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type AssetLocker = (); + type AssetExchanger = (); + type FeeManager = (); + type MessageExporter = (); + type UniversalAliases = Nothing; + type SafeCallFilter = SafeCallFilter; + type AssetIsBurnable = Everything; +} + +type XcmExecutor = pallet_erc20_xcm_bridge::XcmExecutorWrapper< + RuntimeCall, + xcm_executor::XcmExecutor, +>; + +// Converts a Signed Local Origin into a MultiLocation +pub type LocalOriginToLocation = SignedToAccountId20; + +/// The means for routing XCM messages which are not for local execution into the right message +/// queues. +pub type XcmRouter = ( + // Two routers - use UMP to communicate with the relay chain: + cumulus_primitives_utility::ParentAsUmp, + // ..and XCMP to communicate with the sibling chains. + XcmpQueue, +); + +#[cfg(feature = "runtime-benchmarks")] +parameter_types! { + pub ReachableDest: Option = Some(Parent.into()); +} + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = Nothing; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Nothing; + type XcmReserveTransferFilter = Everything; + type Weigher = XcmWeigher; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; + type Currency = Balances; + type CurrencyMatcher = (); + type TrustedLockers = (); + type SovereignAccountOf = LocationToAccountId; + type MaxLockers = ConstU32<8>; + // TODO pallet-xcm weights + type WeightInfo = pallet_xcm::TestWeightInfo; + #[cfg(feature = "runtime-benchmarks")] + type ReachableDest = ReachableDest; +} + +impl cumulus_pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +impl cumulus_pallet_xcmp_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; + type ChannelInfo = ParachainSystem; + type VersionWrapper = PolkadotXcm; + type ExecuteOverweightOrigin = EnsureRoot; + type ControllerOrigin = EnsureRoot; + type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; + type WeightInfo = cumulus_pallet_xcmp_queue::weights::SubstrateWeight; + type PriceForSiblingDelivery = (); +} + +impl cumulus_pallet_dmp_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; + type ExecuteOverweightOrigin = EnsureRoot; +} + +// Our AssetType. For now we only handle Xcm Assets +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum AssetType { + Xcm(MultiLocation), +} +impl Default for AssetType { + fn default() -> Self { + Self::Xcm(MultiLocation::here()) + } +} + +impl From for AssetType { + fn from(location: MultiLocation) -> Self { + Self::Xcm(location) + } +} +impl Into> for AssetType { + fn into(self) -> Option { + match self { + Self::Xcm(location) => Some(location), + } + } +} + +// Implementation on how to retrieve the AssetId from an AssetType +// We simply hash the AssetType and take the lowest 128 bits +impl From for AssetId { + fn from(asset: AssetType) -> AssetId { + match asset { + AssetType::Xcm(id) => { + let mut result: [u8; 16] = [0u8; 16]; + let hash: H256 = id.using_encoded(::Hashing::hash); + result.copy_from_slice(&hash.as_fixed_bytes()[0..16]); + u128::from_le_bytes(result) + } + } + } +} + +// Our currencyId. We distinguish for now between SelfReserve, and Others, defined by their Id. +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum CurrencyId { + // Our native token + SelfReserve, + // Assets representing other chains native tokens + ForeignAsset(AssetId), + // Our local assets + LocalAssetReserve(AssetId), + // Erc20 token + Erc20 { contract_address: H160 }, +} + +impl AccountIdToCurrencyId for Runtime { + fn account_to_currency_id(account: AccountId) -> Option { + Some(match account { + // the self-reserve currency is identified by the pallet-balances address + a if a == H160::from_low_u64_be(2050).into() => CurrencyId::SelfReserve, + // the rest of the currencies, by their corresponding erc20 address + _ => match Runtime::account_to_asset_id(account) { + // We distinguish by prefix, and depending on it we create either + // Foreign or Local + Some((prefix, asset_id)) => { + if prefix == FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX.to_vec() { + CurrencyId::ForeignAsset(asset_id) + } else { + CurrencyId::LocalAssetReserve(asset_id) + } + } + // If no known prefix is identified, we consider that it's a "real" erc20 token + // (i.e. managed by a real smart contract) + None => CurrencyId::Erc20 { + contract_address: account.into(), + }, + }, + }) + } +} +// How to convert from CurrencyId to MultiLocation +pub struct CurrencyIdtoMultiLocation(sp_std::marker::PhantomData); +impl sp_runtime::traits::Convert> + for CurrencyIdtoMultiLocation +where + AssetXConverter: xcm_executor::traits::Convert, +{ + fn convert(currency: CurrencyId) -> Option { + match currency { + CurrencyId::SelfReserve => { + let multi: MultiLocation = SelfReserve::get(); + Some(multi) + } + CurrencyId::ForeignAsset(asset) => AssetXConverter::reverse_ref(asset).ok(), + // No transactor matches this yet, so even if we have this enum variant the transfer will fail + CurrencyId::LocalAssetReserve(asset) => { + let mut location = LocalAssetsPalletLocation::get(); + location.push_interior(Junction::GeneralIndex(asset)).ok(); + Some(location) + } + CurrencyId::Erc20 { contract_address } => { + let mut location = Erc20XcmBridgePalletLocation::get(); + location + .push_interior(Junction::AccountKey20 { + key: contract_address.0, + network: None, + }) + .ok(); + Some(location) + } + } + } +} + +parameter_types! { + pub const BaseXcmWeight: Weight = Weight::from_parts(200_000_000u64, 0); + pub const MaxAssetsForTransfer: usize = 2; + + // This is how we are going to detect whether the asset is a Reserve asset + // This however is the chain part only + pub SelfLocation: MultiLocation = MultiLocation::here(); + // We need this to be able to catch when someone is trying to execute a non- + // cross-chain transfer in xtokens through the absolute path way + pub SelfLocationAbsolute: MultiLocation = MultiLocation { + parents:1, + interior: Junctions::X1( + Parachain(ParachainInfo::parachain_id().into()) + ) + }; +} + +parameter_type_with_key! { + pub ParachainMinFee: |_location: MultiLocation| -> Option { + Some(u128::MAX) + }; +} + +impl orml_xtokens::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type CurrencyId = CurrencyId; + type AccountIdToMultiLocation = AccountIdToMultiLocation; + type CurrencyIdConvert = + CurrencyIdtoMultiLocation>; + type XcmExecutor = XcmExecutor; + type SelfLocation = SelfLocation; + type Weigher = XcmWeigher; + type BaseXcmWeight = BaseXcmWeight; + type UniversalLocation = UniversalLocation; + type MaxAssetsForTransfer = MaxAssetsForTransfer; + type MinXcmFee = ParachainMinFee; + type MultiLocationsFilter = Everything; + type ReserveProvider = AbsoluteAndRelativeReserve; +} + +// 1 DOT should be enough +parameter_types! { + pub MaxHrmpRelayFee: MultiAsset = (MultiLocation::parent(), 1_000_000_000_000u128).into(); +} + +// For now we only allow to transact in the relay, although this might change in the future +// Transactors just defines the chains in which we allow transactions to be issued through +// xcm +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum Transactors { + Relay, +} + +// Default for benchmarking +#[cfg(feature = "runtime-benchmarks")] +impl Default for Transactors { + fn default() -> Self { + Transactors::Relay + } +} + +impl TryFrom for Transactors { + type Error = (); + fn try_from(value: u8) -> Result { + match value { + 0u8 => Ok(Transactors::Relay), + _ => Err(()), + } + } +} + +impl UtilityEncodeCall for Transactors { + fn encode_call(self, call: UtilityAvailableCalls) -> Vec { + match self { + // The encoder should be polkadot + Transactors::Relay => { + moonbeam_relay_encoder::polkadot::PolkadotEncoder.encode_call(call) + } + } + } +} + +impl XcmTransact for Transactors { + fn destination(self) -> MultiLocation { + match self { + Transactors::Relay => MultiLocation::parent(), + } + } +} + +pub type DerivativeAddressRegistrationOrigin = + EitherOfDiverse, governance::custom_origins::GeneralAdmin>; + +impl pallet_xcm_transactor::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type Transactor = Transactors; + type DerivativeAddressRegistrationOrigin = DerivativeAddressRegistrationOrigin; + type SovereignAccountDispatcherOrigin = EnsureRoot; + type CurrencyId = CurrencyId; + type AccountIdToMultiLocation = AccountIdToMultiLocation; + type CurrencyIdToMultiLocation = + CurrencyIdtoMultiLocation>; + type XcmSender = XcmRouter; + type SelfLocation = SelfLocation; + type Weigher = XcmWeigher; + type UniversalLocation = UniversalLocation; + type BaseXcmWeight = BaseXcmWeight; + type AssetTransactor = AssetTransactors; + type ReserveProvider = AbsoluteAndRelativeReserve; + type WeightInfo = pallet_xcm_transactor::weights::SubstrateWeight; + type HrmpManipulatorOrigin = GeneralAdminOrRoot; + type MaxHrmpFee = xcm_builder::Case; + type HrmpEncoder = moonbeam_relay_encoder::polkadot::PolkadotEncoder; +} + +parameter_types! { + // This is the relative view of erc20 assets. + // Identified by this prefix + AccountKey20(contractAddress) + // We use the RELATIVE multilocation + pub Erc20XcmBridgePalletLocation: MultiLocation = MultiLocation { + parents:0, + interior: Junctions::X1( + PalletInstance(::index() as u8) + ) + }; + + // To be able to support almost all erc20 implementations, + // we provide a sufficiently hight gas limit. + pub Erc20XcmBridgeTransferGasLimit: u64 = 80_000; +} + +impl pallet_erc20_xcm_bridge::Config for Runtime { + type AccountIdConverter = LocationToH160; + type Erc20MultilocationPrefix = Erc20XcmBridgePalletLocation; + type Erc20TransferGasLimit = Erc20XcmBridgeTransferGasLimit; + type EvmRunner = EvmRunnerPrecompileOrEthXcm; +} + +#[cfg(feature = "runtime-benchmarks")] +mod testing { + use super::*; + + /// This From exists for benchmarking purposes. It has the potential side-effect of calling + /// AssetManager::set_asset_type_asset_id() and should NOT be used in any production code. + impl From for CurrencyId { + fn from(location: MultiLocation) -> CurrencyId { + use xcm_executor::traits::Convert as XConvert; + use xcm_primitives::AssetTypeGetter; + + // If it does not exist, for benchmarking purposes, we create the association + let asset_id = if let Ok(asset_id) = + AsAssetType::::convert_ref(&location) + { + asset_id + } else { + let asset_type = AssetType::Xcm(location); + let asset_id: AssetId = asset_type.clone().into(); + AssetManager::set_asset_type_asset_id(asset_type, asset_id); + asset_id + }; + + CurrencyId::ForeignAsset(asset_id) + } + } +} diff --git a/tracing/2402/runtime/moonbeam/tests/common/mod.rs b/tracing/2402/runtime/moonbeam/tests/common/mod.rs new file mode 100644 index 0000000..3063502 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/tests/common/mod.rs @@ -0,0 +1,403 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +#![allow(dead_code)] + +use cumulus_primitives_parachain_inherent::ParachainInherentData; +use fp_evm::GenesisAccount; +use frame_support::{ + assert_ok, + dispatch::Dispatchable, + traits::{GenesisBuild, OnFinalize, OnInitialize}, +}; +pub use moonbeam_runtime::{ + asset_config::AssetRegistrarMetadata, + currency::{GIGAWEI, GLMR, SUPPLY_FACTOR, WEI}, + xcm_config::AssetType, + AccountId, AssetId, AssetManager, Assets, AuthorInherent, Balance, Balances, CrowdloanRewards, + Ethereum, Executive, Header, InflationInfo, LocalAssets, ParachainStaking, Range, Runtime, + RuntimeCall, RuntimeEvent, System, TransactionConverter, TransactionPaymentAsGasPrice, + UncheckedExtrinsic, HOURS, WEEKS, +}; +use nimbus_primitives::{NimbusId, NIMBUS_ENGINE_ID}; +use sp_core::{Encode, H160}; +use sp_runtime::{Digest, DigestItem, Perbill, Percent}; + +use std::collections::BTreeMap; + +use fp_rpc::ConvertTransaction; + +// A valid signed Alice transfer. +pub const VALID_ETH_TX: &str = + "02f869820501808085e8d4a51000825208943cd0a705a2dc65e5b1e1205896baa2be8a07c6e00180c\ + 001a061087911e877a5802142a89a40d231d50913db399eb50839bb2d04e612b22ec8a01aa313efdf2\ + 793bea76da6813bda611444af16a6207a8cfef2d9c8aa8f8012f7"; + +// An invalid signed Alice transfer with a gas limit artifically set to 0. +pub const INVALID_ETH_TX: &str = + "f8628085174876e800809412cb274aad8251c875c0bf6872b67d9983e53fdd01801ba011110796057\ + 0e2d49fcc2afbc582e1abd3eeb027242b92abcebcec7cdefab63ea001732f6fac84acdd5b096554230\ + 75003e7f07430652c3d6722e18f50b3d34e29"; + +pub fn rpc_run_to_block(n: u32) { + while System::block_number() < n { + Ethereum::on_finalize(System::block_number()); + System::set_block_number(System::block_number() + 1); + Ethereum::on_initialize(System::block_number()); + } +} + +/// Utility function that advances the chain to the desired block number. +/// If an author is provided, that author information is injected to all the blocks in the meantime. +pub fn run_to_block(n: u32, author: Option) { + // Finalize the first block + Ethereum::on_finalize(System::block_number()); + AuthorInherent::on_finalize(System::block_number()); + while System::block_number() < n { + // Set the new block number and author + match author { + Some(ref author) => { + let pre_digest = Digest { + logs: vec![DigestItem::PreRuntime(NIMBUS_ENGINE_ID, author.encode())], + }; + System::reset_events(); + System::initialize( + &(System::block_number() + 1), + &System::parent_hash(), + &pre_digest, + ); + } + None => { + System::set_block_number(System::block_number() + 1); + } + } + + // Initialize the new block + AuthorInherent::on_initialize(System::block_number()); + ParachainStaking::on_initialize(System::block_number()); + Ethereum::on_initialize(System::block_number()); + + // Finalize the block + Ethereum::on_finalize(System::block_number()); + AuthorInherent::on_finalize(System::block_number()); + ParachainStaking::on_finalize(System::block_number()); + } +} + +pub fn last_event() -> RuntimeEvent { + System::events().pop().expect("Event expected").event +} + +// Helper function to give a simple evm context suitable for tests. +// We can remove this once https://github.com/rust-blockchain/evm/pull/35 +// is in our dependency graph. +pub fn evm_test_context() -> fp_evm::Context { + fp_evm::Context { + address: Default::default(), + caller: Default::default(), + apparent_value: From::from(0), + } +} + +// Test struct with the purpose of initializing xcm assets +#[derive(Clone)] +pub struct XcmAssetInitialization { + pub asset_type: AssetType, + pub metadata: AssetRegistrarMetadata, + pub balances: Vec<(AccountId, Balance)>, + pub is_sufficient: bool, +} + +pub struct ExtBuilder { + // [asset, Vec, owner] + local_assets: Vec<(AssetId, Vec<(AccountId, Balance)>, AccountId)>, + // endowed accounts with balances + balances: Vec<(AccountId, Balance)>, + // [collator, amount] + collators: Vec<(AccountId, Balance)>, + // [delegator, collator, nomination_amount] + delegations: Vec<(AccountId, AccountId, Balance, Percent)>, + // per-round inflation config + inflation: InflationInfo, + // AuthorId -> AccountId mappings + mappings: Vec<(NimbusId, AccountId)>, + // Crowdloan fund + crowdloan_fund: Balance, + // Chain id + chain_id: u64, + // EVM genesis accounts + evm_accounts: BTreeMap, + // [assettype, metadata, Vec, is_sufficient] + xcm_assets: Vec, + safe_xcm_version: Option, +} + +impl Default for ExtBuilder { + fn default() -> ExtBuilder { + ExtBuilder { + local_assets: vec![], + balances: vec![], + delegations: vec![], + collators: vec![], + inflation: InflationInfo { + expect: Range { + min: 100_000 * GLMR, + ideal: 200_000 * GLMR, + max: 500_000 * GLMR, + }, + // not used + annual: Range { + min: Perbill::from_percent(50), + ideal: Perbill::from_percent(50), + max: Perbill::from_percent(50), + }, + // unrealistically high parameterization, only for testing + round: Range { + min: Perbill::from_percent(5), + ideal: Perbill::from_percent(5), + max: Perbill::from_percent(5), + }, + }, + mappings: vec![], + crowdloan_fund: 0, + chain_id: CHAIN_ID, + evm_accounts: BTreeMap::new(), + xcm_assets: vec![], + safe_xcm_version: None, + } + } +} + +impl ExtBuilder { + pub fn with_evm_accounts(mut self, accounts: BTreeMap) -> Self { + self.evm_accounts = accounts; + self + } + + pub fn with_balances(mut self, balances: Vec<(AccountId, Balance)>) -> Self { + self.balances = balances; + self + } + + pub fn with_collators(mut self, collators: Vec<(AccountId, Balance)>) -> Self { + self.collators = collators; + self + } + + pub fn with_delegations(mut self, delegations: Vec<(AccountId, AccountId, Balance)>) -> Self { + self.delegations = delegations + .into_iter() + .map(|d| (d.0, d.1, d.2, Percent::zero())) + .collect(); + self + } + + pub fn with_crowdloan_fund(mut self, crowdloan_fund: Balance) -> Self { + self.crowdloan_fund = crowdloan_fund; + self + } + + pub fn with_mappings(mut self, mappings: Vec<(NimbusId, AccountId)>) -> Self { + self.mappings = mappings; + self + } + + pub fn with_local_assets( + mut self, + local_assets: Vec<(AssetId, Vec<(AccountId, Balance)>, AccountId)>, + ) -> Self { + self.local_assets = local_assets; + self + } + + pub fn with_xcm_assets(mut self, xcm_assets: Vec) -> Self { + self.xcm_assets = xcm_assets; + self + } + + pub fn with_safe_xcm_version(mut self, safe_xcm_version: u32) -> Self { + self.safe_xcm_version = Some(safe_xcm_version); + self + } + + #[allow(dead_code)] + pub fn with_inflation(mut self, inflation: InflationInfo) -> Self { + self.inflation = inflation; + self + } + + pub fn build(self) -> sp_io::TestExternalities { + let mut t = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap(); + + pallet_balances::GenesisConfig:: { + balances: self.balances, + } + .assimilate_storage(&mut t) + .unwrap(); + + pallet_parachain_staking::GenesisConfig:: { + candidates: self.collators, + delegations: self.delegations, + inflation_config: self.inflation, + collator_commission: Perbill::from_percent(20), + parachain_bond_reserve_percent: Percent::from_percent(30), + blocks_per_round: 6 * HOURS, + num_selected_candidates: 8, + } + .assimilate_storage(&mut t) + .unwrap(); + + pallet_crowdloan_rewards::GenesisConfig:: { + funded_amount: self.crowdloan_fund, + } + .assimilate_storage(&mut t) + .unwrap(); + + pallet_author_mapping::GenesisConfig:: { + mappings: self.mappings, + } + .assimilate_storage(&mut t) + .unwrap(); + + >::assimilate_storage( + &pallet_ethereum_chain_id::GenesisConfig { + chain_id: self.chain_id, + }, + &mut t, + ) + .unwrap(); + + >::assimilate_storage( + &pallet_evm::GenesisConfig { + accounts: self.evm_accounts, + }, + &mut t, + ) + .unwrap(); + + >::assimilate_storage( + &pallet_ethereum::GenesisConfig {}, + &mut t, + ) + .unwrap(); + + >::assimilate_storage( + &pallet_xcm::GenesisConfig { + safe_xcm_version: self.safe_xcm_version, + }, + &mut t, + ) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + let local_assets = self.local_assets.clone(); + let xcm_assets = self.xcm_assets.clone(); + ext.execute_with(|| { + // If any local assets specified, we create them here + for (asset_id, balances, owner) in local_assets.clone() { + LocalAssets::force_create(root_origin(), asset_id.into(), owner, true, 1).unwrap(); + for (account, balance) in balances { + LocalAssets::mint(origin_of(owner.into()), asset_id.into(), account, balance) + .unwrap(); + } + } + // If any xcm assets specified, we register them here + for xcm_asset_initialization in xcm_assets { + let asset_id: AssetId = xcm_asset_initialization.asset_type.clone().into(); + AssetManager::register_foreign_asset( + root_origin(), + xcm_asset_initialization.asset_type, + xcm_asset_initialization.metadata, + 1, + xcm_asset_initialization.is_sufficient, + ) + .unwrap(); + for (account, balance) in xcm_asset_initialization.balances { + Assets::mint( + origin_of(AssetManager::account_id()), + asset_id.into(), + account, + balance, + ) + .unwrap(); + } + } + System::set_block_number(1); + }); + ext + } +} + +pub const CHAIN_ID: u64 = 1281; +pub const ALICE: [u8; 20] = [4u8; 20]; +pub const ALICE_NIMBUS: [u8; 32] = [4u8; 32]; +pub const BOB: [u8; 20] = [5u8; 20]; +pub const CHARLIE: [u8; 20] = [6u8; 20]; +pub const DAVE: [u8; 20] = [7u8; 20]; +pub const EVM_CONTRACT: [u8; 20] = [8u8; 20]; + +pub fn origin_of(account_id: AccountId) -> ::RuntimeOrigin { + ::RuntimeOrigin::signed(account_id) +} + +pub fn inherent_origin() -> ::RuntimeOrigin { + ::RuntimeOrigin::none() +} + +pub fn root_origin() -> ::RuntimeOrigin { + ::RuntimeOrigin::root() +} + +/// Mock the inherent that sets validation data in ParachainSystem, which +/// contains the `relay_chain_block_number`, which is used in `author-filter` as a +/// source of randomness to filter valid authors at each block. +pub fn set_parachain_inherent_data() { + use cumulus_primitives_core::PersistedValidationData; + use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; + let (relay_parent_storage_root, relay_chain_state) = + RelayStateSproofBuilder::default().into_state_root_and_proof(); + let vfp = PersistedValidationData { + relay_parent_number: 1u32, + relay_parent_storage_root, + ..Default::default() + }; + let parachain_inherent_data = ParachainInherentData { + validation_data: vfp, + relay_chain_state: relay_chain_state, + downward_messages: Default::default(), + horizontal_messages: Default::default(), + }; + assert_ok!(RuntimeCall::ParachainSystem( + cumulus_pallet_parachain_system::Call::::set_validation_data { + data: parachain_inherent_data + } + ) + .dispatch(inherent_origin())); +} + +pub fn unchecked_eth_tx(raw_hex_tx: &str) -> UncheckedExtrinsic { + let converter = TransactionConverter; + converter.convert_transaction(ethereum_transaction(raw_hex_tx)) +} + +pub fn ethereum_transaction(raw_hex_tx: &str) -> pallet_ethereum::Transaction { + let bytes = hex::decode(raw_hex_tx).expect("Transaction bytes."); + let transaction = ethereum::EnvelopedDecodable::decode(&bytes[..]); + assert!(transaction.is_ok()); + transaction.unwrap() +} diff --git a/tracing/2402/runtime/moonbeam/tests/evm_tracing.rs b/tracing/2402/runtime/moonbeam/tests/evm_tracing.rs new file mode 100644 index 0000000..b023e94 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/tests/evm_tracing.rs @@ -0,0 +1,94 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Moonbeam EVM tracing Integration Tests + +mod common; + +#[cfg(test)] +#[cfg(feature = "evm-tracing")] +mod tests { + use super::common::*; + + use pallet_evm::AddressMapping; + use sp_core::H160; + + use moonbeam_rpc_primitives_debug::runtime_decl_for_debug_runtime_api::DebugRuntimeApi; + use std::str::FromStr; + + #[test] + fn debug_runtime_api_trace_transaction() { + let alith = ::AddressMapping::into_account_id( + H160::from_str("6be02d1d3665660d22ff9624b7be0551ee1ac91b") + .expect("internal H160 is valid; qed"), + ); + ExtBuilder::default() + .with_balances(vec![ + (alith, 2_000 * GLMR), + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .build() + .execute_with(|| { + let non_eth_uxt = UncheckedExtrinsic::new_unsigned( + pallet_balances::Call::::transfer { + dest: AccountId::from(BOB), + value: 1 * GLMR, + } + .into(), + ); + let transaction = ethereum_transaction(VALID_ETH_TX); + let eth_uxt = unchecked_eth_tx(VALID_ETH_TX); + assert!(Runtime::trace_transaction( + vec![non_eth_uxt.clone(), eth_uxt, non_eth_uxt.clone()], + &transaction + ) + .is_ok()); + }); + } + + #[test] + fn debug_runtime_api_trace_block() { + let alith = ::AddressMapping::into_account_id( + H160::from_str("6be02d1d3665660d22ff9624b7be0551ee1ac91b") + .expect("internal H160 is valid; qed"), + ); + ExtBuilder::default() + .with_balances(vec![ + (alith, 2_000 * GLMR), + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .build() + .execute_with(|| { + let non_eth_uxt = UncheckedExtrinsic::new_unsigned( + pallet_balances::Call::::transfer { + dest: AccountId::from(BOB), + value: 1 * GLMR, + } + .into(), + ); + let eth_uxt = unchecked_eth_tx(VALID_ETH_TX); + let eth_tx = ethereum_transaction(VALID_ETH_TX); + let eth_extrinsic_hash = eth_tx.hash(); + assert!(Runtime::trace_block( + vec![non_eth_uxt.clone(), eth_uxt.clone(), non_eth_uxt, eth_uxt], + vec![eth_extrinsic_hash, eth_extrinsic_hash] + ) + .is_ok()); + }); + } +} diff --git a/tracing/2402/runtime/moonbeam/tests/integration_test.rs b/tracing/2402/runtime/moonbeam/tests/integration_test.rs new file mode 100644 index 0000000..da80cb3 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/tests/integration_test.rs @@ -0,0 +1,3246 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Moonbeam Runtime Integration Tests + +#![cfg(test)] + +mod common; +use common::*; + +use fp_evm::{Context, IsPrecompileResult}; +use frame_support::{ + assert_noop, assert_ok, + dispatch::{DispatchClass, Dispatchable}, + traits::{ + fungible::Inspect, fungibles::Inspect as FungiblesInspect, Currency as CurrencyT, + EnsureOrigin, PalletInfo, StorageInfo, StorageInfoTrait, + }, + weights::{constants::WEIGHT_REF_TIME_PER_SECOND, Weight}, + StorageHasher, Twox128, +}; +use moonbeam_runtime::{ + asset_config::LocalAssetInstance, + currency::GLMR, + xcm_config::{CurrencyId, SelfReserve}, + AccountId, Balances, CouncilCollective, CrowdloanRewards, OpenTechCommitteeCollective, + ParachainStaking, PolkadotXcm, Precompiles, Runtime, RuntimeBlockWeights, RuntimeCall, + RuntimeEvent, System, TechCommitteeCollective, TransactionPayment, TreasuryCouncilCollective, + XTokens, XcmTransactor, FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, +}; +use moonbeam_xcm_benchmarks::weights::XcmWeight; +use nimbus_primitives::NimbusId; +use pallet_evm::PrecompileSet; +use pallet_evm_precompileset_assets_erc20::{ + AccountIdAssetIdConversion, IsLocal, SELECTOR_LOG_APPROVAL, SELECTOR_LOG_TRANSFER, +}; +use pallet_transaction_payment::Multiplier; +use pallet_xcm_transactor::{Currency, CurrencyPayment, TransactWeights}; +use parity_scale_codec::Encode; +use polkadot_parachain::primitives::Sibling; +use precompile_utils::{ + precompile_set::{is_precompile_or_fail, IsActivePrecompile}, + prelude::*, + testing::*, +}; +use sha3::{Digest, Keccak256}; +use sp_core::{ByteArray, Pair, H160, U256}; +use sp_runtime::{traits::Convert, DispatchError, ModuleError, TokenError}; +use std::str::from_utf8; +use xcm::latest::prelude::*; +use xcm::{VersionedMultiAsset, VersionedMultiAssets, VersionedMultiLocation}; +use xcm_builder::{ParentIsPreset, SiblingParachainConvertsVia}; +use xcm_executor::traits::Convert as XcmConvert; + +type BatchPCall = pallet_evm_precompile_batch::BatchPrecompileCall; +type CrowdloanRewardsPCall = + pallet_evm_precompile_crowdloan_rewards::CrowdloanRewardsPrecompileCall; +type XcmUtilsPCall = pallet_evm_precompile_xcm_utils::XcmUtilsPrecompileCall< + Runtime, + moonbeam_runtime::xcm_config::XcmExecutorConfig, +>; +type XtokensPCall = pallet_evm_precompile_xtokens::XtokensPrecompileCall; +type LocalAssetsPCall = pallet_evm_precompileset_assets_erc20::Erc20AssetsPrecompileSetCall< + Runtime, + IsLocal, + LocalAssetInstance, +>; +type XcmTransactorV2PCall = + pallet_evm_precompile_xcm_transactor::v2::XcmTransactorPrecompileV2Call; + +const BASE_FEE_GENESIS: u128 = 10000 * GIGAWEI; + +#[test] +fn xcmp_queue_controller_origin_is_root() { + // important for the XcmExecutionManager impl of PauseExecution which uses root origin + // to suspend/resume XCM execution in xcmp_queue::on_idle + assert_ok!( + ::ControllerOrigin::ensure_origin(root_origin()) + ); +} + +#[test] +fn fast_track_available() { + assert!(moonbeam_runtime::get!( + pallet_democracy, + InstantAllowed, + bool + )); +} + +#[test] +fn verify_pallet_prefixes() { + fn is_pallet_prefix(name: &str) { + // Compares the unhashed pallet prefix in the `StorageInstance` implementation by every + // storage item in the pallet P. This pallet prefix is used in conjunction with the + // item name to get the unique storage key: hash(PalletPrefix) + hash(StorageName) + // https://github.com/paritytech/substrate/blob/master/frame/support/procedural/src/pallet/ + // expand/storage.rs#L389-L401 + assert_eq!( + ::PalletInfo::name::

(), + Some(name) + ); + } + // TODO: use StorageInfoTrait once https://github.com/paritytech/substrate/pull/9246 + // is pulled in substrate deps. + is_pallet_prefix::("System"); + is_pallet_prefix::("Utility"); + is_pallet_prefix::("ParachainSystem"); + is_pallet_prefix::("TransactionPayment"); + is_pallet_prefix::("ParachainInfo"); + is_pallet_prefix::("EthereumChainId"); + is_pallet_prefix::("EVM"); + is_pallet_prefix::("Ethereum"); + is_pallet_prefix::("ParachainStaking"); + is_pallet_prefix::("Scheduler"); + is_pallet_prefix::("Democracy"); + is_pallet_prefix::("CouncilCollective"); + is_pallet_prefix::("TechCommitteeCollective"); + is_pallet_prefix::( + "OpenTechCommitteeCollective", + ); + is_pallet_prefix::("Treasury"); + is_pallet_prefix::("AuthorInherent"); + is_pallet_prefix::("AuthorFilter"); + is_pallet_prefix::("CrowdloanRewards"); + is_pallet_prefix::("AuthorMapping"); + is_pallet_prefix::("MaintenanceMode"); + is_pallet_prefix::("Identity"); + is_pallet_prefix::("XcmpQueue"); + is_pallet_prefix::("CumulusXcm"); + is_pallet_prefix::("DmpQueue"); + is_pallet_prefix::("PolkadotXcm"); + is_pallet_prefix::("Assets"); + is_pallet_prefix::("XTokens"); + is_pallet_prefix::("AssetManager"); + is_pallet_prefix::("Migrations"); + is_pallet_prefix::("XcmTransactor"); + is_pallet_prefix::("ProxyGenesisCompanion"); + is_pallet_prefix::("LocalAssets"); + is_pallet_prefix::("MoonbeamOrbiters"); + is_pallet_prefix::("TreasuryCouncilCollective"); + let prefix = |pallet_name, storage_name| { + let mut res = [0u8; 32]; + res[0..16].copy_from_slice(&Twox128::hash(pallet_name)); + res[16..32].copy_from_slice(&Twox128::hash(storage_name)); + res.to_vec() + }; + assert_eq!( + ::storage_info(), + vec![ + StorageInfo { + pallet_name: b"Timestamp".to_vec(), + storage_name: b"Now".to_vec(), + prefix: prefix(b"Timestamp", b"Now"), + max_values: Some(1), + max_size: Some(8), + }, + StorageInfo { + pallet_name: b"Timestamp".to_vec(), + storage_name: b"DidUpdate".to_vec(), + prefix: prefix(b"Timestamp", b"DidUpdate"), + max_values: Some(1), + max_size: Some(1), + } + ] + ); + assert_eq!( + ::storage_info(), + vec![ + StorageInfo { + pallet_name: b"Balances".to_vec(), + storage_name: b"TotalIssuance".to_vec(), + prefix: prefix(b"Balances", b"TotalIssuance"), + max_values: Some(1), + max_size: Some(16), + }, + StorageInfo { + pallet_name: b"Balances".to_vec(), + storage_name: b"InactiveIssuance".to_vec(), + prefix: prefix(b"Balances", b"InactiveIssuance"), + max_values: Some(1), + max_size: Some(16), + }, + StorageInfo { + pallet_name: b"Balances".to_vec(), + storage_name: b"Account".to_vec(), + prefix: prefix(b"Balances", b"Account"), + max_values: None, + max_size: Some(100), + }, + StorageInfo { + pallet_name: b"Balances".to_vec(), + storage_name: b"Locks".to_vec(), + prefix: prefix(b"Balances", b"Locks"), + max_values: None, + max_size: Some(1287), + }, + StorageInfo { + pallet_name: b"Balances".to_vec(), + storage_name: b"Reserves".to_vec(), + prefix: prefix(b"Balances", b"Reserves"), + max_values: None, + max_size: Some(1037), + }, + ] + ); + assert_eq!( + ::storage_info(), + vec![ + StorageInfo { + pallet_name: b"Proxy".to_vec(), + storage_name: b"Proxies".to_vec(), + prefix: prefix(b"Proxy", b"Proxies"), + max_values: None, + max_size: Some(845), + }, + StorageInfo { + pallet_name: b"Proxy".to_vec(), + storage_name: b"Announcements".to_vec(), + prefix: prefix(b"Proxy", b"Announcements"), + max_values: None, + max_size: Some(1837), + } + ] + ); + assert_eq!( + ::storage_info(), + vec![StorageInfo { + pallet_name: b"MaintenanceMode".to_vec(), + storage_name: b"MaintenanceMode".to_vec(), + prefix: prefix(b"MaintenanceMode", b"MaintenanceMode"), + max_values: Some(1), + max_size: None, + },] + ); +} + +#[test] +fn test_collectives_storage_item_prefixes() { + for StorageInfo { pallet_name, .. } in + ::storage_info() + { + assert_eq!(pallet_name, b"CouncilCollective".to_vec()); + } + + for StorageInfo { pallet_name, .. } in + ::storage_info() + { + assert_eq!(pallet_name, b"TechCommitteeCollective".to_vec()); + } + + for StorageInfo { pallet_name, .. } in + ::storage_info() + { + assert_eq!(pallet_name, b"TreasuryCouncilCollective".to_vec()); + } + + for StorageInfo { pallet_name, .. } in + ::storage_info() + { + assert_eq!(pallet_name, b"OpenTechCommitteeCollective".to_vec()); + } +} + +#[test] +fn collective_set_members_root_origin_works() { + ExtBuilder::default().build().execute_with(|| { + // CouncilCollective + assert_ok!(CouncilCollective::set_members( + ::RuntimeOrigin::root(), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + )); + // TechCommitteeCollective + assert_ok!(TechCommitteeCollective::set_members( + ::RuntimeOrigin::root(), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + )); + // TreasuryCouncilCollective + assert_ok!(TreasuryCouncilCollective::set_members( + ::RuntimeOrigin::root(), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + )); + // OpenTechCommitteeCollective + assert_ok!(OpenTechCommitteeCollective::set_members( + ::RuntimeOrigin::root(), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + )); + }); +} + +#[test] +fn collective_set_members_general_admin_origin_works() { + use moonbeam_runtime::{ + governance::custom_origins::Origin as CustomOrigin, OriginCaller, Utility, + }; + + ExtBuilder::default().build().execute_with(|| { + let root_caller = ::RuntimeOrigin::root(); + let alice = AccountId::from(ALICE); + + // CouncilCollective + let _ = Utility::dispatch_as( + root_caller.clone(), + Box::new(OriginCaller::Origins(CustomOrigin::GeneralAdmin)), + Box::new( + pallet_collective::Call::::set_members { + new_members: vec![alice, AccountId::from(BOB)], + prime: Some(alice), + old_count: 2, + } + .into(), + ), + ); + // TechCommitteeCollective + let _ = Utility::dispatch_as( + root_caller.clone(), + Box::new(OriginCaller::Origins(CustomOrigin::GeneralAdmin)), + Box::new( + pallet_collective::Call::::set_members { + new_members: vec![alice, AccountId::from(BOB)], + prime: Some(alice), + old_count: 2, + } + .into(), + ), + ); + // TreasuryCouncilCollective + let _ = Utility::dispatch_as( + root_caller.clone(), + Box::new(OriginCaller::Origins(CustomOrigin::GeneralAdmin)), + Box::new( + pallet_collective::Call::::set_members { + new_members: vec![alice, AccountId::from(BOB)], + prime: Some(alice), + old_count: 2, + } + .into(), + ), + ); + // OpenTechCommitteeCollective + let _ = Utility::dispatch_as( + root_caller, + Box::new(OriginCaller::Origins(CustomOrigin::GeneralAdmin)), + Box::new( + pallet_collective::Call::::set_members { + new_members: vec![alice, AccountId::from(BOB)], + prime: Some(alice), + old_count: 2, + } + .into(), + ), + ); + + assert_eq!( + System::events() + .into_iter() + .filter_map(|r| { + match r.event { + RuntimeEvent::Utility(pallet_utility::Event::DispatchedAs { result }) + if result.is_ok() => + { + Some(true) + } + _ => None, + } + }) + .collect::>() + .len(), + 4 + ) + }); +} + +#[test] +fn collective_set_members_signed_origin_does_not_work() { + let alice = AccountId::from(ALICE); + ExtBuilder::default().build().execute_with(|| { + // CouncilCollective + assert!(CouncilCollective::set_members( + ::RuntimeOrigin::signed(alice), + vec![alice, AccountId::from(BOB)], + Some(alice), + 2 + ) + .is_err()); + // TechCommitteeCollective + assert!(TechCommitteeCollective::set_members( + ::RuntimeOrigin::signed(alice), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + ) + .is_err()); + // TreasuryCouncilCollective + assert!(TreasuryCouncilCollective::set_members( + ::RuntimeOrigin::signed(alice), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + ) + .is_err()); + // OpenTechCommitteeCollective + assert!(OpenTechCommitteeCollective::set_members( + ::RuntimeOrigin::signed(alice), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + ) + .is_err()); + }); +} + +#[test] +fn verify_pallet_indices() { + fn is_pallet_index(index: usize) { + assert_eq!( + ::PalletInfo::index::

(), + Some(index) + ); + } + + // System support + is_pallet_index::(0); + is_pallet_index::(1); + is_pallet_index::(3); + is_pallet_index::(4); + // Monetary + is_pallet_index::(10); + is_pallet_index::(11); + // Consensus support + is_pallet_index::(20); + is_pallet_index::(21); + is_pallet_index::(22); + is_pallet_index::(23); + is_pallet_index::(24); + // Handy utilities + is_pallet_index::(30); + is_pallet_index::(31); + is_pallet_index::(32); + is_pallet_index::(33); + is_pallet_index::(34); + is_pallet_index::(35); + // Ethereum compatibility + is_pallet_index::(50); + is_pallet_index::(51); + is_pallet_index::(52); + // Governance + is_pallet_index::(60); + is_pallet_index::(61); + // Council + is_pallet_index::(70); + is_pallet_index::(71); + is_pallet_index::(72); + is_pallet_index::(73); + // Treasury + is_pallet_index::(80); + // Crowdloan + is_pallet_index::(90); + // XCM Stuff + is_pallet_index::(100); + is_pallet_index::(101); + is_pallet_index::(102); + is_pallet_index::(103); + is_pallet_index::(104); + is_pallet_index::(105); + is_pallet_index::(106); + is_pallet_index::(107); + is_pallet_index::(108); +} + +#[test] +fn verify_reserved_indices() { + use frame_support::metadata::*; + let metadata = moonbeam_runtime::Runtime::metadata(); + let metadata = match metadata.1 { + RuntimeMetadata::V14(metadata) => metadata, + _ => panic!("metadata has been bumped, test needs to be updated"), + }; + // 40: Sudo + // 53: BaseFee + let reserved = vec![40, 53]; + let existing = metadata + .pallets + .iter() + .map(|p| p.index) + .collect::>(); + assert!(reserved.iter().all(|index| !existing.contains(index))); +} + +#[test] +fn verify_proxy_type_indices() { + assert_eq!(moonbeam_runtime::ProxyType::Any as u8, 0); + assert_eq!(moonbeam_runtime::ProxyType::NonTransfer as u8, 1); + assert_eq!(moonbeam_runtime::ProxyType::Governance as u8, 2); + assert_eq!(moonbeam_runtime::ProxyType::Staking as u8, 3); + assert_eq!(moonbeam_runtime::ProxyType::CancelProxy as u8, 4); + assert_eq!(moonbeam_runtime::ProxyType::Balances as u8, 5); + assert_eq!(moonbeam_runtime::ProxyType::AuthorMapping as u8, 6); + assert_eq!(moonbeam_runtime::ProxyType::IdentityJudgement as u8, 7); +} + +#[test] +fn join_collator_candidates() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 10_000_000 * GLMR), + (AccountId::from(BOB), 10_000_000 * GLMR), + (AccountId::from(CHARLIE), 10_000_000 * GLMR), + (AccountId::from(DAVE), 10_000_000 * GLMR), + ]) + .with_collators(vec![ + (AccountId::from(ALICE), 2_000_000 * GLMR), + (AccountId::from(BOB), 2_000_000 * GLMR), + ]) + .with_delegations(vec![ + ( + AccountId::from(CHARLIE), + AccountId::from(ALICE), + 5_000 * GLMR, + ), + (AccountId::from(CHARLIE), AccountId::from(BOB), 5_000 * GLMR), + ]) + .build() + .execute_with(|| { + assert_noop!( + ParachainStaking::join_candidates( + origin_of(AccountId::from(ALICE)), + 2_000_000 * GLMR, + 2u32 + ), + pallet_parachain_staking::Error::::CandidateExists + ); + assert_noop!( + ParachainStaking::join_candidates( + origin_of(AccountId::from(CHARLIE)), + 2_000_000 * GLMR, + 2u32 + ), + pallet_parachain_staking::Error::::DelegatorExists + ); + assert!(System::events().is_empty()); + assert_ok!(ParachainStaking::join_candidates( + origin_of(AccountId::from(DAVE)), + 2_000_000 * GLMR, + 2u32 + )); + assert_eq!( + last_event(), + RuntimeEvent::ParachainStaking( + pallet_parachain_staking::Event::JoinedCollatorCandidates { + account: AccountId::from(DAVE), + amount_locked: 2_000_000 * GLMR, + new_total_amt_locked: 6_010_000 * GLMR + } + ) + ); + let candidates = ParachainStaking::candidate_pool(); + assert_eq!(candidates.0[0].owner, AccountId::from(ALICE)); + assert_eq!(candidates.0[0].amount, 2_005_000 * GLMR); + assert_eq!(candidates.0[1].owner, AccountId::from(BOB)); + assert_eq!(candidates.0[1].amount, 2_005_000 * GLMR); + assert_eq!(candidates.0[2].owner, AccountId::from(DAVE)); + assert_eq!(candidates.0[2].amount, 2_000_000 * GLMR); + }); +} + +#[test] +fn transfer_through_evm_to_stake() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 10_000_000 * GLMR)]) + .build() + .execute_with(|| { + // Charlie has no balance => fails to stake + assert_noop!( + ParachainStaking::join_candidates( + origin_of(AccountId::from(CHARLIE)), + 2_000_000 * GLMR, + 2u32 + ), + DispatchError::Module(ModuleError { + index: 20, + error: [8, 0, 0, 0], + message: Some("InsufficientBalance") + }) + ); + // Alice transfer from free balance 3_000_000 GLMR to Bob + assert_ok!(Balances::transfer( + origin_of(AccountId::from(ALICE)), + AccountId::from(BOB), + 3_000_000 * GLMR, + )); + assert_eq!( + Balances::free_balance(AccountId::from(BOB)), + 3_000_000 * GLMR + ); + + let gas_limit = 100000u64; + let gas_price: U256 = BASE_FEE_GENESIS.into(); + // Bob transfers 2_000_000 GLMR to Charlie via EVM + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(BOB), + target: H160::from(CHARLIE), + input: vec![], + value: (2_000_000 * GLMR).into(), + gas_limit, + max_fee_per_gas: gas_price, + max_priority_fee_per_gas: None, + nonce: None, + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + assert_eq!( + Balances::free_balance(AccountId::from(CHARLIE)), + 2_000_000 * GLMR, + ); + + // Charlie can stake now + assert_ok!(ParachainStaking::join_candidates( + origin_of(AccountId::from(CHARLIE)), + 2_000_000 * GLMR, + 2u32 + ),); + let candidates = ParachainStaking::candidate_pool(); + assert_eq!(candidates.0[0].owner, AccountId::from(CHARLIE)); + assert_eq!(candidates.0[0].amount, 2_000_000 * GLMR); + }); +} + +#[test] +fn reward_block_authors() { + ExtBuilder::default() + .with_balances(vec![ + // Alice gets 10k extra tokens for her mapping deposit + (AccountId::from(ALICE), 10_010_000 * GLMR), + (AccountId::from(BOB), 10_000_000 * GLMR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 2_000_000 * GLMR)]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 50_000 * GLMR, + )]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + for x in 2..3599 { + run_to_block(x, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + } + // no rewards doled out yet + assert_eq!( + Balances::usable_balance(AccountId::from(ALICE)), + 8_000_000 * GLMR, + ); + assert_eq!( + Balances::usable_balance(AccountId::from(BOB)), + 9_950_000 * GLMR, + ); + run_to_block(3601, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + // rewards minted and distributed + assert_eq!( + Balances::usable_balance(AccountId::from(ALICE)), + 8980978048702400000000000, + ); + assert_eq!( + Balances::usable_balance(AccountId::from(BOB)), + 9969521950497200000000000, + ); + }); +} + +#[test] +fn reward_block_authors_with_parachain_bond_reserved() { + ExtBuilder::default() + .with_balances(vec![ + // Alice gets 10k extra tokens for her mapping deposit + (AccountId::from(ALICE), 10_010_000 * GLMR), + (AccountId::from(BOB), 10_000_000 * GLMR), + (AccountId::from(CHARLIE), 10_000 * GLMR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 2_000_000 * GLMR)]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 50_000 * GLMR, + )]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + assert_ok!(ParachainStaking::set_parachain_bond_account( + root_origin(), + AccountId::from(CHARLIE), + ),); + for x in 2..3599 { + run_to_block(x, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + } + // no rewards doled out yet + assert_eq!( + Balances::usable_balance(AccountId::from(ALICE)), + 8_000_000 * GLMR, + ); + assert_eq!( + Balances::usable_balance(AccountId::from(BOB)), + 9_950_000 * GLMR, + ); + assert_eq!( + Balances::usable_balance(AccountId::from(CHARLIE)), + 10_000 * GLMR, + ); + run_to_block(3601, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + // rewards minted and distributed + assert_eq!( + Balances::usable_balance(AccountId::from(ALICE)), + 8688492682878000000000000, + ); + assert_eq!( + Balances::usable_balance(AccountId::from(BOB)), + 9962207316621500000000000, + ); + // 30% reserved for parachain bond + assert_eq!( + Balances::usable_balance(AccountId::from(CHARLIE)), + 310300000000000000000000, + ); + }); +} + +#[test] +fn initialize_crowdloan_addresses_with_batch_and_pay() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 200_000 * GLMR), + (AccountId::from(BOB), 100_000 * GLMR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 100_000 * GLMR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(300_000_000 * GLMR) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(CHARLIE)), + 150_000_000 * GLMR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [5u8; 32].into(), + Some(AccountId::from(DAVE)), + 150_000_000 * GLMR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + // 30 percent initial payout + assert_eq!( + Balances::balance(&AccountId::from(CHARLIE)), + 45_000_000 * GLMR + ); + // 30 percent initial payout + assert_eq!(Balances::balance(&AccountId::from(DAVE)), 45_000_000 * GLMR); + let expected = RuntimeEvent::Utility(pallet_utility::Event::BatchCompleted); + assert_eq!(last_event(), expected); + // This one should fail, as we already filled our data + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch { + calls: vec![RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(ALICE)), + 43_200_000 + )] + } + )] + }) + .dispatch(root_origin()) + ); + let expected_fail = RuntimeEvent::Utility(pallet_utility::Event::BatchInterrupted { + index: 0, + error: DispatchError::Module(ModuleError { + index: 90, + error: [8, 0, 0, 0], + message: None, + }), + }); + assert_eq!(last_event(), expected_fail); + // Claim 1 block. + assert_ok!(CrowdloanRewards::claim(origin_of(AccountId::from(CHARLIE)))); + assert_ok!(CrowdloanRewards::claim(origin_of(AccountId::from(DAVE)))); + + let vesting_period = 4 * WEEKS as u128; + let per_block = (105_000_000 * GLMR) / vesting_period; + + assert_eq!( + CrowdloanRewards::accounts_payable(&AccountId::from(CHARLIE)) + .unwrap() + .claimed_reward, + (45_000_000 * GLMR) + per_block + ); + assert_eq!( + CrowdloanRewards::accounts_payable(&AccountId::from(DAVE)) + .unwrap() + .claimed_reward, + (45_000_000 * GLMR) + per_block + ); + // The total claimed reward should be equal to the account balance at this point. + assert_eq!( + Balances::balance(&AccountId::from(CHARLIE)), + (45_000_000 * GLMR) + per_block + ); + assert_eq!( + Balances::balance(&AccountId::from(DAVE)), + (45_000_000 * GLMR) + per_block + ); + assert_noop!( + CrowdloanRewards::claim(origin_of(AccountId::from(ALICE))), + pallet_crowdloan_rewards::Error::::NoAssociatedClaim + ); + }); +} + +#[test] +fn initialize_crowdloan_address_and_change_with_relay_key_sig() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * GLMR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * GLMR) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + + let (pair1, _) = sp_core::sr25519::Pair::generate(); + let (pair2, _) = sp_core::sr25519::Pair::generate(); + + let public1 = pair1.public(); + let public2 = pair2.public(); + + // signature is new_account || previous_account + let mut message = pallet_crowdloan_rewards::WRAPPED_BYTES_PREFIX.to_vec(); + message.append(&mut b"moonbeam-".to_vec()); + message.append(&mut AccountId::from(DAVE).encode()); + message.append(&mut AccountId::from(CHARLIE).encode()); + message.append(&mut pallet_crowdloan_rewards::WRAPPED_BYTES_POSTFIX.to_vec()); + let signature1 = pair1.sign(&message); + let signature2 = pair2.sign(&message); + + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + // two relay accounts pointing at the same reward account + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + public1.into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * GLMR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + public2.into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * GLMR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + // 30 percent initial payout + assert_eq!(Balances::balance(&AccountId::from(CHARLIE)), 900_000 * GLMR); + + // this should fail, as we are only providing one signature + assert_noop!( + CrowdloanRewards::change_association_with_relay_keys( + origin_of(AccountId::from(CHARLIE)), + AccountId::from(DAVE), + AccountId::from(CHARLIE), + vec![(public1.into(), signature1.clone().into())] + ), + pallet_crowdloan_rewards::Error::::InsufficientNumberOfValidProofs + ); + + // this should be valid + assert_ok!(CrowdloanRewards::change_association_with_relay_keys( + origin_of(AccountId::from(CHARLIE)), + AccountId::from(DAVE), + AccountId::from(CHARLIE), + vec![ + (public1.into(), signature1.into()), + (public2.into(), signature2.into()) + ] + )); + + assert_eq!( + CrowdloanRewards::accounts_payable(&AccountId::from(DAVE)) + .unwrap() + .claimed_reward, + (900_000 * GLMR) + ); + }); +} + +#[test] +fn claim_via_precompile() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * GLMR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * GLMR) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * GLMR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [5u8; 32].into(), + Some(AccountId::from(DAVE)), + 1_500_000 * GLMR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + + assert!(CrowdloanRewards::initialized()); + + // 30 percent initial payout + assert_eq!(Balances::balance(&AccountId::from(CHARLIE)), 450_000 * GLMR); + // 30 percent initial payout + assert_eq!(Balances::balance(&AccountId::from(DAVE)), 450_000 * GLMR); + + let crowdloan_precompile_address = H160::from_low_u64_be(2049); + + // Alice uses the crowdloan precompile to claim through the EVM + let gas_limit = 100000u64; + let gas_price: U256 = BASE_FEE_GENESIS.into(); + + // Construct the call data (selector, amount) + let mut call_data = Vec::::from([0u8; 4]); + call_data[0..4].copy_from_slice(&Keccak256::digest(b"claim()")[0..4]); + + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(CHARLIE), + target: crowdloan_precompile_address, + input: call_data, + value: U256::zero(), // No value sent in EVM + gas_limit, + max_fee_per_gas: gas_price, + max_priority_fee_per_gas: None, + nonce: None, // Use the next nonce + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + let vesting_period = 4 * WEEKS as u128; + let per_block = (1_050_000 * GLMR) / vesting_period; + + assert_eq!( + CrowdloanRewards::accounts_payable(&AccountId::from(CHARLIE)) + .unwrap() + .claimed_reward, + (450_000 * GLMR) + per_block + ); + }) +} + +#[test] +fn is_contributor_via_precompile() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 200_000 * GLMR), + (AccountId::from(BOB), 100_000 * GLMR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 100_000 * GLMR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000_000 * GLMR) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(CHARLIE)), + 1_500_000_000 * GLMR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [5u8; 32].into(), + Some(AccountId::from(DAVE)), + 1_500_000_000 * GLMR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + + let crowdloan_precompile_address = H160::from_low_u64_be(2049); + + // Assert precompile reports Bob is not a contributor + Precompiles::new() + .prepare_test( + ALICE, + crowdloan_precompile_address, + CrowdloanRewardsPCall::is_contributor { + contributor: Address(AccountId::from(BOB).into()), + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(false); + + // Assert precompile reports Charlie is a nominator + Precompiles::new() + .prepare_test( + ALICE, + crowdloan_precompile_address, + CrowdloanRewardsPCall::is_contributor { + contributor: Address(AccountId::from(CHARLIE).into()), + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(true); + }) +} + +#[test] +fn reward_info_via_precompile() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 200_000 * GLMR), + (AccountId::from(BOB), 100_000 * GLMR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 100_000 * GLMR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * GLMR) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * GLMR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [5u8; 32].into(), + Some(AccountId::from(DAVE)), + 1_500_000 * GLMR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + + let crowdloan_precompile_address = H160::from_low_u64_be(2049); + + let expected_total: U256 = (1_500_000 * GLMR).into(); + let expected_claimed: U256 = (450_000 * GLMR).into(); + + // Assert precompile reports correct Charlie reward info. + Precompiles::new() + .prepare_test( + ALICE, + crowdloan_precompile_address, + CrowdloanRewardsPCall::reward_info { + contributor: Address(AccountId::from(CHARLIE).into()), + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns((expected_total, expected_claimed)); + }) +} + +#[test] +fn update_reward_address_via_precompile() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * GLMR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * GLMR) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * GLMR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [5u8; 32].into(), + Some(AccountId::from(DAVE)), + 1_500_000 * GLMR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + + let crowdloan_precompile_address = H160::from_low_u64_be(2049); + + // Charlie uses the crowdloan precompile to update address through the EVM + let gas_limit = 100000u64; + let gas_price: U256 = BASE_FEE_GENESIS.into(); + + // Construct the input data to check if Bob is a contributor + let mut call_data = Vec::::from([0u8; 36]); + call_data[0..4] + .copy_from_slice(&Keccak256::digest(b"update_reward_address(address)")[0..4]); + call_data[16..36].copy_from_slice(&ALICE); + + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(CHARLIE), + target: crowdloan_precompile_address, + input: call_data, + value: U256::zero(), // No value sent in EVM + gas_limit, + max_fee_per_gas: gas_price, + max_priority_fee_per_gas: None, + nonce: None, // Use the next nonce + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + assert!(CrowdloanRewards::accounts_payable(&AccountId::from(CHARLIE)).is_none()); + assert_eq!( + CrowdloanRewards::accounts_payable(&AccountId::from(ALICE)) + .unwrap() + .claimed_reward, + (450_000 * GLMR) + ); + }) +} + +fn run_with_system_weight(w: Weight, mut assertions: F) +where + F: FnMut() -> (), +{ + let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap() + .into(); + t.execute_with(|| { + System::set_block_consumed_resources(w, 0); + assertions() + }); +} + +#[test] +#[rustfmt::skip] +fn length_fee_is_sensible() { + use sp_runtime::testing::TestXt; + + // tests that length fee is sensible for a few hypothetical transactions + ExtBuilder::default().build().execute_with(|| { + let call = frame_system::Call::remark:: { remark: vec![] }; + let uxt: TestXt<_, ()> = TestXt::new(call, Some((1u64, ()))); + + let calc_fee = |len: u32| -> Balance { + moonbeam_runtime::TransactionPayment::query_fee_details(uxt.clone(), len) + .inclusion_fee + .expect("fee should be calculated") + .len_fee + }; + + // editorconfig-checker-disable + // left: cost of length fee, right: size in bytes + // /------------- proportional component: O(N * 1B) + // | /- exponential component: O(N ** 3) + // | | + assert_eq!( 100_000_000_100, calc_fee(1)); + assert_eq!( 1_000_000_100_000, calc_fee(10)); + assert_eq!( 10_000_100_000_000, calc_fee(100)); + assert_eq!( 100_100_000_000_000, calc_fee(1_000)); + assert_eq!( 1_100_000_000_000_000, calc_fee(10_000)); // inflection point + assert_eq!( 110_000_000_000_000_000, calc_fee(100_000)); + assert_eq!( 100_100_000_000_000_000_000, calc_fee(1_000_000)); // 100 GLMR, ~ 1MB + assert_eq!( 100_001_000_000_000_000_000_000, calc_fee(10_000_000)); + assert_eq!(100_000_010_000_000_000_000_000_000, calc_fee(100_000_000)); + // editorconfig-checker-enable + }); +} + +#[test] +fn multiplier_can_grow_from_zero() { + use frame_support::traits::Get; + + let minimum_multiplier = moonbeam_runtime::MinimumMultiplier::get(); + let target = moonbeam_runtime::TargetBlockFullness::get() + * RuntimeBlockWeights::get() + .get(DispatchClass::Normal) + .max_total + .unwrap(); + // if the min is too small, then this will not change, and we are doomed forever. + // the weight is 1/100th bigger than target. + run_with_system_weight(target * 101 / 100, || { + let next = moonbeam_runtime::SlowAdjustingFeeUpdate::::convert(minimum_multiplier); + assert!( + next > minimum_multiplier, + "{:?} !>= {:?}", + next, + minimum_multiplier + ); + }) +} + +#[test] +fn ethereum_invalid_transaction() { + ExtBuilder::default().build().execute_with(|| { + // Ensure an extrinsic not containing enough gas limit to store the transaction + // on chain is rejected. + assert_eq!( + Executive::apply_extrinsic(unchecked_eth_tx(INVALID_ETH_TX)), + Err( + sp_runtime::transaction_validity::TransactionValidityError::Invalid( + sp_runtime::transaction_validity::InvalidTransaction::Custom(3u8) + ) + ) + ); + }); +} + +#[test] +fn initial_gas_fee_is_correct() { + use fp_evm::FeeCalculator; + + ExtBuilder::default().build().execute_with(|| { + let multiplier = TransactionPayment::next_fee_multiplier(); + assert_eq!(multiplier, Multiplier::from(1u128)); + + assert_eq!( + TransactionPaymentAsGasPrice::min_gas_price(), + ( + 125_000_000_000u128.into(), + Weight::from_parts(25_000_000u64, 0) + ) + ); + }); +} + +#[test] +fn min_gas_fee_is_correct() { + use fp_evm::FeeCalculator; + use frame_support::traits::Hooks; + + ExtBuilder::default().build().execute_with(|| { + pallet_transaction_payment::NextFeeMultiplier::::put(Multiplier::from(0)); + TransactionPayment::on_finalize(System::block_number()); // should trigger min to kick in + + let multiplier = TransactionPayment::next_fee_multiplier(); + assert_eq!(multiplier, Multiplier::from(1u128)); + + assert_eq!( + TransactionPaymentAsGasPrice::min_gas_price(), + ( + 125_000_000_000u128.into(), + Weight::from_parts(25_000_000u64, 0) + ) + ); + }); +} + +#[test] +fn transfer_ed_0_substrate() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), (1 * GLMR) + (1 * WEI)), + (AccountId::from(BOB), 0), + ]) + .build() + .execute_with(|| { + // Substrate transfer + assert_ok!(Balances::transfer( + origin_of(AccountId::from(ALICE)), + AccountId::from(BOB), + 1 * GLMR, + )); + // 1 WEI is left in the account + assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 1 * WEI); + }); +} + +#[test] +fn transfer_ed_0_evm() { + ExtBuilder::default() + .with_balances(vec![ + ( + AccountId::from(ALICE), + ((1 * GLMR) + (21_000 * BASE_FEE_GENESIS)) + (1 * WEI), + ), + (AccountId::from(BOB), 0), + ]) + .build() + .execute_with(|| { + // EVM transfer + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(ALICE), + target: H160::from(BOB), + input: Vec::new(), + value: (1 * GLMR).into(), + gas_limit: 21_000u64, + max_fee_per_gas: BASE_FEE_GENESIS.into(), + max_priority_fee_per_gas: Some(BASE_FEE_GENESIS.into()), + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + // 1 WEI is left in the account + assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 1 * WEI,); + }); +} + +#[test] +fn refund_ed_0_evm() { + ExtBuilder::default() + .with_balances(vec![ + ( + AccountId::from(ALICE), + ((1 * GLMR) + (21_777 * BASE_FEE_GENESIS)), + ), + (AccountId::from(BOB), 0), + ]) + .build() + .execute_with(|| { + // EVM transfer that zeroes ALICE + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(ALICE), + target: H160::from(BOB), + input: Vec::new(), + value: (1 * GLMR).into(), + gas_limit: 21_777u64, + max_fee_per_gas: BASE_FEE_GENESIS.into(), + max_priority_fee_per_gas: Some(BASE_FEE_GENESIS.into()), + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + // ALICE is refunded + assert_eq!( + Balances::free_balance(AccountId::from(ALICE)), + 777 * BASE_FEE_GENESIS, + ); + }); +} + +#[test] +fn author_does_not_receive_priority_fee() { + ExtBuilder::default() + .with_balances(vec![( + AccountId::from(BOB), + (1 * GLMR) + (21_000 * (500 * GIGAWEI)), + )]) + .build() + .execute_with(|| { + // Some block author as seen by pallet-evm. + let author = AccountId::from(>::find_author()); + // Currently the default impl of the evm uses `deposit_into_existing`. + // If we were to use this implementation, and for an author to receive eventual tips, + // the account needs to be somehow initialized, otherwise the deposit would fail. + Balances::make_free_balance_be(&author, 100 * GLMR); + + // EVM transfer. + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(BOB), + target: H160::from(ALICE), + input: Vec::new(), + value: (1 * GLMR).into(), + gas_limit: 21_000u64, + max_fee_per_gas: U256::from(300 * GIGAWEI), + max_priority_fee_per_gas: Some(U256::from(200 * GIGAWEI)), + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + // Author free balance didn't change. + assert_eq!(Balances::free_balance(author), 100 * GLMR,); + }); +} + +#[test] +fn total_issuance_after_evm_transaction_with_priority_fee() { + ExtBuilder::default() + .with_balances(vec![( + AccountId::from(BOB), + (1 * GLMR) + (21_000 * (200 * GIGAWEI)), + )]) + .build() + .execute_with(|| { + let issuance_before = ::Currency::total_issuance(); + // EVM transfer. + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(BOB), + target: H160::from(ALICE), + input: Vec::new(), + value: (1 * GLMR).into(), + gas_limit: 21_000u64, + max_fee_per_gas: U256::from(200 * GIGAWEI), + max_priority_fee_per_gas: Some(U256::from(100 * GIGAWEI)), + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + let issuance_after = ::Currency::total_issuance(); + // Fee is 100 GWEI base fee + 100 GWEI tip. + let fee = ((200 * GIGAWEI) * 21_000) as f64; + // 80% was burned. + let expected_burn = (fee * 0.8) as u128; + assert_eq!(issuance_after, issuance_before - expected_burn,); + // 20% was sent to treasury. + let expected_treasury = (fee * 0.2) as u128; + assert_eq!(moonbeam_runtime::Treasury::pot(), expected_treasury); + }); +} + +#[test] +fn total_issuance_after_evm_transaction_without_priority_fee() { + ExtBuilder::default() + .with_balances(vec![( + AccountId::from(BOB), + (1 * GLMR) + (21_000 * BASE_FEE_GENESIS), + )]) + .build() + .execute_with(|| { + let issuance_before = ::Currency::total_issuance(); + // EVM transfer. + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(BOB), + target: H160::from(ALICE), + input: Vec::new(), + value: (1 * GLMR).into(), + gas_limit: 21_000u64, + max_fee_per_gas: BASE_FEE_GENESIS.into(), + max_priority_fee_per_gas: Some(BASE_FEE_GENESIS.into()), + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + let issuance_after = ::Currency::total_issuance(); + // Fee is 100 GWEI base fee. + let fee = (BASE_FEE_GENESIS * 21_000) as f64; + // 80% was burned. + let expected_burn = (fee * 0.8) as u128; + assert_eq!(issuance_after, issuance_before - expected_burn,); + // 20% was sent to treasury. + let expected_treasury = (fee * 0.2) as u128; + assert_eq!(moonbeam_runtime::Treasury::pot(), expected_treasury); + }); +} + +#[test] +fn root_can_change_default_xcm_vers() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000_000_000_000_000)], + is_sufficient: true, + }]) + .build() + .execute_with(|| { + let source_location = AssetType::Xcm(MultiLocation::parent()); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: [1u8; 32], + }), + }; + let source_id: moonbeam_runtime::AssetId = source_location.clone().into(); + // Default XCM version is not set yet, so xtokens should fail because it does not + // know with which version to send + assert_noop!( + XTokens::transfer( + origin_of(AccountId::from(ALICE)), + CurrencyId::ForeignAsset(source_id), + 100_000_000_000_000, + Box::new(xcm::VersionedMultiLocation::V3(dest.clone())), + WeightLimit::Limited(4000000000.into()) + ), + orml_xtokens::Error::::XcmExecutionFailed + ); + + // Root sets the defaultXcm + assert_ok!(PolkadotXcm::force_default_xcm_version( + root_origin(), + Some(2) + )); + + // Now transferring does not fail + assert_ok!(XTokens::transfer( + origin_of(AccountId::from(ALICE)), + CurrencyId::ForeignAsset(source_id), + 100_000_000_000_000, + Box::new(xcm::VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(4000000000.into()) + )); + }) +} + +#[test] +fn asset_can_be_registered() { + ExtBuilder::default().build().execute_with(|| { + let source_location = AssetType::Xcm(MultiLocation::parent()); + let source_id: moonbeam_runtime::AssetId = source_location.clone().into(); + let asset_metadata = AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }; + assert_ok!(AssetManager::register_foreign_asset( + moonbeam_runtime::RuntimeOrigin::root(), + source_location, + asset_metadata, + 1u128, + true + )); + assert!(AssetManager::asset_id_type(source_id).is_some()); + }); +} + +#[test] +fn local_assets_cannot_be_create_by_signed_origins() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR * SUPPLY_FACTOR), + (AccountId::from(BOB), 1_000 * GLMR * SUPPLY_FACTOR), + ]) + .build() + .execute_with(|| { + assert_noop!( + RuntimeCall::LocalAssets( + pallet_assets::Call::::create { + id: 11u128.into(), + admin: AccountId::from(ALICE), + min_balance: 1u128 + } + ) + .dispatch(::RuntimeOrigin::signed( + AccountId::from(ALICE) + )), + frame_system::Error::::CallFiltered + ); + }); +} + +#[test] +fn asset_erc20_precompiles_supply_and_balance() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * GLMR)], + AccountId::from(ALICE), + )]) + .build() + .execute_with(|| { + // Assert the asset has been created with the correct supply + assert_eq!(LocalAssets::total_supply(0u128), 1_000 * GLMR); + + // Convert the assetId to its corresponding precompile address + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Access totalSupply through precompile. + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::total_supply {}, + ) + .expect_cost(3000) + .expect_no_logs() + .execute_returns(U256::from(1000 * GLMR)); + + // Access balanceOf through precompile + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(ALICE.into()), + }, + ) + .expect_cost(3000) + .expect_no_logs() + .execute_returns(U256::from(1000 * GLMR)); + }); +} + +#[test] +fn asset_erc20_precompiles_transfer() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * GLMR)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Transfer tokens from Aice to Bob, 400 GLMR. + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::transfer { + to: Address(BOB.into()), + value: { 400 * GLMR }.into(), + }, + ) + .expect_cost(25775) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::from(ALICE), + H160::from(BOB), + solidity::encode_event_data(U256::from(400 * GLMR)), + )) + .execute_returns(true); + + // Make sure BOB has 400 GLMR + Precompiles::new() + .prepare_test( + BOB, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(BOB.into()), + }, + ) + .expect_cost(3000) + .expect_no_logs() + .execute_returns(U256::from(400 * GLMR)); + }); +} + +#[test] +fn asset_erc20_precompiles_approve() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * GLMR)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Aprove Bob for spending 400 GLMR from Alice + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::approve { + spender: Address(BOB.into()), + value: { 400 * GLMR }.into(), + }, + ) + .expect_cost(16048) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_APPROVAL, + H160::from(ALICE), + H160::from(BOB), + solidity::encode_event_data(U256::from(400 * GLMR)), + )) + .execute_returns(true); + + // Transfer tokens from Alice to Charlie by using BOB as origin + Precompiles::new() + .prepare_test( + BOB, + asset_precompile_address, + LocalAssetsPCall::transfer_from { + from: Address(ALICE.into()), + to: Address(CHARLIE.into()), + value: { 400 * GLMR }.into(), + }, + ) + .expect_cost(33145) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::from(ALICE), + H160::from(CHARLIE), + solidity::encode_event_data(U256::from(400 * GLMR)), + )) + .execute_returns(true); + + // Make sure CHARLIE has 400 GLMR + Precompiles::new() + .prepare_test( + CHARLIE, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(CHARLIE.into()), + }, + ) + .expect_cost(3000) + .expect_no_logs() + .execute_returns(U256::from(400 * GLMR)); + }); +} + +#[test] +fn asset_erc20_precompiles_mint_burn() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * GLMR)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Mint 1000 MOVRS to BOB + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::mint { + to: Address(BOB.into()), + value: { 1000 * GLMR }.into(), + }, + ) + .expect_cost(14932) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::default(), + H160::from(BOB), + solidity::encode_event_data(U256::from(1_000 * GLMR)), + )) + .execute_returns(true); + + // Assert the asset has been minted + assert_eq!(LocalAssets::total_supply(0u128), 2_000 * GLMR); + assert_eq!( + LocalAssets::balance(0u128, AccountId::from(BOB)), + 1_000 * GLMR + ); + + // Burn tokens + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::burn { + from: Address(BOB.into()), + value: { 500 * GLMR }.into(), + }, + ) + .expect_cost(15172) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::from(BOB), + H160::default(), + solidity::encode_event_data(U256::from(500 * GLMR)), + )) + .execute_returns(true); + + // Assert the asset has been burnt + assert_eq!(LocalAssets::total_supply(0u128), 1_500 * GLMR); + assert_eq!( + LocalAssets::balance(0u128, AccountId::from(BOB)), + 500 * GLMR + ); + }); +} + +#[test] +fn asset_erc20_precompiles_freeze_thaw_account() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * GLMR)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Freeze account + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::freeze { + account: Address(ALICE.into()), + }, + ) + .expect_cost(8783) + .expect_no_logs() + .execute_returns(true); + + // Assert account is frozen + assert_eq!( + LocalAssets::can_withdraw(0u128, &AccountId::from(ALICE), 1).into_result(), + Err(TokenError::Frozen.into()) + ); + + // Thaw Account + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::thaw { + account: Address(ALICE.into()), + }, + ) + .expect_cost(8803) + .expect_no_logs() + .execute_returns(true); + + // Assert account is not frozen + assert!(LocalAssets::can_withdraw(0u128, &AccountId::from(ALICE), 1) + .into_result() + .is_ok()); + }); +} + +#[test] +fn asset_erc20_precompiles_freeze_thaw_asset() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * GLMR)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Freeze Asset + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::freeze_asset {}, + ) + .expect_cost(7623) + .expect_no_logs() + .execute_returns(true); + + // Assert account is frozen + assert_eq!( + LocalAssets::can_withdraw(0u128, &AccountId::from(ALICE), 1).into_result(), + Err(TokenError::Frozen.into()) + ); + + // Thaw Asset + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::thaw_asset {}, + ) + .expect_cost(7634) + .expect_no_logs() + .execute_returns(true); + + // Assert account is not frozen + assert!(LocalAssets::can_withdraw(0u128, &AccountId::from(ALICE), 1) + .into_result() + .is_ok()); + }); +} + +#[test] +fn asset_erc20_precompiles_freeze_transfer_ownership() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * GLMR)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Transfer ownerhsip of an asset + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::transfer_ownership { + owner: Address(BOB.into()), + }, + ) + .expect_cost(8706) + .expect_no_logs() + .execute_returns(true); + + // No clear way of testing BOB is new owner, other than doing a priviledged function + // e.g., transfer_ownership again + assert_ok!(LocalAssets::transfer_ownership( + origin_of(AccountId::from(BOB)), + 0u128.into(), + AccountId::from(ALICE) + )); + }); +} + +#[test] +fn asset_erc20_precompiles_freeze_set_team() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * GLMR)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Set Bob as issuer, admin and freezer + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::set_team { + admin: Address(BOB.into()), + freezer: Address(BOB.into()), + issuer: Address(BOB.into()), + }, + ) + .expect_cost(7657) + .expect_no_logs() + .execute_returns(true); + + // Bob should be able to mint, freeze, and thaw + assert_ok!(LocalAssets::mint( + origin_of(AccountId::from(BOB)), + 0u128.into(), + AccountId::from(BOB), + 1_000 * GLMR + )); + assert_ok!(LocalAssets::freeze( + origin_of(AccountId::from(BOB)), + 0u128.into(), + AccountId::from(ALICE) + )); + assert_ok!(LocalAssets::thaw( + origin_of(AccountId::from(BOB)), + 0u128.into(), + AccountId::from(ALICE) + )); + }); +} + +#[test] +fn xcm_asset_erc20_precompiles_supply_and_balance() { + ExtBuilder::default() + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000 * GLMR)], + is_sufficient: true, + }]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .build() + .execute_with(|| { + // We have the assetId that corresponds to the relay chain registered + let relay_asset_id: moonbeam_runtime::AssetId = + AssetType::Xcm(MultiLocation::parent()).into(); + + // Its address is + let asset_precompile_address = Runtime::asset_id_to_account( + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + relay_asset_id, + ); + + // Assert the asset has been created with the correct supply + assert_eq!(Assets::total_supply(relay_asset_id), 1_000 * GLMR); + + // Access totalSupply through precompile. Important that the context is correct + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::total_supply {}, + ) + .expect_cost(2000) + .expect_no_logs() + .execute_returns(U256::from(1000 * GLMR)); + + // Access balanceOf through precompile + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(ALICE.into()), + }, + ) + .expect_cost(2000) + .expect_no_logs() + .execute_returns(U256::from(1000 * GLMR)); + }); +} + +#[test] +fn xcm_asset_erc20_precompiles_transfer() { + ExtBuilder::default() + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000 * GLMR)], + is_sufficient: true, + }]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .build() + .execute_with(|| { + // We have the assetId that corresponds to the relay chain registered + let relay_asset_id: moonbeam_runtime::AssetId = + AssetType::Xcm(MultiLocation::parent()).into(); + + // Its address is + let asset_precompile_address = Runtime::asset_id_to_account( + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + relay_asset_id, + ); + + // Transfer tokens from Aice to Bob, 400 GLMR. + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::transfer { + to: Address(BOB.into()), + value: { 400 * GLMR }.into(), + }, + ) + .expect_cost(24775) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::from(ALICE), + H160::from(BOB), + solidity::encode_event_data(U256::from(400 * GLMR)), + )) + .execute_returns(true); + + // Make sure BOB has 400 GLMR + Precompiles::new() + .prepare_test( + BOB, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(BOB.into()), + }, + ) + .expect_cost(2000) + .expect_no_logs() + .execute_returns(U256::from(400 * GLMR)); + }); +} + +#[test] +fn xcm_asset_erc20_precompiles_approve() { + ExtBuilder::default() + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000 * GLMR)], + is_sufficient: true, + }]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .build() + .execute_with(|| { + // We have the assetId that corresponds to the relay chain registered + let relay_asset_id: moonbeam_runtime::AssetId = + AssetType::Xcm(MultiLocation::parent()).into(); + + // Its address is + let asset_precompile_address = Runtime::asset_id_to_account( + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + relay_asset_id, + ); + + // Aprove Bob for spending 400 GLMR from Alice + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::approve { + spender: Address(BOB.into()), + value: { 400 * GLMR }.into(), + }, + ) + .expect_cost(15048) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_APPROVAL, + H160::from(ALICE), + H160::from(BOB), + solidity::encode_event_data(U256::from(400 * GLMR)), + )) + .execute_returns(true); + + // Transfer tokens from Alice to Charlie by using BOB as origin + Precompiles::new() + .prepare_test( + BOB, + asset_precompile_address, + LocalAssetsPCall::transfer_from { + from: Address(ALICE.into()), + to: Address(CHARLIE.into()), + value: { 400 * GLMR }.into(), + }, + ) + .expect_cost(32145) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::from(ALICE), + H160::from(CHARLIE), + solidity::encode_event_data(U256::from(400 * GLMR)), + )) + .execute_returns(true); + + // Make sure CHARLIE has 400 GLMR + Precompiles::new() + .prepare_test( + CHARLIE, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(CHARLIE.into()), + }, + ) + .expect_cost(2000) + .expect_no_logs() + .execute_returns(U256::from(400 * GLMR)); + }); +} + +#[test] +fn xtokens_precompile_transfer() { + ExtBuilder::default() + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000_000_000_000_000)], + is_sufficient: true, + }]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + let xtokens_precompile_address = H160::from_low_u64_be(2052); + + // We have the assetId that corresponds to the relay chain registered + let relay_asset_id: moonbeam_runtime::AssetId = + AssetType::Xcm(MultiLocation::parent()).into(); + + // Its address is + let asset_precompile_address = Runtime::asset_id_to_account( + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + relay_asset_id, + ); + + // Alice has 1000 tokens. She should be able to send through precompile + let destination = MultiLocation::new( + 1, + Junctions::X1(Junction::AccountId32 { + network: None, + id: [1u8; 32], + }), + ); + + // We use the address of the asset as an identifier of the asset we want to transfer + Precompiles::new() + .prepare_test( + ALICE, + xtokens_precompile_address, + XtokensPCall::transfer { + currency_address: Address(asset_precompile_address.into()), + amount: 500_000_000_000_000u128.into(), + destination: destination.clone(), + weight: 4_000_000, + }, + ) + .expect_cost(57639) + .expect_no_logs() + .execute_returns(()) + }) +} + +#[test] +fn xtokens_precompile_transfer_multiasset() { + ExtBuilder::default() + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000_000_000_000_000)], + is_sufficient: true, + }]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + let xtokens_precompile_address = H160::from_low_u64_be(2052); + + // Alice has 1000 tokens. She should be able to send through precompile + let destination = MultiLocation::new( + 1, + Junctions::X1(Junction::AccountId32 { + network: None, + id: [1u8; 32], + }), + ); + + // This time we transfer it through TransferMultiAsset + // Instead of the address, we encode directly the multilocation referencing the asset + Precompiles::new() + .prepare_test( + ALICE, + xtokens_precompile_address, + XtokensPCall::transfer_multiasset { + // We want to transfer the relay token + asset: MultiLocation::parent(), + amount: 500_000_000_000_000u128.into(), + destination: destination.clone(), + weight: 4_000_000, + }, + ) + .expect_cost(57639) + .expect_no_logs() + .execute_returns(()); + }) +} + +#[test] +fn make_sure_glmr_can_be_transferred_precompile() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * GLMR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: [1u8; 32], + }), + }; + assert_ok!(XTokens::transfer_multiasset( + origin_of(AccountId::from(ALICE)), + Box::new(VersionedMultiAsset::V3(MultiAsset { + id: Concrete(moonbeam_runtime::xcm_config::SelfReserve::get()), + fun: Fungible(1000) + })), + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(40000.into()) + )); + }); +} + +#[test] +fn make_sure_glmr_can_be_transferred() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * GLMR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: [1u8; 32], + }), + }; + assert_ok!(XTokens::transfer( + origin_of(AccountId::from(ALICE)), + CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(40000.into()) + )); + }); +} + +#[test] +fn make_sure_polkadot_xcm_cannot_be_called() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * GLMR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .build() + .execute_with(|| { + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: [1u8; 32], + }), + }; + let multiassets: MultiAssets = [MultiAsset { + id: Concrete(moonbeam_runtime::xcm_config::SelfLocation::get()), + fun: Fungible(1000), + }] + .to_vec() + .into(); + assert_noop!( + RuntimeCall::PolkadotXcm(pallet_xcm::Call::::reserve_transfer_assets { + dest: Box::new(VersionedMultiLocation::V3(dest.clone())), + beneficiary: Box::new(VersionedMultiLocation::V3(dest)), + assets: Box::new(VersionedMultiAssets::V3(multiassets)), + fee_asset_item: 0, + }) + .dispatch(::RuntimeOrigin::signed( + AccountId::from(ALICE) + )), + frame_system::Error::::CallFiltered + ); + }); +} + +#[test] +fn transact_through_signed_precompile_works_v2() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + // Destination + let dest = MultiLocation::parent(); + + let fee_payer_asset = MultiLocation::parent(); + + let bytes = vec![1u8, 2u8, 3u8]; + + let total_weight = 1_000_000_000u64; + + let xcm_transactor_v2_precompile_address = H160::from_low_u64_be(2061); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_transactor_v2_precompile_address, + XcmTransactorV2PCall::transact_through_signed_multilocation { + dest, + fee_asset: fee_payer_asset, + weight: 4_000_000, + call: bytes.into(), + fee_amount: u128::from(total_weight).into(), + overall_weight: total_weight, + }, + ) + .expect_cost(18737) + .expect_no_logs() + .execute_returns(()); + }); +} + +#[test] +fn transact_through_signed_cannot_send_to_local_chain() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + // Destination + let dest = MultiLocation::here(); + + let fee_payer_asset = MultiLocation::parent(); + + let bytes = vec![1u8, 2u8, 3u8]; + + let total_weight = 1_000_000_000u64; + + let xcm_transactor_v2_precompile_address = H160::from_low_u64_be(2061); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_transactor_v2_precompile_address, + XcmTransactorV2PCall::transact_through_signed_multilocation { + dest, + fee_asset: fee_payer_asset, + weight: 4_000_000, + call: bytes.into(), + fee_amount: u128::from(total_weight).into(), + overall_weight: total_weight, + }, + ) + .execute_reverts(|output| { + from_utf8(&output) + .unwrap() + .contains("Dispatched call failed with error:") + && from_utf8(&output).unwrap().contains("ErrorValidating") + }); + }); +} + +#[test] +fn transactor_cannot_use_more_than_max_weight() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000_000_000_000_000)], + is_sufficient: true, + }]) + .build() + .execute_with(|| { + let source_location = AssetType::Xcm(MultiLocation::parent()); + let source_id: moonbeam_runtime::AssetId = source_location.clone().into(); + assert_ok!(XcmTransactor::register( + root_origin(), + AccountId::from(ALICE), + 0, + )); + + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + root_origin(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + // Relay charges 1000 for every instruction, and we have 3, so 3000 + 3000.into(), + 20000.into(), + None + )); + + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + root_origin(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + 1, + )); + + assert_noop!( + XcmTransactor::transact_through_derivative( + origin_of(AccountId::from(ALICE)), + moonbeam_runtime::xcm_config::Transactors::Relay, + 0, + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new( + xcm::VersionedMultiLocation::V3(MultiLocation::parent()) + )), + fee_amount: None + }, + vec![], + // 2000 is the max + TransactWeights { + transact_required_weight_at_most: 17001.into(), + overall_weight: None + } + ), + pallet_xcm_transactor::Error::::MaxWeightTransactReached + ); + assert_noop!( + XcmTransactor::transact_through_derivative( + origin_of(AccountId::from(ALICE)), + moonbeam_runtime::xcm_config::Transactors::Relay, + 0, + CurrencyPayment { + currency: Currency::AsCurrencyId(CurrencyId::ForeignAsset(source_id)), + fee_amount: None + }, + vec![], + // 20000 is the max + TransactWeights { + transact_required_weight_at_most: 17001.into(), + overall_weight: None + } + ), + pallet_xcm_transactor::Error::::MaxWeightTransactReached + ); + }) +} + +#[test] +fn call_xtokens_with_fee() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 1_000 * GLMR), + ]) + .with_safe_xcm_version(2) + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000_000_000_000_000)], + is_sufficient: true, + }]) + .build() + .execute_with(|| { + let source_location = AssetType::Xcm(MultiLocation::parent()); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: [1u8; 32], + }), + }; + let source_id: moonbeam_runtime::AssetId = source_location.clone().into(); + + let before_balance = Assets::balance(source_id, &AccountId::from(ALICE)); + + // We are able to transfer with fee + assert_ok!(XTokens::transfer_with_fee( + origin_of(AccountId::from(ALICE)), + CurrencyId::ForeignAsset(source_id), + 100_000_000_000_000, + 100, + Box::new(xcm::VersionedMultiLocation::V3(dest.clone())), + WeightLimit::Limited(4000000000.into()) + )); + + let after_balance = Assets::balance(source_id, &AccountId::from(ALICE)); + // At least these much (plus fees) should have been charged + assert_eq!(before_balance - 100_000_000_000_000 - 100, after_balance); + }); +} + +#[test] +fn test_xcm_utils_ml_tp_account() { + ExtBuilder::default().build().execute_with(|| { + let xcm_utils_precompile_address = H160::from_low_u64_be(2060); + let expected_address_parent: H160 = + ParentIsPreset::::convert_ref(MultiLocation::parent()) + .unwrap() + .into(); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_utils_precompile_address, + XcmUtilsPCall::multilocation_to_address { + multilocation: MultiLocation::parent(), + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(Address(expected_address_parent)); + + let parachain_2000_multilocation = MultiLocation::new(1, X1(Parachain(2000))); + let expected_address_parachain: H160 = + SiblingParachainConvertsVia::::convert_ref( + parachain_2000_multilocation.clone(), + ) + .unwrap() + .into(); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_utils_precompile_address, + XcmUtilsPCall::multilocation_to_address { + multilocation: parachain_2000_multilocation, + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(Address(expected_address_parachain)); + + let alice_in_parachain_2000_multilocation = MultiLocation::new( + 1, + X2( + Parachain(2000), + AccountKey20 { + network: None, + key: ALICE, + }, + ), + ); + let expected_address_alice_in_parachain_2000: H160 = + xcm_builder::HashedDescriptionDescribeFamilyAllTerminal::::convert_ref( + alice_in_parachain_2000_multilocation.clone(), + ) + .unwrap() + .into(); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_utils_precompile_address, + XcmUtilsPCall::multilocation_to_address { + multilocation: alice_in_parachain_2000_multilocation, + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(Address(expected_address_alice_in_parachain_2000)); + }); +} + +#[test] +fn test_xcm_utils_weight_message() { + ExtBuilder::default().build().execute_with(|| { + let xcm_utils_precompile_address = H160::from_low_u64_be(2060); + let expected_weight = + XcmWeight::::clear_origin().ref_time(); + + let message: Vec = xcm::VersionedXcm::<()>::V3(Xcm(vec![ClearOrigin])).encode(); + + let input = XcmUtilsPCall::weight_message { + message: message.into(), + }; + + Precompiles::new() + .prepare_test(ALICE, xcm_utils_precompile_address, input) + .expect_cost(0) + .expect_no_logs() + .execute_returns(expected_weight); + }); +} + +#[test] +fn test_xcm_utils_get_units_per_second() { + ExtBuilder::default().build().execute_with(|| { + let xcm_utils_precompile_address = H160::from_low_u64_be(2060); + let multilocation = SelfReserve::get(); + + let input = XcmUtilsPCall::get_units_per_second { multilocation }; + + let expected_units = + WEIGHT_REF_TIME_PER_SECOND as u128 * moonbeam_runtime::currency::WEIGHT_FEE; + + Precompiles::new() + .prepare_test(ALICE, xcm_utils_precompile_address, input) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(expected_units); + }); +} + +#[test] +fn precompile_existence() { + ExtBuilder::default().build().execute_with(|| { + let precompiles = Precompiles::new(); + let precompile_addresses: std::collections::BTreeSet<_> = vec![ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 1024, 1025, 1026, 2048, 2049, 2050, 2051, 2052, 2053, 2054, + 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, + 2069, 2070, + ] + .into_iter() + .map(H160::from_low_u64_be) + .collect(); + + for i in 0..3000 { + let address = H160::from_low_u64_be(i); + + if precompile_addresses.contains(&address) { + assert!( + is_precompile_or_fail::(address, 100_000u64).expect("to be ok"), + "is_precompile({}) should return true", + i + ); + + assert!( + precompiles + .execute(&mut MockHandle::new( + address, + Context { + address, + caller: H160::zero(), + apparent_value: U256::zero() + } + ),) + .is_some(), + "execute({},..) should return Some(_)", + i + ); + } else { + assert!( + !is_precompile_or_fail::(address, 100_000u64).expect("to be ok"), + "is_precompile({}) should return false", + i + ); + + assert!( + precompiles + .execute(&mut MockHandle::new( + address, + Context { + address, + caller: H160::zero(), + apparent_value: U256::zero() + } + ),) + .is_none(), + "execute({},..) should return None", + i + ); + } + } + }); +} + +#[test] +fn removed_precompiles() { + ExtBuilder::default().build().execute_with(|| { + let precompiles = Precompiles::new(); + let removed_precompiles = [1025]; + + for i in 1..3000 { + let address = H160::from_low_u64_be(i); + + if !is_precompile_or_fail::(address, 100_000u64).expect("to be ok") { + continue; + } + + if !removed_precompiles.contains(&i) { + assert!( + match precompiles.is_active_precompile(address, 100_000u64) { + IsPrecompileResult::Answer { is_precompile, .. } => is_precompile, + _ => false, + }, + "{i} should be an active precompile" + ); + continue; + } + + assert!( + !match precompiles.is_active_precompile(address, 100_000u64) { + IsPrecompileResult::Answer { is_precompile, .. } => is_precompile, + _ => false, + }, + "{i} shouldn't be an active precompile" + ); + + precompiles + .prepare_test(Alice, address, []) + .execute_reverts(|out| out == b"Removed precompile"); + } + }) +} + +#[test] +fn deal_with_fees_handles_tip() { + use frame_support::traits::OnUnbalanced; + use moonbeam_runtime::{DealWithFees, Treasury}; + use pallet_balances::NegativeImbalance; + + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 10_000)]) + .build() + .execute_with(|| { + // Alice has 10_000, which makes inital supply 10_000. + // drop()ing the NegativeImbalance below will cause the total_supply to be decreased + // incorrectly (since there was never a withdraw to begin with), which in this case has + // the desired effect of showing that currency was burned. + let total_supply_before = Balances::total_issuance(); + assert_eq!(total_supply_before, 10_000); + + let fees_then_tips = vec![ + NegativeImbalance::::new(100), + NegativeImbalance::::new(1_000), + ]; + DealWithFees::on_unbalanceds(fees_then_tips.into_iter()); + + // treasury should have received 20% + assert_eq!(Balances::free_balance(&Treasury::account_id()), 220); + + // verify 80% burned + let total_supply_after = Balances::total_issuance(); + assert_eq!(total_supply_before - total_supply_after, 880); + }); +} + +#[test] +fn evm_revert_substrate_events() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 100_000 * GLMR)]) + .build() + .execute_with(|| { + let batch_precompile_address = H160::from_low_u64_be(2056); + + // Batch a transfer followed by an invalid call to batch. + // Thus BatchAll will revert the transfer. + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::call { + source: ALICE.into(), + target: batch_precompile_address, + + input: BatchPCall::batch_all { + to: vec![Address(BOB.into()), Address(batch_precompile_address)].into(), + value: vec![U256::from(1 * GLMR), U256::zero()].into(), + call_data: vec![].into(), + gas_limit: vec![].into() + } + .into(), + value: U256::zero(), // No value sent in EVM + gas_limit: 500_000, + max_fee_per_gas: BASE_FEE_GENESIS.into(), + max_priority_fee_per_gas: None, + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + let transfer_count = System::events() + .iter() + .filter(|r| match r.event { + RuntimeEvent::Balances(pallet_balances::Event::Transfer { .. }) => true, + _ => false, + }) + .count(); + + assert_eq!(transfer_count, 0, "there should be no transfer event"); + }); +} + +#[test] +fn evm_success_keeps_substrate_events() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 100_000 * GLMR)]) + .build() + .execute_with(|| { + let batch_precompile_address = H160::from_low_u64_be(2056); + + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::call { + source: ALICE.into(), + target: batch_precompile_address, + input: BatchPCall::batch_all { + to: vec![Address(BOB.into())].into(), + value: vec![U256::from(1 * GLMR)].into(), + call_data: vec![].into(), + gas_limit: vec![].into() + } + .into(), + value: U256::zero(), // No value sent in EVM + gas_limit: 500_000, + max_fee_per_gas: BASE_FEE_GENESIS.into(), + max_priority_fee_per_gas: None, + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + let transfer_count = System::events() + .iter() + .filter(|r| match r.event { + RuntimeEvent::Balances(pallet_balances::Event::Transfer { .. }) => true, + _ => false, + }) + .count(); + + assert_eq!(transfer_count, 1, "there should be 1 transfer event"); + }); +} + +#[cfg(test)] +mod fee_tests { + use super::*; + use frame_support::{ + traits::ConstU128, + weights::{ConstantMultiplier, WeightToFee}, + }; + use moonbeam_runtime::{ + currency, LengthToFee, MinimumMultiplier, RuntimeBlockWeights, SlowAdjustingFeeUpdate, + TargetBlockFullness, TransactionPayment, + }; + use sp_core::Get; + use sp_runtime::FixedPointNumber; + + fn run_with_system_weight(w: Weight, mut assertions: F) + where + F: FnMut() -> (), + { + let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap() + .into(); + t.execute_with(|| { + System::set_block_consumed_resources(w, 0); + assertions() + }); + } + + #[test] + fn test_multiplier_can_grow_from_zero() { + let minimum_multiplier = MinimumMultiplier::get(); + let target = TargetBlockFullness::get() + * RuntimeBlockWeights::get() + .get(DispatchClass::Normal) + .max_total + .unwrap(); + // if the min is too small, then this will not change, and we are doomed forever. + // the weight is 1/100th bigger than target. + run_with_system_weight(target * 101 / 100, || { + let next = SlowAdjustingFeeUpdate::::convert(minimum_multiplier); + assert!( + next > minimum_multiplier, + "{:?} !>= {:?}", + next, + minimum_multiplier + ); + }) + } + + #[test] + fn test_fee_calculation() { + let base_extrinsic = RuntimeBlockWeights::get() + .get(DispatchClass::Normal) + .base_extrinsic; + let multiplier = sp_runtime::FixedU128::from_float(0.999000000000000000); + let extrinsic_len = 100u32; + let extrinsic_weight = 5_000u64; + let tip = 42u128; + type WeightToFeeImpl = ConstantMultiplier>; + type LengthToFeeImpl = LengthToFee; + + // base_fee + (multiplier * extrinsic_weight_fee) + extrinsic_length_fee + tip + let expected_fee = + WeightToFeeImpl::weight_to_fee(&base_extrinsic) + + multiplier.saturating_mul_int(WeightToFeeImpl::weight_to_fee( + &Weight::from_parts(extrinsic_weight, 1), + )) + LengthToFeeImpl::weight_to_fee(&Weight::from_parts(extrinsic_len as u64, 1)) + + tip; + + let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap() + .into(); + t.execute_with(|| { + pallet_transaction_payment::NextFeeMultiplier::::set(multiplier); + let actual_fee = TransactionPayment::compute_fee( + extrinsic_len, + &frame_support::dispatch::DispatchInfo { + class: DispatchClass::Normal, + pays_fee: frame_support::dispatch::Pays::Yes, + weight: Weight::from_parts(extrinsic_weight, 1), + }, + tip, + ); + + assert_eq!( + expected_fee, + actual_fee, + "The actual fee did not match the expected fee, diff {}", + actual_fee - expected_fee + ); + }); + } +} diff --git a/tracing/2402/runtime/moonbeam/tests/runtime_apis.rs b/tracing/2402/runtime/moonbeam/tests/runtime_apis.rs new file mode 100644 index 0000000..ba8eb93 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/tests/runtime_apis.rs @@ -0,0 +1,393 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Moonbeam Runtime Api Integration Tests + +mod common; +use common::*; + +use fp_evm::GenesisAccount; +use frame_support::assert_ok; +use nimbus_primitives::NimbusId; +use pallet_evm::{Account as EVMAccount, AddressMapping, FeeCalculator}; +use sp_core::{ByteArray, H160, H256, U256}; + +use fp_rpc::runtime_decl_for_ethereum_runtime_rpc_api::EthereumRuntimeRPCApi; +use moonbeam_rpc_primitives_txpool::runtime_decl_for_tx_pool_runtime_api::TxPoolRuntimeApi; +use nimbus_primitives::runtime_decl_for_nimbus_api::NimbusApi; +use std::{collections::BTreeMap, str::FromStr}; + +#[test] +fn ethereum_runtime_rpc_api_chain_id() { + ExtBuilder::default().build().execute_with(|| { + assert_eq!(Runtime::chain_id(), CHAIN_ID); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_account_basic() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 2_000 * GLMR)]) + .build() + .execute_with(|| { + assert_eq!( + Runtime::account_basic(H160::from(ALICE)), + EVMAccount { + balance: U256::from(2_000 * GLMR), + nonce: U256::zero() + } + ); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_gas_price() { + ExtBuilder::default().build().execute_with(|| { + assert_eq!( + Runtime::gas_price(), + TransactionPaymentAsGasPrice::min_gas_price().0 + ); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_account_code_at() { + let address = H160::from(EVM_CONTRACT); + let code: Vec = vec![1, 2, 3, 4, 5]; + ExtBuilder::default() + .with_evm_accounts({ + let mut map = BTreeMap::new(); + map.insert( + address, + GenesisAccount { + balance: U256::zero(), + code: code.clone(), + nonce: Default::default(), + storage: Default::default(), + }, + ); + map + }) + .build() + .execute_with(|| { + assert_eq!(Runtime::account_code_at(address), code); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_author() { + ExtBuilder::default() + .with_collators(vec![(AccountId::from(ALICE), 100_000 * GLMR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 200_000 * GLMR), + (AccountId::from(BOB), 100_000 * GLMR), + ]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 50_000 * GLMR, + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + run_to_block(2, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + assert_eq!(Runtime::author(), H160::from(ALICE)); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_storage_at() { + let address = H160::from(EVM_CONTRACT); + let mut key = [0u8; 32]; + key[31..32].copy_from_slice(&[6u8][..]); + let mut value = [0u8; 32]; + value[31..32].copy_from_slice(&[7u8][..]); + let item = H256::from_slice(&key[..]); + let mut storage: BTreeMap = BTreeMap::new(); + storage.insert(H256::from_slice(&key[..]), item); + ExtBuilder::default() + .with_evm_accounts({ + let mut map = BTreeMap::new(); + map.insert( + address, + GenesisAccount { + balance: U256::zero(), + code: Vec::new(), + nonce: Default::default(), + storage: storage.clone(), + }, + ); + map + }) + .build() + .execute_with(|| { + assert_eq!(Runtime::storage_at(address, U256::from(6)), item); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_call() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * GLMR), + (AccountId::from(BOB), 2_000 * GLMR), + ]) + .build() + .execute_with(|| { + let execution_result = Runtime::call( + H160::from(ALICE), // from + H160::from(BOB), // to + Vec::new(), // data + U256::from(1000u64), // value + U256::from(100000u64), // gas_limit + None, // max_fee_per_gas + None, // max_priority_fee_per_gas + None, // nonce + false, // estimate + None, // access_list + ); + assert!(execution_result.is_ok()); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_create() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 2_000 * GLMR)]) + .build() + .execute_with(|| { + let execution_result = Runtime::create( + H160::from(ALICE), // from + vec![0, 1, 1, 0], // data + U256::zero(), // value + U256::from(100000u64), // gas_limit + None, // max_fee_per_gas + None, // max_priority_fee_per_gas + None, // nonce + false, // estimate + None, // access_list + ); + assert!(execution_result.is_ok()); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_current_transaction_statuses() { + let alith = ::AddressMapping::into_account_id( + H160::from_str("f24FF3a9CF04c71Dbc94D0b566f7A27B94566cac") + .expect("internal H160 is valid; qed"), + ); + ExtBuilder::default() + .with_collators(vec![(AccountId::from(ALICE), 100_000 * GLMR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (alith, 200_000 * GLMR), + (AccountId::from(ALICE), 200_000 * GLMR), + (AccountId::from(BOB), 100_000 * GLMR), + ]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 50_000 * GLMR, + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + + let _result = Executive::apply_extrinsic(unchecked_eth_tx(VALID_ETH_TX)); + + rpc_run_to_block(2); + let statuses = + Runtime::current_transaction_statuses().expect("Transaction statuses result."); + assert_eq!(statuses.len(), 1); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_current_block() { + ExtBuilder::default() + .with_collators(vec![(AccountId::from(ALICE), 100_000 * GLMR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 200_000 * GLMR), + (AccountId::from(BOB), 100_000 * GLMR), + ]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 50_000 * GLMR, + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + rpc_run_to_block(2); + let block = Runtime::current_block().expect("Block result."); + assert_eq!(block.header.number, U256::from(1u8)); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_current_receipts() { + let alith = ::AddressMapping::into_account_id( + H160::from_str("f24FF3a9CF04c71Dbc94D0b566f7A27B94566cac") + .expect("internal H160 is valid; qed"), + ); + ExtBuilder::default() + .with_collators(vec![(AccountId::from(ALICE), 100_000 * GLMR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (alith, 200_000 * GLMR), + (AccountId::from(ALICE), 200_000 * GLMR), + (AccountId::from(BOB), 100_000 * GLMR), + ]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 50_000 * GLMR, + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + + let _result = Executive::apply_extrinsic(unchecked_eth_tx(VALID_ETH_TX)); + + rpc_run_to_block(2); + let receipts = Runtime::current_receipts().expect("Receipts result."); + assert_eq!(receipts.len(), 1); + }); +} + +#[test] +fn txpool_runtime_api_extrinsic_filter() { + ExtBuilder::default().build().execute_with(|| { + let non_eth_uxt = UncheckedExtrinsic::new_unsigned( + pallet_balances::Call::::transfer { + dest: AccountId::from(BOB), + value: 1 * GLMR, + } + .into(), + ); + let eth_uxt = unchecked_eth_tx(VALID_ETH_TX); + let txpool = >::extrinsic_filter( + vec![eth_uxt.clone(), non_eth_uxt.clone()], + vec![unchecked_eth_tx(VALID_ETH_TX), non_eth_uxt], + ); + assert_eq!(txpool.ready.len(), 1); + assert_eq!(txpool.future.len(), 1); + }); +} + +#[test] +fn can_author_when_selected_is_empty() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 20_000_000 * GLMR), + (AccountId::from(BOB), 10_000_000 * GLMR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 2_000_000 * GLMR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + run_to_block(2, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + + assert_eq!(ParachainStaking::candidate_pool().0.len(), 1); + + let slot_number = 0; + let parent = Header { + digest: Default::default(), + extrinsics_root: Default::default(), + number: Default::default(), + parent_hash: Default::default(), + state_root: Default::default(), + }; + + // Base case: ALICE can author blocks when she is the only candidate + let can_author_block = Runtime::can_author( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + slot_number, + &parent, + ); + + assert!(can_author_block); + + // Remove ALICE from candidate pool, leaving the candidate_pool empty + assert_ok!(ParachainStaking::go_offline(origin_of(AccountId::from( + ALICE + )))); + + // Need to fast forward to right before the next session, which is when selected candidates + // will be updated. We want to test the creation of the first block of the next session. + run_to_block(1799, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + + assert_eq!(ParachainStaking::candidate_pool().0.len(), 0); + + let slot_number = 0; + let parent = Header { + digest: Default::default(), + extrinsics_root: Default::default(), + number: 1799, + parent_hash: Default::default(), + state_root: Default::default(), + }; + + let can_author_block = Runtime::can_author( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + slot_number, + &parent, + ); + + assert!(can_author_block); + + // Check that it works as expected after session update + run_to_block(1800, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + + assert_eq!(ParachainStaking::candidate_pool().0.len(), 0); + + let slot_number = 0; + let parent = Header { + digest: Default::default(), + extrinsics_root: Default::default(), + number: 1800, + parent_hash: Default::default(), + state_root: Default::default(), + }; + + let can_author_block = Runtime::can_author( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + slot_number, + &parent, + ); + + assert!(can_author_block); + }); +} diff --git a/tracing/2402/runtime/moonbeam/tests/xcm_mock/mod.rs b/tracing/2402/runtime/moonbeam/tests/xcm_mock/mod.rs new file mode 100644 index 0000000..46167db --- /dev/null +++ b/tracing/2402/runtime/moonbeam/tests/xcm_mock/mod.rs @@ -0,0 +1,254 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +pub mod parachain; +pub mod relay_chain; +pub mod statemint_like; + +use cumulus_primitives_core::ParaId; +use sp_runtime::traits::AccountIdConversion; +use sp_runtime::AccountId32; +use xcm_simulator::{decl_test_network, decl_test_parachain, decl_test_relay_chain}; + +use polkadot_runtime_parachains::configuration::{ + GenesisConfig as ConfigurationGenesisConfig, HostConfiguration, +}; +use polkadot_runtime_parachains::paras::{ + GenesisConfig as ParasGenesisConfig, ParaGenesisArgs, ParaKind, +}; +use sp_core::{H160, U256}; +use std::{collections::BTreeMap, str::FromStr}; + +pub const PARAALICE: [u8; 20] = [1u8; 20]; +pub const RELAYALICE: AccountId32 = AccountId32::new([0u8; 32]); + +pub fn para_a_account() -> AccountId32 { + ParaId::from(1).into_account_truncating() +} + +pub fn para_b_account() -> AccountId32 { + ParaId::from(2).into_account_truncating() +} + +pub fn para_a_account_20() -> parachain::AccountId { + ParaId::from(1).into_account_truncating() +} + +pub fn evm_account() -> H160 { + H160::from_str("1000000000000000000000000000000000000001").unwrap() +} + +pub fn mock_para_genesis_info() -> ParaGenesisArgs { + ParaGenesisArgs { + genesis_head: vec![1u8].into(), + validation_code: vec![1u8].into(), + para_kind: ParaKind::Parachain, + } +} + +pub fn mock_relay_config() -> HostConfiguration { + HostConfiguration:: { + hrmp_channel_max_capacity: u32::MAX, + hrmp_channel_max_total_size: u32::MAX, + hrmp_max_parachain_inbound_channels: 10, + hrmp_max_parachain_outbound_channels: 10, + hrmp_channel_max_message_size: u32::MAX, + max_downward_message_size: u32::MAX, + ..Default::default() + } +} + +decl_test_parachain! { + pub struct ParaA { + Runtime = parachain::Runtime, + XcmpMessageHandler = parachain::MsgQueue, + DmpMessageHandler = parachain::MsgQueue, + new_ext = para_ext(1), + } +} + +decl_test_parachain! { + pub struct ParaB { + Runtime = parachain::Runtime, + XcmpMessageHandler = parachain::MsgQueue, + DmpMessageHandler = parachain::MsgQueue, + new_ext = para_ext(2), + } +} + +decl_test_parachain! { + pub struct ParaC { + Runtime = parachain::Runtime, + XcmpMessageHandler = parachain::MsgQueue, + DmpMessageHandler = parachain::MsgQueue, + new_ext = para_ext(3), + } +} + +decl_test_parachain! { + pub struct Statemint { + Runtime = statemint_like::Runtime, + XcmpMessageHandler = statemint_like::MsgQueue, + DmpMessageHandler = statemint_like::MsgQueue, + new_ext = statemint_ext(4), + } +} + +decl_test_relay_chain! { + pub struct Relay { + Runtime = relay_chain::Runtime, + XcmConfig = relay_chain::XcmConfig, + new_ext = relay_ext(vec![1, 2, 3, 4]), + } +} + +decl_test_network! { + pub struct MockNet { + relay_chain = Relay, + parachains = vec![ + (1, ParaA), + (2, ParaB), + (3, ParaC), + (4, Statemint), + ], + } +} + +pub const INITIAL_BALANCE: u128 = 10_000_000_000_000_000; + +pub const INITIAL_EVM_BALANCE: u128 = 0; +pub const INITIAL_EVM_NONCE: u32 = 1; + +pub fn para_ext(para_id: u32) -> sp_io::TestExternalities { + use parachain::{MsgQueue, Runtime, System}; + + let mut t = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap(); + + pallet_balances::GenesisConfig:: { + balances: vec![(PARAALICE.into(), INITIAL_BALANCE)], + } + .assimilate_storage(&mut t) + .unwrap(); + + // EVM accounts are self-sufficient. + let mut evm_accounts = BTreeMap::new(); + evm_accounts.insert( + evm_account(), + fp_evm::GenesisAccount { + nonce: U256::from(INITIAL_EVM_NONCE), + balance: U256::from(INITIAL_EVM_BALANCE), + storage: Default::default(), + code: vec![ + 0x00, // STOP + ], + }, + ); + + frame_support::traits::GenesisBuild::::assimilate_storage( + &pallet_evm::GenesisConfig { + accounts: evm_accounts, + }, + &mut t, + ) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| { + System::set_block_number(1); + MsgQueue::set_para_id(para_id.into()); + }); + ext +} + +pub fn statemint_ext(para_id: u32) -> sp_io::TestExternalities { + use statemint_like::{MsgQueue, Runtime, System}; + + let mut t = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap(); + + pallet_balances::GenesisConfig:: { + balances: vec![(RELAYALICE.into(), INITIAL_BALANCE)], + } + .assimilate_storage(&mut t) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| { + System::set_block_number(1); + MsgQueue::set_para_id(para_id.into()); + }); + ext +} + +pub fn relay_ext(paras: Vec) -> sp_io::TestExternalities { + use relay_chain::{Runtime, System}; + + let mut t = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap(); + + pallet_balances::GenesisConfig:: { + balances: vec![(RELAYALICE, INITIAL_BALANCE)], + } + .assimilate_storage(&mut t) + .unwrap(); + + let para_genesis: Vec<(ParaId, ParaGenesisArgs)> = paras + .iter() + .map(|¶_id| (para_id.into(), mock_para_genesis_info())) + .collect(); + + frame_support::traits::GenesisBuild::::assimilate_storage( + &ConfigurationGenesisConfig { + config: mock_relay_config(), + }, + &mut t, + ) + .unwrap(); + + frame_support::traits::GenesisBuild::::assimilate_storage( + &ParasGenesisConfig { + paras: para_genesis, + }, + &mut t, + ) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| { + System::set_block_number(1); + }); + ext +} + +pub type RelayChainPalletXcm = pallet_xcm::Pallet; +pub type Hrmp = polkadot_runtime_parachains::hrmp::Pallet; + +pub type StatemintBalances = pallet_balances::Pallet; +pub type StatemintChainPalletXcm = pallet_xcm::Pallet; +pub type StatemintAssets = pallet_assets::Pallet; + +pub type Assets = pallet_assets::Pallet; +pub type LocalAssets = pallet_assets::Pallet; +pub type Treasury = pallet_treasury::Pallet; +pub type AssetManager = pallet_asset_manager::Pallet; +pub type XTokens = orml_xtokens::Pallet; +pub type RelayBalances = pallet_balances::Pallet; +pub type ParaBalances = pallet_balances::Pallet; +pub type XcmTransactor = pallet_xcm_transactor::Pallet; diff --git a/tracing/2402/runtime/moonbeam/tests/xcm_mock/parachain.rs b/tracing/2402/runtime/moonbeam/tests/xcm_mock/parachain.rs new file mode 100644 index 0000000..e2dc366 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/tests/xcm_mock/parachain.rs @@ -0,0 +1,1176 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +//! Parachain runtime mock. + +use frame_support::{ + codec::MaxEncodedLen, + construct_runtime, + dispatch::GetDispatchInfo, + ensure, parameter_types, + traits::{ + AsEnsureOriginWithArg, ConstU32, Everything, Get, InstanceFilter, Nothing, PalletInfoAccess, + }, + weights::Weight, + PalletId, +}; + +use cumulus_primitives_core::relay_chain::HrmpChannelId; +use frame_system::{EnsureNever, EnsureRoot}; +use orml_traits::parameter_type_with_key; +use parity_scale_codec::{Decode, Encode}; +use sp_core::H256; +use sp_runtime::{ + traits::{BlakeTwo256, Hash, IdentityLookup, Zero}, + Permill, +}; +use sp_std::{convert::TryFrom, prelude::*}; +use xcm::{latest::prelude::*, Version as XcmVersion, VersionedXcm}; + +use pallet_ethereum::PostLogContent; +use polkadot_core_primitives::BlockNumber as RelayBlockNumber; +use polkadot_parachain::primitives::{Id as ParaId, Sibling}; +use xcm::latest::{ + AssetId as XcmAssetId, Error as XcmError, ExecuteXcm, + Junction::{PalletInstance, Parachain}, + Junctions, MultiLocation, NetworkId, Outcome, Xcm, +}; +use xcm_builder::{ + AccountKey20Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, + AllowTopLevelPaidExecutionFrom, AsPrefixedGeneralIndex, ConvertedConcreteId, + CurrencyAdapter as XcmCurrencyAdapter, EnsureXcmOrigin, FixedRateOfFungible, FixedWeightBounds, + FungiblesAdapter, IsConcrete, NoChecking, ParentAsSuperuser, ParentIsPreset, + RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountKey20AsNative, SovereignSignedViaLocation, TakeWeightCredit, WithComputedOrigin, +}; +use xcm_executor::{traits::JustTry, Config, XcmExecutor}; + +use scale_info::TypeInfo; +use xcm_simulator::{ + DmpMessageHandlerT as DmpMessageHandler, XcmpMessageFormat, + XcmpMessageHandlerT as XcmpMessageHandler, +}; + +pub type AccountId = moonbeam_core_primitives::AccountId; +pub type Balance = u128; +pub type AssetId = u128; +pub type BlockNumber = u32; + +parameter_types! { + pub const BlockHashCount: u32 = 250; +} + +impl frame_system::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Index = u64; + type BlockNumber = BlockNumber; + type Hash = H256; + type Hashing = ::sp_runtime::traits::BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = sp_runtime::generic::Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type BlockWeights = (); + type BlockLength = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = (); + type BaseCallFilter = Everything; + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +parameter_types! { + pub ExistentialDeposit: Balance = 0; + pub const MaxLocks: u32 = 50; + pub const MaxReserves: u32 = 50; +} + +impl pallet_balances::Config for Runtime { + type MaxLocks = MaxLocks; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxReserves = MaxReserves; + type ReserveIdentifier = [u8; 8]; +} + +pub type ForeignAssetInstance = (); +pub type LocalAssetInstance = pallet_assets::Instance1; + +parameter_types! { + pub const AssetDeposit: Balance = 1; // Does not really matter as this will be only called by root + pub const ApprovalDeposit: Balance = 0; + pub const AssetsStringLimit: u32 = 50; + pub const MetadataDepositBase: Balance = 0; + pub const MetadataDepositPerByte: Balance = 0; + pub const AssetAccountDeposit: Balance = 0; +} + +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type Currency = Balances; + type ForceOrigin = EnsureRoot; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type AssetAccountDeposit = AssetAccountDeposit; + type WeightInfo = pallet_assets::weights::SubstrateWeight; + type RemoveItemsLimit = ConstU32<656>; + type AssetIdParameter = AssetId; + type CreateOrigin = AsEnsureOriginWithArg>; + type CallbackHandle = (); +} + +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type Currency = Balances; + type ForceOrigin = EnsureRoot; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type AssetAccountDeposit = AssetAccountDeposit; + type WeightInfo = pallet_assets::weights::SubstrateWeight; + type RemoveItemsLimit = ConstU32<656>; + type AssetIdParameter = AssetId; + type CreateOrigin = AsEnsureOriginWithArg>; + type CallbackHandle = (); +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the default `AccountId`. + ParentIsPreset, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + AccountKey20Aliases, + // Generate remote accounts according to polkadot standards + xcm_builder::HashedDescriptionDescribeFamilyAllTerminal, +); + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can +/// biases the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain which they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when + // recognised. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognised. + SiblingParachainAsNative, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, + // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. + pallet_xcm::XcmPassthrough, + SignedAccountKey20AsNative, +); + +parameter_types! { + pub const UnitWeightCost: Weight = Weight::from_parts(1u64, 1u64); + pub MaxInstructions: u32 = 100; +} + +// Instructing how incoming xcm assets will be handled +pub type ForeignFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + Assets, + // Use this currency when it is a fungible asset matching the given location or name: + ( + ConvertedConcreteId< + AssetId, + Balance, + xcm_primitives::AsAssetType, + JustTry, + >, + ), + // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont allow teleports. + NoChecking, + // We dont track any teleports + (), +>; + +pub type LocalAssetTransactor = XcmCurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching any of the locations in + // SelfReserveRepresentations + IsConcrete, + // We can convert the MultiLocations with our converter above: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont allow teleport + (), +>; + +/// Means for transacting local assets besides the native currency on this chain. +pub type LocalFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + LocalAssets, + // Use this currency when it is a fungible asset matching the given location or name: + ( + ConvertedConcreteId< + AssetId, + Balance, + AsPrefixedGeneralIndex, + JustTry, + >, + ), + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont want to allow teleporting assets + NoChecking, + // The account to use for tracking teleports. + (), +>; + +// We use all transactors +pub type AssetTransactors = ( + LocalAssetTransactor, + ForeignFungiblesTransactor, + LocalFungiblesTransactor, +); +pub type XcmRouter = super::ParachainXcmRouter; + +pub type XcmBarrier = ( + // Weight that is paid for may be consumed. + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, +); + +parameter_types! { + /// Xcm fees will go to the treasury account + pub XcmFeesAccount: AccountId = Treasury::account_id(); +} + +/// This is the struct that will handle the revenue from xcm fees +pub type XcmFeesToAccount_ = xcm_primitives::XcmFeesToAccount< + Assets, + ( + ConvertedConcreteId< + AssetId, + Balance, + xcm_primitives::AsAssetType, + JustTry, + >, + ), + AccountId, + XcmFeesAccount, +>; + +parameter_types! { + // We cannot skip the native trader for some specific tests, so we will have to work with + // a native trader that charges same number of units as weight + pub ParaTokensPerSecond: (XcmAssetId, u128, u128) = + (Concrete(SelfReserve::get()), 1000000000000, 0); +} + +parameter_types! { + pub const RelayNetwork: NetworkId = NetworkId::Polkadot; + pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); + pub UniversalLocation: InteriorMultiLocation = + X2(GlobalConsensus(RelayNetwork::get()), Parachain(MsgQueue::parachain_id().into())); + pub SelfReserve: MultiLocation = MultiLocation { + parents:0, + interior: Junctions::X1( + PalletInstance(::index() as u8) + ) + }; + pub LocalAssetsPalletLocation: MultiLocation = MultiLocation { + parents:0, + interior: Junctions::X1( + PalletInstance(::index() as u8) + ) + }; + pub const MaxAssetsIntoHolding: u32 = 64; +} + +use frame_system::RawOrigin; +use sp_runtime::traits::PostDispatchInfoOf; +use sp_runtime::DispatchErrorWithPostInfo; +use xcm_executor::traits::CallDispatcher; +moonbeam_runtime_common::impl_moonbeam_xcm_call!(); + +pub struct XcmConfig; +impl Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = AssetTransactors; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + type IsReserve = orml_xcm_support::MultiNativeAsset< + xcm_primitives::AbsoluteAndRelativeReserve, + >; + type IsTeleporter = (); + type UniversalLocation = UniversalLocation; + type Barrier = XcmBarrier; + type Weigher = FixedWeightBounds; + // We use two traders + // When we receive the self-reserve asset, + // When we receive a non-reserve asset, we use AssetManager to fetch how many + // units per second we should charge + type Trader = ( + FixedRateOfFungible, + xcm_primitives::FirstAssetTrader, + ); + type ResponseHandler = PolkadotXcm; + type SubscriptionService = PolkadotXcm; + type AssetTrap = PolkadotXcm; + type AssetClaims = PolkadotXcm; + type CallDispatcher = MoonbeamCall; + type AssetLocker = (); + type AssetExchanger = (); + type PalletInstancesInfo = (); + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type FeeManager = (); + type MessageExporter = (); + type UniversalAliases = Nothing; + type SafeCallFilter = Everything; + type AssetIsBurnable = Everything; +} + +impl cumulus_pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +// Our currencyId. We distinguish for now between SelfReserve, and Others, defined by their Id. +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum CurrencyId { + SelfReserve, + ForeignAsset(AssetId), + LocalAssetReserve(AssetId), +} + +// How to convert from CurrencyId to MultiLocation +pub struct CurrencyIdtoMultiLocation(sp_std::marker::PhantomData); +impl sp_runtime::traits::Convert> + for CurrencyIdtoMultiLocation +where + AssetXConverter: xcm_executor::traits::Convert, +{ + fn convert(currency: CurrencyId) -> Option { + match currency { + CurrencyId::SelfReserve => { + let multi: MultiLocation = SelfReserve::get(); + Some(multi) + } + CurrencyId::ForeignAsset(asset) => AssetXConverter::reverse_ref(asset).ok(), + CurrencyId::LocalAssetReserve(asset) => { + let mut location = LocalAssetsPalletLocation::get(); + location.push_interior(Junction::GeneralIndex(asset)).ok(); + Some(location) + } + } + } +} + +parameter_types! { + pub const BaseXcmWeight: Weight = Weight::from_parts(100u64, 100u64); + pub const MaxAssetsForTransfer: usize = 2; + pub SelfLocation: MultiLocation = MultiLocation::here(); + pub SelfLocationAbsolute: MultiLocation = MultiLocation { + parents:1, + interior: Junctions::X1( + Parachain(MsgQueue::parachain_id().into()) + ) + }; +} + +parameter_type_with_key! { + pub ParachainMinFee: |_location: MultiLocation| -> Option { + Some(u128::MAX) + }; +} + +// The XCM message wrapper wrapper +impl orml_xtokens::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type CurrencyId = CurrencyId; + type AccountIdToMultiLocation = xcm_primitives::AccountIdToMultiLocation; + type CurrencyIdConvert = + CurrencyIdtoMultiLocation>; + type XcmExecutor = XcmExecutor; + type SelfLocation = SelfLocation; + type Weigher = xcm_builder::FixedWeightBounds; + type BaseXcmWeight = BaseXcmWeight; + type UniversalLocation = UniversalLocation; + type MaxAssetsForTransfer = MaxAssetsForTransfer; + type MinXcmFee = ParachainMinFee; + type MultiLocationsFilter = Everything; + type ReserveProvider = xcm_primitives::AbsoluteAndRelativeReserve; +} + +parameter_types! { + pub const ProposalBond: Permill = Permill::from_percent(5); + pub const ProposalBondMinimum: Balance = 0; + pub const SpendPeriod: u32 = 0; + pub const TreasuryId: PalletId = PalletId(*b"pc/trsry"); + pub const MaxApprovals: u32 = 100; +} + +impl pallet_treasury::Config for Runtime { + type PalletId = TreasuryId; + type Currency = Balances; + type ApproveOrigin = EnsureRoot; + type RejectOrigin = EnsureRoot; + type RuntimeEvent = RuntimeEvent; + type OnSlash = Treasury; + type ProposalBond = ProposalBond; + type ProposalBondMinimum = ProposalBondMinimum; + type SpendPeriod = SpendPeriod; + type Burn = (); + type BurnDestination = (); + type MaxApprovals = MaxApprovals; + type WeightInfo = (); + type SpendFunds = (); + type ProposalBondMaximum = (); + type SpendOrigin = frame_support::traits::NeverEnsureOrigin; // Same as Polkadot +} + +#[frame_support::pallet] +pub mod mock_msg_queue { + use super::*; + use frame_support::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + type XcmExecutor: ExecuteXcm; + } + + #[pallet::call] + impl Pallet {} + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::storage] + #[pallet::getter(fn parachain_id)] + pub(super) type ParachainId = StorageValue<_, ParaId, ValueQuery>; + + impl Get for Pallet { + fn get() -> ParaId { + Self::parachain_id() + } + } + + pub type MessageId = [u8; 32]; + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + // XCMP + /// Some XCM was executed OK. + Success(Option), + /// Some XCM failed. + Fail(Option, XcmError), + /// Bad XCM version used. + BadVersion(Option), + /// Bad XCM format used. + BadFormat(Option), + + // DMP + /// Downward message is invalid XCM. + InvalidFormat(MessageId), + /// Downward message is unsupported version of XCM. + UnsupportedVersion(MessageId), + /// Downward message executed with the given outcome. + ExecutedDownward(MessageId, Outcome), + } + + impl Pallet { + pub fn set_para_id(para_id: ParaId) { + ParachainId::::put(para_id); + } + + fn handle_xcmp_message( + sender: ParaId, + _sent_at: RelayBlockNumber, + xcm: VersionedXcm, + max_weight: Weight, + ) -> Result { + let hash = Encode::using_encoded(&xcm, T::Hashing::hash); + let (result, event) = match Xcm::::try_from(xcm) { + Ok(xcm) => { + let location = MultiLocation::new(1, Junctions::X1(Parachain(sender.into()))); + let mut id = [0u8; 32]; + id.copy_from_slice(hash.as_ref()); + match T::XcmExecutor::execute_xcm(location, xcm, id, max_weight) { + Outcome::Error(e) => (Err(e.clone()), Event::Fail(Some(hash), e)), + Outcome::Complete(w) => (Ok(w), Event::Success(Some(hash))), + // As far as the caller is concerned, this was dispatched without error, so + // we just report the weight used. + Outcome::Incomplete(w, e) => (Ok(w), Event::Fail(Some(hash), e)), + } + } + Err(()) => ( + Err(XcmError::UnhandledXcmVersion), + Event::BadVersion(Some(hash)), + ), + }; + Self::deposit_event(event); + result + } + } + + impl XcmpMessageHandler for Pallet { + fn handle_xcmp_messages<'a, I: Iterator>( + iter: I, + max_weight: Weight, + ) -> Weight { + for (sender, sent_at, data) in iter { + let mut data_ref = data; + let _ = XcmpMessageFormat::decode(&mut data_ref) + .expect("Simulator encodes with versioned xcm format; qed"); + + let mut remaining_fragments = &data_ref[..]; + while !remaining_fragments.is_empty() { + if let Ok(xcm) = + VersionedXcm::::decode(&mut remaining_fragments) + { + let _ = Self::handle_xcmp_message(sender, sent_at, xcm, max_weight); + } else { + debug_assert!(false, "Invalid incoming XCMP message data"); + } + } + } + max_weight + } + } + + impl DmpMessageHandler for Pallet { + fn handle_dmp_messages( + iter: impl Iterator)>, + limit: Weight, + ) -> Weight { + for (_i, (_sent_at, data)) in iter.enumerate() { + let id = sp_io::hashing::blake2_256(&data[..]); + let maybe_msg = VersionedXcm::::decode(&mut &data[..]) + .map(Xcm::::try_from); + match maybe_msg { + Err(_) => { + Self::deposit_event(Event::InvalidFormat(id)); + } + Ok(Err(())) => { + Self::deposit_event(Event::UnsupportedVersion(id)); + } + Ok(Ok(x)) => { + let outcome = T::XcmExecutor::execute_xcm(Parent, x, id, limit); + Self::deposit_event(Event::ExecutedDownward(id, outcome)); + } + } + } + limit + } + } +} + +// Pallet to provide the version, used to test runtime upgrade version changes +#[frame_support::pallet] +pub mod mock_version_changer { + use super::*; + use frame_support::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + } + + #[pallet::call] + impl Pallet {} + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::storage] + #[pallet::getter(fn current_version)] + pub(super) type CurrentVersion = StorageValue<_, XcmVersion, ValueQuery>; + + impl Get for Pallet { + fn get() -> XcmVersion { + Self::current_version() + } + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + // XCMP + /// Some XCM was executed OK. + VersionChanged(XcmVersion), + } + + impl Pallet { + pub fn set_version(version: XcmVersion) { + CurrentVersion::::put(version); + Self::deposit_event(Event::VersionChanged(version)); + } + } +} + +impl mock_msg_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +impl mock_version_changer::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} + +pub type LocalOriginToLocation = + xcm_primitives::SignedToAccountId20; + +parameter_types! { + pub MatcherLocation: MultiLocation = MultiLocation::here(); +} + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = frame_support::traits::Nothing; + type XcmExecutor = XcmExecutor; + // Do not allow teleports + type XcmTeleportFilter = Nothing; + type XcmReserveTransferFilter = Everything; + type Weigher = FixedWeightBounds; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + // We use a custom one to test runtime ugprades + type AdvertisedXcmVersion = XcmVersioner; + type Currency = Balances; + type CurrencyMatcher = IsConcrete; + type TrustedLockers = (); + type SovereignAccountOf = (); + type MaxLockers = ConstU32<8>; + type WeightInfo = pallet_xcm::TestWeightInfo; +} + +// Our AssetType. For now we only handle Xcm Assets +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum AssetType { + Xcm(MultiLocation), +} +impl Default for AssetType { + fn default() -> Self { + Self::Xcm(MultiLocation::here()) + } +} + +impl From for AssetType { + fn from(location: MultiLocation) -> Self { + Self::Xcm(location) + } +} + +impl Into> for AssetType { + fn into(self) -> Option { + match self { + Self::Xcm(location) => Some(location), + } + } +} + +// Implementation on how to retrieve the AssetId from an AssetType +// We simply hash the AssetType and take the lowest 128 bits +impl From for AssetId { + fn from(asset: AssetType) -> AssetId { + match asset { + AssetType::Xcm(id) => { + let mut result: [u8; 16] = [0u8; 16]; + let hash: H256 = id.using_encoded(::Hashing::hash); + result.copy_from_slice(&hash.as_fixed_bytes()[0..16]); + u128::from_le_bytes(result) + } + } + } +} + +// We instruct how to register the Assets +// In this case, we tell it to Create an Asset in pallet-assets +pub struct AssetRegistrar; +use frame_support::pallet_prelude::DispatchResult; +impl pallet_asset_manager::AssetRegistrar for AssetRegistrar { + fn create_foreign_asset( + asset: AssetId, + min_balance: Balance, + metadata: AssetMetadata, + is_sufficient: bool, + ) -> DispatchResult { + Assets::force_create( + RuntimeOrigin::root(), + asset, + AssetManager::account_id(), + is_sufficient, + min_balance, + )?; + + Assets::force_set_metadata( + RuntimeOrigin::root(), + asset, + metadata.name, + metadata.symbol, + metadata.decimals, + false, + ) + } + + fn create_local_asset( + asset: AssetId, + _creator: AccountId, + min_balance: Balance, + is_sufficient: bool, + owner: AccountId, + ) -> DispatchResult { + LocalAssets::force_create( + RuntimeOrigin::root(), + asset, + owner, + is_sufficient, + min_balance, + )?; + + // TODO uncomment when we feel comfortable + /* + // The asset has been created. Let's put the revert code in the precompile address + let precompile_address = Runtime::asset_id_to_account(ASSET_PRECOMPILE_ADDRESS_PREFIX, asset); + pallet_evm::AccountCodes::::insert( + precompile_address, + vec![0x60, 0x00, 0x60, 0x00, 0xfd], + );*/ + Ok(()) + } + + fn destroy_foreign_asset(asset: AssetId) -> DispatchResult { + // Mark the asset as destroying + Assets::start_destroy(RuntimeOrigin::root(), asset)?; + + Ok(()) + } + + fn destroy_local_asset(asset: AssetId) -> DispatchResult { + // Mark the asset as destroying + LocalAssets::start_destroy(RuntimeOrigin::root(), asset)?; + + Ok(()) + } + + fn destroy_asset_dispatch_info_weight(asset: AssetId) -> Weight { + RuntimeCall::Assets( + pallet_assets::Call::::start_destroy { + id: asset.into(), + }, + ) + .get_dispatch_info() + .weight + } +} + +#[derive(Clone, Default, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub struct AssetMetadata { + pub name: Vec, + pub symbol: Vec, + pub decimals: u8, +} + +pub struct LocalAssetIdCreator; +impl pallet_asset_manager::LocalAssetIdCreator for LocalAssetIdCreator { + fn create_asset_id_from_metadata(local_asset_counter: u128) -> AssetId { + // Our means of converting a local asset counter to an assetId + // We basically hash (local asset counter) + let mut result: [u8; 16] = [0u8; 16]; + let hash: H256 = + local_asset_counter.using_encoded(::Hashing::hash); + result.copy_from_slice(&hash.as_fixed_bytes()[0..16]); + u128::from_le_bytes(result) + } +} + +impl pallet_asset_manager::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type AssetRegistrarMetadata = AssetMetadata; + type ForeignAssetType = AssetType; + type AssetRegistrar = AssetRegistrar; + type ForeignAssetModifierOrigin = EnsureRoot; + type LocalAssetModifierOrigin = EnsureRoot; + type LocalAssetIdCreator = LocalAssetIdCreator; + type Currency = Balances; + type LocalAssetDeposit = AssetDeposit; + type WeightInfo = (); +} + +// 1 DOT should be enough +parameter_types! { + pub MaxHrmpRelayFee: MultiAsset = (MultiLocation::parent(), 1_000_000_000_000u128).into(); +} + +impl pallet_xcm_transactor::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type Transactor = MockTransactors; + type DerivativeAddressRegistrationOrigin = EnsureRoot; + type SovereignAccountDispatcherOrigin = frame_system::EnsureRoot; + type CurrencyId = CurrencyId; + type AccountIdToMultiLocation = xcm_primitives::AccountIdToMultiLocation; + type CurrencyIdToMultiLocation = + CurrencyIdtoMultiLocation>; + type SelfLocation = SelfLocation; + type Weigher = xcm_builder::FixedWeightBounds; + type UniversalLocation = UniversalLocation; + type XcmSender = XcmRouter; + type BaseXcmWeight = BaseXcmWeight; + type AssetTransactor = AssetTransactors; + type ReserveProvider = xcm_primitives::AbsoluteAndRelativeReserve; + type WeightInfo = (); + type HrmpManipulatorOrigin = EnsureRoot; + type MaxHrmpFee = xcm_builder::Case; + type HrmpEncoder = MockHrmpEncoder; +} + +parameter_types! { + pub const MinimumPeriod: u64 = 1000; +} +impl pallet_timestamp::Config for Runtime { + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); +} + +use sp_core::U256; + +const MAX_POV_SIZE: u64 = 5 * 1024 * 1024; + +parameter_types! { + pub BlockGasLimit: U256 = U256::from(u64::MAX); + pub WeightPerGas: Weight = Weight::from_parts(1, 0); + pub GasLimitPovSizeRatio: u64 = { + let block_gas_limit = BlockGasLimit::get().min(u64::MAX.into()).low_u64(); + block_gas_limit.saturating_div(MAX_POV_SIZE) + }; +} + +impl pallet_evm::Config for Runtime { + type FeeCalculator = (); + type GasWeightMapping = pallet_evm::FixedGasWeightMapping; + type WeightPerGas = WeightPerGas; + + type CallOrigin = pallet_evm::EnsureAddressRoot; + type WithdrawOrigin = pallet_evm::EnsureAddressNever; + + type AddressMapping = moonbeam_runtime_common::IntoAddressMapping; + type Currency = Balances; + type Runner = pallet_evm::runner::stack::Runner; + + type RuntimeEvent = RuntimeEvent; + type PrecompilesType = (); + type PrecompilesValue = (); + type ChainId = (); + type BlockGasLimit = BlockGasLimit; + type OnChargeTransaction = (); + type BlockHashMapping = pallet_evm::SubstrateBlockHashMapping; + type FindAuthor = (); + type OnCreate = (); + type GasLimitPovSizeRatio = GasLimitPovSizeRatio; + type Timestamp = Timestamp; + type WeightInfo = pallet_evm::weights::SubstrateWeight; +} + +pub struct NormalFilter; +impl frame_support::traits::Contains for NormalFilter { + fn contains(c: &RuntimeCall) -> bool { + match c { + _ => true, + } + } +} + +// We need to use the encoding from the relay mock runtime +#[derive(Encode, Decode)] +pub enum RelayCall { + #[codec(index = 5u8)] + // the index should match the position of the module in `construct_runtime!` + Utility(UtilityCall), + #[codec(index = 6u8)] + // the index should match the position of the module in `construct_runtime!` + Hrmp(HrmpCall), +} + +#[derive(Encode, Decode)] +pub enum UtilityCall { + #[codec(index = 1u8)] + AsDerivative(u16), +} + +// HRMP call encoding, needed for xcm transactor pallet +#[derive(Encode, Decode)] +pub enum HrmpCall { + #[codec(index = 0u8)] + InitOpenChannel(ParaId, u32, u32), + #[codec(index = 1u8)] + AcceptOpenChannel(ParaId), + #[codec(index = 2u8)] + CloseChannel(HrmpChannelId), + #[codec(index = 6u8)] + CancelOpenRequest(HrmpChannelId, u32), +} + +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum MockTransactors { + Relay, +} + +impl xcm_primitives::XcmTransact for MockTransactors { + fn destination(self) -> MultiLocation { + match self { + MockTransactors::Relay => MultiLocation::parent(), + } + } +} + +impl xcm_primitives::UtilityEncodeCall for MockTransactors { + fn encode_call(self, call: xcm_primitives::UtilityAvailableCalls) -> Vec { + match self { + MockTransactors::Relay => match call { + xcm_primitives::UtilityAvailableCalls::AsDerivative(a, b) => { + let mut call = + RelayCall::Utility(UtilityCall::AsDerivative(a.clone())).encode(); + call.append(&mut b.clone()); + call + } + }, + } + } +} + +pub struct MockHrmpEncoder; +impl xcm_primitives::HrmpEncodeCall for MockHrmpEncoder { + fn hrmp_encode_call( + call: xcm_primitives::HrmpAvailableCalls, + ) -> Result, xcm::latest::Error> { + match call { + xcm_primitives::HrmpAvailableCalls::InitOpenChannel(a, b, c) => Ok(RelayCall::Hrmp( + HrmpCall::InitOpenChannel(a.clone(), b.clone(), c.clone()), + ) + .encode()), + xcm_primitives::HrmpAvailableCalls::AcceptOpenChannel(a) => { + Ok(RelayCall::Hrmp(HrmpCall::AcceptOpenChannel(a.clone())).encode()) + } + xcm_primitives::HrmpAvailableCalls::CloseChannel(a) => { + Ok(RelayCall::Hrmp(HrmpCall::CloseChannel(a.clone())).encode()) + } + xcm_primitives::HrmpAvailableCalls::CancelOpenRequest(a, b) => { + Ok(RelayCall::Hrmp(HrmpCall::CancelOpenRequest(a.clone(), b.clone())).encode()) + } + } + } +} + +parameter_types! { + pub const PostBlockAndTxnHashes: PostLogContent = PostLogContent::BlockAndTxnHashes; +} + +impl pallet_ethereum::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type StateRoot = pallet_ethereum::IntermediateStateRoot; + type PostLogContent = PostBlockAndTxnHashes; + type ExtraDataLength = ConstU32<30>; +} + +parameter_types! { + pub ReservedXcmpWeight: Weight = Weight::from_parts(u64::max_value(), 0); +} + +#[derive( + Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, MaxEncodedLen, TypeInfo, +)] +pub enum ProxyType { + NotAllowed = 0, + Any = 1, +} + +impl pallet_evm_precompile_proxy::EvmProxyCallFilter for ProxyType {} + +impl InstanceFilter for ProxyType { + fn filter(&self, _c: &RuntimeCall) -> bool { + match self { + ProxyType::NotAllowed => false, + ProxyType::Any => true, + } + } + fn is_superset(&self, _o: &Self) -> bool { + false + } +} + +impl Default for ProxyType { + fn default() -> Self { + Self::NotAllowed + } +} + +parameter_types! { + pub const ProxyCost: u64 = 1; +} + +impl pallet_proxy::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type Currency = Balances; + type ProxyType = ProxyType; + type ProxyDepositBase = ProxyCost; + type ProxyDepositFactor = ProxyCost; + type MaxProxies = ConstU32<32>; + type WeightInfo = pallet_proxy::weights::SubstrateWeight; + type MaxPending = ConstU32<32>; + type CallHasher = BlakeTwo256; + type AnnouncementDepositBase = ProxyCost; + type AnnouncementDepositFactor = ProxyCost; +} + +pub struct EthereumXcmEnsureProxy; +impl xcm_primitives::EnsureProxy for EthereumXcmEnsureProxy { + fn ensure_ok(delegator: AccountId, delegatee: AccountId) -> Result<(), &'static str> { + // The EVM implicitely contains an Any proxy, so we only allow for "Any" proxies + let def: pallet_proxy::ProxyDefinition = + pallet_proxy::Pallet::::find_proxy( + &delegator, + &delegatee, + Some(ProxyType::Any), + ) + .map_err(|_| "proxy error: expected `ProxyType::Any`")?; + // We only allow to use it for delay zero proxies, as the call will iMmediatly be executed + ensure!(def.delay.is_zero(), "proxy delay is Non-zero`"); + Ok(()) + } +} + +impl pallet_ethereum_xcm::Config for Runtime { + type InvalidEvmTransactionError = pallet_ethereum::InvalidTransactionWrapper; + type ValidatedTransaction = pallet_ethereum::ValidatedTransaction; + type XcmEthereumOrigin = pallet_ethereum_xcm::EnsureXcmEthereumTransaction; + type ReservedXcmpWeight = ReservedXcmpWeight; + type EnsureProxy = EthereumXcmEnsureProxy; + type ControllerOrigin = EnsureRoot; +} + +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; + +construct_runtime!( + pub enum Runtime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Storage, Config, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + MsgQueue: mock_msg_queue::{Pallet, Storage, Event}, + XcmVersioner: mock_version_changer::{Pallet, Storage, Event}, + + PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin}, + Assets: pallet_assets::{Pallet, Call, Storage, Event}, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin}, + XTokens: orml_xtokens::{Pallet, Call, Storage, Event}, + AssetManager: pallet_asset_manager::{Pallet, Call, Storage, Event}, + XcmTransactor: pallet_xcm_transactor::{Pallet, Call, Storage, Event}, + Treasury: pallet_treasury::{Pallet, Storage, Config, Event, Call}, + LocalAssets: pallet_assets::::{Pallet, Call, Storage, Event}, + Proxy: pallet_proxy::{Pallet, Call, Storage, Event}, + + Timestamp: pallet_timestamp::{Pallet, Call, Storage}, + EVM: pallet_evm::{Pallet, Call, Storage, Config, Event}, + Ethereum: pallet_ethereum::{Pallet, Call, Storage, Event, Origin, Config}, + EthereumXcm: pallet_ethereum_xcm::{Pallet, Call, Origin}, + } +); + +pub(crate) fn para_events() -> Vec { + System::events() + .into_iter() + .map(|r| r.event) + .filter_map(|e| Some(e)) + .collect::>() +} + +use frame_support::traits::{OnFinalize, OnInitialize, OnRuntimeUpgrade}; +pub(crate) fn on_runtime_upgrade() { + PolkadotXcm::on_runtime_upgrade(); +} + +pub(crate) fn para_roll_to(n: BlockNumber) { + while System::block_number() < n { + PolkadotXcm::on_finalize(System::block_number()); + Balances::on_finalize(System::block_number()); + System::on_finalize(System::block_number()); + System::set_block_number(System::block_number() + 1); + System::on_initialize(System::block_number()); + Balances::on_initialize(System::block_number()); + PolkadotXcm::on_initialize(System::block_number()); + } +} diff --git a/tracing/2402/runtime/moonbeam/tests/xcm_mock/relay_chain.rs b/tracing/2402/runtime/moonbeam/tests/xcm_mock/relay_chain.rs new file mode 100644 index 0000000..f4d9e13 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/tests/xcm_mock/relay_chain.rs @@ -0,0 +1,349 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +//! Relay chain runtime mock. + +use frame_support::{ + construct_runtime, parameter_types, + traits::{Everything, Nothing}, +}; +use sp_core::H256; +use sp_runtime::{ + traits::{BlakeTwo256, ConstU32, IdentityLookup}, + AccountId32, +}; + +use frame_support::weights::Weight; +use polkadot_parachain::primitives::Id as ParaId; +use polkadot_runtime_parachains::{configuration, dmp, hrmp, origin, paras, shared, ump}; +use sp_runtime::transaction_validity::TransactionPriority; +use sp_runtime::Permill; +use xcm::latest::prelude::*; +use xcm_builder::{ + Account32Hash, AccountId32Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, + AllowTopLevelPaidExecutionFrom, ChildParachainAsNative, ChildParachainConvertsVia, + ChildSystemParachainAsSuperuser, CurrencyAdapter as XcmCurrencyAdapter, FixedRateOfFungible, + FixedWeightBounds, IsConcrete, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, WithComputedOrigin, +}; +use xcm_executor::{Config, XcmExecutor}; +pub type AccountId = AccountId32; +pub type Balance = u128; +pub type BlockNumber = u32; + +parameter_types! { + pub const BlockHashCount: u32 = 250; +} + +impl frame_system::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Index = u64; + type BlockNumber = BlockNumber; + type Hash = H256; + type Hashing = ::sp_runtime::traits::BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = sp_runtime::generic::Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type BlockWeights = (); + type BlockLength = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = (); + type BaseCallFilter = Everything; + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = ConstU32<16>; +} + +parameter_types! { + pub ExistentialDeposit: Balance = 1; + pub const MaxLocks: u32 = 50; + pub const MaxReserves: u32 = 50; +} + +impl pallet_balances::Config for Runtime { + type MaxLocks = MaxLocks; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxReserves = MaxReserves; + type ReserveIdentifier = [u8; 8]; +} + +impl pallet_utility::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type WeightInfo = (); + type PalletsOrigin = OriginCaller; +} + +impl shared::Config for Runtime {} + +impl configuration::Config for Runtime { + type WeightInfo = configuration::TestWeightInfo; +} + +parameter_types! { + pub KsmLocation: MultiLocation = Here.into(); + pub const KusamaNetwork: NetworkId = NetworkId::Kusama; + pub const AnyNetwork: Option = None; + pub UniversalLocation: InteriorMultiLocation = Here; +} + +pub type SovereignAccountOf = ( + ChildParachainConvertsVia, + AccountId32Aliases, + // Not enabled in the relay per se, but we enable it to test + // the transact_through_signed extrinsic + Account32Hash, +); + +pub type LocalAssetTransactor = + XcmCurrencyAdapter, SovereignAccountOf, AccountId, ()>; + +type LocalOriginConverter = ( + SovereignSignedViaLocation, + ChildParachainAsNative, + SignedAccountId32AsNative, + ChildSystemParachainAsSuperuser, +); + +parameter_types! { + pub const BaseXcmWeight: Weight = Weight::from_parts(1000u64, 1000u64); + pub KsmPerSecond: (AssetId, u128, u128) = (Concrete(KsmLocation::get()), 1, 1); + pub const MaxInstructions: u32 = 100; + pub const MaxAssetsIntoHolding: u32 = 64; + pub MatcherLocation: MultiLocation = MultiLocation::here(); +} + +pub type XcmRouter = super::RelayChainXcmRouter; + +pub type XcmBarrier = ( + // Weight that is paid for may be consumed. + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, +); + +pub struct XcmConfig; +impl Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = LocalAssetTransactor; + type OriginConverter = LocalOriginConverter; + type IsReserve = (); + type IsTeleporter = (); + type UniversalLocation = UniversalLocation; + type Barrier = XcmBarrier; + type Weigher = FixedWeightBounds; + type Trader = FixedRateOfFungible; + type ResponseHandler = XcmPallet; + type AssetTrap = XcmPallet; + type AssetClaims = XcmPallet; + type SubscriptionService = XcmPallet; + type CallDispatcher = RuntimeCall; + type AssetLocker = (); + type AssetExchanger = (); + type PalletInstancesInfo = (); + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type FeeManager = (); + type MessageExporter = (); + type UniversalAliases = Nothing; + type SafeCallFilter = Everything; + type AssetIsBurnable = Everything; +} + +pub type LocalOriginToLocation = SignedToAccountId32; + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type SendXcmOrigin = xcm_builder::EnsureXcmOrigin; + type XcmRouter = XcmRouter; + // Anyone can execute XCM messages locally... + type ExecuteXcmOrigin = xcm_builder::EnsureXcmOrigin; + type XcmExecuteFilter = Nothing; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Everything; + type XcmReserveTransferFilter = Everything; + type Weigher = FixedWeightBounds; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; + type Currency = Balances; + type CurrencyMatcher = (); + type TrustedLockers = (); + type SovereignAccountOf = (); + type MaxLockers = ConstU32<8>; + type WeightInfo = pallet_xcm::TestWeightInfo; +} + +parameter_types! { + pub const FirstMessageFactorPercent: u64 = 100; +} + +impl ump::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type UmpSink = ump::XcmSink, Runtime>; + type FirstMessageFactorPercent = FirstMessageFactorPercent; + type ExecuteOverweightOrigin = frame_system::EnsureRoot; + type WeightInfo = ump::TestWeightInfo; +} + +parameter_types! { + pub const ParasUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); +} + +/// A very dumb implementation of `EstimateNextSessionRotation`. At the moment of writing, this +/// is more to satisfy type requirements rather than to test anything. +pub struct TestNextSessionRotation; + +impl frame_support::traits::EstimateNextSessionRotation for TestNextSessionRotation { + fn average_session_length() -> u32 { + 10 + } + + fn estimate_current_session_progress(_now: u32) -> (Option, Weight) { + (None, Weight::zero()) + } + + fn estimate_next_session_rotation(_now: u32) -> (Option, Weight) { + (None, Weight::zero()) + } +} + +impl paras::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = paras::TestWeightInfo; + type UnsignedPriority = ParasUnsignedPriority; + type NextSessionRotation = TestNextSessionRotation; +} + +impl dmp::Config for Runtime {} + +impl hrmp::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type WeightInfo = TestHrmpWeightInfo; +} + +impl frame_system::offchain::SendTransactionTypes for Runtime +where + RuntimeCall: From, +{ + type Extrinsic = UncheckedExtrinsic; + type OverarchingCall = RuntimeCall; +} + +impl origin::Config for Runtime {} + +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; + +construct_runtime!( + pub enum Runtime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Storage, Config, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + ParasOrigin: origin::{Pallet, Origin}, + ParasUmp: ump::{Pallet, Call, Storage, Event}, + XcmPallet: pallet_xcm::{Pallet, Call, Storage, Event, Origin}, + Utility: pallet_utility::{Pallet, Call, Event}, + Hrmp: hrmp::{Pallet, Call, Storage, Event, Config}, + Dmp: dmp::{Pallet, Call, Storage}, + Paras: paras::{Pallet, Call, Storage, Event, Config, ValidateUnsigned}, + Configuration: configuration::{Pallet, Call, Storage, Config}, + } +); + +pub(crate) fn relay_events() -> Vec { + System::events() + .into_iter() + .map(|r| r.event) + .filter_map(|e| Some(e)) + .collect::>() +} + +use frame_support::traits::{OnFinalize, OnInitialize}; +pub(crate) fn relay_roll_to(n: BlockNumber) { + while System::block_number() < n { + XcmPallet::on_finalize(System::block_number()); + Balances::on_finalize(System::block_number()); + System::on_finalize(System::block_number()); + System::set_block_number(System::block_number() + 1); + System::on_initialize(System::block_number()); + Balances::on_initialize(System::block_number()); + XcmPallet::on_initialize(System::block_number()); + } +} + +/// A weight info that is only suitable for testing. +pub struct TestHrmpWeightInfo; + +impl hrmp::WeightInfo for TestHrmpWeightInfo { + fn hrmp_accept_open_channel() -> Weight { + Weight::from_parts(1, 0) + } + fn force_clean_hrmp(_: u32, _: u32) -> Weight { + Weight::from_parts(1, 0) + } + fn force_process_hrmp_close(_: u32) -> Weight { + Weight::from_parts(1, 0) + } + fn force_process_hrmp_open(_: u32) -> Weight { + Weight::from_parts(1, 0) + } + fn hrmp_cancel_open_request(_: u32) -> Weight { + Weight::from_parts(1, 0) + } + fn hrmp_close_channel() -> Weight { + Weight::from_parts(1, 0) + } + fn hrmp_init_open_channel() -> Weight { + Weight::from_parts(1, 0) + } + fn clean_open_channel_requests(_: u32) -> Weight { + Weight::from_parts(1, 0) + } + fn force_open_hrmp_channel() -> Weight { + Weight::from_parts(1, 0) + } +} diff --git a/tracing/2402/runtime/moonbeam/tests/xcm_mock/statemint_like.rs b/tracing/2402/runtime/moonbeam/tests/xcm_mock/statemint_like.rs new file mode 100644 index 0000000..b27c2b2 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/tests/xcm_mock/statemint_like.rs @@ -0,0 +1,528 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +//! Relay chain runtime mock. + +use frame_support::{ + construct_runtime, match_types, parameter_types, + traits::{AsEnsureOriginWithArg, Everything, Nothing}, + weights::Weight, +}; +use frame_system::{EnsureRoot, EnsureSigned}; + +use sp_core::H256; +use sp_runtime::{ + traits::{BlakeTwo256, ConstU32, Hash, IdentityLookup}, + AccountId32, +}; + +use polkadot_core_primitives::BlockNumber as RelayBlockNumber; + +use polkadot_parachain::primitives::Id as ParaId; +use polkadot_parachain::primitives::Sibling; +use sp_std::convert::TryFrom; +use xcm::latest::prelude::*; +use xcm::VersionedXcm; +use xcm_builder::{ + AccountId32Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, + AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, AsPrefixedGeneralIndex, + ConvertedConcreteId, CurrencyAdapter, EnsureXcmOrigin, FixedRateOfFungible, FixedWeightBounds, + FungiblesAdapter, IsConcrete, NoChecking, ParentAsSuperuser, ParentIsPreset, + RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, +}; +use xcm_executor::{traits::JustTry, Config, XcmExecutor}; +use xcm_simulator::{ + DmpMessageHandlerT as DmpMessageHandler, XcmpMessageFormat, + XcmpMessageHandlerT as XcmpMessageHandler, +}; +pub type AccountId = AccountId32; +pub type Balance = u128; +pub type AssetId = u128; +pub type BlockNumber = u32; + +parameter_types! { + pub const BlockHashCount: u32 = 250; +} + +impl frame_system::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Index = u64; + type BlockNumber = BlockNumber; + type Hash = H256; + type Hashing = ::sp_runtime::traits::BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = sp_runtime::generic::Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type BlockWeights = (); + type BlockLength = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = (); + type BaseCallFilter = Everything; + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +parameter_types! { + pub ExistentialDeposit: Balance = 1; + pub const MaxLocks: u32 = 50; + pub const MaxReserves: u32 = 50; +} + +impl pallet_balances::Config for Runtime { + type MaxLocks = MaxLocks; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxReserves = MaxReserves; + type ReserveIdentifier = [u8; 8]; +} + +parameter_types! { + pub const AssetDeposit: Balance = 0; // 1 UNIT deposit to create asset + pub const ApprovalDeposit: Balance = 0; + pub const AssetsStringLimit: u32 = 50; + /// Key = 32 bytes, Value = 36 bytes (32+1+1+1+1) + // https://github.com/paritytech/substrate/blob/069917b/frame/assets/src/lib.rs#L257L271 + pub const MetadataDepositBase: Balance = 0; + pub const MetadataDepositPerByte: Balance = 0; + pub const ExecutiveBody: BodyId = BodyId::Executive; + pub const AssetAccountDeposit: Balance = 0; +} + +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type Currency = Balances; + type ForceOrigin = EnsureRoot; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type AssetAccountDeposit = AssetAccountDeposit; + type WeightInfo = (); + type RemoveItemsLimit = ConstU32<656>; + type AssetIdParameter = AssetId; + type CreateOrigin = AsEnsureOriginWithArg>; + type CallbackHandle = (); +} + +parameter_types! { + pub const KsmLocation: MultiLocation = MultiLocation::parent(); + pub const RelayNetwork: NetworkId = NetworkId::Kusama; + pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); + pub UniversalLocation: InteriorMultiLocation = + X2(GlobalConsensus(RelayNetwork::get()), Parachain(MsgQueue::parachain_id().into())); + pub Local: MultiLocation = Here.into(); + pub CheckingAccount: AccountId = PolkadotXcm::check_account(); + pub KsmPerSecond: (xcm::latest::prelude::AssetId, u128, u128) = + (Concrete(KsmLocation::get()), 1, 1); +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the default `AccountId`. + ParentIsPreset, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // Straight up local `AccountId32` origins just alias directly to `AccountId`. + AccountId32Aliases, +); + +/// Means for transacting the native currency on this chain. +pub type CurrencyTransactor = CurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We don't track any teleports of `Balances`. + (), +>; + +/// Means for transacting assets besides the native currency on this chain. +pub type FungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + Assets, + // Use this currency when it is a fungible asset matching the given location or name: + ConvertedConcreteId< + AssetId, + Balance, + AsPrefixedGeneralIndex, + JustTry, + >, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We only want to allow teleports of known assets. We use non-zero issuance as an indication + // that this asset is known. + NoChecking, + // The account to use for tracking teleports. + CheckingAccount, +>; +/// Means for transacting assets on this chain. +pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor); + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can +/// biases the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain which they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when + // recognised. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognised. + SiblingParachainAsNative, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, + // Native signed account converter; this just converts an `AccountId32` origin into a normal + // `RuntimeOrigin::signed` origin of the same 32-byte value. + SignedAccountId32AsNative, + // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. + pallet_xcm::XcmPassthrough, +); + +parameter_types! { + // One XCM operation is 1_000_000_000 weight - almost certainly a conservative estimate. + pub UnitWeightCost: Weight = Weight::from_parts(100u64, 100u64); + pub const MaxInstructions: u32 = 100; +} + +match_types! { + pub type ParentOrParentsExecutivePlurality: impl Contains = { + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) } + }; +} +match_types! { + pub type ParentOrSiblings: impl Contains = { + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(_) } + }; +} + +pub type Barrier = ( + TakeWeightCredit, + AllowTopLevelPaidExecutionFrom, + // Parent and its exec plurality get free execution + AllowUnpaidExecutionFrom, + // Expected responses are OK. + AllowKnownQueryResponses, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, +); + +parameter_types! { + pub MatcherLocation: MultiLocation = MultiLocation::here(); + pub const MaxAssetsIntoHolding: u32 = 64; +} + +pub struct XcmConfig; +impl Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = AssetTransactors; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + type IsReserve = + orml_xcm_support::MultiNativeAsset; + type IsTeleporter = (); + type UniversalLocation = UniversalLocation; + type Barrier = Barrier; + type Weigher = FixedWeightBounds; + type Trader = FixedRateOfFungible; + type ResponseHandler = PolkadotXcm; + type AssetTrap = PolkadotXcm; + type AssetClaims = PolkadotXcm; + type SubscriptionService = PolkadotXcm; + type CallDispatcher = RuntimeCall; + type AssetLocker = (); + type AssetExchanger = (); + type PalletInstancesInfo = (); + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type FeeManager = (); + type MessageExporter = (); + type UniversalAliases = Nothing; + type SafeCallFilter = Everything; + type AssetIsBurnable = Everything; +} + +/// No local origins on this chain are allowed to dispatch XCM sends/executions. +pub type LocalOriginToLocation = SignedToAccountId32; + +pub type XcmRouter = super::ParachainXcmRouter; + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = Nothing; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Everything; + type XcmReserveTransferFilter = Everything; + type Weigher = FixedWeightBounds; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; + type Currency = Balances; + type CurrencyMatcher = IsConcrete; + type TrustedLockers = (); + type SovereignAccountOf = (); + type MaxLockers = ConstU32<8>; + type WeightInfo = pallet_xcm::TestWeightInfo; +} + +impl cumulus_pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +#[frame_support::pallet] +pub mod mock_msg_queue { + use super::*; + use frame_support::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + type XcmExecutor: ExecuteXcm; + } + + #[pallet::call] + impl Pallet {} + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::storage] + #[pallet::getter(fn parachain_id)] + pub(super) type ParachainId = StorageValue<_, ParaId, ValueQuery>; + + impl Get for Pallet { + fn get() -> ParaId { + Self::parachain_id() + } + } + + pub type MessageId = [u8; 32]; + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + // XCMP + /// Some XCM was executed OK. + Success(Option), + /// Some XCM failed. + Fail(Option, XcmError), + /// Bad XCM version used. + BadVersion(Option), + /// Bad XCM format used. + BadFormat(Option), + + // DMP + /// Downward message is invalid XCM. + InvalidFormat(MessageId), + /// Downward message is unsupported version of XCM. + UnsupportedVersion(MessageId), + /// Downward message executed with the given outcome. + ExecutedDownward(MessageId, Outcome), + } + + impl Pallet { + pub fn set_para_id(para_id: ParaId) { + ParachainId::::put(para_id); + } + + fn handle_xcmp_message( + sender: ParaId, + _sent_at: RelayBlockNumber, + xcm: VersionedXcm, + max_weight: Weight, + ) -> Result { + let hash = Encode::using_encoded(&xcm, T::Hashing::hash); + let (result, event) = match Xcm::::try_from(xcm) { + Ok(xcm) => { + let location = MultiLocation::new(1, Junctions::X1(Parachain(sender.into()))); + let mut id = [0u8; 32]; + id.copy_from_slice(hash.as_ref()); + match T::XcmExecutor::execute_xcm(location, xcm, id, max_weight) { + Outcome::Error(e) => (Err(e.clone()), Event::Fail(Some(hash), e)), + Outcome::Complete(w) => (Ok(w), Event::Success(Some(hash))), + // As far as the caller is concerned, this was dispatched without error, so + // we just report the weight used. + Outcome::Incomplete(w, e) => (Ok(w), Event::Fail(Some(hash), e)), + } + } + Err(()) => ( + Err(XcmError::UnhandledXcmVersion), + Event::BadVersion(Some(hash)), + ), + }; + Self::deposit_event(event); + result + } + } + + impl XcmpMessageHandler for Pallet { + fn handle_xcmp_messages<'a, I: Iterator>( + iter: I, + max_weight: Weight, + ) -> Weight { + for (sender, sent_at, data) in iter { + let mut data_ref = data; + let _ = XcmpMessageFormat::decode(&mut data_ref) + .expect("Simulator encodes with versioned xcm format; qed"); + + let mut remaining_fragments = &data_ref[..]; + while !remaining_fragments.is_empty() { + if let Ok(xcm) = + VersionedXcm::::decode(&mut remaining_fragments) + { + let _ = Self::handle_xcmp_message(sender, sent_at, xcm, max_weight); + } else { + debug_assert!(false, "Invalid incoming XCMP message data"); + } + } + } + max_weight + } + } + + impl DmpMessageHandler for Pallet { + fn handle_dmp_messages( + iter: impl Iterator)>, + limit: Weight, + ) -> Weight { + for (_i, (_sent_at, data)) in iter.enumerate() { + let id = sp_io::hashing::blake2_256(&data[..]); + let maybe_msg = VersionedXcm::::decode(&mut &data[..]) + .map(Xcm::::try_from); + match maybe_msg { + Err(_) => { + Self::deposit_event(Event::InvalidFormat(id)); + } + Ok(Err(())) => { + Self::deposit_event(Event::UnsupportedVersion(id)); + } + Ok(Ok(x)) => { + let outcome = T::XcmExecutor::execute_xcm(Parent, x, id, limit); + Self::deposit_event(Event::ExecutedDownward(id, outcome)); + } + } + } + limit + } + } +} +impl mock_msg_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +// Pallet to cover test cases for change https://github.com/paritytech/cumulus/pull/831 +#[frame_support::pallet] +pub mod mock_statemint_prefix { + use super::*; + use frame_support::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + } + + #[pallet::call] + impl Pallet {} + + #[pallet::pallet] + #[pallet::without_storage_info] + pub struct Pallet(_); + + #[pallet::storage] + #[pallet::getter(fn current_prefix)] + pub(super) type CurrentPrefix = StorageValue<_, MultiLocation, ValueQuery>; + + impl Get for Pallet { + fn get() -> MultiLocation { + Self::current_prefix() + } + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + // Changed Prefix + PrefixChanged(MultiLocation), + } + + impl Pallet { + pub fn set_prefix(prefix: MultiLocation) { + CurrentPrefix::::put(&prefix); + Self::deposit_event(Event::PrefixChanged(prefix)); + } + } +} + +impl mock_statemint_prefix::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} + +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; +construct_runtime!( + pub enum Runtime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Storage, Config, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + PolkadotXcm: pallet_xcm::{Pallet, Call, Storage, Event, Origin}, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin}, + MsgQueue: mock_msg_queue::{Pallet, Storage, Event}, + Assets: pallet_assets::{Pallet, Storage, Event}, + PrefixChanger: mock_statemint_prefix::{Pallet, Storage, Event}, + + } +); diff --git a/tracing/2402/runtime/moonbeam/tests/xcm_tests.rs b/tracing/2402/runtime/moonbeam/tests/xcm_tests.rs new file mode 100644 index 0000000..d944c14 --- /dev/null +++ b/tracing/2402/runtime/moonbeam/tests/xcm_tests.rs @@ -0,0 +1,3055 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Moonbeam Runtime Xcm Tests + +mod xcm_mock; + +use cumulus_primitives_core::relay_chain::HrmpChannelId; +use frame_support::{ + assert_ok, + traits::{PalletInfo, PalletInfoAccess}, + weights::{constants::WEIGHT_REF_TIME_PER_SECOND, Weight}, + BoundedVec, +}; +use pallet_asset_manager::LocalAssetIdCreator; +use pallet_xcm_transactor::{ + Currency, CurrencyPayment, HrmpInitParams, HrmpOperation, TransactWeights, +}; +use sp_core::ConstU32; +use xcm::latest::prelude::*; +use xcm::{VersionedMultiLocation, WrapVersion}; +use xcm_builder::HashedDescriptionDescribeFamilyAllTerminal; +use xcm_executor::traits::Convert; +use xcm_mock::parachain; +use xcm_mock::relay_chain; +use xcm_mock::*; +use xcm_primitives::{UtilityEncodeCall, DEFAULT_PROOF_SIZE}; +use xcm_simulator::TestExt; + +// Send a relay asset (like DOT) to a parachain A +#[test] +fn receive_relay_asset_from_relay() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + // Register relay asset in paraA + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + + // First send relay chain asset to Parachain + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + // Verify that parachain received the asset + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 123); + }); +} + +// Send relay asset (like DOT) back from Parachain A to relaychain +#[test] +fn send_relay_asset_to_relay() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + // Register relay asset in paraA + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + // Free execution + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + let dest: MultiLocation = Junction::AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + + // First send relay chain asset to Parachain like in previous test + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // Free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 123); + }); + + // Lets gather the balance before sending back money + let mut balance_before_sending = 0; + Relay::execute_with(|| { + balance_before_sending = RelayBalances::free_balance(&RELAYALICE); + }); + + // We now send back some money to the relay + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: RELAYALICE.into(), + }), + }; + + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 123, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // The balances in paraAlice should have been substracted + ParaA::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 0); + }); + + // Balances in the relay should have been received + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(&RELAYALICE) > balance_before_sending); + }); +} + +#[test] +fn send_relay_asset_to_para_b() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + // Register asset in paraA. Free execution + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata.clone(), + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location.clone(), + 0u128, + 0 + )); + }); + + // Register asset in paraB. Free execution + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + let dest: MultiLocation = Junction::AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 123); + }); + + // Now send relay asset from para A to para B + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // Para A balances should have been substracted + ParaA::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 23); + }); + + // Para B balances should have been credited + ParaB::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); +} + +#[test] +fn send_para_a_asset_to_para_b() { + MockNet::reset(); + + // This represents the asset in paraA + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + // Register asset in paraB. Free execution + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Send para A asset from para A to para B + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + // Native token is substracted in paraA + ParaA::execute_with(|| { + // Free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(800000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + // Asset is minted in paraB + ParaB::execute_with(|| { + // Free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); +} + +#[test] +fn send_para_a_asset_from_para_b_to_para_c() { + MockNet::reset(); + + // Represents para A asset + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + // Register para A asset in parachain B. Free execution + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata.clone(), + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location.clone(), + 0u128, + 0 + )); + }); + + // Register para A asset in parachain C. Free execution + ParaC::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // Para A balances have been substracted + ParaA::execute_with(|| { + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + // Para B balances have been credited + ParaB::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); + + // Send para A asset from para B to para C + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(3), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaB::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // The message passed through parachainA so we needed to pay since its the native token + ParaC::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 96); + }); +} + +#[test] +fn send_para_a_asset_to_para_b_and_back_to_para_a() { + MockNet::reset(); + + // para A asset + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + // Register para A asset in para B + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Send para A asset to para B + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // Balances have been substracted + ParaA::execute_with(|| { + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + // Para B balances have been credited + ParaB::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); + + // Send back para A asset to para A + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(1), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + ParaB::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + // Weight used is 4 + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 4 + ); + }); +} + +#[test] +fn receive_relay_asset_with_trader() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + // This time we are gonna put a rather high number of units per second + // we know later we will divide by 1e12 + // Lets put 1e6 as units per second + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 2500000000000u128, + 0 + )); + }); + + let dest: MultiLocation = Junction::AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + // We are sending 100 tokens from relay. + // Amount spent in fees is Units per second * weight / 1_000_000_000_000 (weight per second) + // weight is 4 since we are executing 4 instructions with a unitweightcost of 1. + // Units per second should be 2_500_000_000_000_000 + // Therefore with no refund, we should receive 10 tokens less + // Native trader fails for this, and we use the asset trader + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 100).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // non-free execution, not full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 90); + // Fee should have been received by treasury + assert_eq!(Assets::balance(source_id, &Treasury::account_id()), 10); + }); +} + +#[test] +fn send_para_a_asset_to_para_b_with_trader() { + MockNet::reset(); + + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 2500000000000u128, + 0 + )); + }); + + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + // In destination chain, we only need 4 weight + // We put 10 weight, 6 of which should be refunded and 4 of which should go to treasury + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(10u64, DEFAULT_PROOF_SIZE)) + )); + }); + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + // We are sending 100 tokens from para A. + // Amount spent in fees is Units per second * weight / 1_000_000_000_000 (weight per second) + // weight is 4 since we are executing 4 instructions with a unitweightcost of 1. + // Units per second should be 2_500_000_000_000_000 + // Since we set 10 weight in destination chain, 25 will be charged upfront + // 15 of those will be refunded, while 10 will go to treasury as the true weight used + // will be 4 + ParaB::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 90); + // Fee should have been received by treasury + assert_eq!(Assets::balance(source_id, &Treasury::account_id()), 10); + }); +} + +#[test] +fn send_para_a_asset_to_para_b_with_trader_and_fee() { + MockNet::reset(); + + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + // With these units per second, 80K weight convrets to 1 asset unit + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 12500000u128, + 0 + )); + }); + + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + // we use transfer_with_fee + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer_with_fee( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + 1, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(800000u64, DEFAULT_PROOF_SIZE)) + )); + }); + ParaA::execute_with(|| { + // 100 tokens transferred plus 1 taken from fees + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 - 1 + ); + }); + + ParaB::execute_with(|| { + // free execution, full amount received because trully the xcm instruction does not cost + // what it is specified + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 101); + }); +} + +#[test] +fn error_when_not_paying_enough() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + let dest: MultiLocation = Junction::AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + // This time we are gonna put a rather high number of units per second + // we know later we will divide by 1e12 + // Lets put 1e6 as units per second + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 2500000000000u128, + 0 + )); + }); + + // We are sending 100 tokens from relay. + // If we set the dest weight to be 1e7, we know the buy_execution will spend 1e7*1e6/1e12 = 10 + // Therefore with no refund, we should receive 10 tokens less + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 5).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // amount not received as it is not paying enough + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 0); + }); +} + +#[test] +fn transact_through_derivative_multilocation() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 1u128, + 0 + )); + + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + // Relay charges 1000 for every instruction, and we have 3, so 3000 + 3000.into(), + 20000000000.into(), + None + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + WEIGHT_REF_TIME_PER_SECOND as u128, + )); + }); + + // Let's construct the call to know how much weight it is going to require + + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + // 4000000000 transact + 3000 correspond to 4000003000 tokens. 100 more for the transfer call + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 4000003100u128).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003100); + }); + + // Register address + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::register( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + 0, + )); + }); + + // Send to registered address + + let registered_address = derivative_account_id(para_a_account(), 0); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: registered_address.clone().into(), + }), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003000); + }); + + // What we will do now is transfer this relay tokens from the derived account to the sovereign + // again + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 4000003000); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_derivative( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::MockTransactors::Relay, + 0, + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: None + }, + encoded, + // 400000000 + 3000 we should have taken out 4000003000 tokens from the caller + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(®istered_address) == 0); + }); +} + +#[test] +fn transact_through_derivative_with_custom_fee_weight() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 1u128, + 0 + )); + }); + + // Let's construct the call to know how much weight it is going to require + + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + // 4000000000 transact + 3000 correspond to 4000003000 tokens. 100 more for the transfer call + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 4000003100u128).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003100); + }); + + // Register address + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::register( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + 0, + )); + }); + + // Send to registered address + + let registered_address = derivative_account_id(para_a_account(), 0); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: registered_address.clone().into(), + }), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003000); + }); + + // What we will do now is transfer this relay tokens from the derived account to the sovereign + // again + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 4000003000); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + let overall_weight = 4000003000u64; + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_derivative( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::MockTransactors::Relay, + 0, + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + // 1-1 fee weight mapping + fee_amount: Some(overall_weight as u128) + }, + // 4000000000 + 3000 we should have taken out 4000003000 tokens from the caller + encoded, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: Some(overall_weight.into()) + } + )); + let event_found: Option = parachain::para_events() + .iter() + .find_map(|event| match event.clone() { + parachain::RuntimeEvent::PolkadotXcm(pallet_xcm::Event::AssetsTrapped(_, _, _)) => { + Some(event.clone()) + } + _ => None, + }); + // Assert that the events do not contain the assets being trapped + assert!(event_found.is_none()); + }); + + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(®istered_address) == 0); + }); +} + +#[test] +fn transact_through_sovereign() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 1u128, + 0 + )); + + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + // Relay charges 1000 for every instruction, and we have 3, so 3000 + 3000.into(), + 20000000000.into(), + None + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + WEIGHT_REF_TIME_PER_SECOND as u128, + )); + }); + + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 4000003100u128).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003100); + }); + + // Register address + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::register( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + 0, + )); + }); + + // Send to registered address + let registered_address = derivative_account_id(para_a_account(), 0); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: registered_address.clone().into(), + }), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003000); + }); + + // What we will do now is transfer this relay tokens from the derived account to the sovereign + // again + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 4000003000); + 0 + }); + + // We send the xcm transact operation to parent + let dest = MultiLocation { + parents: 1, + interior: Here, + }; + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + let utility_bytes = parachain::MockTransactors::Relay.encode_call( + xcm_primitives::UtilityAvailableCalls::AsDerivative(0, encoded), + ); + + // Root can directly pass the execution byes to the sovereign + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_sovereign( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(dest)), + PARAALICE.into(), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: None + }, + utility_bytes, + OriginKind::SovereignAccount, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(®istered_address) == 0); + }); +} + +#[test] +fn transact_through_sovereign_with_custom_fee_weight() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 1u128, + 0 + )); + }); + + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 4000003100u128).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003100); + }); + + // Register address + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::register( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + 0, + )); + }); + + // Send to registered address + let registered_address = derivative_account_id(para_a_account(), 0); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: registered_address.clone().into(), + }), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003000); + }); + + // What we will do now is transfer this relay tokens from the derived account to the sovereign + // again + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 4000003000); + 0 + }); + + // We send the xcm transact operation to parent + let dest = MultiLocation { + parents: 1, + interior: Here, + }; + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + let utility_bytes = parachain::MockTransactors::Relay.encode_call( + xcm_primitives::UtilityAvailableCalls::AsDerivative(0, encoded), + ); + + let total_weight = 4000003000u64; + // Root can directly pass the execution byes to the sovereign + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_sovereign( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(dest)), + PARAALICE.into(), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + // 1-1 fee-weight mapping + fee_amount: Some(total_weight as u128) + }, + utility_bytes, + OriginKind::SovereignAccount, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: Some(total_weight.into()) + } + )); + }); + + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(®istered_address) == 0); + }); +} + +#[test] +fn test_automatic_versioning_on_runtime_upgrade_with_relay() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A and set XCM version to 1 + ParaA::execute_with(|| { + parachain::XcmVersioner::set_version(1); + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + let response = Response::Version(2); + let querier: MultiLocation = Here.into(); + + // This is irrelevant, nothing will be done with this message, + // but we need to pass a message as an argument to trigger the storage change + let mock_message: Xcm<()> = Xcm(vec![QueryResponse { + query_id: 0, + response, + max_weight: Weight::zero(), + querier: Some(querier), + }]); + // The router is mocked, and we cannot use WrapVersion in ChildParachainRouter. So we will force + // it directly here + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + + Relay::execute_with(|| { + // This sets the default version, for not known destinations + assert_ok!(RelayChainPalletXcm::force_default_xcm_version( + relay_chain::RuntimeOrigin::root(), + Some(2) + )); + + // Wrap version, which sets VersionedStorage + // This is necessary because the mock router does not use wrap_version, but + // this is not necessary in prod + assert_ok!(::wrap_version( + &Parachain(1).into(), + mock_message + )); + + // Transfer assets. Since it is an unknown destination, it will query for version + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + + // Let's advance the relay. This should trigger the subscription message + relay_chain::relay_roll_to(2); + + // queries should have been updated + assert!(RelayChainPalletXcm::query(0).is_some()); + }); + + let expected_supported_version: relay_chain::RuntimeEvent = + pallet_xcm::Event::SupportedVersionChanged( + MultiLocation { + parents: 0, + interior: X1(Parachain(1)), + }, + 1, + ) + .into(); + + Relay::execute_with(|| { + // Assert that the events vector contains the version change + assert!(relay_chain::relay_events().contains(&expected_supported_version)); + }); + + let expected_version_notified: parachain::RuntimeEvent = + pallet_xcm::Event::VersionChangeNotified( + MultiLocation { + parents: 1, + interior: Here, + }, + 2, + vec![].into(), + ) + .into(); + + // ParaA changes version to 2, and calls on_runtime_upgrade. This should notify the targets + // of the new version change + ParaA::execute_with(|| { + // Set version + parachain::XcmVersioner::set_version(2); + // Do runtime upgrade + parachain::on_runtime_upgrade(); + // Initialize block, to call on_initialize and notify targets + parachain::para_roll_to(2); + // Expect the event in the parachain + assert!(parachain::para_events().contains(&expected_version_notified)); + }); + + // This event should have been seen in the relay + let expected_supported_version_2: relay_chain::RuntimeEvent = + pallet_xcm::Event::SupportedVersionChanged( + MultiLocation { + parents: 0, + interior: X1(Parachain(1)), + }, + 2, + ) + .into(); + + Relay::execute_with(|| { + // Assert that the events vector contains the new version change + assert!(relay_chain::relay_events().contains(&expected_supported_version_2)); + }); +} + +#[test] +fn receive_asset_with_no_sufficients_not_possible_if_non_existent_account() { + MockNet::reset(); + + let fresh_account = [2u8; 20]; + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + false + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: fresh_account, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest.clone()).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + // parachain should not have received assets + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &fresh_account.into()), 0); + }); + + // Send native token to fresh_account + ParaA::execute_with(|| { + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + fresh_account.into(), + 100 + )); + }); + + // Re-send tokens + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + // parachain should have received assets + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &fresh_account.into()), 123); + }); +} + +#[test] +fn receive_assets_with_sufficients_true_allows_non_funded_account_to_receive_assets() { + MockNet::reset(); + + let fresh_account = [2u8; 20]; + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: fresh_account, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest.clone()).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + // parachain should have received assets + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &fresh_account.into()), 123); + }); +} + +#[test] +fn evm_account_receiving_assets_should_handle_sufficients_ref_count() { + MockNet::reset(); + + let mut sufficient_account = [0u8; 20]; + sufficient_account[0..20].copy_from_slice(&evm_account()[..]); + + let evm_account_id = parachain::AccountId::from(sufficient_account); + + // Evm account is self sufficient + ParaA::execute_with(|| { + assert_eq!(parachain::System::account(evm_account_id).sufficients, 1); + }); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: sufficient_account, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest.clone()).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + // Evm account sufficient ref count increased by 1. + ParaA::execute_with(|| { + assert_eq!(parachain::System::account(evm_account_id).sufficients, 2); + }); + + ParaA::execute_with(|| { + // Remove the account from the evm context. + parachain::EVM::remove_account(&evm_account()); + // Evm account sufficient ref count decreased by 1. + assert_eq!(parachain::System::account(evm_account_id).sufficients, 1); + }); +} + +#[test] +fn empty_account_should_not_be_reset() { + MockNet::reset(); + + // Test account has nonce 1 on genesis. + let mut sufficient_account = [0u8; 20]; + sufficient_account[0..20].copy_from_slice(&evm_account()[..]); + + let evm_account_id = parachain::AccountId::from(sufficient_account); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + false + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Send native token to evm_account + ParaA::execute_with(|| { + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + evm_account_id, + 100 + )); + }); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: sufficient_account, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest.clone()).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // Empty the assets from the account. + // As this makes the account go below the `min_balance`, the account is considered dead + // at eyes of pallet-assets, and the consumer reference is decreased by 1 and is now Zero. + assert_ok!(parachain::Assets::transfer( + parachain::RuntimeOrigin::signed(evm_account_id), + source_id, + PARAALICE.into(), + 123 + )); + // Verify account asset balance is Zero. + assert_eq!( + parachain::Assets::balance(source_id, &evm_account_id.into()), + 0 + ); + // Because we no longer have consumer references, we can set the balance to Zero. + // This would reset the account if our ED were to be > than Zero. + assert_ok!(ParaBalances::set_balance( + parachain::RuntimeOrigin::root(), + evm_account_id, + 0, + 0, + )); + // Verify account native balance is Zero. + assert_eq!(ParaBalances::free_balance(&evm_account_id), 0); + // Remove the account from the evm context. + // This decreases the sufficients reference by 1 and now is Zero. + parachain::EVM::remove_account(&evm_account()); + // Verify reference count. + let account = parachain::System::account(evm_account_id); + assert_eq!(account.sufficients, 0); + assert_eq!(account.consumers, 0); + assert_eq!(account.providers, 1); + // We expect the account to be alive in a Zero ED context. + assert_eq!(parachain::System::account_nonce(evm_account_id), 1); + }); +} + +#[test] +fn test_statemint_like() { + MockNet::reset(); + + let dest_para = MultiLocation::new(1, X1(Parachain(1))); + + let sov = xcm_builder::SiblingParachainConvertsVia::< + polkadot_parachain::primitives::Sibling, + statemint_like::AccountId, + >::convert_ref(dest_para) + .unwrap(); + + let statemint_asset_a_balances = MultiLocation::new( + 1, + X3( + Parachain(4), + PalletInstance(5), + xcm::latest::prelude::GeneralIndex(0u128), + ), + ); + let source_location = parachain::AssetType::Xcm(statemint_asset_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"StatemintToken".to_vec(), + symbol: b"StatemintToken".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata.clone(), + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + Statemint::execute_with(|| { + // Set new prefix + statemint_like::PrefixChanger::set_prefix( + PalletInstance(::index() as u8).into(), + ); + + assert_ok!(StatemintAssets::create( + statemint_like::RuntimeOrigin::signed(RELAYALICE), + 0, + RELAYALICE, + 1 + )); + + assert_ok!(StatemintAssets::mint( + statemint_like::RuntimeOrigin::signed(RELAYALICE), + 0, + RELAYALICE, + 300000000000000 + )); + + // This is needed, since the asset is created as non-sufficient + assert_ok!(StatemintBalances::transfer( + statemint_like::RuntimeOrigin::signed(RELAYALICE), + sov, + 100000000000000 + )); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + + // Send with new prefix + assert_ok!(StatemintChainPalletXcm::reserve_transfer_assets( + statemint_like::RuntimeOrigin::signed(RELAYALICE), + Box::new(MultiLocation::new(1, X1(Parachain(1))).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new( + ( + X2( + xcm::latest::prelude::PalletInstance( + ::index() as u8 + ), + xcm::latest::prelude::GeneralIndex(0), + ), + 123 + ) + .into() + ), + 0, + )); + }); + + ParaA::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 123); + }); +} + +#[test] +fn send_para_a_local_asset_to_para_b() { + MockNet::reset(); + + let asset_id = parachain::LocalAssetIdCreator::create_asset_id_from_metadata(0); + let para_a_local_asset = MultiLocation::new( + 1, + X3(Parachain(1), PalletInstance(11u8), GeneralIndex(asset_id)), + ); + let source_location = parachain::AssetType::Xcm(para_a_local_asset); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaALocalAsset".to_vec(), + symbol: b"ParaALocalAsset".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_local_asset( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + PARAALICE.into(), + true, + 1 + )); + + assert_ok!(LocalAssets::mint( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + asset_id, + PARAALICE.into(), + 300000000000000 + )); + }); + + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::LocalAssetReserve(asset_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(800000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaB::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); +} + +#[test] +fn send_para_a_local_asset_to_para_b_and_send_it_back_together_with_some_glmr() { + MockNet::reset(); + + let asset_id = parachain::LocalAssetIdCreator::create_asset_id_from_metadata(0); + let para_a_local_asset = MultiLocation::new( + 1, + X3(Parachain(1), PalletInstance(11u8), GeneralIndex(asset_id)), + ); + let source_location_local_asset = parachain::AssetType::Xcm(para_a_local_asset); + let source_id_local_asset: parachain::AssetId = source_location_local_asset.clone().into(); + + let asset_metadata_local_asset = parachain::AssetMetadata { + name: b"ParaALocalAsset".to_vec(), + symbol: b"ParaALocalAsset".to_vec(), + decimals: 12, + }; + + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location_balances = parachain::AssetType::Xcm(para_a_balances); + let source_id_balances: parachain::AssetId = source_location_balances.clone().into(); + + let asset_metadata_balances = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location_local_asset.clone(), + asset_metadata_local_asset, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location_local_asset, + 0u128, + 0 + )); + + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location_balances.clone(), + asset_metadata_balances, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location_balances, + 0u128, + 1 + )); + }); + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_local_asset( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + PARAALICE.into(), + true, + 1 + )); + + assert_ok!(LocalAssets::mint( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + asset_id, + PARAALICE.into(), + 300000000000000 + )); + }); + + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer_multicurrencies( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + vec![ + (parachain::CurrencyId::LocalAssetReserve(asset_id), 100), + (parachain::CurrencyId::SelfReserve, 1000000) + ], + 0, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(800000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + let mut alith_balance_asset_before = 0; + let mut alith_balance_native_token_before = 0; + + ParaA::execute_with(|| { + alith_balance_asset_before = LocalAssets::balance(asset_id, &PARAALICE.into()); + alith_balance_native_token_before = ParaBalances::free_balance(&PARAALICE.into()); + }); + + let new_dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(1), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaB::execute_with(|| { + // free execution, full amount received + assert_eq!( + Assets::balance(source_id_local_asset, &PARAALICE.into()), + 100 + ); + assert_eq!( + Assets::balance(source_id_balances, &PARAALICE.into()), + 1000000 + ); + + // free execution, full amount received + assert_ok!(XTokens::transfer_multicurrencies( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + vec![ + (parachain::CurrencyId::ForeignAsset(source_id_balances), 4), + ( + parachain::CurrencyId::ForeignAsset(source_id_local_asset), + 50 + ) + ], + 0, + Box::new(VersionedMultiLocation::V3(new_dest)), + WeightLimit::Limited(4.into()) + )); + }); + + ParaA::execute_with(|| { + let alith_balance_asset_after = LocalAssets::balance(asset_id, &PARAALICE.into()); + let alith_balance_native_token_after = ParaBalances::free_balance(&PARAALICE.into()); + assert_eq!(alith_balance_asset_after, alith_balance_asset_before + 50); + assert_eq!( + alith_balance_native_token_before, + alith_balance_native_token_after + ); + }); +} + +#[test] +fn transact_through_signed_multilocation() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + ParaA::execute_with(|| { + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + // Relay charges 1000 for every instruction, and we have 3, so 3000 + 3000.into(), + 20000000000.into(), + // 4 instructions in transact through signed + Some(4000.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + WEIGHT_REF_TIME_PER_SECOND as u128, + )); + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the relay will see instead of us + descend_origin_multilocation + .reanchor(&MultiLocation::parent(), ancestry.interior) + .unwrap(); + + let derived = xcm_builder::Account32Hash::< + relay_chain::KusamaNetwork, + relay_chain::AccountId, + >::convert_ref(descend_origin_multilocation) + .unwrap(); + + Relay::execute_with(|| { + // free execution, full amount received + assert_ok!(RelayBalances::transfer( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + derived.clone(), + 4000004100u128, + )); + // derived account has all funds + assert!(RelayBalances::free_balance(&derived) == 4000004100); + // sovereign account has 0 funds + assert!(RelayBalances::free_balance(¶_a_account()) == 0); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + // 100 to sovereign + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: None + }, + encoded, + // 4000000000 for transfer + 4000 for XCM + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + Relay::execute_with(|| { + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(&derived) == 0); + }); +} + +#[test] +fn transact_through_signed_multilocation_custom_fee_and_weight() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + ParaA::execute_with(|| { + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the relay will see instead of us + descend_origin_multilocation + .reanchor(&MultiLocation::parent(), ancestry.interior) + .unwrap(); + + let derived = xcm_builder::Account32Hash::< + relay_chain::KusamaNetwork, + relay_chain::AccountId, + >::convert_ref(descend_origin_multilocation) + .unwrap(); + + Relay::execute_with(|| { + // free execution, full amount received + assert_ok!(RelayBalances::transfer( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + derived.clone(), + 4000004100u128, + )); + // derived account has all funds + assert!(RelayBalances::free_balance(&derived) == 4000004100); + // sovereign account has 0 funds + assert!(RelayBalances::free_balance(¶_a_account()) == 0); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + // 100 to sovereign + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + let total_weight = 4000004000u64; + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: Some(total_weight as u128) + }, + encoded, + // 4000000000 for transfer + 4000 for XCM + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: Some(total_weight.into()) + } + )); + }); + + Relay::execute_with(|| { + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(&derived) == 0); + }); +} + +#[test] +fn transact_through_signed_multilocation_para_to_para() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + let para_b_location = MultiLocation::new(1, X1(Parachain(2))); + + let para_b_balances = MultiLocation::new(1, X2(Parachain(2), PalletInstance(1u8))); + + ParaA::execute_with(|| { + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + // ParaB + Box::new(xcm::VersionedMultiLocation::V3(para_b_location.clone())), + // Para charges 1000 for every instruction, and we have 3, so 3 + 3.into(), + 20000000000.into(), + // 4 instructions in transact through signed + Some(4.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(para_b_balances.clone())), + parachain::ParaTokensPerSecond::get().1 as u128, + )); + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the paraB will see instead of us + descend_origin_multilocation + .reanchor(¶_b_location, ancestry.interior) + .unwrap(); + + let derived = HashedDescriptionDescribeFamilyAllTerminal::::convert_ref( + descend_origin_multilocation, + ) + .unwrap(); + + ParaB::execute_with(|| { + // free execution, full amount received + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + derived.clone(), + 4000000104u128, + )); + // derived account has all funds + assert!(ParaBalances::free_balance(&derived) == 4000000104); + // sovereign account has 0 funds + assert!(ParaBalances::free_balance(¶_a_account_20()) == 0); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = + ::PalletInfo::index::() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + // 100 to sovereign + dest: para_a_account_20(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(para_b_location)), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + para_b_balances + ))), + fee_amount: None + }, + encoded, + // 4000000000 for transfer + 4000 for XCM + // 1-1 to fee + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + ParaB::execute_with(|| { + assert!(ParaBalances::free_balance(&derived) == 0); + + assert!(ParaBalances::free_balance(¶_a_account_20()) == 100); + }); +} + +#[test] +fn transact_through_signed_multilocation_para_to_para_ethereum() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + let para_b_location = MultiLocation::new(1, X1(Parachain(2))); + + let para_b_balances = MultiLocation::new(1, X2(Parachain(2), PalletInstance(1u8))); + + ParaA::execute_with(|| { + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + // ParaB + Box::new(xcm::VersionedMultiLocation::V3(para_b_location.clone())), + // Para charges 1000 for every instruction, and we have 3, so 3 + 3.into(), + 20000000000.into(), + // 4 instructions in transact through signed + Some(4.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(para_b_balances.clone())), + parachain::ParaTokensPerSecond::get().1 as u128, + )); + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the paraB will see instead of us + descend_origin_multilocation + .reanchor(¶_b_location, ancestry.interior) + .unwrap(); + + let derived = HashedDescriptionDescribeFamilyAllTerminal::::convert_ref( + descend_origin_multilocation, + ) + .unwrap(); + + let mut parachain_b_alice_balances_before = 0; + ParaB::execute_with(|| { + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + derived.clone(), + 4000000104u128, + )); + // derived account has all funds + assert!(ParaBalances::free_balance(&derived) == 4000000104); + // sovereign account has 0 funds + assert!(ParaBalances::free_balance(¶_a_account_20()) == 0); + + parachain_b_alice_balances_before = ParaBalances::free_balance(&PARAALICE.into()) + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = + ::PalletInfo::index::() + .unwrap() as u8; + + encoded.push(index); + + use sp_core::U256; + // Let's do a EVM transfer + let eth_tx = + xcm_primitives::EthereumXcmTransaction::V1(xcm_primitives::EthereumXcmTransactionV1 { + gas_limit: U256::from(21000), + fee_payment: xcm_primitives::EthereumXcmFee::Auto, + action: pallet_ethereum::TransactionAction::Call(PARAALICE.into()), + value: U256::from(100), + input: BoundedVec::< + u8, + ConstU32<{ xcm_primitives::MAX_ETHEREUM_XCM_INPUT_SIZE }> + >::try_from(vec![]).unwrap(), + access_list: None, + }); + + // Then call bytes + let mut call_bytes = pallet_ethereum_xcm::Call::::transact { + xcm_transaction: eth_tx, + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(para_b_location)), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + para_b_balances + ))), + fee_amount: None + }, + encoded, + // 4000000000 for transfer + 4000 for XCM + // 1-1 to fee + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + ParaB::execute_with(|| { + // Make sure the EVM transfer went through + assert!( + ParaBalances::free_balance(&PARAALICE.into()) + == parachain_b_alice_balances_before + 100 + ); + }); +} + +#[test] +fn transact_through_signed_multilocation_para_to_para_ethereum_no_proxy_fails() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + let para_b_location = MultiLocation::new(1, X1(Parachain(2))); + + let para_b_balances = MultiLocation::new(1, X2(Parachain(2), PalletInstance(1u8))); + + ParaA::execute_with(|| { + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + // ParaB + Box::new(xcm::VersionedMultiLocation::V3(para_b_location.clone())), + // Para charges 1000 for every instruction, and we have 3, so 3 + 3.into(), + 20000000000.into(), + // 4 instructions in transact through signed + Some(4.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(para_b_balances.clone())), + parachain::ParaTokensPerSecond::get().1 as u128, + )); + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the paraB will see instead of us + descend_origin_multilocation + .reanchor(¶_b_location, ancestry.interior) + .unwrap(); + + let derived = HashedDescriptionDescribeFamilyAllTerminal::::convert_ref( + descend_origin_multilocation, + ) + .unwrap(); + + let mut parachain_b_alice_balances_before = 0; + ParaB::execute_with(|| { + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + derived.clone(), + 4000000104u128, + )); + // derived account has all funds + assert!(ParaBalances::free_balance(&derived) == 4000000104); + // sovereign account has 0 funds + assert!(ParaBalances::free_balance(¶_a_account_20()) == 0); + + parachain_b_alice_balances_before = ParaBalances::free_balance(&PARAALICE.into()) + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = + ::PalletInfo::index::() + .unwrap() as u8; + + encoded.push(index); + + use sp_core::U256; + // Let's do a EVM transfer + let eth_tx = + xcm_primitives::EthereumXcmTransaction::V1(xcm_primitives::EthereumXcmTransactionV1 { + gas_limit: U256::from(21000), + fee_payment: xcm_primitives::EthereumXcmFee::Auto, + action: pallet_ethereum::TransactionAction::Call(PARAALICE.into()), + value: U256::from(100), + input: BoundedVec::< + u8, + ConstU32<{ xcm_primitives::MAX_ETHEREUM_XCM_INPUT_SIZE }> + >::try_from(vec![]).unwrap(), + access_list: None, + }); + + // Then call bytes + let mut call_bytes = pallet_ethereum_xcm::Call::::transact_through_proxy { + transact_as: PARAALICE.into(), + xcm_transaction: eth_tx, + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(para_b_location)), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + para_b_balances + ))), + fee_amount: None + }, + encoded, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + ParaB::execute_with(|| { + // Make sure the EVM transfer wasn't executed + assert!(ParaBalances::free_balance(&PARAALICE.into()) == parachain_b_alice_balances_before); + }); +} + +#[test] +fn transact_through_signed_multilocation_para_to_para_ethereum_proxy_succeeds() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + let para_b_location = MultiLocation::new(1, X1(Parachain(2))); + + let para_b_balances = MultiLocation::new(1, X2(Parachain(2), PalletInstance(1u8))); + + ParaA::execute_with(|| { + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + // ParaB + Box::new(xcm::VersionedMultiLocation::V3(para_b_location.clone())), + // Para charges 1000 for every instruction, and we have 3, so 3 + 3.into(), + 20000000000.into(), + // 4 instructions in transact through signed + Some(4.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(para_b_balances.clone())), + parachain::ParaTokensPerSecond::get().1 as u128, + )); + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the paraB will see instead of us + descend_origin_multilocation + .reanchor(¶_b_location, ancestry.interior) + .unwrap(); + + let derived = HashedDescriptionDescribeFamilyAllTerminal::::convert_ref( + descend_origin_multilocation, + ) + .unwrap(); + + let transfer_recipient = evm_account(); + let mut transfer_recipient_balance_before = 0; + ParaB::execute_with(|| { + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + derived.clone(), + 4000000104u128, + )); + // derived account has all funds + assert!(ParaBalances::free_balance(&derived) == 4000000104); + // sovereign account has 0 funds + assert!(ParaBalances::free_balance(¶_a_account_20()) == 0); + + transfer_recipient_balance_before = ParaBalances::free_balance(&transfer_recipient.into()); + + // Add proxy ALICE -> derived + let _ = parachain::Proxy::add_proxy_delegate( + &PARAALICE.into(), + derived, + parachain::ProxyType::Any, + 0, + ); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = + ::PalletInfo::index::() + .unwrap() as u8; + + encoded.push(index); + + use sp_core::U256; + // Let's do a EVM transfer + let eth_tx = + xcm_primitives::EthereumXcmTransaction::V2(xcm_primitives::EthereumXcmTransactionV2 { + gas_limit: U256::from(21000), + action: pallet_ethereum::TransactionAction::Call(transfer_recipient.into()), + value: U256::from(100), + input: BoundedVec::< + u8, + ConstU32<{ xcm_primitives::MAX_ETHEREUM_XCM_INPUT_SIZE }> + >::try_from(vec![]).unwrap(), + access_list: None, + }); + + // Then call bytes + let mut call_bytes = pallet_ethereum_xcm::Call::::transact_through_proxy { + transact_as: PARAALICE.into(), + xcm_transaction: eth_tx, + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(para_b_location)), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + para_b_balances + ))), + fee_amount: None + }, + encoded, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + ParaB::execute_with(|| { + // Make sure the EVM transfer was executed + assert!( + ParaBalances::free_balance(&transfer_recipient.into()) + == transfer_recipient_balance_before + 100 + ); + }); +} + +#[test] +fn hrmp_init_accept_through_root() { + MockNet::reset(); + + Relay::execute_with(|| { + assert_ok!(RelayBalances::transfer( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + para_a_account(), + 1000u128 + )); + assert_ok!(RelayBalances::transfer( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + para_b_account(), + 1000u128 + )); + }); + + ParaA::execute_with(|| { + let total_fee = 1_000u128; + let total_weight: u64 = 1_000_000_000; + let tx_weight: u64 = 500_000_000; + // Root can send hrmp init channel + assert_ok!(XcmTransactor::hrmp_manage( + parachain::RuntimeOrigin::root(), + HrmpOperation::InitOpen(HrmpInitParams { + para_id: 2u32.into(), + proposed_max_capacity: 1, + proposed_max_message_size: 1 + }), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: Some(total_fee) + }, + TransactWeights { + transact_required_weight_at_most: tx_weight.into(), + overall_weight: Some(total_weight.into()) + } + )); + }); + Relay::execute_with(|| { + let expected_event: relay_chain::RuntimeEvent = + polkadot_runtime_parachains::hrmp::Event::OpenChannelRequested( + 1u32.into(), + 2u32.into(), + 1u32, + 1u32, + ) + .into(); + assert!(relay_chain::relay_events().contains(&expected_event)); + }); + ParaB::execute_with(|| { + let total_fee = 1_000u128; + let total_weight: u64 = 1_000_000_000; + let tx_weight: u64 = 500_000_000; + // Root can send hrmp init channel + assert_ok!(XcmTransactor::hrmp_manage( + parachain::RuntimeOrigin::root(), + HrmpOperation::Accept { + para_id: 1u32.into() + }, + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: Some(total_fee) + }, + TransactWeights { + transact_required_weight_at_most: tx_weight.into(), + overall_weight: Some(total_weight.into()) + } + )); + }); + + Relay::execute_with(|| { + let expected_event: relay_chain::RuntimeEvent = + polkadot_runtime_parachains::hrmp::Event::OpenChannelAccepted(1u32.into(), 2u32.into()) + .into(); + assert!(relay_chain::relay_events().contains(&expected_event)); + }); +} + +#[test] +fn hrmp_close_works() { + MockNet::reset(); + + Relay::execute_with(|| { + assert_ok!(RelayBalances::transfer( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + para_a_account(), + 1000u128 + )); + assert_ok!(Hrmp::force_open_hrmp_channel( + relay_chain::RuntimeOrigin::root(), + 1u32.into(), + 2u32.into(), + 1u32, + 1u32 + )); + assert_ok!(Hrmp::force_process_hrmp_open( + relay_chain::RuntimeOrigin::root(), + 0u32 + )); + }); + + ParaA::execute_with(|| { + let total_fee = 1_000u128; + let total_weight: u64 = 1_000_000_000; + let tx_weight: u64 = 500_000_000; + // Root can send hrmp close + assert_ok!(XcmTransactor::hrmp_manage( + parachain::RuntimeOrigin::root(), + HrmpOperation::Close(HrmpChannelId { + sender: 1u32.into(), + recipient: 2u32.into() + }), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: Some(total_fee) + }, + TransactWeights { + transact_required_weight_at_most: tx_weight.into(), + overall_weight: Some(total_weight.into()) + } + )); + }); + Relay::execute_with(|| { + let expected_event: relay_chain::RuntimeEvent = + polkadot_runtime_parachains::hrmp::Event::ChannelClosed( + 1u32.into(), + HrmpChannelId { + sender: 1u32.into(), + recipient: 2u32.into(), + }, + ) + .into(); + assert!(relay_chain::relay_events().contains(&expected_event)); + }); +} + +use parity_scale_codec::{Decode, Encode}; +use sp_io::hashing::blake2_256; + +// Helper to derive accountIds +pub fn derivative_account_id(who: sp_runtime::AccountId32, index: u16) -> sp_runtime::AccountId32 { + let entropy = (b"modlpy/utilisuba", who, index).using_encoded(blake2_256); + sp_runtime::AccountId32::decode(&mut &entropy[..]).expect("valid account id") +} diff --git a/tracing/2402/runtime/moonriver/Cargo.toml b/tracing/2402/runtime/moonriver/Cargo.toml new file mode 100644 index 0000000..6040236 --- /dev/null +++ b/tracing/2402/runtime/moonriver/Cargo.toml @@ -0,0 +1,337 @@ +[package] +name = "moonriver-runtime" +authors = { workspace = true } +build = "build.rs" +description = "Moonriver Runtime" +edition = "2021" +homepage = "https://moonbeam.network" +license = "GPL-3.0-only" +version = "0.8.4" + +[dependencies] +hex-literal = { workspace = true, optional = true } +log = { workspace = true } +num_enum = { workspace = true } +rlp = { workspace = true, optional = true } +serde = { workspace = true, optional = true, features = [ "derive" ] } +sha3 = { workspace = true, optional = true } +smallvec = { workspace = true } +strum = { workspace = true } +strum_macros = { workspace = true } + +# Moonbeam +account = { workspace = true } +moonbeam-core-primitives = { workspace = true } +moonbeam-relay-encoder = { workspace = true } +moonbeam-runtime-common = { workspace = true } +precompile-utils = { workspace = true } +session-keys-primitives = { workspace = true } +xcm-primitives = { workspace = true } + +# Moonbeam pallets +moonbeam-xcm-benchmarks = { workspace = true } +pallet-asset-manager = { workspace = true } +pallet-author-mapping = { workspace = true } +pallet-crowdloan-rewards = { workspace = true } +pallet-erc20-xcm-bridge = { workspace = true } +pallet-ethereum-chain-id = { workspace = true } +pallet-ethereum-xcm = { workspace = true } +pallet-maintenance-mode = { workspace = true, features = [ "xcm-support" ] } +pallet-migrations = { workspace = true } +pallet-moonbeam-orbiters = { workspace = true } +pallet-parachain-staking = { workspace = true } +pallet-proxy-genesis-companion = { workspace = true } +pallet-randomness = { workspace = true } +pallet-xcm-transactor = { workspace = true } + +# Moonbeam precompiles +pallet-evm-precompile-author-mapping = { workspace = true } +pallet-evm-precompile-balances-erc20 = { workspace = true } +pallet-evm-precompile-batch = { workspace = true } +pallet-evm-precompile-call-permit = { workspace = true } +pallet-evm-precompile-collective = { workspace = true } +pallet-evm-precompile-conviction-voting = { workspace = true } +pallet-evm-precompile-crowdloan-rewards = { workspace = true } +pallet-evm-precompile-democracy = { workspace = true } +pallet-evm-precompile-gmp = { workspace = true } +pallet-evm-precompile-parachain-staking = { workspace = true } +pallet-evm-precompile-preimage = { workspace = true } +pallet-evm-precompile-proxy = { workspace = true } +pallet-evm-precompile-randomness = { workspace = true } +pallet-evm-precompile-referenda = { workspace = true } +pallet-evm-precompile-registry = { workspace = true } +pallet-evm-precompile-relay-encoder = { workspace = true } +pallet-evm-precompile-xcm-transactor = { workspace = true } +pallet-evm-precompile-xcm-utils = { workspace = true } +pallet-evm-precompile-xtokens = { workspace = true } +pallet-evm-precompileset-assets-erc20 = { workspace = true } + +# Moonbeam tracing +evm-tracing-events = { workspace = true, optional = true } +moonbeam-evm-tracer = { workspace = true, optional = true } +moonbeam-rpc-primitives-debug = { workspace = true } +moonbeam-rpc-primitives-txpool = { workspace = true } + +# Substrate +frame-executive = { workspace = true } +frame-support = { workspace = true } +frame-system = { workspace = true } +frame-system-rpc-runtime-api = { workspace = true } +pallet-assets = { workspace = true } +pallet-balances = { workspace = true } +pallet-collective = { workspace = true } +pallet-conviction-voting = { workspace = true } +pallet-democracy = { workspace = true } +pallet-identity = { workspace = true } +pallet-multisig = { workspace = true } +pallet-preimage = { workspace = true } +pallet-proxy = { workspace = true } +pallet-referenda = { workspace = true } +pallet-root-testing = { workspace = true } +pallet-scheduler = { workspace = true } +pallet-society = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-transaction-payment = { workspace = true } +pallet-transaction-payment-rpc-runtime-api = { workspace = true } +pallet-treasury = { workspace = true } +pallet-utility = { workspace = true } +pallet-whitelist = { workspace = true } +parity-scale-codec = { workspace = true, features = [ "derive", "max-encoded-len" ] } +scale-info = { workspace = true, features = [ "derive" ] } +sp-api = { workspace = true } +sp-block-builder = { workspace = true } +sp-core = { workspace = true } +sp-debug-derive = { workspace = true } +sp-inherents = { workspace = true } +sp-io = { workspace = true } +sp-offchain = { workspace = true } +sp-runtime = { workspace = true } +sp-session = { workspace = true } +sp-std = { workspace = true } +sp-transaction-pool = { workspace = true } +sp-version = { workspace = true } + +# Frontier +fp-evm = { workspace = true } +fp-rpc = { workspace = true } +fp-self-contained = { workspace = true } +pallet-base-fee = { workspace = true } +pallet-ethereum = { workspace = true, features = [ "forbid-evm-reentrancy" ] } +pallet-evm = { workspace = true, features = [ "forbid-evm-reentrancy" ] } +pallet-evm-precompile-blake2 = { workspace = true } +pallet-evm-precompile-bn128 = { workspace = true } +pallet-evm-precompile-dispatch = { workspace = true } +pallet-evm-precompile-modexp = { workspace = true } +pallet-evm-precompile-sha3fips = { workspace = true } +pallet-evm-precompile-simple = { workspace = true } + +# Cumulus / Nimbus +cumulus-pallet-dmp-queue = { workspace = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-xcm = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +cumulus-primitives-core = { workspace = true } +cumulus-primitives-timestamp = { workspace = true } +cumulus-primitives-utility = { workspace = true } +nimbus-primitives = { workspace = true } +pallet-author-inherent = { workspace = true } +pallet-author-slot-filter = { workspace = true } +parachain-info = { workspace = true } + +# Polkadot / XCM +orml-traits = { workspace = true } +orml-xcm-support = { workspace = true } +orml-xtokens = { workspace = true } +pallet-xcm = { workspace = true } +pallet-xcm-benchmarks = { workspace = true, optional = true } +polkadot-core-primitives = { workspace = true } +polkadot-parachain = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } + +# Benchmarking +frame-benchmarking = { workspace = true, optional = true } +frame-system-benchmarking = { workspace = true, optional = true } +frame-try-runtime = { workspace = true, optional = true } + +[build-dependencies] +substrate-wasm-builder = { workspace = true } + +[features] +default = [ "std" , "evm-tracing"] +std = [ + "account/std", + "cumulus-pallet-dmp-queue/std", + "cumulus-pallet-parachain-system/std", + "cumulus-pallet-xcm/std", + "cumulus-pallet-xcmp-queue/std", + "cumulus-primitives-core/std", + "cumulus-primitives-timestamp/std", + "evm-tracing-events/std", + "fp-evm/std", + "fp-rpc/std", + "fp-self-contained/std", + "frame-benchmarking/std", + "frame-executive/std", + "frame-support/std", + "frame-system-rpc-runtime-api/std", + "frame-system/std", + "moonbeam-core-primitives/std", + "moonbeam-evm-tracer/std", + "moonbeam-rpc-primitives-debug/std", + "moonbeam-rpc-primitives-txpool/std", + "moonbeam-runtime-common/std", + "moonbeam-xcm-benchmarks/std", + "nimbus-primitives/std", + "orml-xtokens/std", + "pallet-asset-manager/std", + "pallet-assets/std", + "pallet-author-inherent/std", + "pallet-author-mapping/std", + "pallet-author-slot-filter/std", + "pallet-balances/std", + "pallet-base-fee/std", + "pallet-collective/std", + "pallet-conviction-voting/std", + "pallet-crowdloan-rewards/std", + "pallet-democracy/std", + "pallet-erc20-xcm-bridge/std", + "pallet-ethereum-chain-id/std", + "pallet-ethereum-xcm/std", + "pallet-ethereum/std", + "pallet-evm-precompile-author-mapping/std", + "pallet-evm-precompile-balances-erc20/std", + "pallet-evm-precompile-batch/std", + "pallet-evm-precompile-call-permit/std", + "pallet-evm-precompile-collective/std", + "pallet-evm-precompile-conviction-voting/std", + "pallet-evm-precompile-democracy/std", + "pallet-evm-precompile-parachain-staking/std", + "pallet-evm-precompile-preimage/std", + "pallet-evm-precompile-randomness/std", + "pallet-evm-precompile-referenda/std", + "pallet-evm-precompile-xcm-transactor/std", + "pallet-evm-precompile-xcm-utils/std", + "pallet-evm-precompile-xtokens/std", + "pallet-evm/std", + "pallet-identity/std", + "pallet-maintenance-mode/std", + "pallet-migrations/std", + "pallet-moonbeam-orbiters/std", + "pallet-multisig/std", + "pallet-parachain-staking/std", + "pallet-preimage/std", + "pallet-proxy-genesis-companion/std", + "pallet-proxy/std", + "pallet-randomness/std", + "pallet-referenda/std", + "pallet-root-testing/std", + "pallet-scheduler/std", + "pallet-society/std", + "pallet-timestamp/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-transaction-payment/std", + "pallet-treasury/std", + "pallet-utility/std", + "pallet-whitelist/std", + "pallet-xcm-transactor/std", + "pallet-xcm/std", + "parachain-info/std", + "parity-scale-codec/std", + "precompile-utils/std", + "scale-info/std", + "serde", + "session-keys-primitives/std", + "sp-api/std", + "sp-block-builder/std", + "sp-core/std", + "sp-inherents/std", + "sp-io/std", + "sp-offchain/std", + "sp-runtime/std", + "sp-session/std", + "sp-std/std", + "sp-transaction-pool/std", + "sp-version/std", + "strum/std", + "xcm-builder/std", + "xcm-executor/std", + "xcm-primitives/std", + "xcm/std", +] + +# Must be enabled for tracing runtimes only +evm-tracing = [ "evm-tracing-events", "moonbeam-evm-tracer", "rlp", "sha3" ] + +# Allow to print logs details (no wasm:stripped) +force-debug = [ "sp-debug-derive/force-debug" ] + +# Will be enabled by the `wasm-builder` when building the runtime for WASM. +runtime-wasm = [] + +# A feature that should be enabled when the runtime should be build for on-chain +# deployment. This will disable stuff that shouldn't be part of the on-chain wasm +# to make it smaller like logging for example. +on-chain-release-build = [ "sp-api/disable-logging" ] + +runtime-benchmarks = [ + "cumulus-pallet-parachain-system/runtime-benchmarks", + "frame-benchmarking", + "frame-support/runtime-benchmarks", + "frame-system-benchmarking/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "hex-literal", + "moonbeam-runtime-common/runtime-benchmarks", + "moonbeam-xcm-benchmarks/runtime-benchmarks", + "pallet-asset-manager/runtime-benchmarks", + "pallet-author-inherent/runtime-benchmarks", + "pallet-author-mapping/runtime-benchmarks", + "pallet-author-slot-filter/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-collective/runtime-benchmarks", + "pallet-conviction-voting/runtime-benchmarks", + "pallet-crowdloan-rewards/runtime-benchmarks", + "pallet-ethereum/runtime-benchmarks", + "pallet-ethereum-xcm/runtime-benchmarks", + "pallet-migrations/runtime-benchmarks", + "pallet-moonbeam-orbiters/runtime-benchmarks", + "pallet-parachain-staking/runtime-benchmarks", + "pallet-preimage/runtime-benchmarks", + "pallet-randomness/runtime-benchmarks", + "pallet-referenda/runtime-benchmarks", + "pallet-society/runtime-benchmarks", + "pallet-timestamp/runtime-benchmarks", + "pallet-whitelist/runtime-benchmarks", + "pallet-xcm-benchmarks", + "pallet-xcm-transactor/runtime-benchmarks", + "pallet-xcm/runtime-benchmarks", + "session-keys-primitives/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", +] +try-runtime = [ + "fp-self-contained/try-runtime", + "frame-executive/try-runtime", + "frame-system/try-runtime", + "frame-try-runtime", + "moonbeam-runtime-common/try-runtime", + "pallet-asset-manager/try-runtime", + "pallet-author-mapping/try-runtime", + "pallet-author-slot-filter/try-runtime", + "pallet-balances/try-runtime", + "pallet-collective/try-runtime", + "pallet-conviction-voting/try-runtime", + "pallet-democracy/try-runtime", + "pallet-maintenance-mode/try-runtime", + #"pallet-crowdloan-rewards/try-runtime", + "pallet-migrations/try-runtime", + "pallet-parachain-staking/try-runtime", + "pallet-preimage/try-runtime", + "pallet-referenda/try-runtime", + "pallet-root-testing/try-runtime", + "pallet-scheduler/try-runtime", + "pallet-society/try-runtime", + "pallet-timestamp/try-runtime", + "pallet-whitelist/try-runtime", +] diff --git a/tracing/2402/runtime/moonriver/build.rs b/tracing/2402/runtime/moonriver/build.rs new file mode 100644 index 0000000..3934b9c --- /dev/null +++ b/tracing/2402/runtime/moonriver/build.rs @@ -0,0 +1,25 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +use substrate_wasm_builder::WasmBuilder; + +fn main() { + WasmBuilder::new() + .with_current_project() + .export_heap_base() + .import_memory() + .build() +} diff --git a/tracing/2402/runtime/moonriver/src/asset_config.rs b/tracing/2402/runtime/moonriver/src/asset_config.rs new file mode 100644 index 0000000..e95767b --- /dev/null +++ b/tracing/2402/runtime/moonriver/src/asset_config.rs @@ -0,0 +1,342 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Asset configuration for Moonbase. +//! + +use super::{ + currency, governance, xcm_config, AccountId, AssetId, AssetManager, Assets, Balance, Balances, + CouncilInstance, LocalAssets, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, +}; + +use pallet_evm_precompileset_assets_erc20::AccountIdAssetIdConversion; +use sp_runtime::traits::Hash as THash; + +use frame_support::{ + dispatch::GetDispatchInfo, + parameter_types, + traits::{AsEnsureOriginWithArg, ConstU128, ConstU32, EitherOfDiverse}, + weights::Weight, +}; +use frame_system::{EnsureNever, EnsureRoot}; +use sp_core::{H160, H256}; + +use parity_scale_codec::{Compact, Decode, Encode}; +use scale_info::TypeInfo; + +use sp_std::{ + convert::{From, Into}, + prelude::*, +}; + +// Number of items that can be destroyed with our configured max extrinsic proof size. +// x = (a - b) / c where: +// a: maxExtrinsic proof size +// b: base proof size for destroy_accounts in pallet_assets weights +// c: proof size for each item +// 656.87 = (3_407_872 - 8232) / 5180 +const REMOVE_ITEMS_LIMIT: u32 = 656; + +// Not to disrupt the previous asset instance, we assign () to Foreign +pub type ForeignAssetInstance = (); +pub type LocalAssetInstance = pallet_assets::Instance1; + +// For foreign assets, these parameters dont matter much +// as this will only be called by root with the forced arguments +// No deposit is substracted with those methods +// For local assets, they do matter. We use similar parameters +// to those in statemine (except for approval) +parameter_types! { + pub const AssetDeposit: Balance = 100 * currency::MOVR * currency::SUPPLY_FACTOR; + pub const ApprovalDeposit: Balance = 0; + pub const AssetsStringLimit: u32 = 50; + pub const MetadataDepositBase: Balance = currency::deposit(1,68); + pub const MetadataDepositPerByte: Balance = currency::deposit(0, 1); +} + +/// We allow root and Chain council to execute privileged asset operations. +pub type AssetsForceOrigin = EitherOfDiverse< + EnsureRoot, + EitherOfDiverse< + pallet_collective::EnsureProportionMoreThan, + governance::custom_origins::GeneralAdmin, + >, +>; + +// Required for runtime benchmarks +pallet_assets::runtime_benchmarks_enabled! { + pub struct BenchmarkHelper; + impl pallet_assets::BenchmarkHelper for BenchmarkHelper + where + AssetIdParameter: From, + { + fn create_asset_id_parameter(id: u32) -> AssetIdParameter { + (id as u128).into() + } + } +} + +// Foreign assets +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type Currency = Balances; + type ForceOrigin = AssetsForceOrigin; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type AssetAccountDeposit = ConstU128<{ currency::deposit(1, 18) }>; + type WeightInfo = pallet_assets::weights::SubstrateWeight; + type RemoveItemsLimit = ConstU32<{ REMOVE_ITEMS_LIMIT }>; + type AssetIdParameter = Compact; + type CreateOrigin = AsEnsureOriginWithArg>; + type CallbackHandle = (); + pallet_assets::runtime_benchmarks_enabled! { + type BenchmarkHelper = BenchmarkHelper; + } +} + +// Local assets +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type Currency = Balances; + type ForceOrigin = AssetsForceOrigin; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type AssetAccountDeposit = ConstU128<{ currency::deposit(1, 18) }>; + type WeightInfo = pallet_assets::weights::SubstrateWeight; + type RemoveItemsLimit = ConstU32<{ REMOVE_ITEMS_LIMIT }>; + type AssetIdParameter = Compact; + type CreateOrigin = AsEnsureOriginWithArg>; + type CallbackHandle = (); + pallet_assets::runtime_benchmarks_enabled! { + type BenchmarkHelper = BenchmarkHelper; + } +} + +// We instruct how to register the Assets +// In this case, we tell it to Create an Asset in pallet-assets +pub struct AssetRegistrar; +use frame_support::{pallet_prelude::DispatchResult, transactional}; + +impl pallet_asset_manager::AssetRegistrar for AssetRegistrar { + #[transactional] + fn create_foreign_asset( + asset: AssetId, + min_balance: Balance, + metadata: AssetRegistrarMetadata, + is_sufficient: bool, + ) -> DispatchResult { + Assets::force_create( + RuntimeOrigin::root(), + asset.into(), + AssetManager::account_id(), + is_sufficient, + min_balance, + )?; + + // TODO uncomment when we feel comfortable + /* + // The asset has been created. Let's put the revert code in the precompile address + let precompile_address = Runtime::asset_id_to_account(asset); + pallet_evm::AccountCodes::::insert( + precompile_address, + vec![0x60, 0x00, 0x60, 0x00, 0xfd], + );*/ + + // Lastly, the metadata + Assets::force_set_metadata( + RuntimeOrigin::root(), + asset.into(), + metadata.name, + metadata.symbol, + metadata.decimals, + metadata.is_frozen, + ) + } + + #[transactional] + fn create_local_asset( + asset: AssetId, + _creator: AccountId, + min_balance: Balance, + is_sufficient: bool, + owner: AccountId, + ) -> DispatchResult { + // We create with root, because we need to decide whether we want to create the asset + // as sufficient. Take into account this does not hold any reserved amount + // in pallet-assets + LocalAssets::force_create( + RuntimeOrigin::root(), + asset.into(), + owner, + is_sufficient, + min_balance, + )?; + + // No metadata needs to be set, as this can be set through regular calls + + // TODO: should we put the revert code? + // The asset has been created. Let's put the revert code in the precompile address + let precompile_address: H160 = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, asset).into(); + pallet_evm::AccountCodes::::insert( + precompile_address, + vec![0x60, 0x00, 0x60, 0x00, 0xfd], + ); + Ok(()) + } + + #[transactional] + fn destroy_foreign_asset(asset: AssetId) -> DispatchResult { + // Mark the asset as destroying + Assets::start_destroy(RuntimeOrigin::root(), asset.into())?; + + // We remove the EVM revert code + // This does not panick even if there is no code in the address + let precompile_address: H160 = + Runtime::asset_id_to_account(FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, asset).into(); + pallet_evm::AccountCodes::::remove(precompile_address); + Ok(()) + } + + #[transactional] + fn destroy_local_asset(asset: AssetId) -> DispatchResult { + // Mark the asset as destroying + LocalAssets::start_destroy(RuntimeOrigin::root(), asset.into())?; + + // We remove the EVM revert code + // This does not panick even if there is no code in the address + let precompile_address: H160 = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, asset).into(); + pallet_evm::AccountCodes::::remove(precompile_address); + Ok(()) + } + + fn destroy_asset_dispatch_info_weight(asset: AssetId) -> Weight { + // For us both of them (Foreign and Local) have the same annotated weight for a given + // witness + // We need to take the dispatch info from the destroy call, which is already annotated in + // the assets pallet + // Additionally, we need to add a DB write for removing the precompile revert code in the + // EVM + + // This is the dispatch info of destroy + let call_weight = RuntimeCall::Assets( + pallet_assets::Call::::start_destroy { + id: asset.into(), + }, + ) + .get_dispatch_info() + .weight; + + // This is the db write + call_weight.saturating_add(::DbWeight::get().writes(1)) + } +} + +pub struct LocalAssetIdCreator; +impl pallet_asset_manager::LocalAssetIdCreator for LocalAssetIdCreator { + fn create_asset_id_from_metadata(local_asset_counter: u128) -> AssetId { + // Our means of converting a local asset counter to an assetId + // We basically hash (local asset counter) + let mut result: [u8; 16] = [0u8; 16]; + let hash: H256 = + local_asset_counter.using_encoded(::Hashing::hash); + result.copy_from_slice(&hash.as_fixed_bytes()[0..16]); + u128::from_le_bytes(result) + } +} + +#[derive(Clone, Default, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub struct AssetRegistrarMetadata { + pub name: Vec, + pub symbol: Vec, + pub decimals: u8, + pub is_frozen: bool, +} + +pub type ForeignAssetModifierOrigin = EitherOfDiverse< + EnsureRoot, + EitherOfDiverse< + pallet_collective::EnsureProportionMoreThan, + governance::custom_origins::GeneralAdmin, + >, +>; +pub type LocalAssetModifierOrigin = EitherOfDiverse< + EnsureRoot, + EitherOfDiverse< + pallet_collective::EnsureProportionMoreThan, + governance::custom_origins::GeneralAdmin, + >, +>; + +impl pallet_asset_manager::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type AssetRegistrarMetadata = AssetRegistrarMetadata; + type ForeignAssetType = xcm_config::AssetType; + type AssetRegistrar = AssetRegistrar; + type ForeignAssetModifierOrigin = ForeignAssetModifierOrigin; + type LocalAssetModifierOrigin = LocalAssetModifierOrigin; + type LocalAssetIdCreator = LocalAssetIdCreator; + type Currency = Balances; + type LocalAssetDeposit = AssetDeposit; + type WeightInfo = pallet_asset_manager::weights::SubstrateWeight; +} + +// Instruct how to go from an H160 to an AssetID +// We just take the lowest 128 bits +impl AccountIdAssetIdConversion for Runtime { + /// The way to convert an account to assetId is by ensuring that the prefix is 0XFFFFFFFF + /// and by taking the lowest 128 bits as the assetId + fn account_to_asset_id(account: AccountId) -> Option<(Vec, AssetId)> { + let h160_account: H160 = account.into(); + let mut data = [0u8; 16]; + let (prefix_part, id_part) = h160_account.as_fixed_bytes().split_at(4); + if prefix_part == FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX + || prefix_part == LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX + { + data.copy_from_slice(id_part); + let asset_id: AssetId = u128::from_be_bytes(data).into(); + Some((prefix_part.to_vec(), asset_id)) + } else { + None + } + } + + // The opposite conversion + fn asset_id_to_account(prefix: &[u8], asset_id: AssetId) -> AccountId { + let mut data = [0u8; 20]; + data[0..4].copy_from_slice(prefix); + data[4..20].copy_from_slice(&asset_id.to_be_bytes()); + AccountId::from(data) + } +} diff --git a/tracing/2402/runtime/moonriver/src/governance/councils.rs b/tracing/2402/runtime/moonriver/src/governance/councils.rs new file mode 100644 index 0000000..2baf41a --- /dev/null +++ b/tracing/2402/runtime/moonriver/src/governance/councils.rs @@ -0,0 +1,88 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Councils for Gov1 and Gov2 + +use super::*; + +pub type CouncilInstance = pallet_collective::Instance1; +pub type TechCommitteeInstance = pallet_collective::Instance2; +pub type TreasuryCouncilInstance = pallet_collective::Instance3; +pub type OpenTechCommitteeInstance = pallet_collective::Instance4; + +impl pallet_collective::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Proposal = RuntimeCall; + /// The maximum amount of time (in blocks) for council members to vote on motions. + /// Motions may end in fewer blocks if enough votes are cast to determine the result. + type MotionDuration = ConstU32<{ 3 * DAYS }>; + /// The maximum number of proposals that can be open in the council at once. + type MaxProposals = ConstU32<100>; + /// The maximum number of council members. + type MaxMembers = ConstU32<100>; + type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote; + type WeightInfo = pallet_collective::weights::SubstrateWeight; + type SetMembersOrigin = referenda::GeneralAdminOrRoot; +} + +impl pallet_collective::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Proposal = RuntimeCall; + /// The maximum amount of time (in blocks) for technical committee members to vote on motions. + /// Motions may end in fewer blocks if enough votes are cast to determine the result. + type MotionDuration = ConstU32<{ 3 * DAYS }>; + /// The maximum number of proposals that can be open in the technical committee at once. + type MaxProposals = ConstU32<100>; + /// The maximum number of technical committee members. + type MaxMembers = ConstU32<100>; + type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote; + type WeightInfo = pallet_collective::weights::SubstrateWeight; + type SetMembersOrigin = referenda::GeneralAdminOrRoot; +} + +impl pallet_collective::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Proposal = RuntimeCall; + /// The maximum amount of time (in blocks) for treasury council members to vote on motions. + /// Motions may end in fewer blocks if enough votes are cast to determine the result. + type MotionDuration = ConstU32<{ 3 * DAYS }>; + /// The maximum number of proposals that can be open in the treasury council at once. + type MaxProposals = ConstU32<20>; + /// The maximum number of treasury council members. + type MaxMembers = ConstU32<9>; + type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote; + type WeightInfo = pallet_collective::weights::SubstrateWeight; + type SetMembersOrigin = referenda::GeneralAdminOrRoot; +} + +impl pallet_collective::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Proposal = RuntimeCall; + /// The maximum amount of time (in blocks) for technical committee members to vote on motions. + /// Motions may end in fewer blocks if enough votes are cast to determine the result. + type MotionDuration = ConstU32<{ 14 * DAYS }>; + /// The maximum number of proposals that can be open in the technical committee at once. + type MaxProposals = ConstU32<100>; + /// The maximum number of technical committee members. + type MaxMembers = ConstU32<100>; + type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote; + type WeightInfo = pallet_collective::weights::SubstrateWeight; + type SetMembersOrigin = referenda::GeneralAdminOrRoot; +} diff --git a/tracing/2402/runtime/moonriver/src/governance/democracy.rs b/tracing/2402/runtime/moonriver/src/governance/democracy.rs new file mode 100644 index 0000000..6984d61 --- /dev/null +++ b/tracing/2402/runtime/moonriver/src/governance/democracy.rs @@ -0,0 +1,77 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Democracy config for Gov1 + +use super::councils::*; +use crate::*; + +// The purpose of this offset is to ensure that a democratic proposal will not apply in the same +// block as a round change. +const ENACTMENT_OFFSET: u32 = 300; + +impl pallet_democracy::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type EnactmentPeriod = ConstU32<{ 1 * DAYS + ENACTMENT_OFFSET }>; + type LaunchPeriod = ConstU32<{ 1 * DAYS }>; + type VotingPeriod = ConstU32<{ 5 * DAYS }>; + + type VoteLockingPeriod = ConstU32<{ 1 * DAYS }>; + type FastTrackVotingPeriod = ConstU32<{ 3 * HOURS }>; + type MinimumDeposit = ConstU128<{ 4 * currency::MOVR * currency::SUPPLY_FACTOR }>; + /// To decide what their next motion is. + type ExternalOrigin = + pallet_collective::EnsureProportionAtLeast; + /// To have the next scheduled referendum be a straight majority-carries vote. + type ExternalMajorityOrigin = + pallet_collective::EnsureProportionAtLeast; + /// To have the next scheduled referendum be a straight default-carries (NTB) vote. + type ExternalDefaultOrigin = + pallet_collective::EnsureProportionAtLeast; + /// To allow a shorter voting/enactment period for external proposals. + type FastTrackOrigin = + pallet_collective::EnsureProportionAtLeast; + /// To instant fast track. + type InstantOrigin = + pallet_collective::EnsureProportionAtLeast; + // To cancel a proposal which has been passed. + type CancellationOrigin = EitherOfDiverse< + EnsureRoot, + pallet_collective::EnsureProportionAtLeast, + >; + // To cancel a proposal before it has been passed. + type CancelProposalOrigin = EitherOfDiverse< + EnsureRoot, + pallet_collective::EnsureProportionAtLeast, + >; + type BlacklistOrigin = EnsureRoot; + // Any single technical committee member may veto a coming council proposal, however they can + // only do it once and it lasts only for the cooloff period. + type VetoOrigin = pallet_collective::EnsureMember; + type CooloffPeriod = ConstU32<{ 7 * DAYS }>; + type Slash = (); + type InstantAllowed = ConstBool; + type Scheduler = Scheduler; + type MaxVotes = ConstU32<100>; + type PalletsOrigin = OriginCaller; + type WeightInfo = pallet_democracy::weights::SubstrateWeight; + type MaxProposals = ConstU32<100>; + type Preimages = Preimage; + type MaxDeposits = ConstU32<100>; + type MaxBlacklisted = ConstU32<100>; + type SubmitOrigin = EnsureSigned; +} diff --git a/tracing/2402/runtime/moonriver/src/governance/mod.rs b/tracing/2402/runtime/moonriver/src/governance/mod.rs new file mode 100644 index 0000000..0367cdf --- /dev/null +++ b/tracing/2402/runtime/moonriver/src/governance/mod.rs @@ -0,0 +1,30 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Governance configurations + +pub mod councils; +mod democracy; +pub mod referenda; + +use super::*; + +mod origins; +pub use origins::{ + custom_origins, GeneralAdmin, ReferendumCanceller, ReferendumKiller, WhitelistedCaller, +}; +mod tracks; +pub use tracks::TracksInfo; diff --git a/tracing/2402/runtime/moonriver/src/governance/origins.rs b/tracing/2402/runtime/moonriver/src/governance/origins.rs new file mode 100644 index 0000000..a8a5a53 --- /dev/null +++ b/tracing/2402/runtime/moonriver/src/governance/origins.rs @@ -0,0 +1,82 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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. + +//! Custom origins for governance interventions. +#![cfg_attr(not(feature = "std"), no_std)] + +pub use custom_origins::*; + +#[frame_support::pallet] +pub mod custom_origins { + use frame_support::pallet_prelude::*; + use strum_macros::EnumString; + + #[pallet::config] + pub trait Config: frame_system::Config {} + + #[pallet::pallet] + pub struct Pallet(_); + + #[derive( + PartialEq, Eq, Clone, MaxEncodedLen, Encode, Decode, TypeInfo, RuntimeDebug, EnumString, + )] + #[strum(serialize_all = "snake_case")] + #[pallet::origin] + pub enum Origin { + /// Origin able to dispatch a whitelisted call. + WhitelistedCaller, + /// General admin + GeneralAdmin, + /// Origin able to cancel referenda. + ReferendumCanceller, + /// Origin able to kill referenda. + ReferendumKiller, + } + + macro_rules! decl_unit_ensures { + ( $name:ident: $success_type:ty = $success:expr ) => { + pub struct $name; + impl> + From> + EnsureOrigin for $name + { + type Success = $success_type; + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + Origin::$name => Ok($success), + r => Err(O::from(r)), + }) + } + #[cfg(feature = "runtime-benchmarks")] + fn try_successful_origin() -> Result { + Ok(O::from(Origin::$name)) + } + } + }; + ( $name:ident ) => { decl_unit_ensures! { $name : () = () } }; + ( $name:ident: $success_type:ty = $success:expr, $( $rest:tt )* ) => { + decl_unit_ensures! { $name: $success_type = $success } + decl_unit_ensures! { $( $rest )* } + }; + ( $name:ident, $( $rest:tt )* ) => { + decl_unit_ensures! { $name } + decl_unit_ensures! { $( $rest )* } + }; + () => {} + } + decl_unit_ensures!( + ReferendumCanceller, + ReferendumKiller, + WhitelistedCaller, + GeneralAdmin + ); +} diff --git a/tracing/2402/runtime/moonriver/src/governance/referenda.rs b/tracing/2402/runtime/moonriver/src/governance/referenda.rs new file mode 100644 index 0000000..3e0df96 --- /dev/null +++ b/tracing/2402/runtime/moonriver/src/governance/referenda.rs @@ -0,0 +1,98 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! # Gov2 config +//! Includes runtime configs for these substrate pallets: +//! 1. pallet-conviction-voting +//! 2. pallet-whitelist +//! 3. pallet-referenda + +use super::*; +use crate::currency::*; +use frame_support::traits::{EitherOf, MapSuccess}; +use frame_system::EnsureRootWithSuccess; +use sp_runtime::traits::Replace; + +parameter_types! { + pub const VoteLockingPeriod: BlockNumber = 1 * DAYS; +} + +impl pallet_conviction_voting::Config for Runtime { + type WeightInfo = pallet_conviction_voting::weights::SubstrateWeight; + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type Polls = Referenda; + type MaxTurnout = frame_support::traits::TotalIssuanceOf; + // Maximum number of concurrent votes an account may have + type MaxVotes = ConstU32<20>; + // Minimum period of vote locking + type VoteLockingPeriod = VoteLockingPeriod; +} + +parameter_types! { + pub const AlarmInterval: BlockNumber = 1; + pub const SubmissionDeposit: Balance = 10 * MOVR * SUPPLY_FACTOR; + pub const UndecidingTimeout: BlockNumber = 14 * DAYS; +} + +// Origin for general admin or root +pub type GeneralAdminOrRoot = EitherOf, origins::GeneralAdmin>; + +impl custom_origins::Config for Runtime {} + +// The purpose of this pallet is to queue calls to be dispatched as by root later => the Dispatch +// origin corresponds to the Gov2 Whitelist track. +impl pallet_whitelist::Config for Runtime { + type WeightInfo = pallet_whitelist::weights::SubstrateWeight; + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type WhitelistOrigin = EitherOf< + EnsureRootWithSuccess>, + MapSuccess< + pallet_collective::EnsureProportionAtLeast< + Self::AccountId, + OpenTechCommitteeInstance, + 5, + 9, + >, + Replace>, + >, + >; + type DispatchWhitelistedOrigin = EitherOf, WhitelistedCaller>; + type Preimages = Preimage; +} + +pallet_referenda::impl_tracksinfo_get!(TracksInfo, Balance, BlockNumber); + +impl pallet_referenda::Config for Runtime { + type WeightInfo = pallet_referenda::weights::SubstrateWeight; + type RuntimeCall = RuntimeCall; + type RuntimeEvent = RuntimeEvent; + type Scheduler = Scheduler; + type Currency = Balances; + type SubmitOrigin = frame_system::EnsureSigned; + type CancelOrigin = EitherOf, ReferendumCanceller>; + type KillOrigin = EitherOf, ReferendumKiller>; + type Slash = Treasury; + type Votes = pallet_conviction_voting::VotesOf; + type Tally = pallet_conviction_voting::TallyOf; + type SubmissionDeposit = SubmissionDeposit; + type MaxQueued = ConstU32<100>; + type UndecidingTimeout = UndecidingTimeout; + type AlarmInterval = AlarmInterval; + type Tracks = TracksInfo; + type Preimages = Preimage; +} diff --git a/tracing/2402/runtime/moonriver/src/governance/tracks.rs b/tracing/2402/runtime/moonriver/src/governance/tracks.rs new file mode 100644 index 0000000..b4e23ba --- /dev/null +++ b/tracing/2402/runtime/moonriver/src/governance/tracks.rs @@ -0,0 +1,179 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +//! Track configurations for governance. + +use super::*; +use crate::currency::{KILOMOVR, MOVR, SUPPLY_FACTOR}; +use sp_std::str::FromStr; + +const fn percent(x: i32) -> sp_runtime::FixedI64 { + sp_runtime::FixedI64::from_rational(x as u128, 100) +} +const fn permill(x: i32) -> sp_runtime::FixedI64 { + sp_runtime::FixedI64::from_rational(x as u128, 1000) +} + +use pallet_referenda::Curve; +const TRACKS_DATA: [(u16, pallet_referenda::TrackInfo); 5] = [ + ( + 0, + pallet_referenda::TrackInfo { + // Name of this track. + name: "root", + // A limit for the number of referenda on this track that can be being decided at once. + // For Root origin this should generally be just one. + max_deciding: 5, + // Amount that must be placed on deposit before a decision can be made. + decision_deposit: 100 * KILOMOVR * SUPPLY_FACTOR, + // Amount of time this must be submitted for before a decision can be made. + prepare_period: 1 * DAYS, + // Amount of time that a decision may take to be approved prior to cancellation. + decision_period: 14 * DAYS, + // Amount of time that the approval criteria must hold before it can be approved. + confirm_period: 1 * DAYS, + // Minimum amount of time that an approved proposal must be in the dispatch queue. + min_enactment_period: 1 * DAYS, + // Minimum aye votes as percentage of overall conviction-weighted votes needed for + // approval as a function of time into decision period. + min_approval: Curve::make_reciprocal(4, 14, percent(80), percent(50), percent(100)), + // Minimum pre-conviction aye-votes ("support") as percentage of overall population that + // is needed for approval as a function of time into decision period. + min_support: Curve::make_linear(14, 14, permill(5), percent(25)), + }, + ), + ( + 1, + pallet_referenda::TrackInfo { + name: "whitelisted_caller", + max_deciding: 100, + decision_deposit: 10 * KILOMOVR * SUPPLY_FACTOR, + prepare_period: 10 * MINUTES, + decision_period: 14 * DAYS, + confirm_period: 10 * MINUTES, + min_enactment_period: 30 * MINUTES, + min_approval: Curve::make_reciprocal(1, 14, percent(96), percent(50), percent(100)), + min_support: Curve::make_reciprocal(1, 14 * 24, percent(1), percent(0), percent(2)), + }, + ), + ( + 2, + pallet_referenda::TrackInfo { + name: "general_admin", + max_deciding: 10, + decision_deposit: 500 * MOVR * SUPPLY_FACTOR, + prepare_period: 1 * HOURS, + decision_period: 14 * DAYS, + confirm_period: 1 * DAYS, + min_enactment_period: 1 * DAYS, + min_approval: Curve::make_reciprocal(4, 14, percent(80), percent(50), percent(100)), + min_support: Curve::make_reciprocal(7, 14, percent(10), percent(0), percent(50)), + }, + ), + ( + 3, + pallet_referenda::TrackInfo { + name: "referendum_canceller", + max_deciding: 20, + decision_deposit: 10 * KILOMOVR * SUPPLY_FACTOR, + prepare_period: 1 * HOURS, + decision_period: 14 * DAYS, + confirm_period: 3 * HOURS, + min_enactment_period: 10 * MINUTES, + min_approval: Curve::make_reciprocal(1, 14, percent(96), percent(50), percent(100)), + min_support: Curve::make_reciprocal(1, 14, percent(1), percent(0), percent(10)), + }, + ), + ( + 4, + pallet_referenda::TrackInfo { + name: "referendum_killer", + max_deciding: 100, + decision_deposit: 20 * KILOMOVR * SUPPLY_FACTOR, + prepare_period: 1 * HOURS, + decision_period: 14 * DAYS, + confirm_period: 3 * HOURS, + min_enactment_period: 10 * MINUTES, + min_approval: Curve::make_reciprocal(1, 14, percent(96), percent(50), percent(100)), + min_support: Curve::make_reciprocal(1, 14, percent(1), percent(0), percent(10)), + }, + ), +]; + +pub struct TracksInfo; +impl pallet_referenda::TracksInfo for TracksInfo { + type Id = u16; + type RuntimeOrigin = ::PalletsOrigin; + fn tracks() -> &'static [(Self::Id, pallet_referenda::TrackInfo)] { + &TRACKS_DATA[..] + } + fn track_for(id: &Self::RuntimeOrigin) -> Result { + if let Ok(system_origin) = frame_system::RawOrigin::try_from(id.clone()) { + match system_origin { + frame_system::RawOrigin::Root => { + if let Some((track_id, _)) = Self::tracks() + .into_iter() + .find(|(_, track)| track.name == "root") + { + Ok(*track_id) + } else { + Err(()) + } + } + _ => Err(()), + } + } else if let Ok(custom_origin) = custom_origins::Origin::try_from(id.clone()) { + if let Some((track_id, _)) = Self::tracks().into_iter().find(|(_, track)| { + if let Ok(track_custom_origin) = custom_origins::Origin::from_str(track.name) { + track_custom_origin == custom_origin + } else { + false + } + }) { + Ok(*track_id) + } else { + Err(()) + } + } else { + Err(()) + } + } +} + +#[test] +/// To ensure voters are always locked into their vote +fn vote_locking_always_longer_than_enactment_period() { + for (_, track) in TRACKS_DATA { + assert!( + ::VoteLockingPeriod::get() + >= track.min_enactment_period, + "Track {} has enactment period {} < vote locking period {}", + track.name, + track.min_enactment_period, + ::VoteLockingPeriod::get(), + ); + } +} + +#[test] +fn all_tracks_have_origins() { + for (_, track) in TRACKS_DATA { + // check name.into() is successful either converts into "root" or custom origin + let track_is_root = track.name == "root"; + let track_has_custom_origin = custom_origins::Origin::from_str(track.name).is_ok(); + assert!(track_is_root || track_has_custom_origin); + } +} diff --git a/tracing/2402/runtime/moonriver/src/lib.rs b/tracing/2402/runtime/moonriver/src/lib.rs new file mode 100644 index 0000000..593d281 --- /dev/null +++ b/tracing/2402/runtime/moonriver/src/lib.rs @@ -0,0 +1,1714 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! The Moonriver Runtime. +//! +//! Primary features of this runtime include: +//! * Ethereum compatibility +//! * Moonriver tokenomics + +#![cfg_attr(not(feature = "std"), no_std)] +// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. +#![recursion_limit = "256"] + +// Make the WASM binary available. +#[cfg(feature = "std")] +include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); + +use account::AccountId20; +use cumulus_pallet_parachain_system::{RelayChainStateProof, RelaychainDataProvider}; +use cumulus_primitives_core::relay_chain; +use fp_rpc::TransactionStatus; + +// Re-export required by get! macro. +#[cfg(feature = "std")] +pub use fp_evm::GenesisAccount; +pub use frame_support::traits::Get; +use frame_support::{ + construct_runtime, + dispatch::{DispatchClass, GetDispatchInfo}, + ensure, + pallet_prelude::DispatchResult, + parameter_types, + traits::{ + ConstBool, ConstU128, ConstU16, ConstU32, ConstU64, ConstU8, Contains, + Currency as CurrencyT, EitherOfDiverse, EqualPrivilegeOnly, Imbalance, InstanceFilter, + OffchainWorker, OnFinalize, OnIdle, OnInitialize, OnRuntimeUpgrade, OnUnbalanced, + }, + weights::{ + constants::{RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND}, + ConstantMultiplier, Weight, WeightToFeeCoefficient, WeightToFeeCoefficients, + WeightToFeePolynomial, + }, + PalletId, +}; +use frame_system::{EnsureRoot, EnsureSigned}; +pub use moonbeam_core_primitives::{ + AccountId, AccountIndex, Address, AssetId, Balance, BlockNumber, DigestItem, Hash, Header, + Index, Signature, +}; +use moonbeam_rpc_primitives_txpool::TxPoolResponse; +use pallet_balances::NegativeImbalance; +use pallet_ethereum::Call::transact; +use pallet_ethereum::{PostLogContent, Transaction as EthereumTransaction}; +use pallet_evm::{ + Account as EVMAccount, EVMCurrencyAdapter, EnsureAddressNever, EnsureAddressRoot, + FeeCalculator, GasWeightMapping, OnChargeEVMTransaction as OnChargeEVMTransactionT, Runner, +}; +pub use pallet_parachain_staking::{InflationInfo, Range}; +use pallet_transaction_payment::{CurrencyAdapter, Multiplier, TargetedFeeAdjustment}; +use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; +use scale_info::TypeInfo; +use sp_api::impl_runtime_apis; +use sp_core::{OpaqueMetadata, H160, H256, U256}; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, + traits::{ + BlakeTwo256, Block as BlockT, DispatchInfoOf, Dispatchable, IdentityLookup, + PostDispatchInfoOf, UniqueSaturatedInto, Zero, + }, + transaction_validity::{ + InvalidTransaction, TransactionSource, TransactionValidity, TransactionValidityError, + }, + ApplyExtrinsicResult, FixedPointNumber, Perbill, Permill, Perquintill, SaturatedConversion, +}; +use sp_std::{convert::TryFrom, prelude::*}; + +use cumulus_primitives_core::{relay_chain::BlockNumber as RelayBlockNumber, DmpMessageHandler}; +use smallvec::smallvec; +#[cfg(feature = "std")] +use sp_version::NativeVersion; +use sp_version::RuntimeVersion; + +use nimbus_primitives::CanAuthor; + +mod precompiles; +pub use precompiles::{ + MoonriverPrecompiles, PrecompileName, FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, +}; + +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; + +pub type Precompiles = MoonriverPrecompiles; + +pub mod asset_config; +pub mod governance; +pub mod xcm_config; +use governance::councils::*; + +pub use governance::councils::*; + +/// MOVR, the native token, uses 18 decimals of precision. +pub mod currency { + use super::Balance; + + // Provide a common factor between runtimes based on a supply of 10_000_000 tokens. + pub const SUPPLY_FACTOR: Balance = 1; + + pub const WEI: Balance = 1; + pub const KILOWEI: Balance = 1_000; + pub const MEGAWEI: Balance = 1_000_000; + pub const GIGAWEI: Balance = 1_000_000_000; + pub const MICROMOVR: Balance = 1_000_000_000_000; + pub const MILLIMOVR: Balance = 1_000_000_000_000_000; + pub const MOVR: Balance = 1_000_000_000_000_000_000; + pub const KILOMOVR: Balance = 1_000_000_000_000_000_000_000; + + pub const TRANSACTION_BYTE_FEE: Balance = 1 * GIGAWEI * SUPPLY_FACTOR; + pub const STORAGE_BYTE_FEE: Balance = 100 * MICROMOVR * SUPPLY_FACTOR; + pub const WEIGHT_FEE: Balance = 50 * KILOWEI * SUPPLY_FACTOR; + + pub const fn deposit(items: u32, bytes: u32) -> Balance { + items as Balance * 1 * MOVR * SUPPLY_FACTOR + (bytes as Balance) * STORAGE_BYTE_FEE + } +} + +/// Maximum weight per block +pub const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND, u64::MAX) + .saturating_div(2) + .set_proof_size(cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64); + +pub const MILLISECS_PER_BLOCK: u64 = 12000; +pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); +pub const HOURS: BlockNumber = MINUTES * 60; +pub const DAYS: BlockNumber = HOURS * 24; +pub const WEEKS: BlockNumber = DAYS * 7; +/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know +/// the specifics of the runtime. They can then be made to be agnostic over specific formats +/// of data like extrinsics, allowing for them to continue syncing the network through upgrades +/// to even the core datastructures. +pub mod opaque { + use super::*; + + pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; + pub type Block = generic::Block; + + impl_opaque_keys! { + pub struct SessionKeys { + pub nimbus: AuthorInherent, + pub vrf: session_keys_primitives::VrfSessionKey, + } + } +} + +/// This runtime version. +/// The spec_version is composed of 2x2 digits. The first 2 digits represent major changes +/// that can't be skipped, such as data migration upgrades. The last 2 digits represent minor +/// changes which can be skipped. +#[sp_version::runtime_version] +pub const VERSION: RuntimeVersion = RuntimeVersion { + spec_name: create_runtime_str!("moonriver"), + impl_name: create_runtime_str!("moonriver"), + authoring_version: 3, + spec_version: 2402, + impl_version: 0, + apis: RUNTIME_API_VERSIONS, + transaction_version: 2, + state_version: 0, +}; + +/// The version information used to identify this runtime when compiled natively. +#[cfg(feature = "std")] +pub fn native_version() -> NativeVersion { + NativeVersion { + runtime_version: VERSION, + can_author_with: Default::default(), + } +} + +const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); +pub const NORMAL_WEIGHT: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_mul(3).saturating_div(4); +// Here we assume Ethereum's base fee of 21000 gas and convert to weight, but we +// subtract roughly the cost of a balance transfer from it (about 1/3 the cost) +// and some cost to account for per-byte-fee. +// TODO: we should use benchmarking's overhead feature to measure this +pub const EXTRINSIC_BASE_WEIGHT: Weight = Weight::from_parts(10000 * WEIGHT_PER_GAS, 0); + +pub struct RuntimeBlockWeights; +impl Get for RuntimeBlockWeights { + fn get() -> frame_system::limits::BlockWeights { + frame_system::limits::BlockWeights::builder() + .for_class(DispatchClass::Normal, |weights| { + weights.base_extrinsic = EXTRINSIC_BASE_WEIGHT; + weights.max_total = NORMAL_WEIGHT.into(); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = MAXIMUM_BLOCK_WEIGHT.into(); + weights.reserved = (MAXIMUM_BLOCK_WEIGHT - NORMAL_WEIGHT).into(); + }) + .avg_block_initialization(Perbill::from_percent(10)) + .build() + .expect("Provided BlockWeight definitions are valid, qed") + } +} + +parameter_types! { + pub const Version: RuntimeVersion = VERSION; + /// We allow for 5 MB blocks. + pub BlockLength: frame_system::limits::BlockLength = frame_system::limits::BlockLength + ::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); +} + +impl frame_system::Config for Runtime { + /// The identifier used to distinguish between accounts. + type AccountId = AccountId; + /// The aggregated dispatch type that is available for extrinsics. + type RuntimeCall = RuntimeCall; + /// The lookup mechanism to get account ID from whatever is passed in dispatchers. + type Lookup = IdentityLookup; + /// The index type for storing how many extrinsics an account has signed. + type Index = Index; + /// The index type for blocks. + type BlockNumber = BlockNumber; + /// The type for hashing blocks and tries. + type Hash = Hash; + /// The hashing algorithm used. + type Hashing = BlakeTwo256; + /// The header type. + type Header = generic::Header; + /// The ubiquitous event type. + type RuntimeEvent = RuntimeEvent; + /// The ubiquitous origin type. + type RuntimeOrigin = RuntimeOrigin; + /// Maximum number of block number to block hash mappings to keep (oldest pruned first). + type BlockHashCount = ConstU32<256>; + /// Maximum weight of each block. With a default weight system of 1byte == 1weight, 4mb is ok. + type BlockWeights = RuntimeBlockWeights; + /// Maximum size of all encoded transactions (in bytes) that are allowed in one block. + type BlockLength = BlockLength; + /// Runtime version. + type Version = Version; + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = RocksDbWeight; + type BaseCallFilter = MaintenanceMode; + type SystemWeightInfo = (); + /// This is used as an identifier of the chain. 42 is the generic substrate prefix. + type SS58Prefix = ConstU16<1285>; + type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +impl pallet_utility::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type PalletsOrigin = OriginCaller; + type WeightInfo = pallet_utility::weights::SubstrateWeight; +} + +impl pallet_timestamp::Config for Runtime { + /// A timestamp: milliseconds since the unix epoch. + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = ConstU64<6000>; + type WeightInfo = pallet_timestamp::weights::SubstrateWeight; +} + +impl pallet_balances::Config for Runtime { + type MaxReserves = ConstU32<50>; + type ReserveIdentifier = [u8; 4]; + type MaxLocks = ConstU32<50>; + /// The type for recording an account's balance. + type Balance = Balance; + /// The ubiquitous event type. + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ConstU128<0>; + type AccountStore = System; + type WeightInfo = pallet_balances::weights::SubstrateWeight; +} + +pub struct DealWithFees(sp_std::marker::PhantomData); +impl OnUnbalanced> for DealWithFees +where + R: pallet_balances::Config + pallet_treasury::Config, + pallet_treasury::Pallet: OnUnbalanced>, +{ + // this seems to be called for substrate-based transactions + fn on_unbalanceds(mut fees_then_tips: impl Iterator>) { + if let Some(fees) = fees_then_tips.next() { + // for fees, 80% are burned, 20% to the treasury + let (_, to_treasury) = fees.ration(80, 20); + // Balances pallet automatically burns dropped Negative Imbalances by decreasing + // total_supply accordingly + as OnUnbalanced<_>>::on_unbalanced(to_treasury); + + // handle tip if there is one + if let Some(tip) = fees_then_tips.next() { + // for now we use the same burn/treasury strategy used for regular fees + let (_, to_treasury) = tip.ration(80, 20); + as OnUnbalanced<_>>::on_unbalanced(to_treasury); + } + } + } + + // this is called from pallet_evm for Ethereum-based transactions + // (technically, it calls on_unbalanced, which calls this when non-zero) + fn on_nonzero_unbalanced(amount: NegativeImbalance) { + // Balances pallet automatically burns dropped Negative Imbalances by decreasing + // total_supply accordingly + let (_, to_treasury) = amount.ration(80, 20); + as OnUnbalanced<_>>::on_unbalanced(to_treasury); + } +} + +pub struct LengthToFee; +impl WeightToFeePolynomial for LengthToFee { + type Balance = Balance; + + fn polynomial() -> WeightToFeeCoefficients { + smallvec![ + WeightToFeeCoefficient { + degree: 1, + coeff_frac: Perbill::zero(), + coeff_integer: currency::TRANSACTION_BYTE_FEE, + negative: false, + }, + WeightToFeeCoefficient { + degree: 3, + coeff_frac: Perbill::zero(), + coeff_integer: 1 * currency::SUPPLY_FACTOR, + negative: false, + }, + ] + } +} + +impl pallet_transaction_payment::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnChargeTransaction = CurrencyAdapter>; + type OperationalFeeMultiplier = ConstU8<5>; + type WeightToFee = ConstantMultiplier>; + type LengthToFee = LengthToFee; + type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; +} + +impl pallet_ethereum_chain_id::Config for Runtime {} + +/// Current approximation of the gas/s consumption considering +/// EVM execution over compiled WASM (on 4.4Ghz CPU). +/// Given the 500ms Weight, from which 75% only are used for transactions, +/// the total EVM execution gas limit is: GAS_PER_SECOND * 0.500 * 0.75 ~= 15_000_000. +pub const GAS_PER_SECOND: u64 = 40_000_000; + +/// Approximate ratio of the amount of Weight per Gas. +/// u64 works for approximations because Weight is a very small unit compared to gas. +pub const WEIGHT_PER_GAS: u64 = WEIGHT_REF_TIME_PER_SECOND / GAS_PER_SECOND; + +parameter_types! { + pub BlockGasLimit: U256 + = U256::from(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT.ref_time() / WEIGHT_PER_GAS); + /// The portion of the `NORMAL_DISPATCH_RATIO` that we adjust the fees with. Blocks filled less + /// than this will decrease the weight and more will increase. + pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25); + /// The adjustment variable of the runtime. Higher values will cause `TargetBlockFullness` to + /// change the fees more rapidly. This low value causes changes to occur slowly over time. + pub AdjustmentVariable: Multiplier = Multiplier::saturating_from_rational(4, 1_000); + /// Minimum amount of the multiplier. This value cannot be too low. A test case should ensure + /// that combined with `AdjustmentVariable`, we can recover from the minimum. + /// See `multiplier_can_grow_from_zero` in integration_tests.rs. + /// This value is currently only used by pallet-transaction-payment as an assertion that the + /// next multiplier is always > min value. + pub MinimumMultiplier: Multiplier = Multiplier::from(1u128); + /// Maximum multiplier. We pick a value that is expensive but not impossibly so; it should act + /// as a safety net. + pub MaximumMultiplier: Multiplier = Multiplier::from(100_000u128); + pub PrecompilesValue: MoonriverPrecompiles = MoonriverPrecompiles::<_>::new(); + pub WeightPerGas: Weight = Weight::from_parts(WEIGHT_PER_GAS, 0); + /// The amount of gas per pov. A ratio of 4 if we convert ref_time to gas and we compare + /// it with the pov_size for a block. E.g. + /// ceil( + /// (max_extrinsic.ref_time() / max_extrinsic.proof_size()) / WEIGHT_PER_GAS + /// ) + pub const GasLimitPovSizeRatio: u64 = 4; +} + +pub struct TransactionPaymentAsGasPrice; +impl FeeCalculator for TransactionPaymentAsGasPrice { + fn min_gas_price() -> (U256, Weight) { + // note: transaction-payment differs from EIP-1559 in that its tip and length fees are not + // scaled by the multiplier, which means its multiplier will be overstated when + // applied to an ethereum transaction + // note: transaction-payment uses both a congestion modifier (next_fee_multiplier, which is + // updated once per block in on_finalize) and a 'WeightToFee' implementation. Our + // runtime implements this as a 'ConstantModifier', so we can get away with a simple + // multiplication here. + // It is imperative that `saturating_mul_int` be performed as late as possible in the + // expression since it involves fixed point multiplication with a division by a fixed + // divisor. This leads to truncation and subsequent precision loss if performed too early. + // This can lead to min_gas_price being same across blocks even if the multiplier changes. + // There's still some precision loss when the final `gas_price` (used_gas * min_gas_price) + // is computed in frontier, but that's currently unavoidable. + let min_gas_price = TransactionPayment::next_fee_multiplier() + .saturating_mul_int(currency::WEIGHT_FEE.saturating_mul(WEIGHT_PER_GAS as u128)); + ( + min_gas_price.into(), + ::DbWeight::get().reads(1), + ) + } +} + +/// Parameterized slow adjusting fee updated based on +/// https://w3f-research.readthedocs.io/en/latest/polkadot/overview/2-token-economics.html#-2.-slow-adjusting-mechanism // editorconfig-checker-disable-line +/// +/// The adjustment algorithm boils down to: +/// +/// diff = (previous_block_weight - target) / maximum_block_weight +/// next_multiplier = prev_multiplier * (1 + (v * diff) + ((v * diff)^2 / 2)) +/// assert(next_multiplier > min) +/// where: v is AdjustmentVariable +/// target is TargetBlockFullness +/// min is MinimumMultiplier +pub type SlowAdjustingFeeUpdate = TargetedFeeAdjustment< + R, + TargetBlockFullness, + AdjustmentVariable, + MinimumMultiplier, + MaximumMultiplier, +>; + +use frame_support::traits::FindAuthor; +//TODO It feels like this shold be able to work for any T: H160, but I tried for +// embarassingly long and couldn't figure that out. + +/// The author inherent provides a AccountId20, but pallet evm needs an H160. +/// This simple adapter makes the conversion. +pub struct FindAuthorAdapter(sp_std::marker::PhantomData); + +impl FindAuthor for FindAuthorAdapter +where + Inner: FindAuthor, +{ + fn find_author<'a, I>(digests: I) -> Option + where + I: 'a + IntoIterator, + { + Inner::find_author(digests).map(Into::into) + } +} + +moonbeam_runtime_common::impl_on_charge_evm_transaction!(); + +impl pallet_evm::Config for Runtime { + type FeeCalculator = TransactionPaymentAsGasPrice; + type GasWeightMapping = pallet_evm::FixedGasWeightMapping; + type WeightPerGas = WeightPerGas; + type BlockHashMapping = pallet_ethereum::EthereumBlockHashMapping; + type CallOrigin = EnsureAddressRoot; + type WithdrawOrigin = EnsureAddressNever; + type AddressMapping = moonbeam_runtime_common::IntoAddressMapping; + type Currency = Balances; + type RuntimeEvent = RuntimeEvent; + type Runner = pallet_evm::runner::stack::Runner; + type PrecompilesType = MoonriverPrecompiles; + type PrecompilesValue = PrecompilesValue; + type ChainId = EthereumChainId; + type OnChargeTransaction = OnChargeEVMTransaction>; + type BlockGasLimit = BlockGasLimit; + type FindAuthor = FindAuthorAdapter; + type OnCreate = (); + type GasLimitPovSizeRatio = GasLimitPovSizeRatio; + type Timestamp = Timestamp; + type WeightInfo = pallet_evm::weights::SubstrateWeight; +} + +parameter_types! { + pub MaximumSchedulerWeight: Weight = NORMAL_DISPATCH_RATIO * RuntimeBlockWeights::get().max_block; +} + +impl pallet_scheduler::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeOrigin = RuntimeOrigin; + type PalletsOrigin = OriginCaller; + type RuntimeCall = RuntimeCall; + type MaximumWeight = MaximumSchedulerWeight; + type ScheduleOrigin = EnsureRoot; + type MaxScheduledPerBlock = ConstU32<50>; + type WeightInfo = pallet_scheduler::weights::SubstrateWeight; + type OriginPrivilegeCmp = EqualPrivilegeOnly; + type Preimages = Preimage; +} + +impl pallet_preimage::Config for Runtime { + type WeightInfo = pallet_preimage::weights::SubstrateWeight; + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type ManagerOrigin = EnsureRoot; + type BaseDeposit = ConstU128<{ 5 * currency::MOVR * currency::SUPPLY_FACTOR }>; + type ByteDeposit = ConstU128<{ currency::STORAGE_BYTE_FEE }>; +} + +parameter_types! { + pub const ProposalBond: Permill = Permill::from_percent(5); + pub const TreasuryId: PalletId = PalletId(*b"py/trsry"); +} + +type TreasuryApproveOrigin = EitherOfDiverse< + EnsureRoot, + pallet_collective::EnsureProportionAtLeast, +>; + +type TreasuryRejectOrigin = EitherOfDiverse< + EnsureRoot, + pallet_collective::EnsureProportionMoreThan, +>; + +impl pallet_treasury::Config for Runtime { + type PalletId = TreasuryId; + type Currency = Balances; + // At least three-fifths majority of the council is required (or root) to approve a proposal + type ApproveOrigin = TreasuryApproveOrigin; + // More than half of the council is required (or root) to reject a proposal + type RejectOrigin = TreasuryRejectOrigin; + type RuntimeEvent = RuntimeEvent; + // If spending proposal rejected, transfer proposer bond to treasury + type OnSlash = Treasury; + type ProposalBond = ProposalBond; + type ProposalBondMinimum = ConstU128<{ 1 * currency::MOVR * currency::SUPPLY_FACTOR }>; + type SpendPeriod = ConstU32<{ 6 * DAYS }>; + type Burn = (); + type BurnDestination = (); + type MaxApprovals = ConstU32<100>; + type WeightInfo = pallet_treasury::weights::SubstrateWeight; + type SpendFunds = (); + type ProposalBondMaximum = (); + type SpendOrigin = frame_support::traits::NeverEnsureOrigin; // Same as Polkadot +} + +type IdentityForceOrigin = EitherOfDiverse< + EnsureRoot, + EitherOfDiverse< + pallet_collective::EnsureProportionMoreThan, + governance::custom_origins::GeneralAdmin, + >, +>; +type IdentityRegistrarOrigin = EitherOfDiverse< + EnsureRoot, + EitherOfDiverse< + pallet_collective::EnsureProportionMoreThan, + governance::custom_origins::GeneralAdmin, + >, +>; + +impl pallet_identity::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + // Add one item in storage and take 258 bytes + type BasicDeposit = ConstU128<{ currency::deposit(1, 258) }>; + // Not add any item to the storage but takes 66 bytes + type FieldDeposit = ConstU128<{ currency::deposit(0, 66) }>; + // Add one item in storage and take 53 bytes + type SubAccountDeposit = ConstU128<{ currency::deposit(1, 53) }>; + type MaxSubAccounts = ConstU32<100>; + type MaxAdditionalFields = ConstU32<100>; + type MaxRegistrars = ConstU32<20>; + type Slashed = Treasury; + type ForceOrigin = IdentityForceOrigin; + type RegistrarOrigin = IdentityRegistrarOrigin; + type WeightInfo = pallet_identity::weights::SubstrateWeight; +} + +pub struct TransactionConverter; + +impl fp_rpc::ConvertTransaction for TransactionConverter { + fn convert_transaction(&self, transaction: pallet_ethereum::Transaction) -> UncheckedExtrinsic { + UncheckedExtrinsic::new_unsigned( + pallet_ethereum::Call::::transact { transaction }.into(), + ) + } +} + +impl fp_rpc::ConvertTransaction for TransactionConverter { + fn convert_transaction( + &self, + transaction: pallet_ethereum::Transaction, + ) -> opaque::UncheckedExtrinsic { + let extrinsic = UncheckedExtrinsic::new_unsigned( + pallet_ethereum::Call::::transact { transaction }.into(), + ); + let encoded = extrinsic.encode(); + opaque::UncheckedExtrinsic::decode(&mut &encoded[..]) + .expect("Encoded extrinsic is always valid") + } +} + +parameter_types! { + pub const PostBlockAndTxnHashes: PostLogContent = PostLogContent::BlockAndTxnHashes; +} + +impl pallet_ethereum::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type StateRoot = pallet_ethereum::IntermediateStateRoot; + type PostLogContent = PostBlockAndTxnHashes; + type ExtraDataLength = ConstU32<30>; +} + +pub struct EthereumXcmEnsureProxy; +impl xcm_primitives::EnsureProxy for EthereumXcmEnsureProxy { + fn ensure_ok(delegator: AccountId, delegatee: AccountId) -> Result<(), &'static str> { + // The EVM implicitely contains an Any proxy, so we only allow for "Any" proxies + let def: pallet_proxy::ProxyDefinition = + pallet_proxy::Pallet::::find_proxy( + &delegator, + &delegatee, + Some(ProxyType::Any), + ) + .map_err(|_| "proxy error: expected `ProxyType::Any`")?; + // We only allow to use it for delay zero proxies, as the call will immediatly be executed + ensure!(def.delay.is_zero(), "proxy delay is Non-zero`"); + Ok(()) + } +} + +impl pallet_ethereum_xcm::Config for Runtime { + type InvalidEvmTransactionError = pallet_ethereum::InvalidTransactionWrapper; + type ValidatedTransaction = pallet_ethereum::ValidatedTransaction; + type XcmEthereumOrigin = pallet_ethereum_xcm::EnsureXcmEthereumTransaction; + type ReservedXcmpWeight = ReservedXcmpWeight; + type EnsureProxy = EthereumXcmEnsureProxy; + type ControllerOrigin = EnsureRoot; +} + +parameter_types! { + pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); + pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); +} + +impl cumulus_pallet_parachain_system::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnSystemEvent = (); + type SelfParaId = ParachainInfo; + type DmpMessageHandler = MaintenanceMode; + type ReservedDmpWeight = ReservedDmpWeight; + type OutboundXcmpMessageSource = XcmpQueue; + type XcmpMessageHandler = XcmpQueue; + type ReservedXcmpWeight = ReservedXcmpWeight; + type CheckAssociatedRelayNumber = cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; +} + +impl parachain_info::Config for Runtime {} + +pub struct OnNewRound; +impl pallet_parachain_staking::OnNewRound for OnNewRound { + fn on_new_round(round_index: pallet_parachain_staking::RoundIndex) -> Weight { + MoonbeamOrbiters::on_new_round(round_index) + } +} +pub struct PayoutCollatorOrOrbiterReward; +impl pallet_parachain_staking::PayoutCollatorReward for PayoutCollatorOrOrbiterReward { + fn payout_collator_reward( + for_round: pallet_parachain_staking::RoundIndex, + collator_id: AccountId, + amount: Balance, + ) -> Weight { + let extra_weight = if MoonbeamOrbiters::is_orbiter(for_round, collator_id) { + MoonbeamOrbiters::distribute_rewards(for_round, collator_id, amount) + } else { + ParachainStaking::mint_collator_reward(for_round, collator_id, amount) + }; + + ::DbWeight::get() + .reads(1) + .saturating_add(extra_weight) + } +} + +type MonetaryGovernanceOrigin = + EitherOfDiverse, governance::custom_origins::GeneralAdmin>; + +impl pallet_parachain_staking::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type MonetaryGovernanceOrigin = MonetaryGovernanceOrigin; + /// Minimum round length is 2 minutes (10 * 12 second block times) + type MinBlocksPerRound = ConstU32<10>; + /// Rounds before the collator leaving the candidates request can be executed + type LeaveCandidatesDelay = ConstU32<24>; + /// Rounds before the candidate bond increase/decrease can be executed + type CandidateBondLessDelay = ConstU32<24>; + /// Rounds before the delegator exit can be executed + type LeaveDelegatorsDelay = ConstU32<24>; + /// Rounds before the delegator revocation can be executed + type RevokeDelegationDelay = ConstU32<24>; + /// Rounds before the delegator bond increase/decrease can be executed + type DelegationBondLessDelay = ConstU32<24>; + /// Rounds before the reward is paid + type RewardPaymentDelay = ConstU32<2>; + /// Minimum collators selected per round, default at genesis and minimum forever after + type MinSelectedCandidates = ConstU32<8>; + /// Maximum top delegations per candidate + type MaxTopDelegationsPerCandidate = ConstU32<300>; + /// Maximum bottom delegations per candidate + type MaxBottomDelegationsPerCandidate = ConstU32<50>; + /// Maximum delegations per delegator + type MaxDelegationsPerDelegator = ConstU32<100>; + /// Minimum stake required to be reserved to be a candidate + type MinCandidateStk = ConstU128<{ 10000 * currency::MOVR * currency::SUPPLY_FACTOR }>; + /// Minimum stake required to be reserved to be a delegator + type MinDelegation = ConstU128<{ 5 * currency::MOVR * currency::SUPPLY_FACTOR }>; + /// Minimum stake required to be reserved to be a delegator + type MinDelegatorStk = ConstU128<{ 5 * currency::MOVR * currency::SUPPLY_FACTOR }>; + type BlockAuthor = AuthorInherent; + type OnCollatorPayout = (); + type PayoutCollatorReward = PayoutCollatorOrOrbiterReward; + type OnNewRound = OnNewRound; + type WeightInfo = pallet_parachain_staking::weights::SubstrateWeight; +} + +impl pallet_author_inherent::Config for Runtime { + type SlotBeacon = RelaychainDataProvider; + type AccountLookup = MoonbeamOrbiters; + type CanAuthor = AuthorFilter; + type WeightInfo = pallet_author_inherent::weights::SubstrateWeight; +} + +impl pallet_author_slot_filter::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RandomnessSource = Randomness; + type PotentialAuthors = ParachainStaking; + type WeightInfo = pallet_author_slot_filter::weights::SubstrateWeight; +} + +parameter_types! { + pub const InitializationPayment: Perbill = Perbill::from_percent(30); + pub const RelaySignaturesThreshold: Perbill = Perbill::from_percent(100); + pub const SignatureNetworkIdentifier: &'static [u8] = b"moonriver-"; + +} + +impl pallet_crowdloan_rewards::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Initialized = ConstBool; + type InitializationPayment = InitializationPayment; + type MaxInitContributors = ConstU32<500>; + type MinimumReward = ConstU128<0>; + type RewardCurrency = Balances; + type RelayChainAccountId = [u8; 32]; + type RewardAddressAssociateOrigin = EnsureSigned; + type RewardAddressChangeOrigin = EnsureSigned; + type RewardAddressRelayVoteThreshold = RelaySignaturesThreshold; + type SignatureNetworkIdentifier = SignatureNetworkIdentifier; + type VestingBlockNumber = relay_chain::BlockNumber; + type VestingBlockProvider = RelaychainDataProvider; + type WeightInfo = pallet_crowdloan_rewards::weights::SubstrateWeight; +} + +// This is a simple session key manager. It should probably either work with, or be replaced +// entirely by pallet sessions +impl pallet_author_mapping::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type DepositCurrency = Balances; + type DepositAmount = ConstU128<{ 100 * currency::MOVR * currency::SUPPLY_FACTOR }>; + type Keys = session_keys_primitives::VrfId; + type WeightInfo = pallet_author_mapping::weights::SubstrateWeight; +} + +/// The type used to represent the kinds of proxying allowed. +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +#[derive( + Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, MaxEncodedLen, TypeInfo, +)] +pub enum ProxyType { + /// All calls can be proxied. This is the trivial/most permissive filter. + Any = 0, + /// Only extrinsics that do not transfer funds. + NonTransfer = 1, + /// Only extrinsics related to governance (democracy and collectives). + Governance = 2, + /// Only extrinsics related to staking. + Staking = 3, + /// Allow to veto an announced proxy call. + CancelProxy = 4, + /// Allow extrinsic related to Balances. + Balances = 5, + /// Allow extrinsic related to AuthorMapping. + AuthorMapping = 6, + /// Allow extrinsic related to IdentityJudgement. + IdentityJudgement = 7, +} + +impl Default for ProxyType { + fn default() -> Self { + Self::Any + } +} + +fn is_governance_precompile(precompile_name: &precompiles::PrecompileName) -> bool { + matches!( + precompile_name, + PrecompileName::DemocracyPrecompile + | PrecompileName::CouncilInstance + | PrecompileName::TechCommitteeInstance + | PrecompileName::TreasuryCouncilInstance + | PrecompileName::PreimagePrecompile + | PrecompileName::ReferendaPrecompile + | PrecompileName::ConvictionVotingPrecompile + | PrecompileName::OpenTechCommitteeInstance + ) +} + +// Be careful: Each time this filter is modified, the substrate filter must also be modified +// consistently. +impl pallet_evm_precompile_proxy::EvmProxyCallFilter for ProxyType { + fn is_evm_proxy_call_allowed( + &self, + call: &pallet_evm_precompile_proxy::EvmSubCall, + recipient_has_code: bool, + gas: u64, + ) -> precompile_utils::EvmResult { + Ok(match self { + ProxyType::Any => { + match PrecompileName::from_address(call.to.0) { + // Any precompile that can execute a subcall should be forbidden here, + // to ensure that unauthorized smart contract can't be called + // indirectly. + // To be safe, we only allow the precompiles we need. + Some( + PrecompileName::AuthorMappingPrecompile + | PrecompileName::ParachainStakingPrecompile, + ) => true, + Some(ref precompile) if is_governance_precompile(precompile) => true, + // All non-whitelisted precompiles are forbidden + Some(_) => false, + // Allow evm transfer to "simple" account (no code nor precompile) + // For the moment, no smart contract other than precompiles is allowed. + // In the future, we may create a dynamic whitelist to authorize some audited + // smart contracts through governance. + None => { + // If the address is not recognized, allow only evm transfert to "simple" + // accounts (no code nor precompile). + // Note: Checking the presence of the code is not enough because some + // precompiles have no code. + !recipient_has_code + && !precompile_utils::precompile_set::is_precompile_or_fail::( + call.to.0, gas, + )? + } + } + } + ProxyType::NonTransfer => { + call.value == U256::zero() + && match PrecompileName::from_address(call.to.0) { + Some( + PrecompileName::AuthorMappingPrecompile + | PrecompileName::ParachainStakingPrecompile, + ) => true, + Some(ref precompile) if is_governance_precompile(precompile) => true, + _ => false, + } + } + ProxyType::Governance => { + call.value == U256::zero() + && matches!( + PrecompileName::from_address(call.to.0), + Some(ref precompile) if is_governance_precompile(precompile) + ) + } + ProxyType::Staking => { + call.value == U256::zero() + && matches!( + PrecompileName::from_address(call.to.0), + Some( + PrecompileName::AuthorMappingPrecompile + | PrecompileName::ParachainStakingPrecompile + ) + ) + } + // The proxy precompile does not contain method cancel_proxy + ProxyType::CancelProxy => false, + ProxyType::Balances => { + // Allow only "simple" accounts as recipient (no code nor precompile). + // Note: Checking the presence of the code is not enough because some precompiles + // have no code. + !recipient_has_code + && !precompile_utils::precompile_set::is_precompile_or_fail::( + call.to.0, gas, + )? + } + ProxyType::AuthorMapping => { + call.value == U256::zero() + && matches!( + PrecompileName::from_address(call.to.0), + Some(PrecompileName::AuthorMappingPrecompile) + ) + } + // There is no identity precompile + ProxyType::IdentityJudgement => false, + }) + } +} + +// Be careful: Each time this filter is modified, the EVM filter must also be modified consistently. +impl InstanceFilter for ProxyType { + fn filter(&self, c: &RuntimeCall) -> bool { + match self { + ProxyType::Any => true, + ProxyType::NonTransfer => { + matches!( + c, + RuntimeCall::System(..) + | RuntimeCall::ParachainSystem(..) + | RuntimeCall::Timestamp(..) + | RuntimeCall::ParachainStaking(..) + | RuntimeCall::Democracy(..) + | RuntimeCall::Referenda(..) + | RuntimeCall::Preimage(..) + | RuntimeCall::ConvictionVoting(..) + | RuntimeCall::CouncilCollective(..) + | RuntimeCall::TreasuryCouncilCollective(..) + | RuntimeCall::TechCommitteeCollective(..) + | RuntimeCall::OpenTechCommitteeCollective(..) + | RuntimeCall::Identity(..) + | RuntimeCall::Utility(..) + | RuntimeCall::Proxy(..) | RuntimeCall::AuthorMapping(..) + | RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::claim { .. } + ) + ) + } + ProxyType::Governance => matches!( + c, + RuntimeCall::Democracy(..) + | RuntimeCall::Referenda(..) + | RuntimeCall::Preimage(..) + | RuntimeCall::ConvictionVoting(..) + | RuntimeCall::CouncilCollective(..) + | RuntimeCall::TreasuryCouncilCollective(..) + | RuntimeCall::TechCommitteeCollective(..) + | RuntimeCall::OpenTechCommitteeCollective(..) + | RuntimeCall::Utility(..) + ), + ProxyType::Staking => matches!( + c, + RuntimeCall::ParachainStaking(..) + | RuntimeCall::Utility(..) + | RuntimeCall::AuthorMapping(..) + | RuntimeCall::MoonbeamOrbiters(..) + ), + ProxyType::CancelProxy => matches!( + c, + RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) + ), + ProxyType::Balances => { + matches!(c, RuntimeCall::Balances(..) | RuntimeCall::Utility(..)) + } + ProxyType::AuthorMapping => matches!(c, RuntimeCall::AuthorMapping(..)), + ProxyType::IdentityJudgement => matches!( + c, + RuntimeCall::Identity(pallet_identity::Call::provide_judgement { .. }) + | RuntimeCall::Utility(..) + ), + } + } + + fn is_superset(&self, o: &Self) -> bool { + match (self, o) { + (x, y) if x == y => true, + (ProxyType::Any, _) => true, + (_, ProxyType::Any) => false, + _ => false, + } + } +} + +impl pallet_proxy::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type Currency = Balances; + type ProxyType = ProxyType; + // One storage item; key size 32, value size 8 + type ProxyDepositBase = ConstU128<{ currency::deposit(1, 8) }>; + // Additional storage item size of 21 bytes (20 bytes AccountId + 1 byte sizeof(ProxyType)). + type ProxyDepositFactor = ConstU128<{ currency::deposit(0, 21) }>; + type MaxProxies = ConstU32<32>; + type WeightInfo = pallet_proxy::weights::SubstrateWeight; + type MaxPending = ConstU32<32>; + type CallHasher = BlakeTwo256; + type AnnouncementDepositBase = ConstU128<{ currency::deposit(1, 8) }>; + // Additional storage item size of 56 bytes: + // - 20 bytes AccountId + // - 32 bytes Hasher (Blake2256) + // - 4 bytes BlockNumber (u32) + type AnnouncementDepositFactor = ConstU128<{ currency::deposit(0, 56) }>; +} + +impl pallet_migrations::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type MigrationsList = ( + moonbeam_runtime_common::migrations::CommonMigrations< + Runtime, + CouncilCollective, + TechCommitteeCollective, + >, + moonbeam_runtime_common::migrations::ReferendaMigrations< + Runtime, + CouncilCollective, + TechCommitteeCollective, + >, + ); + type XcmExecutionManager = XcmExecutionManager; + type WeightInfo = pallet_migrations::weights::SubstrateWeight; +} + +/// Maintenance mode Call filter +pub struct MaintenanceFilter; +impl Contains for MaintenanceFilter { + fn contains(c: &RuntimeCall) -> bool { + match c { + RuntimeCall::Assets(_) => false, + RuntimeCall::LocalAssets(_) => false, + RuntimeCall::Balances(_) => false, + RuntimeCall::CrowdloanRewards(_) => false, + RuntimeCall::Ethereum(_) => false, + RuntimeCall::EVM(_) => false, + RuntimeCall::Identity(_) => false, + RuntimeCall::XTokens(_) => false, + RuntimeCall::ParachainStaking(_) => false, + RuntimeCall::MoonbeamOrbiters(_) => false, + RuntimeCall::PolkadotXcm(_) => false, + RuntimeCall::Treasury(_) => false, + RuntimeCall::XcmTransactor(_) => false, + RuntimeCall::EthereumXcm(_) => false, + _ => true, + } + } +} + +/// Normal Call Filter +/// We dont allow to create nor mint assets, this for now is disabled +/// We only allow transfers. For now creation of assets will go through +/// asset-manager, while minting/burning only happens through xcm messages +/// This can change in the future +pub struct NormalFilter; +impl Contains for NormalFilter { + fn contains(c: &RuntimeCall) -> bool { + match c { + RuntimeCall::Assets(method) => match method { + pallet_assets::Call::transfer { .. } => true, + pallet_assets::Call::transfer_keep_alive { .. } => true, + pallet_assets::Call::approve_transfer { .. } => true, + pallet_assets::Call::transfer_approved { .. } => true, + pallet_assets::Call::cancel_approval { .. } => true, + pallet_assets::Call::destroy_accounts { .. } => true, + pallet_assets::Call::destroy_approvals { .. } => true, + pallet_assets::Call::finish_destroy { .. } => true, + _ => false, + }, + // We want to disable create, as we dont want users to be choosing the + // assetId of their choice + // We also disable destroy, as we want to route destroy through the + // asset-manager, which guarantees the removal both at the EVM and + // substrate side of things + RuntimeCall::LocalAssets(method) => match method { + pallet_assets::Call::create { .. } => false, + pallet_assets::Call::start_destroy { .. } => false, + _ => true, + }, + // We just want to enable this in case of live chains, since the default version + // is populated at genesis + RuntimeCall::PolkadotXcm(method) => match method { + pallet_xcm::Call::force_default_xcm_version { .. } => true, + _ => false, + }, + // We filter anonymous proxy as they make "reserve" inconsistent + // See: https://github.com/paritytech/substrate/blob/37cca710eed3dadd4ed5364c7686608f5175cce1/frame/proxy/src/lib.rs#L270 // editorconfig-checker-disable-line + RuntimeCall::Proxy(method) => match method { + pallet_proxy::Call::create_pure { .. } => false, + pallet_proxy::Call::kill_pure { .. } => false, + _ => true, + }, + // Filtering the EVM prevents possible re-entrancy from the precompiles which could + // lead to unexpected scenarios. + // See https://github.com/PureStake/sr-moonbeam/issues/30 + // Note: It is also assumed that EVM calls are only allowed through `Origin::Root` so + // this can be seen as an additional security + RuntimeCall::EVM(_) => false, + _ => true, + } + } +} + +pub struct XcmExecutionManager; +impl xcm_primitives::PauseXcmExecution for XcmExecutionManager { + fn suspend_xcm_execution() -> DispatchResult { + XcmpQueue::suspend_xcm_execution(RuntimeOrigin::root()) + } + fn resume_xcm_execution() -> DispatchResult { + XcmpQueue::resume_xcm_execution(RuntimeOrigin::root()) + } +} + +pub struct NormalDmpHandler; +impl DmpMessageHandler for NormalDmpHandler { + // This implementation makes messages be queued + // Since the limit is 0, messages are queued for next iteration + fn handle_dmp_messages( + iter: impl Iterator)>, + limit: Weight, + ) -> Weight { + (if Migrations::should_pause_xcm() { + DmpQueue::handle_dmp_messages(iter, Weight::zero()) + } else { + DmpQueue::handle_dmp_messages(iter, limit) + }) + ::DbWeight::get().reads(1) + } +} + +pub struct MaintenanceDmpHandler; +impl DmpMessageHandler for MaintenanceDmpHandler { + // This implementation makes messages be queued + // Since the limit is 0, messages are queued for next iteration + fn handle_dmp_messages( + iter: impl Iterator)>, + _limit: Weight, + ) -> Weight { + DmpQueue::handle_dmp_messages(iter, Weight::zero()) + } +} + +/// The hooks we wantt to run in Maintenance Mode +pub struct MaintenanceHooks; + +impl OnInitialize for MaintenanceHooks { + fn on_initialize(n: BlockNumber) -> Weight { + AllPalletsWithSystem::on_initialize(n) + } +} + +// return 0 +// For some reason using empty tuple () isnt working +// There exist only two pallets that use onIdle and these are xcmp and dmp queues +// For some reason putting an empty tumple does not work (transaction never finishes) +// We use an empty onIdle, if on the future we want one of the pallets to execute it +// we need to provide it here +impl OnIdle for MaintenanceHooks { + fn on_idle(_n: BlockNumber, _max_weight: Weight) -> Weight { + Weight::zero() + } +} + +impl OnRuntimeUpgrade for MaintenanceHooks { + fn on_runtime_upgrade() -> Weight { + AllPalletsWithSystem::on_runtime_upgrade() + } + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, &'static str> { + AllPalletsWithSystem::pre_upgrade() + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(state: Vec) -> Result<(), &'static str> { + AllPalletsWithSystem::post_upgrade(state) + } +} + +impl OnFinalize for MaintenanceHooks { + fn on_finalize(n: BlockNumber) { + AllPalletsWithSystem::on_finalize(n) + } +} + +impl OffchainWorker for MaintenanceHooks { + fn offchain_worker(n: BlockNumber) { + AllPalletsWithSystem::offchain_worker(n) + } +} + +impl pallet_maintenance_mode::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type NormalCallFilter = NormalFilter; + type MaintenanceCallFilter = MaintenanceFilter; + type MaintenanceOrigin = + pallet_collective::EnsureProportionAtLeast; + type XcmExecutionManager = XcmExecutionManager; + type NormalDmpHandler = NormalDmpHandler; + type MaintenanceDmpHandler = MaintenanceDmpHandler; + // We use AllPalletsWithSystem because we dont want to change the hooks in normal + // operation + type NormalExecutiveHooks = AllPalletsWithSystem; + type MaintenanceExecutiveHooks = MaintenanceHooks; +} + +impl pallet_proxy_genesis_companion::Config for Runtime { + type ProxyType = ProxyType; +} + +parameter_types! { + pub OrbiterReserveIdentifier: [u8; 4] = [b'o', b'r', b'b', b'i']; +} + +type AddCollatorOrigin = + EitherOfDiverse, governance::custom_origins::GeneralAdmin>; +type DelCollatorOrigin = + EitherOfDiverse, governance::custom_origins::GeneralAdmin>; + +impl pallet_moonbeam_orbiters::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type AccountLookup = AuthorMapping; + type AddCollatorOrigin = AddCollatorOrigin; + type Currency = Balances; + type DelCollatorOrigin = DelCollatorOrigin; + /// Maximum number of orbiters per collator + type MaxPoolSize = ConstU32<8>; + /// Maximum number of round to keep on storage + type MaxRoundArchive = ConstU32<4>; + type OrbiterReserveIdentifier = OrbiterReserveIdentifier; + type RotatePeriod = ConstU32<3>; + /// Round index type. + type RoundIndex = pallet_parachain_staking::RoundIndex; + type WeightInfo = pallet_moonbeam_orbiters::weights::SubstrateWeight; +} + +/// Only callable after `set_validation_data` is called which forms this proof the same way +fn relay_chain_state_proof() -> RelayChainStateProof { + let relay_storage_root = ParachainSystem::validation_data() + .expect("set in `set_validation_data`") + .relay_parent_storage_root; + let relay_chain_state = + ParachainSystem::relay_state_proof().expect("set in `set_validation_data`"); + RelayChainStateProof::new(ParachainInfo::get(), relay_storage_root, relay_chain_state) + .expect("Invalid relay chain state proof, already constructed in `set_validation_data`") +} + +pub struct BabeDataGetter; +impl pallet_randomness::GetBabeData> for BabeDataGetter { + // Tolerate panic here because only ever called in inherent (so can be omitted) + fn get_epoch_index() -> u64 { + if cfg!(feature = "runtime-benchmarks") { + // storage reads as per actual reads + let _relay_storage_root = ParachainSystem::validation_data(); + let _relay_chain_state = ParachainSystem::relay_state_proof(); + const BENCHMARKING_NEW_EPOCH: u64 = 10u64; + return BENCHMARKING_NEW_EPOCH; + } + relay_chain_state_proof() + .read_optional_entry(relay_chain::well_known_keys::EPOCH_INDEX) + .ok() + .flatten() + .expect("expected to be able to read epoch index from relay chain state proof") + } + fn get_epoch_randomness() -> Option { + if cfg!(feature = "runtime-benchmarks") { + // storage reads as per actual reads + let _relay_storage_root = ParachainSystem::validation_data(); + let _relay_chain_state = ParachainSystem::relay_state_proof(); + let benchmarking_babe_output = Hash::default(); + return Some(benchmarking_babe_output); + } + relay_chain_state_proof() + .read_optional_entry(relay_chain::well_known_keys::ONE_EPOCH_AGO_RANDOMNESS) + .ok() + .flatten() + } +} + +impl pallet_randomness::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type AddressMapping = moonbeam_runtime_common::IntoAddressMapping; + type Currency = Balances; + type BabeDataGetter = BabeDataGetter; + type VrfKeyLookup = AuthorMapping; + type Deposit = ConstU128<{ 1 * currency::MOVR * currency::SUPPLY_FACTOR }>; + type MaxRandomWords = ConstU8<100>; + type MinBlockDelay = ConstU32<2>; + type MaxBlockDelay = ConstU32<2_000>; + type BlockExpirationDelay = ConstU32<10_000>; + type EpochExpirationDelay = ConstU64<10_000>; + type WeightInfo = pallet_randomness::weights::SubstrateWeight; +} + +impl pallet_root_testing::Config for Runtime {} + +parameter_types! { + // One storage item; key size is 32 + 20; value is size 4+4+16+20 bytes = 44 bytes. + pub const DepositBase: Balance = currency::deposit(1, 96); + // Additional storage item size of 20 bytes. + pub const DepositFactor: Balance = currency::deposit(0, 20); + pub const MaxSignatories: u32 = 100; +} + +impl pallet_multisig::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type Currency = Balances; + type DepositBase = DepositBase; + type DepositFactor = DepositFactor; + type MaxSignatories = MaxSignatories; + type WeightInfo = pallet_multisig::weights::SubstrateWeight; +} + +construct_runtime! { + pub enum Runtime where + Block = Block, + NodeBlock = opaque::Block, + UncheckedExtrinsic = UncheckedExtrinsic + { + // System support stuff. + System: frame_system::{Pallet, Call, Storage, Config, Event} = 0, + ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Storage, Inherent, Event} = 1, + // Previously 2: pallet_randomness_collective_flip + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 3, + ParachainInfo: parachain_info::{Pallet, Storage, Config} = 4, + RootTesting: pallet_root_testing::{Pallet, Call, Storage} = 5, + + // Monetary stuff. + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, + TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Config, Event} = 11, + + // Consensus support. + ParachainStaking: pallet_parachain_staking::{Pallet, Call, Storage, Event, Config} = 20, + AuthorInherent: pallet_author_inherent::{Pallet, Call, Storage, Inherent} = 21, + AuthorFilter: pallet_author_slot_filter::{Pallet, Call, Storage, Event, Config} = 22, + AuthorMapping: pallet_author_mapping::{Pallet, Call, Config, Storage, Event} = 23, + MoonbeamOrbiters: pallet_moonbeam_orbiters::{Pallet, Call, Storage, Event} = 24, + + // Handy utilities. + Utility: pallet_utility::{Pallet, Call, Event} = 30, + Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 31, + MaintenanceMode: pallet_maintenance_mode::{Pallet, Call, Config, Storage, Event} = 32, + Identity: pallet_identity::{Pallet, Call, Storage, Event} = 33, + Migrations: pallet_migrations::{Pallet, Call, Storage, Config, Event} = 34, + ProxyGenesisCompanion: pallet_proxy_genesis_companion::{Pallet, Config} = 35, + Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 36, + + // Sudo was previously index 40 + + // Ethereum compatibility + EthereumChainId: pallet_ethereum_chain_id::{Pallet, Storage, Config} = 50, + EVM: pallet_evm::{Pallet, Config, Call, Storage, Event} = 51, + Ethereum: pallet_ethereum::{Pallet, Call, Storage, Event, Origin, Config} = 52, + + // Governance stuff. + Scheduler: pallet_scheduler::{Pallet, Storage, Event, Call} = 60, + Democracy: pallet_democracy::{Pallet, Storage, Config, Event, Call} = 61, + Preimage: pallet_preimage::{Pallet, Call, Storage, Event} = 62, + ConvictionVoting: pallet_conviction_voting::{Pallet, Call, Storage, Event} = 63, + Referenda: pallet_referenda::{Pallet, Call, Storage, Event} = 64, + Origins: governance::custom_origins::{Origin} = 65, + Whitelist: pallet_whitelist::{Pallet, Call, Storage, Event} = 66, + + // Council stuff. + CouncilCollective: + pallet_collective::::{Pallet, Call, Storage, Event, Origin, Config} = 70, + TechCommitteeCollective: + pallet_collective::::{Pallet, Call, Storage, Event, Origin, Config} = 71, + TreasuryCouncilCollective: + pallet_collective::::{Pallet, Call, Storage, Event, Origin, Config} = 72, + OpenTechCommitteeCollective: + pallet_collective::::{Pallet, Call, Storage, Event, Origin, Config} = 73, + + // Treasury stuff. + Treasury: pallet_treasury::{Pallet, Storage, Config, Event, Call} = 80, + + // Crowdloan stuff. + CrowdloanRewards: pallet_crowdloan_rewards::{Pallet, Call, Config, Storage, Event} = 90, + + // XCM Stuff + XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Storage, Event} = 100, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 101, + DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 102, + PolkadotXcm: pallet_xcm::{Pallet, Storage, Call, Event, Origin, Config} = 103, + Assets: pallet_assets::{Pallet, Call, Storage, Event} = 104, + AssetManager: pallet_asset_manager::{Pallet, Call, Storage, Event} = 105, + XTokens: orml_xtokens::{Pallet, Call, Storage, Event} = 106, + XcmTransactor: pallet_xcm_transactor::{Pallet, Call, Storage, Event} = 107, + LocalAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 108, + EthereumXcm: pallet_ethereum_xcm::{Pallet, Call, Storage, Origin} = 109, + Erc20XcmBridge: pallet_erc20_xcm_bridge::{Pallet} = 110, + + // Randomness + Randomness: pallet_randomness::{Pallet, Call, Storage, Event, Inherent} = 120, + } +} + +/// Block type as expected by this runtime. +pub type Block = generic::Block; +/// A Block signed with a Justification +pub type SignedBlock = generic::SignedBlock; +/// BlockId type as expected by this runtime. +pub type BlockId = generic::BlockId; + +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + frame_system::CheckNonZeroSender, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckEra, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, +); +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = + fp_self_contained::UncheckedExtrinsic; +/// Extrinsic type that has already been checked. +pub type CheckedExtrinsic = + fp_self_contained::CheckedExtrinsic; +/// Executive: handles dispatch to the various pallets. +pub type Executive = frame_executive::Executive< + Runtime, + Block, + frame_system::ChainContext, + Runtime, + pallet_maintenance_mode::ExecutiveHooks, +>; + +// All of our runtimes share most of their Runtime API implementations. +// We use a macro to implement this common part and add runtime-specific additional implementations. +// This macro expands to : +// ``` +// impl_runtime_apis! { +// // All impl blocks shared between all runtimes. +// +// // Specific impls provided to the `impl_runtime_apis_plus_common!` macro. +// } +// ``` +moonbeam_runtime_common::impl_runtime_apis_plus_common! { + impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + xt: ::Extrinsic, + block_hash: ::Hash, + ) -> TransactionValidity { + // Filtered calls should not enter the tx pool as they'll fail if inserted. + // If this call is not allowed, we return early. + if !::BaseCallFilter::contains(&xt.0.function) { + return InvalidTransaction::Call.into(); + } + + // This runtime uses Substrate's pallet transaction payment. This + // makes the chain feel like a standard Substrate chain when submitting + // frame transactions and using Substrate ecosystem tools. It has the downside that + // transaction are not prioritized by gas_price. The following code reprioritizes + // transactions to overcome this. + // + // A more elegant, ethereum-first solution is + // a pallet that replaces pallet transaction payment, and allows users + // to directly specify a gas price rather than computing an effective one. + // #HopefullySomeday + + // First we pass the transactions to the standard FRAME executive. This calculates all the + // necessary tags, longevity and other properties that we will leave unchanged. + // This also assigns some priority that we don't care about and will overwrite next. + let mut intermediate_valid = Executive::validate_transaction(source, xt.clone(), block_hash)?; + + let dispatch_info = xt.get_dispatch_info(); + + // If this is a pallet ethereum transaction, then its priority is already set + // according to gas price from pallet ethereum. If it is any other kind of transaction, + // we modify its priority. + Ok(match &xt.0.function { + RuntimeCall::Ethereum(transact { .. }) => intermediate_valid, + _ if dispatch_info.class != DispatchClass::Normal => intermediate_valid, + _ => { + let tip = match xt.0.signature { + None => 0, + Some((_, _, ref signed_extra)) => { + // Yuck, this depends on the index of charge transaction in Signed Extra + let charge_transaction = &signed_extra.7; + charge_transaction.tip() + } + }; + + // Calculate the fee that will be taken by pallet transaction payment + let fee: u64 = TransactionPayment::compute_fee( + xt.encode().len() as u32, + &dispatch_info, + tip, + ).saturated_into(); + + // Calculate how much gas this effectively uses according to the existing mapping + let effective_gas = + ::GasWeightMapping::weight_to_gas( + dispatch_info.weight + ); + + // Here we calculate an ethereum-style effective gas price using the + // current fee of the transaction. Because the weight -> gas conversion is + // lossy, we have to handle the case where a very low weight maps to zero gas. + let effective_gas_price = if effective_gas > 0 { + fee / effective_gas + } else { + // If the effective gas was zero, we just act like it was 1. + fee + }; + + // Overwrite the original prioritization with this ethereum one + intermediate_valid.priority = effective_gas_price; + intermediate_valid + } + }) + } + } +} + +// Check the timestamp and parachain inherents +struct CheckInherents; + +impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { + fn check_inherents( + block: &Block, + relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, + ) -> sp_inherents::CheckInherentsResult { + let relay_chain_slot = relay_state_proof + .read_slot() + .expect("Could not read the relay chain slot from the proof"); + + let inherent_data = + cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( + relay_chain_slot, + sp_std::time::Duration::from_secs(6), + ) + .create_inherent_data() + .expect("Could not create the timestamp inherent data"); + + inherent_data.check_extrinsics(&block) + } +} + +// Nimbus's Executive wrapper allows relay validators to verify the seal digest +cumulus_pallet_parachain_system::register_validate_block!( + Runtime = Runtime, + BlockExecutor = pallet_author_inherent::BlockExecutor::, + CheckInherents = CheckInherents, +); + +moonbeam_runtime_common::impl_self_contained_call!(); + +// Shorthand for a Get field of a pallet Config. +#[macro_export] +macro_rules! get { + ($pallet:ident, $name:ident, $type:ty) => { + <<$crate::Runtime as $pallet::Config>::$name as $crate::Get<$type>>::get() + }; +} + +#[cfg(test)] +mod tests { + use super::{currency::*, *}; + + #[test] + // Helps us to identify a Pallet Call in case it exceeds the 1kb limit. + // Hint: this should be a rare case. If that happens, one or more of the dispatchable arguments + // need to be Boxed. + fn call_max_size() { + const CALL_ALIGN: u32 = 1024; + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!(std::mem::size_of::>() <= CALL_ALIGN as usize); + assert!(std::mem::size_of::>() <= CALL_ALIGN as usize); + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!(std::mem::size_of::>() <= CALL_ALIGN as usize); + assert!( + std::mem::size_of::>() <= CALL_ALIGN as usize + ); + assert!(std::mem::size_of::>() <= CALL_ALIGN as usize); + assert!( + std::mem::size_of::>() + <= CALL_ALIGN as usize + ); + } + + #[test] + fn currency_constants_are_correct() { + assert_eq!(SUPPLY_FACTOR, 1); + + // txn fees + assert_eq!(TRANSACTION_BYTE_FEE, Balance::from(1 * GIGAWEI)); + assert_eq!( + get!(pallet_transaction_payment, OperationalFeeMultiplier, u8), + 5_u8 + ); + assert_eq!(STORAGE_BYTE_FEE, Balance::from(100 * MICROMOVR)); + + // democracy minimums + assert_eq!( + get!(pallet_democracy, MinimumDeposit, u128), + Balance::from(4 * MOVR) + ); + assert_eq!( + get!(pallet_preimage, ByteDeposit, u128), + Balance::from(100 * MICROMOVR) + ); + assert_eq!( + get!(pallet_treasury, ProposalBondMinimum, u128), + Balance::from(1 * MOVR) + ); + + // pallet_identity deposits + assert_eq!( + get!(pallet_identity, BasicDeposit, u128), + Balance::from(1 * MOVR + 25800 * MICROMOVR) + ); + assert_eq!( + get!(pallet_identity, FieldDeposit, u128), + Balance::from(6600 * MICROMOVR) + ); + assert_eq!( + get!(pallet_identity, SubAccountDeposit, u128), + Balance::from(1 * MOVR + 5300 * MICROMOVR) + ); + + // staking minimums + assert_eq!( + get!(pallet_parachain_staking, MinCandidateStk, u128), + Balance::from(10 * KILOMOVR) + ); + assert_eq!( + get!(pallet_parachain_staking, MinDelegation, u128), + Balance::from(5 * MOVR) + ); + assert_eq!( + get!(pallet_parachain_staking, MinDelegatorStk, u128), + Balance::from(5 * MOVR) + ); + + // crowdloan min reward + assert_eq!( + get!(pallet_crowdloan_rewards, MinimumReward, u128), + Balance::from(0u128) + ); + + // deposit for AuthorMapping + assert_eq!( + get!(pallet_author_mapping, DepositAmount, u128), + Balance::from(100 * MOVR) + ); + + // proxy deposits + assert_eq!( + get!(pallet_proxy, ProxyDepositBase, u128), + Balance::from(1 * MOVR + 800 * MICROMOVR) + ); + assert_eq!( + get!(pallet_proxy, ProxyDepositFactor, u128), + Balance::from(2100 * MICROMOVR) + ); + assert_eq!( + get!(pallet_proxy, AnnouncementDepositBase, u128), + Balance::from(1 * MOVR + 800 * MICROMOVR) + ); + assert_eq!( + get!(pallet_proxy, AnnouncementDepositFactor, u128), + Balance::from(5600 * MICROMOVR) + ); + } + + #[test] + // Required migration is + // pallet_parachain_staking::migrations::IncreaseMaxTopDelegationsPerCandidate + // Purpose of this test is to remind of required migration if constant is ever changed + fn updating_maximum_delegators_per_candidate_requires_configuring_required_migration() { + assert_eq!( + get!(pallet_parachain_staking, MaxTopDelegationsPerCandidate, u32), + 300 + ); + assert_eq!( + get!( + pallet_parachain_staking, + MaxBottomDelegationsPerCandidate, + u32 + ), + 50 + ); + } + + #[test] + fn configured_base_extrinsic_weight_is_evm_compatible() { + let min_ethereum_transaction_weight = WeightPerGas::get() * 21_000; + let base_extrinsic = ::BlockWeights::get() + .get(frame_support::dispatch::DispatchClass::Normal) + .base_extrinsic; + assert!(base_extrinsic.ref_time() <= min_ethereum_transaction_weight.ref_time()); + } +} diff --git a/tracing/2402/runtime/moonriver/src/precompiles.rs b/tracing/2402/runtime/moonriver/src/precompiles.rs new file mode 100644 index 0000000..c0380a4 --- /dev/null +++ b/tracing/2402/runtime/moonriver/src/precompiles.rs @@ -0,0 +1,263 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +use crate::{ + asset_config::{ForeignAssetInstance, LocalAssetInstance}, + xcm_config::XcmExecutorConfig, + CouncilInstance, OpenTechCommitteeInstance, TechCommitteeInstance, TreasuryCouncilInstance, +}; +use frame_support::parameter_types; +use moonbeam_relay_encoder::kusama::KusamaEncoder; +use pallet_evm_precompile_author_mapping::AuthorMappingPrecompile; +use pallet_evm_precompile_balances_erc20::{Erc20BalancesPrecompile, Erc20Metadata}; +use pallet_evm_precompile_batch::BatchPrecompile; +use pallet_evm_precompile_blake2::Blake2F; +use pallet_evm_precompile_bn128::{Bn128Add, Bn128Mul, Bn128Pairing}; +use pallet_evm_precompile_call_permit::CallPermitPrecompile; +use pallet_evm_precompile_collective::CollectivePrecompile; +use pallet_evm_precompile_conviction_voting::ConvictionVotingPrecompile; +use pallet_evm_precompile_crowdloan_rewards::CrowdloanRewardsPrecompile; +use pallet_evm_precompile_democracy::DemocracyPrecompile; +use pallet_evm_precompile_gmp::GmpPrecompile; +use pallet_evm_precompile_modexp::Modexp; +use pallet_evm_precompile_parachain_staking::ParachainStakingPrecompile; +use pallet_evm_precompile_preimage::PreimagePrecompile; +use pallet_evm_precompile_proxy::{OnlyIsProxyAndProxy, ProxyPrecompile}; +use pallet_evm_precompile_randomness::RandomnessPrecompile; +use pallet_evm_precompile_referenda::ReferendaPrecompile; +use pallet_evm_precompile_registry::PrecompileRegistry; +use pallet_evm_precompile_relay_encoder::RelayEncoderPrecompile; +use pallet_evm_precompile_sha3fips::Sha3FIPS256; +use pallet_evm_precompile_simple::{ECRecover, ECRecoverPublicKey, Identity, Ripemd160, Sha256}; +use pallet_evm_precompile_xcm_transactor::{ + v1::XcmTransactorPrecompileV1, v2::XcmTransactorPrecompileV2, +}; +use pallet_evm_precompile_xcm_utils::XcmUtilsPrecompile; +use pallet_evm_precompile_xtokens::XtokensPrecompile; +use pallet_evm_precompileset_assets_erc20::{Erc20AssetsPrecompileSet, IsForeign, IsLocal}; +use precompile_utils::precompile_set::*; + +pub struct NativeErc20Metadata; + +/// ERC20 metadata for the native token. +impl Erc20Metadata for NativeErc20Metadata { + /// Returns the name of the token. + fn name() -> &'static str { + "MOVR token" + } + + /// Returns the symbol of the token. + fn symbol() -> &'static str { + "MOVR" + } + + /// Returns the decimals places of the token. + fn decimals() -> u8 { + 18 + } + + /// Must return `true` only if it represents the main native currency of + /// the network. It must be the currency used in `pallet_evm`. + fn is_native_currency() -> bool { + true + } +} + +/// The asset precompile address prefix. Addresses that match against this prefix will be routed +/// to Erc20AssetsPrecompileSet being marked as foreign +pub const FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX: &[u8] = &[255u8; 4]; +/// The asset precompile address prefix. Addresses that match against this prefix will be routed +/// to Erc20AssetsPrecompileSet being marked as local +pub const LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX: &[u8] = &[255u8, 255u8, 255u8, 254u8]; + +parameter_types! { + pub ForeignAssetPrefix: &'static [u8] = FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX; + pub LocalAssetPrefix: &'static [u8] = LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX; +} + +type EthereumPrecompilesChecks = (AcceptDelegateCall, CallableByContract, CallableByPrecompile); + +#[precompile_utils::precompile_name_from_address] +type MoonriverPrecompilesAt = ( + // Ethereum precompiles: + // We allow DELEGATECALL to stay compliant with Ethereum behavior. + PrecompileAt, ECRecover, EthereumPrecompilesChecks>, + PrecompileAt, Sha256, EthereumPrecompilesChecks>, + PrecompileAt, Ripemd160, EthereumPrecompilesChecks>, + PrecompileAt, Identity, EthereumPrecompilesChecks>, + PrecompileAt, Modexp, EthereumPrecompilesChecks>, + PrecompileAt, Bn128Add, EthereumPrecompilesChecks>, + PrecompileAt, Bn128Mul, EthereumPrecompilesChecks>, + PrecompileAt, Bn128Pairing, EthereumPrecompilesChecks>, + PrecompileAt, Blake2F, EthereumPrecompilesChecks>, + // Non-Moonbeam specific nor Ethereum precompiles : + PrecompileAt, Sha3FIPS256, (CallableByContract, CallableByPrecompile)>, + RemovedPrecompileAt>, // Dispatch + PrecompileAt, ECRecoverPublicKey, (CallableByContract, CallableByPrecompile)>, + // Moonbeam specific precompiles: + PrecompileAt< + AddressU64<2048>, + ParachainStakingPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2049>, + CrowdloanRewardsPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2050>, + Erc20BalancesPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2051>, + DemocracyPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2052>, + XtokensPrecompile, + ( + SubcallWithMaxNesting<1>, + CallableByContract, + CallableByPrecompile, + ), + >, + PrecompileAt< + AddressU64<2053>, + RelayEncoderPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2054>, + XcmTransactorPrecompileV1, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2055>, + AuthorMappingPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2056>, + BatchPrecompile, + ( + SubcallWithMaxNesting<2>, + // Batch is the only precompile allowed to call Batch. + CallableByPrecompile>>, + ), + >, + PrecompileAt< + AddressU64<2057>, + RandomnessPrecompile, + (SubcallWithMaxNesting<0>, CallableByContract), + >, + PrecompileAt< + AddressU64<2058>, + CallPermitPrecompile, + (SubcallWithMaxNesting<0>, CallableByContract), + >, + PrecompileAt< + AddressU64<2059>, + ProxyPrecompile, + ( + CallableByContract>, + SubcallWithMaxNesting<0>, + // Batch is the only precompile allowed to call Proxy. + CallableByPrecompile>>, + ), + >, + PrecompileAt< + AddressU64<2060>, + XcmUtilsPrecompile, + CallableByContract< + pallet_evm_precompile_xcm_utils::AllExceptXcmExecute, + >, + >, + PrecompileAt< + AddressU64<2061>, + XcmTransactorPrecompileV2, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2062>, + CollectivePrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2063>, + CollectivePrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2064>, + CollectivePrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2065>, + ReferendaPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2066>, + ConvictionVotingPrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2067>, + PreimagePrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2068>, + CollectivePrecompile, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt< + AddressU64<2069>, + PrecompileRegistry, + (CallableByContract, CallableByPrecompile), + >, + PrecompileAt, GmpPrecompile, SubcallWithMaxNesting<0>>, +); + +/// The PrecompileSet installed in the Moonriver runtime. +/// We include the nine Istanbul precompiles +/// (https://github.com/ethereum/go-ethereum/blob/3c46f557/core/vm/contracts.go#L69) +/// The following distribution has been decided for the precompiles +/// 0-1023: Ethereum Mainnet Precompiles +/// 1024-2047 Precompiles that are not in Ethereum Mainnet but are neither Moonbeam specific +/// 2048-4095 Moonbeam specific precompiles +pub type MoonriverPrecompiles = PrecompileSetBuilder< + R, + ( + // Skip precompiles if out of range. + PrecompilesInRangeInclusive<(AddressU64<1>, AddressU64<4095>), MoonriverPrecompilesAt>, + // Prefixed precompile sets (XC20) + PrecompileSetStartingWith< + ForeignAssetPrefix, + Erc20AssetsPrecompileSet, + CallableByContract, + >, + PrecompileSetStartingWith< + LocalAssetPrefix, + Erc20AssetsPrecompileSet, + CallableByContract, + >, + ), +>; diff --git a/tracing/2402/runtime/moonriver/src/xcm_config.rs b/tracing/2402/runtime/moonriver/src/xcm_config.rs new file mode 100644 index 0000000..7b56034 --- /dev/null +++ b/tracing/2402/runtime/moonriver/src/xcm_config.rs @@ -0,0 +1,700 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! XCM configuration for Moonbase. +//! + +use super::{ + governance, AccountId, AssetId, AssetManager, Assets, Balance, Balances, DealWithFees, + Erc20XcmBridge, LocalAssets, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, + RuntimeEvent, RuntimeOrigin, Treasury, XcmpQueue, FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, +}; + +use pallet_evm_precompileset_assets_erc20::AccountIdAssetIdConversion; +use sp_runtime::{ + traits::{Hash as THash, PostDispatchInfoOf}, + DispatchErrorWithPostInfo, +}; + +use frame_support::{ + dispatch::Weight, + parameter_types, + traits::{EitherOfDiverse, Everything, Nothing, PalletInfoAccess}, +}; + +use frame_system::{EnsureRoot, RawOrigin}; +use sp_core::{ConstU32, H160, H256}; + +use xcm_builder::{ + AccountKey20Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, + AllowTopLevelPaidExecutionFrom, AsPrefixedGeneralIndex, ConvertedConcreteId, + CurrencyAdapter as XcmCurrencyAdapter, EnsureXcmOrigin, FungiblesAdapter, NoChecking, + ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountKey20AsNative, SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, + WeightInfoBounds, WithComputedOrigin, +}; + +use xcm::latest::prelude::*; +use xcm_executor::traits::{CallDispatcher, JustTry}; + +use orml_xcm_support::MultiNativeAsset; +use xcm_primitives::{ + AbsoluteAndRelativeReserve, AccountIdToCurrencyId, AccountIdToMultiLocation, AsAssetType, + FirstAssetTrader, SignedToAccountId20, UtilityAvailableCalls, UtilityEncodeCall, XcmTransact, +}; + +use parity_scale_codec::{Decode, Encode}; +use scale_info::TypeInfo; + +use sp_std::{ + convert::{From, Into, TryFrom}, + prelude::*, +}; + +use orml_traits::parameter_type_with_key; + +use crate::governance::referenda::GeneralAdminOrRoot; + +parameter_types! { + // The network Id of the relay + pub const RelayNetwork: NetworkId = NetworkId::Kusama; + // The relay chain Origin type + pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); + // The universal location within the global consensus system + pub UniversalLocation: InteriorMultiLocation = + X2(GlobalConsensus(RelayNetwork::get()), Parachain(ParachainInfo::parachain_id().into())); + + // Self Reserve location, defines the multilocation identifiying the self-reserve currency + // This is used to match it also against our Balances pallet when we receive such + // a MultiLocation: (Self Balances pallet index) + // We use the RELATIVE multilocation + pub SelfReserve: MultiLocation = MultiLocation { + parents:0, + interior: Junctions::X1( + PalletInstance(::index() as u8) + ) + }; + + // This is the relative view of our local assets. + // Indentified by thix prefix + generalIndex(assetId) + // We use the RELATIVE multilocation + pub LocalAssetsPalletLocation: MultiLocation = MultiLocation { + parents:0, + interior: Junctions::X1( + PalletInstance(::index() as u8) + ) + }; +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the default `AccountId`. + ParentIsPreset, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // If we receive a MultiLocation of type AccountKey20, just generate a native account + AccountKey20Aliases, + // Generate remote accounts according to polkadot standards + xcm_builder::HashedDescriptionDescribeFamilyAllTerminal, +); + +/// Wrapper type around `LocationToAccountId` to convert an `AccountId` to type `H160`. +pub struct LocationToH160; +impl xcm_executor::traits::Convert for LocationToH160 { + fn convert(location: MultiLocation) -> Result { + >::convert( + location, + ) + .map(Into::into) + } +} + +// The non-reserve fungible transactor type +// It will use pallet-assets, and the Id will be matched against AsAssetType +pub type ForeignFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + Assets, + // Use this currency when it is a fungible asset matching the given location or name: + ( + ConvertedConcreteId< + AssetId, + Balance, + AsAssetType, + JustTry, + >, + ), + // Do a simple punn to convert an AccountId20 MultiLocation into a native chain account ID: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont allow teleports. + NoChecking, + // We dont track any teleports + (), +>; + +/// The transactor for our own chain currency. +pub type LocalAssetTransactor = XcmCurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching any of the locations in + // SelfReserveRepresentations + xcm_builder::IsConcrete, + // We can convert the MultiLocations with our converter above: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont allow teleport + (), +>; + +/// Means for transacting local assets besides the native currency on this chain. +pub type LocalFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + LocalAssets, + // Use this currency when it is a fungible asset matching the given location or name: + ( + ConvertedConcreteId< + AssetId, + Balance, + // This just tells to convert an assetId into a GeneralIndex junction prepended + // by LocalAssetsPalletLocationNewReanchor + AsPrefixedGeneralIndex, + JustTry, + >, + ), + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont want to allow teleporting assets + NoChecking, + // The account to use for tracking teleports. + (), +>; + +// We use all transactors +// These correspond to +// SelfReserve asset, both pre and post 0.9.16 +// Foreign assets +// Local assets, both pre and post 0.9.16 +// We can remove the Old reanchor once +// we import https://github.com/open-web3-stack/open-runtime-module-library/pull/708 +pub type AssetTransactors = ( + LocalAssetTransactor, + ForeignFungiblesTransactor, + LocalFungiblesTransactor, + Erc20XcmBridge, +); + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can +/// biases the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain which they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when + // recognised. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognised. + SiblingParachainAsNative, + // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. + pallet_xcm::XcmPassthrough, + // Xcm Origins defined by a Multilocation of type AccountKey20 can be converted to a 20 byte- + // account local origin + SignedAccountKey20AsNative, +); + +parameter_types! { + /// The amount of weight an XCM operation takes. This is safe overestimate. + pub UnitWeightCost: Weight = Weight::from_parts(200_000_000u64, 0); + /// Maximum number of instructions in a single XCM fragment. A sanity check against + /// weight caculations getting too crazy. + pub MaxInstructions: u32 = 100; +} + +/// Xcm Weigher shared between multiple Xcm-related configs. +pub type XcmWeigher = WeightInfoBounds< + moonbeam_xcm_benchmarks::weights::XcmWeight, + RuntimeCall, + MaxInstructions, +>; + +pub type XcmBarrier = ( + // Weight that is paid for may be consumed. + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, +); + +parameter_types! { + /// Xcm fees will go to the treasury account + pub XcmFeesAccount: AccountId = Treasury::account_id(); +} + +/// This is the struct that will handle the revenue from xcm fees +/// We do not burn anything because we want to mimic exactly what +/// the sovereign account has +pub type XcmFeesToAccount = xcm_primitives::XcmFeesToAccount< + Assets, + ( + ConvertedConcreteId< + AssetId, + Balance, + AsAssetType, + JustTry, + >, + ), + AccountId, + XcmFeesAccount, +>; + +pub struct SafeCallFilter; +impl frame_support::traits::Contains for SafeCallFilter { + fn contains(_call: &RuntimeCall) -> bool { + // TODO review + // This needs to be addressed at EVM level + true + } +} + +parameter_types! { + pub const MaxAssetsIntoHolding: u32 = xcm_primitives::MAX_ASSETS; +} + +// Our implementation of the Moonbeam Call +// Attachs the right origin in case the call is made to pallet-ethereum-xcm +#[cfg(not(feature = "evm-tracing"))] +moonbeam_runtime_common::impl_moonbeam_xcm_call!(); +#[cfg(feature = "evm-tracing")] +moonbeam_runtime_common::impl_moonbeam_xcm_call_tracing!(); + +moonbeam_runtime_common::impl_evm_runner_precompile_or_eth_xcm!(); + +pub struct XcmExecutorConfig; +impl xcm_executor::Config for XcmExecutorConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + // How to withdraw and deposit an asset. + type AssetTransactor = AssetTransactors; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + // Filter to the reserve withdraw operations + // Whenever the reserve matches the relative or absolute value + // of our chain, we always return the relative reserve + type IsReserve = MultiNativeAsset>; + type IsTeleporter = (); // No teleport + type UniversalLocation = UniversalLocation; + type Barrier = XcmBarrier; + type Weigher = XcmWeigher; + // We use two traders + // When we receive the relative representation of the self-reserve asset, + // we use UsingComponents and the local way of handling fees + // When we receive a non-reserve asset, we use AssetManager to fetch how many + // units per second we should charge + type Trader = ( + UsingComponents< + ::WeightToFee, + SelfReserve, + AccountId, + Balances, + DealWithFees, + >, + FirstAssetTrader, + ); + type ResponseHandler = PolkadotXcm; + type SubscriptionService = PolkadotXcm; + type AssetTrap = pallet_erc20_xcm_bridge::AssetTrapWrapper; + type AssetClaims = PolkadotXcm; + type CallDispatcher = MoonbeamCall; + type PalletInstancesInfo = crate::AllPalletsWithSystem; + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type AssetLocker = (); + type AssetExchanger = (); + type FeeManager = (); + type MessageExporter = (); + type UniversalAliases = Nothing; + type SafeCallFilter = SafeCallFilter; + type AssetIsBurnable = Everything; +} + +type XcmExecutor = pallet_erc20_xcm_bridge::XcmExecutorWrapper< + RuntimeCall, + xcm_executor::XcmExecutor, +>; + +// Converts a Signed Local Origin into a MultiLocation +pub type LocalOriginToLocation = SignedToAccountId20; + +/// The means for routing XCM messages which are not for local execution into the right message +/// queues. +pub type XcmRouter = ( + // Two routers - use UMP to communicate with the relay chain: + cumulus_primitives_utility::ParentAsUmp, + // ..and XCMP to communicate with the sibling chains. + XcmpQueue, +); + +#[cfg(feature = "runtime-benchmarks")] +parameter_types! { + pub ReachableDest: Option = Some(Parent.into()); +} + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = Nothing; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Nothing; + type XcmReserveTransferFilter = Everything; + type Weigher = XcmWeigher; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; + type Currency = Balances; + type CurrencyMatcher = (); + type TrustedLockers = (); + type SovereignAccountOf = LocationToAccountId; + type MaxLockers = ConstU32<8>; + // TODO pallet-xcm weights + type WeightInfo = pallet_xcm::TestWeightInfo; + #[cfg(feature = "runtime-benchmarks")] + type ReachableDest = ReachableDest; +} + +impl cumulus_pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +impl cumulus_pallet_xcmp_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; + type ChannelInfo = ParachainSystem; + type VersionWrapper = PolkadotXcm; + type ExecuteOverweightOrigin = EnsureRoot; + type ControllerOrigin = EnsureRoot; + type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; + type WeightInfo = cumulus_pallet_xcmp_queue::weights::SubstrateWeight; + type PriceForSiblingDelivery = (); +} + +impl cumulus_pallet_dmp_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; + type ExecuteOverweightOrigin = EnsureRoot; +} + +// Our AssetType. For now we only handle Xcm Assets +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum AssetType { + Xcm(MultiLocation), +} +impl Default for AssetType { + fn default() -> Self { + Self::Xcm(MultiLocation::here()) + } +} + +impl From for AssetType { + fn from(location: MultiLocation) -> Self { + Self::Xcm(location) + } +} +impl Into> for AssetType { + fn into(self) -> Option { + match self { + Self::Xcm(location) => Some(location), + } + } +} + +// Implementation on how to retrieve the AssetId from an AssetType +// We simply hash the AssetType and take the lowest 128 bits +impl From for AssetId { + fn from(asset: AssetType) -> AssetId { + match asset { + AssetType::Xcm(id) => { + let mut result: [u8; 16] = [0u8; 16]; + let hash: H256 = id.using_encoded(::Hashing::hash); + result.copy_from_slice(&hash.as_fixed_bytes()[0..16]); + u128::from_le_bytes(result) + } + } + } +} + +// Our currencyId. We distinguish for now between SelfReserve, and Others, defined by their Id. +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum CurrencyId { + // Our native token + SelfReserve, + // Assets representing other chains native tokens + ForeignAsset(AssetId), + // Our local assets + LocalAssetReserve(AssetId), + // Erc20 token + Erc20 { contract_address: H160 }, +} + +impl AccountIdToCurrencyId for Runtime { + fn account_to_currency_id(account: AccountId) -> Option { + Some(match account { + // the self-reserve currency is identified by the pallet-balances address + a if a == H160::from_low_u64_be(2050).into() => CurrencyId::SelfReserve, + // the rest of the currencies, by their corresponding erc20 address + _ => match Runtime::account_to_asset_id(account) { + // We distinguish by prefix, and depending on it we create either + // Foreign or Local + Some((prefix, asset_id)) => { + if prefix == FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX.to_vec() { + CurrencyId::ForeignAsset(asset_id) + } else { + CurrencyId::LocalAssetReserve(asset_id) + } + } + // If no known prefix is identified, we consider that it's a "real" erc20 token + // (i.e. managed by a real smart contract) + None => CurrencyId::Erc20 { + contract_address: account.into(), + }, + }, + }) + } +} + +// How to convert from CurrencyId to MultiLocation +pub struct CurrencyIdtoMultiLocation(sp_std::marker::PhantomData); +impl sp_runtime::traits::Convert> + for CurrencyIdtoMultiLocation +where + AssetXConverter: xcm_executor::traits::Convert, +{ + fn convert(currency: CurrencyId) -> Option { + match currency { + // For now and until Xtokens is adapted to handle 0.9.16 version we use + // the old anchoring here + // This is not a problem in either cases, since the view of the destination + // chain does not change + // TODO! change this to NewAnchoringSelfReserve once xtokens is adapted for it + CurrencyId::SelfReserve => { + let multi: MultiLocation = SelfReserve::get(); + Some(multi) + } + CurrencyId::ForeignAsset(asset) => AssetXConverter::reverse_ref(asset).ok(), + CurrencyId::LocalAssetReserve(asset) => { + let mut location = LocalAssetsPalletLocation::get(); + location.push_interior(Junction::GeneralIndex(asset)).ok(); + Some(location) + } + CurrencyId::Erc20 { contract_address } => { + let mut location = Erc20XcmBridgePalletLocation::get(); + location + .push_interior(Junction::AccountKey20 { + key: contract_address.0, + network: None, + }) + .ok(); + Some(location) + } + } + } +} + +parameter_types! { + pub const BaseXcmWeight: Weight = Weight::from_parts(200_000_000u64, 0); + pub const MaxAssetsForTransfer: usize = 2; + + // This is how we are going to detect whether the asset is a Reserve asset + // This however is the chain part only + pub SelfLocation: MultiLocation = MultiLocation::here(); + // We need this to be able to catch when someone is trying to execute a non- + // cross-chain transfer in xtokens through the absolute path way + pub SelfLocationAbsolute: MultiLocation = MultiLocation { + parents:1, + interior: Junctions::X1( + Parachain(ParachainInfo::parachain_id().into()) + ) + }; +} + +parameter_type_with_key! { + pub ParachainMinFee: |_location: MultiLocation| -> Option { + Some(u128::MAX) + }; +} + +impl orml_xtokens::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type CurrencyId = CurrencyId; + type AccountIdToMultiLocation = AccountIdToMultiLocation; + type CurrencyIdConvert = + CurrencyIdtoMultiLocation>; + type XcmExecutor = XcmExecutor; + type SelfLocation = SelfLocation; + type Weigher = XcmWeigher; + type BaseXcmWeight = BaseXcmWeight; + type UniversalLocation = UniversalLocation; + type MaxAssetsForTransfer = MaxAssetsForTransfer; + type MinXcmFee = ParachainMinFee; + type MultiLocationsFilter = Everything; + type ReserveProvider = AbsoluteAndRelativeReserve; +} + +// 1 KSM should be enough +parameter_types! { + pub MaxHrmpRelayFee: MultiAsset = (MultiLocation::parent(), 1_000_000_000_000u128).into(); +} + +// For now we only allow to transact in the relay, although this might change in the future +// Transactors just defines the chains in which we allow transactions to be issued through +// xcm +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum Transactors { + Relay, +} + +// Default for benchmarking +#[cfg(feature = "runtime-benchmarks")] +impl Default for Transactors { + fn default() -> Self { + Transactors::Relay + } +} + +impl TryFrom for Transactors { + type Error = (); + fn try_from(value: u8) -> Result { + match value { + 0u8 => Ok(Transactors::Relay), + _ => Err(()), + } + } +} + +impl UtilityEncodeCall for Transactors { + fn encode_call(self, call: UtilityAvailableCalls) -> Vec { + match self { + // Shall we use westend for moonbase? The tests are probably based on rococo + // but moonbase-alpha is attached to westend-runtime I think + Transactors::Relay => moonbeam_relay_encoder::kusama::KusamaEncoder.encode_call(call), + } + } +} + +impl XcmTransact for Transactors { + fn destination(self) -> MultiLocation { + match self { + Transactors::Relay => MultiLocation::parent(), + } + } +} + +pub type DerivativeAddressRegistrationOrigin = + EitherOfDiverse, governance::custom_origins::GeneralAdmin>; + +impl pallet_xcm_transactor::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type Transactor = Transactors; + type DerivativeAddressRegistrationOrigin = DerivativeAddressRegistrationOrigin; + type SovereignAccountDispatcherOrigin = EnsureRoot; + type CurrencyId = CurrencyId; + type AccountIdToMultiLocation = AccountIdToMultiLocation; + type CurrencyIdToMultiLocation = + CurrencyIdtoMultiLocation>; + type XcmSender = XcmRouter; + type SelfLocation = SelfLocation; + type Weigher = xcm_builder::FixedWeightBounds; + type UniversalLocation = UniversalLocation; + type BaseXcmWeight = BaseXcmWeight; + type AssetTransactor = AssetTransactors; + type ReserveProvider = AbsoluteAndRelativeReserve; + type WeightInfo = pallet_xcm_transactor::weights::SubstrateWeight; + type HrmpManipulatorOrigin = GeneralAdminOrRoot; + type MaxHrmpFee = xcm_builder::Case; + type HrmpEncoder = moonbeam_relay_encoder::kusama::KusamaEncoder; +} + +parameter_types! { + // This is the relative view of erc20 assets. + // Identified by this prefix + AccountKey20(contractAddress) + // We use the RELATIVE multilocation + pub Erc20XcmBridgePalletLocation: MultiLocation = MultiLocation { + parents:0, + interior: Junctions::X1( + PalletInstance(::index() as u8) + ) + }; + + // To be able to support almost all erc20 implementations, + // we provide a sufficiently hight gas limit. + pub Erc20XcmBridgeTransferGasLimit: u64 = 80_000; +} + +impl pallet_erc20_xcm_bridge::Config for Runtime { + type AccountIdConverter = LocationToH160; + type Erc20MultilocationPrefix = Erc20XcmBridgePalletLocation; + type Erc20TransferGasLimit = Erc20XcmBridgeTransferGasLimit; + type EvmRunner = EvmRunnerPrecompileOrEthXcm; +} + +#[cfg(feature = "runtime-benchmarks")] +mod testing { + use super::*; + + /// This From exists for benchmarking purposes. It has the potential side-effect of calling + /// AssetManager::set_asset_type_asset_id() and should NOT be used in any production code. + impl From for CurrencyId { + fn from(location: MultiLocation) -> CurrencyId { + use xcm_executor::traits::Convert as XConvert; + use xcm_primitives::AssetTypeGetter; + + // If it does not exist, for benchmarking purposes, we create the association + let asset_id = if let Ok(asset_id) = + AsAssetType::::convert_ref(&location) + { + asset_id + } else { + let asset_type = AssetType::Xcm(location); + let asset_id: AssetId = asset_type.clone().into(); + AssetManager::set_asset_type_asset_id(asset_type, asset_id); + asset_id + }; + + CurrencyId::ForeignAsset(asset_id) + } + } +} diff --git a/tracing/2402/runtime/moonriver/tests/common/mod.rs b/tracing/2402/runtime/moonriver/tests/common/mod.rs new file mode 100644 index 0000000..55ef74a --- /dev/null +++ b/tracing/2402/runtime/moonriver/tests/common/mod.rs @@ -0,0 +1,412 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +#![allow(dead_code)] + +use cumulus_primitives_parachain_inherent::ParachainInherentData; +use fp_evm::GenesisAccount; +use frame_support::{ + assert_ok, + dispatch::Dispatchable, + traits::{GenesisBuild, OnFinalize, OnInitialize}, +}; +pub use moonriver_runtime::{ + asset_config::AssetRegistrarMetadata, + currency::{GIGAWEI, MOVR, SUPPLY_FACTOR, WEI}, + xcm_config::AssetType, + AccountId, AssetId, AssetManager, Assets, AuthorInherent, Balance, Balances, CrowdloanRewards, + Ethereum, Executive, Header, InflationInfo, LocalAssets, ParachainStaking, Range, Runtime, + RuntimeCall, RuntimeEvent, System, TransactionConverter, TransactionPaymentAsGasPrice, + UncheckedExtrinsic, HOURS, WEEKS, +}; +use nimbus_primitives::{NimbusId, NIMBUS_ENGINE_ID}; +use sp_core::{Encode, H160}; +use sp_runtime::{Digest, DigestItem, Perbill, Percent}; + +use std::collections::BTreeMap; + +use fp_rpc::ConvertTransaction; +use pallet_transaction_payment::Multiplier; + +// A valid signed Alice transfer. +pub const VALID_ETH_TX: &str = + "02f86d8205018085174876e80085e8d4a5100082520894f24ff3a9cf04c71dbc94d0b566f7a27b9456\ + 6cac8080c001a0e1094e1a52520a75c0255db96132076dd0f1263089f838bea548cbdbfc64a4d19f031c\ + 92a8cb04e2d68d20a6158d542a07ac440cc8d07b6e36af02db046d92df"; + +// An invalid signed Alice transfer with a gas limit artifically set to 0. +pub const INVALID_ETH_TX: &str = + "f86180843b9aca00809412cb274aad8251c875c0bf6872b67d9983e53fdd01801ca00e28ba2dd3c5a\ + 3fd467d4afd7aefb4a34b373314fff470bb9db743a84d674a0aa06e5994f2d07eafe1c37b4ce5471ca\ + ecec29011f6f5bf0b1a552c55ea348df35f"; + +pub fn rpc_run_to_block(n: u32) { + while System::block_number() < n { + Ethereum::on_finalize(System::block_number()); + System::set_block_number(System::block_number() + 1); + Ethereum::on_initialize(System::block_number()); + } +} + +/// Utility function that advances the chain to the desired block number. +/// If an author is provided, that author information is injected to all the blocks in the meantime. +pub fn run_to_block(n: u32, author: Option) { + // Finalize the first block + Ethereum::on_finalize(System::block_number()); + AuthorInherent::on_finalize(System::block_number()); + while System::block_number() < n { + // Set the new block number and author + match author { + Some(ref author) => { + let pre_digest = Digest { + logs: vec![DigestItem::PreRuntime(NIMBUS_ENGINE_ID, author.encode())], + }; + System::reset_events(); + System::initialize( + &(System::block_number() + 1), + &System::parent_hash(), + &pre_digest, + ); + } + None => { + System::set_block_number(System::block_number() + 1); + } + } + + // Initialize the new block + AuthorInherent::on_initialize(System::block_number()); + ParachainStaking::on_initialize(System::block_number()); + Ethereum::on_initialize(System::block_number()); + + // Finalize the block + Ethereum::on_finalize(System::block_number()); + AuthorInherent::on_finalize(System::block_number()); + ParachainStaking::on_finalize(System::block_number()); + } +} + +pub fn last_event() -> RuntimeEvent { + System::events().pop().expect("Event expected").event +} + +// Helper function to give a simple evm context suitable for tests. +// We can remove this once https://github.com/rust-blockchain/evm/pull/35 +// is in our dependency graph. +pub fn evm_test_context() -> fp_evm::Context { + fp_evm::Context { + address: Default::default(), + caller: Default::default(), + apparent_value: From::from(0), + } +} + +// Test struct with the purpose of initializing xcm assets +#[derive(Clone)] +pub struct XcmAssetInitialization { + pub asset_type: AssetType, + pub metadata: AssetRegistrarMetadata, + pub balances: Vec<(AccountId, Balance)>, + pub is_sufficient: bool, +} + +pub struct ExtBuilder { + // [asset, Vec, owner] + local_assets: Vec<(AssetId, Vec<(AccountId, Balance)>, AccountId)>, + // endowed accounts with balances + balances: Vec<(AccountId, Balance)>, + // [collator, amount] + collators: Vec<(AccountId, Balance)>, + // [delegator, collator, nomination_amount] + delegations: Vec<(AccountId, AccountId, Balance, Percent)>, + // per-round inflation config + inflation: InflationInfo, + // AuthorId -> AccoutId mappings + mappings: Vec<(NimbusId, AccountId)>, + // Crowdloan fund + crowdloan_fund: Balance, + // Chain id + chain_id: u64, + // EVM genesis accounts + evm_accounts: BTreeMap, + // [assettype, metadata, Vec, is_sufficient] + xcm_assets: Vec, + safe_xcm_version: Option, +} + +impl Default for ExtBuilder { + fn default() -> ExtBuilder { + ExtBuilder { + local_assets: vec![], + balances: vec![], + delegations: vec![], + collators: vec![], + inflation: InflationInfo { + expect: Range { + min: 100_000 * MOVR, + ideal: 200_000 * MOVR, + max: 500_000 * MOVR, + }, + // not used + annual: Range { + min: Perbill::from_percent(50), + ideal: Perbill::from_percent(50), + max: Perbill::from_percent(50), + }, + // unrealistically high parameterization, only for testing + round: Range { + min: Perbill::from_percent(5), + ideal: Perbill::from_percent(5), + max: Perbill::from_percent(5), + }, + }, + mappings: vec![], + crowdloan_fund: 0, + chain_id: CHAIN_ID, + evm_accounts: BTreeMap::new(), + xcm_assets: vec![], + safe_xcm_version: None, + } + } +} + +impl ExtBuilder { + pub fn with_evm_accounts(mut self, accounts: BTreeMap) -> Self { + self.evm_accounts = accounts; + self + } + + pub fn with_balances(mut self, balances: Vec<(AccountId, Balance)>) -> Self { + self.balances = balances; + self + } + + pub fn with_collators(mut self, collators: Vec<(AccountId, Balance)>) -> Self { + self.collators = collators; + self + } + + pub fn with_delegations(mut self, delegations: Vec<(AccountId, AccountId, Balance)>) -> Self { + self.delegations = delegations + .into_iter() + .map(|d| (d.0, d.1, d.2, Percent::zero())) + .collect(); + self + } + + pub fn with_crowdloan_fund(mut self, crowdloan_fund: Balance) -> Self { + self.crowdloan_fund = crowdloan_fund; + self + } + + pub fn with_mappings(mut self, mappings: Vec<(NimbusId, AccountId)>) -> Self { + self.mappings = mappings; + self + } + + #[allow(dead_code)] + pub fn with_inflation(mut self, inflation: InflationInfo) -> Self { + self.inflation = inflation; + self + } + + pub fn with_local_assets( + mut self, + local_assets: Vec<(AssetId, Vec<(AccountId, Balance)>, AccountId)>, + ) -> Self { + self.local_assets = local_assets; + self + } + + pub fn with_xcm_assets(mut self, xcm_assets: Vec) -> Self { + self.xcm_assets = xcm_assets; + self + } + + pub fn with_safe_xcm_version(mut self, safe_xcm_version: u32) -> Self { + self.safe_xcm_version = Some(safe_xcm_version); + self + } + + pub fn build(self) -> sp_io::TestExternalities { + let mut t = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap(); + + pallet_balances::GenesisConfig:: { + balances: self.balances, + } + .assimilate_storage(&mut t) + .unwrap(); + + pallet_parachain_staking::GenesisConfig:: { + candidates: self.collators, + delegations: self.delegations, + inflation_config: self.inflation, + collator_commission: Perbill::from_percent(20), + parachain_bond_reserve_percent: Percent::from_percent(30), + blocks_per_round: 2 * HOURS, + num_selected_candidates: 8, + } + .assimilate_storage(&mut t) + .unwrap(); + + pallet_crowdloan_rewards::GenesisConfig:: { + funded_amount: self.crowdloan_fund, + } + .assimilate_storage(&mut t) + .unwrap(); + + pallet_author_mapping::GenesisConfig:: { + mappings: self.mappings, + } + .assimilate_storage(&mut t) + .unwrap(); + + >::assimilate_storage( + &pallet_ethereum_chain_id::GenesisConfig { + chain_id: self.chain_id, + }, + &mut t, + ) + .unwrap(); + + >::assimilate_storage( + &pallet_evm::GenesisConfig { + accounts: self.evm_accounts, + }, + &mut t, + ) + .unwrap(); + + >::assimilate_storage( + &pallet_ethereum::GenesisConfig {}, + &mut t, + ) + .unwrap(); + + >::assimilate_storage( + &pallet_xcm::GenesisConfig { + safe_xcm_version: self.safe_xcm_version, + }, + &mut t, + ) + .unwrap(); + + >::assimilate_storage( + &pallet_transaction_payment::GenesisConfig { + multiplier: Multiplier::from(10u128), + }, + &mut t, + ) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + let local_assets = self.local_assets.clone(); + let xcm_assets = self.xcm_assets.clone(); + ext.execute_with(|| { + // If any local assets specified, we create them here + for (asset_id, balances, owner) in local_assets.clone() { + LocalAssets::force_create(root_origin(), asset_id.into(), owner, true, 1).unwrap(); + for (account, balance) in balances { + LocalAssets::mint(origin_of(owner.into()), asset_id.into(), account, balance) + .unwrap(); + } + } + // If any xcm assets specified, we register them here + for xcm_asset_initialization in xcm_assets { + let asset_id: AssetId = xcm_asset_initialization.asset_type.clone().into(); + AssetManager::register_foreign_asset( + root_origin(), + xcm_asset_initialization.asset_type, + xcm_asset_initialization.metadata, + 1, + xcm_asset_initialization.is_sufficient, + ) + .unwrap(); + for (account, balance) in xcm_asset_initialization.balances { + Assets::mint( + origin_of(AssetManager::account_id()), + asset_id.into(), + account, + balance, + ) + .unwrap(); + } + } + System::set_block_number(1); + }); + ext + } +} + +pub const CHAIN_ID: u64 = 1281; +pub const ALICE: [u8; 20] = [4u8; 20]; +pub const ALICE_NIMBUS: [u8; 32] = [4u8; 32]; +pub const BOB: [u8; 20] = [5u8; 20]; +pub const CHARLIE: [u8; 20] = [6u8; 20]; +pub const DAVE: [u8; 20] = [7u8; 20]; +pub const EVM_CONTRACT: [u8; 20] = [8u8; 20]; + +pub fn origin_of(account_id: AccountId) -> ::RuntimeOrigin { + ::RuntimeOrigin::signed(account_id) +} + +pub fn inherent_origin() -> ::RuntimeOrigin { + ::RuntimeOrigin::none() +} + +pub fn root_origin() -> ::RuntimeOrigin { + ::RuntimeOrigin::root() +} + +/// Mock the inherent that sets validation data in ParachainSystem, which +/// contains the `relay_chain_block_number`, which is used in `author-filter` as a +/// source of randomness to filter valid authors at each block. +pub fn set_parachain_inherent_data() { + use cumulus_primitives_core::PersistedValidationData; + use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; + let (relay_parent_storage_root, relay_chain_state) = + RelayStateSproofBuilder::default().into_state_root_and_proof(); + let vfp = PersistedValidationData { + relay_parent_number: 1u32, + relay_parent_storage_root, + ..Default::default() + }; + let parachain_inherent_data = ParachainInherentData { + validation_data: vfp, + relay_chain_state: relay_chain_state, + downward_messages: Default::default(), + horizontal_messages: Default::default(), + }; + assert_ok!(RuntimeCall::ParachainSystem( + cumulus_pallet_parachain_system::Call::::set_validation_data { + data: parachain_inherent_data + } + ) + .dispatch(inherent_origin())); +} + +pub fn unchecked_eth_tx(raw_hex_tx: &str) -> UncheckedExtrinsic { + let converter = TransactionConverter; + converter.convert_transaction(ethereum_transaction(raw_hex_tx)) +} + +pub fn ethereum_transaction(raw_hex_tx: &str) -> pallet_ethereum::Transaction { + let bytes = hex::decode(raw_hex_tx).expect("Transaction bytes."); + let transaction = ethereum::EnvelopedDecodable::decode(&bytes[..]); + assert!(transaction.is_ok()); + transaction.unwrap() +} diff --git a/tracing/2402/runtime/moonriver/tests/evm_tracing.rs b/tracing/2402/runtime/moonriver/tests/evm_tracing.rs new file mode 100644 index 0000000..12fab58 --- /dev/null +++ b/tracing/2402/runtime/moonriver/tests/evm_tracing.rs @@ -0,0 +1,94 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Moonriver EVM tracing Integration Tests + +mod common; + +#[cfg(test)] +#[cfg(feature = "evm-tracing")] +mod tests { + use super::common::*; + + use pallet_evm::AddressMapping; + use sp_core::H160; + + use moonbeam_rpc_primitives_debug::runtime_decl_for_debug_runtime_api::DebugRuntimeApi; + use std::str::FromStr; + + #[test] + fn debug_runtime_api_trace_transaction() { + let alith = ::AddressMapping::into_account_id( + H160::from_str("6be02d1d3665660d22ff9624b7be0551ee1ac91b") + .expect("internal H160 is valid; qed"), + ); + ExtBuilder::default() + .with_balances(vec![ + (alith, 2_000 * MOVR), + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .build() + .execute_with(|| { + let non_eth_uxt = UncheckedExtrinsic::new_unsigned( + pallet_balances::Call::::transfer { + dest: AccountId::from(BOB), + value: 1 * MOVR, + } + .into(), + ); + let transaction = ethereum_transaction(VALID_ETH_TX); + let eth_uxt = unchecked_eth_tx(VALID_ETH_TX); + assert!(Runtime::trace_transaction( + vec![non_eth_uxt.clone(), eth_uxt, non_eth_uxt.clone()], + &transaction + ) + .is_ok()); + }); + } + + #[test] + fn debug_runtime_api_trace_block() { + let alith = ::AddressMapping::into_account_id( + H160::from_str("6be02d1d3665660d22ff9624b7be0551ee1ac91b") + .expect("internal H160 is valid; qed"), + ); + ExtBuilder::default() + .with_balances(vec![ + (alith, 2_000 * MOVR), + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .build() + .execute_with(|| { + let non_eth_uxt = UncheckedExtrinsic::new_unsigned( + pallet_balances::Call::::transfer { + dest: AccountId::from(BOB), + value: 1 * MOVR, + } + .into(), + ); + let eth_uxt = unchecked_eth_tx(VALID_ETH_TX); + let eth_tx = ethereum_transaction(VALID_ETH_TX); + let eth_extrinsic_hash = eth_tx.hash(); + assert!(Runtime::trace_block( + vec![non_eth_uxt.clone(), eth_uxt.clone(), non_eth_uxt, eth_uxt], + vec![eth_extrinsic_hash, eth_extrinsic_hash] + ) + .is_ok()); + }); + } +} diff --git a/tracing/2402/runtime/moonriver/tests/integration_test.rs b/tracing/2402/runtime/moonriver/tests/integration_test.rs new file mode 100644 index 0000000..2ea6aad --- /dev/null +++ b/tracing/2402/runtime/moonriver/tests/integration_test.rs @@ -0,0 +1,3152 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Moonriver Runtime Integration Tests + +#![cfg(test)] + +mod common; +use common::*; + +use fp_evm::{Context, IsPrecompileResult}; +use frame_support::{ + assert_noop, assert_ok, + dispatch::{DispatchClass, Dispatchable}, + traits::{ + fungible::Inspect, fungibles::Inspect as FungiblesInspect, Currency as CurrencyT, + EnsureOrigin, PalletInfo, StorageInfo, StorageInfoTrait, + }, + weights::{constants::WEIGHT_REF_TIME_PER_SECOND, Weight}, + StorageHasher, Twox128, +}; +use moonbeam_xcm_benchmarks::weights::XcmWeight; +use moonriver_runtime::{ + asset_config::LocalAssetInstance, + xcm_config::{CurrencyId, SelfReserve}, + AssetId, CouncilCollective, LocalAssets, OpenTechCommitteeCollective, PolkadotXcm, Precompiles, + RuntimeBlockWeights, TechCommitteeCollective, TransactionPayment, TreasuryCouncilCollective, + XTokens, XcmTransactor, FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, +}; +use nimbus_primitives::NimbusId; +use pallet_evm::PrecompileSet; +use pallet_evm_precompileset_assets_erc20::{ + AccountIdAssetIdConversion, IsLocal, SELECTOR_LOG_APPROVAL, SELECTOR_LOG_TRANSFER, +}; +use pallet_transaction_payment::Multiplier; +use pallet_xcm_transactor::{Currency, CurrencyPayment, TransactWeights}; +use parity_scale_codec::Encode; +use polkadot_parachain::primitives::Sibling; +use precompile_utils::{ + precompile_set::{is_precompile_or_fail, IsActivePrecompile}, + prelude::*, + testing::*, +}; +use sha3::{Digest, Keccak256}; +use sp_core::{ByteArray, Pair, H160, U256}; +use sp_runtime::{traits::Convert, DispatchError, ModuleError, TokenError}; +use std::str::from_utf8; +use xcm::latest::prelude::*; +use xcm::{VersionedMultiAssets, VersionedMultiLocation}; +use xcm_builder::{ParentIsPreset, SiblingParachainConvertsVia}; +use xcm_executor::traits::Convert as XcmConvert; + +type BatchPCall = pallet_evm_precompile_batch::BatchPrecompileCall; +type CrowdloanRewardsPCall = + pallet_evm_precompile_crowdloan_rewards::CrowdloanRewardsPrecompileCall; +type XcmUtilsPCall = pallet_evm_precompile_xcm_utils::XcmUtilsPrecompileCall< + Runtime, + moonriver_runtime::xcm_config::XcmExecutorConfig, +>; +type XtokensPCall = pallet_evm_precompile_xtokens::XtokensPrecompileCall; +type LocalAssetsPCall = pallet_evm_precompileset_assets_erc20::Erc20AssetsPrecompileSetCall< + Runtime, + IsLocal, + LocalAssetInstance, +>; +type XcmTransactorV2PCall = + pallet_evm_precompile_xcm_transactor::v2::XcmTransactorPrecompileV2Call; + +const BASE_FEE_GENESIS: u128 = 100 * GIGAWEI; + +#[test] +fn xcmp_queue_controller_origin_is_root() { + // important for the XcmExecutionManager impl of PauseExecution which uses root origin + // to suspend/resume XCM execution in xcmp_queue::on_idle + assert_ok!( + ::ControllerOrigin::ensure_origin(root_origin()) + ); +} + +#[test] +fn fast_track_available() { + assert!(moonriver_runtime::get!( + pallet_democracy, + InstantAllowed, + bool + )); +} + +#[test] +fn verify_pallet_prefixes() { + fn is_pallet_prefix(name: &str) { + // Compares the unhashed pallet prefix in the `StorageInstance` implementation by every + // storage item in the pallet P. This pallet prefix is used in conjunction with the + // item name to get the unique storage key: hash(PalletPrefix) + hash(StorageName) + // https://github.com/paritytech/substrate/blob/master/frame/support/procedural/src/pallet/ + // expand/storage.rs#L389-L401 + assert_eq!( + ::PalletInfo::name::

(), + Some(name) + ); + } + // TODO: use StorageInfoTrait from https://github.com/paritytech/substrate/pull/9246 + // This is now available with polkadot-v0.9.9 dependencies + is_pallet_prefix::("System"); + is_pallet_prefix::("Utility"); + is_pallet_prefix::("ParachainSystem"); + is_pallet_prefix::("TransactionPayment"); + is_pallet_prefix::("ParachainInfo"); + is_pallet_prefix::("EthereumChainId"); + is_pallet_prefix::("EVM"); + is_pallet_prefix::("Ethereum"); + is_pallet_prefix::("ParachainStaking"); + is_pallet_prefix::("MaintenanceMode"); + is_pallet_prefix::("Scheduler"); + is_pallet_prefix::("Democracy"); + is_pallet_prefix::("CouncilCollective"); + is_pallet_prefix::("TechCommitteeCollective"); + is_pallet_prefix::( + "OpenTechCommitteeCollective", + ); + is_pallet_prefix::("Treasury"); + is_pallet_prefix::("AuthorInherent"); + is_pallet_prefix::("AuthorFilter"); + is_pallet_prefix::("CrowdloanRewards"); + is_pallet_prefix::("AuthorMapping"); + is_pallet_prefix::("Identity"); + is_pallet_prefix::("XcmpQueue"); + is_pallet_prefix::("CumulusXcm"); + is_pallet_prefix::("DmpQueue"); + is_pallet_prefix::("PolkadotXcm"); + is_pallet_prefix::("Assets"); + is_pallet_prefix::("XTokens"); + is_pallet_prefix::("AssetManager"); + is_pallet_prefix::("Migrations"); + is_pallet_prefix::("XcmTransactor"); + is_pallet_prefix::("ProxyGenesisCompanion"); + is_pallet_prefix::("LocalAssets"); + is_pallet_prefix::("MoonbeamOrbiters"); + is_pallet_prefix::("TreasuryCouncilCollective"); + + let prefix = |pallet_name, storage_name| { + let mut res = [0u8; 32]; + res[0..16].copy_from_slice(&Twox128::hash(pallet_name)); + res[16..32].copy_from_slice(&Twox128::hash(storage_name)); + res.to_vec() + }; + assert_eq!( + ::storage_info(), + vec![ + StorageInfo { + pallet_name: b"Timestamp".to_vec(), + storage_name: b"Now".to_vec(), + prefix: prefix(b"Timestamp", b"Now"), + max_values: Some(1), + max_size: Some(8), + }, + StorageInfo { + pallet_name: b"Timestamp".to_vec(), + storage_name: b"DidUpdate".to_vec(), + prefix: prefix(b"Timestamp", b"DidUpdate"), + max_values: Some(1), + max_size: Some(1), + } + ] + ); + assert_eq!( + ::storage_info(), + vec![ + StorageInfo { + pallet_name: b"Balances".to_vec(), + storage_name: b"TotalIssuance".to_vec(), + prefix: prefix(b"Balances", b"TotalIssuance"), + max_values: Some(1), + max_size: Some(16), + }, + StorageInfo { + pallet_name: b"Balances".to_vec(), + storage_name: b"InactiveIssuance".to_vec(), + prefix: prefix(b"Balances", b"InactiveIssuance"), + max_values: Some(1), + max_size: Some(16), + }, + StorageInfo { + pallet_name: b"Balances".to_vec(), + storage_name: b"Account".to_vec(), + prefix: prefix(b"Balances", b"Account"), + max_values: None, + max_size: Some(100), + }, + StorageInfo { + pallet_name: b"Balances".to_vec(), + storage_name: b"Locks".to_vec(), + prefix: prefix(b"Balances", b"Locks"), + max_values: None, + max_size: Some(1287), + }, + StorageInfo { + pallet_name: b"Balances".to_vec(), + storage_name: b"Reserves".to_vec(), + prefix: prefix(b"Balances", b"Reserves"), + max_values: None, + max_size: Some(1037), + }, + ] + ); + assert_eq!( + ::storage_info(), + vec![ + StorageInfo { + pallet_name: b"Proxy".to_vec(), + storage_name: b"Proxies".to_vec(), + prefix: prefix(b"Proxy", b"Proxies"), + max_values: None, + max_size: Some(845), + }, + StorageInfo { + pallet_name: b"Proxy".to_vec(), + storage_name: b"Announcements".to_vec(), + prefix: prefix(b"Proxy", b"Announcements"), + max_values: None, + max_size: Some(1837), + } + ] + ); + assert_eq!( + ::storage_info(), + vec![StorageInfo { + pallet_name: b"MaintenanceMode".to_vec(), + storage_name: b"MaintenanceMode".to_vec(), + prefix: prefix(b"MaintenanceMode", b"MaintenanceMode"), + max_values: Some(1), + max_size: None, + },] + ); +} + +#[test] +fn test_collectives_storage_item_prefixes() { + for StorageInfo { pallet_name, .. } in + ::storage_info() + { + assert_eq!(pallet_name, b"CouncilCollective".to_vec()); + } + + for StorageInfo { pallet_name, .. } in + ::storage_info() + { + assert_eq!(pallet_name, b"TechCommitteeCollective".to_vec()); + } + + for StorageInfo { pallet_name, .. } in + ::storage_info() + { + assert_eq!(pallet_name, b"TreasuryCouncilCollective".to_vec()); + } + + for StorageInfo { pallet_name, .. } in + ::storage_info() + { + assert_eq!(pallet_name, b"OpenTechCommitteeCollective".to_vec()); + } +} + +#[test] +fn collective_set_members_root_origin_works() { + ExtBuilder::default().build().execute_with(|| { + // CouncilCollective + assert_ok!(CouncilCollective::set_members( + ::RuntimeOrigin::root(), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + )); + // TechCommitteeCollective + assert_ok!(TechCommitteeCollective::set_members( + ::RuntimeOrigin::root(), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + )); + // TreasuryCouncilCollective + assert_ok!(TreasuryCouncilCollective::set_members( + ::RuntimeOrigin::root(), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + )); + // OpenTechCommitteeCollective + assert_ok!(OpenTechCommitteeCollective::set_members( + ::RuntimeOrigin::root(), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + )); + }); +} + +#[test] +fn collective_set_members_general_admin_origin_works() { + use moonriver_runtime::{ + governance::custom_origins::Origin as CustomOrigin, OriginCaller, Utility, + }; + + ExtBuilder::default().build().execute_with(|| { + let root_caller = ::RuntimeOrigin::root(); + let alice = AccountId::from(ALICE); + + // CouncilCollective + let _ = Utility::dispatch_as( + root_caller.clone(), + Box::new(OriginCaller::Origins(CustomOrigin::GeneralAdmin)), + Box::new( + pallet_collective::Call::::set_members { + new_members: vec![alice, AccountId::from(BOB)], + prime: Some(alice), + old_count: 2, + } + .into(), + ), + ); + // TechCommitteeCollective + let _ = Utility::dispatch_as( + root_caller.clone(), + Box::new(OriginCaller::Origins(CustomOrigin::GeneralAdmin)), + Box::new( + pallet_collective::Call::::set_members { + new_members: vec![alice, AccountId::from(BOB)], + prime: Some(alice), + old_count: 2, + } + .into(), + ), + ); + // TreasuryCouncilCollective + let _ = Utility::dispatch_as( + root_caller.clone(), + Box::new(OriginCaller::Origins(CustomOrigin::GeneralAdmin)), + Box::new( + pallet_collective::Call::::set_members { + new_members: vec![alice, AccountId::from(BOB)], + prime: Some(alice), + old_count: 2, + } + .into(), + ), + ); + // OpenTechCommitteeCollective + let _ = Utility::dispatch_as( + root_caller, + Box::new(OriginCaller::Origins(CustomOrigin::GeneralAdmin)), + Box::new( + pallet_collective::Call::::set_members { + new_members: vec![alice, AccountId::from(BOB)], + prime: Some(alice), + old_count: 2, + } + .into(), + ), + ); + + assert_eq!( + System::events() + .into_iter() + .filter_map(|r| { + match r.event { + RuntimeEvent::Utility(pallet_utility::Event::DispatchedAs { result }) + if result.is_ok() => + { + Some(true) + } + _ => None, + } + }) + .collect::>() + .len(), + 4 + ) + }); +} + +#[test] +fn collective_set_members_signed_origin_does_not_work() { + let alice = AccountId::from(ALICE); + ExtBuilder::default().build().execute_with(|| { + // CouncilCollective + assert!(CouncilCollective::set_members( + ::RuntimeOrigin::signed(alice), + vec![alice, AccountId::from(BOB)], + Some(alice), + 2 + ) + .is_err()); + // TechCommitteeCollective + assert!(TechCommitteeCollective::set_members( + ::RuntimeOrigin::signed(alice), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + ) + .is_err()); + // TreasuryCouncilCollective + assert!(TreasuryCouncilCollective::set_members( + ::RuntimeOrigin::signed(alice), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + ) + .is_err()); + // OpenTechCommitteeCollective + assert!(OpenTechCommitteeCollective::set_members( + ::RuntimeOrigin::signed(alice), + vec![AccountId::from(ALICE), AccountId::from(BOB)], + Some(AccountId::from(ALICE)), + 2 + ) + .is_err()); + }); +} + +#[test] +fn verify_pallet_indices() { + fn is_pallet_index(index: usize) { + assert_eq!( + ::PalletInfo::index::

(), + Some(index) + ); + } + // System support + is_pallet_index::(0); + is_pallet_index::(1); + is_pallet_index::(3); + is_pallet_index::(4); + // Monetary + is_pallet_index::(10); + is_pallet_index::(11); + // Consensus support + is_pallet_index::(20); + is_pallet_index::(21); + is_pallet_index::(22); + is_pallet_index::(23); + is_pallet_index::(24); + // Handy utilities + is_pallet_index::(30); + is_pallet_index::(31); + is_pallet_index::(32); + is_pallet_index::(33); + is_pallet_index::(34); + is_pallet_index::(35); + // Ethereum compatibility + is_pallet_index::(50); + is_pallet_index::(51); + is_pallet_index::(52); + // Governance + is_pallet_index::(60); + is_pallet_index::(61); + // Council + is_pallet_index::(70); + is_pallet_index::(71); + is_pallet_index::(72); + is_pallet_index::(73); + // Treasury + is_pallet_index::(80); + // Crowdloan + is_pallet_index::(90); + // XCM Stuff + is_pallet_index::(100); + is_pallet_index::(101); + is_pallet_index::(102); + is_pallet_index::(103); + is_pallet_index::(104); + is_pallet_index::(105); + is_pallet_index::(106); + is_pallet_index::(107); + is_pallet_index::(108); +} + +#[test] +fn verify_reserved_indices() { + use frame_support::metadata::*; + let metadata = moonriver_runtime::Runtime::metadata(); + let metadata = match metadata.1 { + RuntimeMetadata::V14(metadata) => metadata, + _ => panic!("metadata has been bumped, test needs to be updated"), + }; + // 40: Sudo + // 53: BaseFee + let reserved = vec![40, 53]; + let existing = metadata + .pallets + .iter() + .map(|p| p.index) + .collect::>(); + assert!(reserved.iter().all(|index| !existing.contains(index))); +} + +#[test] +fn verify_proxy_type_indices() { + assert_eq!(moonriver_runtime::ProxyType::Any as u8, 0); + assert_eq!(moonriver_runtime::ProxyType::NonTransfer as u8, 1); + assert_eq!(moonriver_runtime::ProxyType::Governance as u8, 2); + assert_eq!(moonriver_runtime::ProxyType::Staking as u8, 3); + assert_eq!(moonriver_runtime::ProxyType::CancelProxy as u8, 4); + assert_eq!(moonriver_runtime::ProxyType::Balances as u8, 5); + assert_eq!(moonriver_runtime::ProxyType::AuthorMapping as u8, 6); + assert_eq!(moonriver_runtime::ProxyType::IdentityJudgement as u8, 7); +} + +#[test] +fn join_collator_candidates() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 20_000 * MOVR), + (AccountId::from(BOB), 20_000 * MOVR), + (AccountId::from(CHARLIE), 10_100 * MOVR), + (AccountId::from(DAVE), 10_000 * MOVR), + ]) + .with_collators(vec![ + (AccountId::from(ALICE), 10_000 * MOVR), + (AccountId::from(BOB), 10_000 * MOVR), + ]) + .with_delegations(vec![ + (AccountId::from(CHARLIE), AccountId::from(ALICE), 50 * MOVR), + (AccountId::from(CHARLIE), AccountId::from(BOB), 50 * MOVR), + ]) + .build() + .execute_with(|| { + assert_noop!( + ParachainStaking::join_candidates( + origin_of(AccountId::from(ALICE)), + 10_000 * MOVR, + 2u32 + ), + pallet_parachain_staking::Error::::CandidateExists + ); + assert_noop!( + ParachainStaking::join_candidates( + origin_of(AccountId::from(CHARLIE)), + 10_000 * MOVR, + 2u32 + ), + pallet_parachain_staking::Error::::DelegatorExists + ); + assert!(System::events().is_empty()); + assert_ok!(ParachainStaking::join_candidates( + origin_of(AccountId::from(DAVE)), + 10_000 * MOVR, + 2u32 + )); + assert_eq!( + last_event(), + RuntimeEvent::ParachainStaking( + pallet_parachain_staking::Event::JoinedCollatorCandidates { + account: AccountId::from(DAVE), + amount_locked: 10_000 * MOVR, + new_total_amt_locked: 30_100 * MOVR + } + ) + ); + let candidates = ParachainStaking::candidate_pool(); + assert_eq!(candidates.0[0].owner, AccountId::from(ALICE)); + assert_eq!(candidates.0[0].amount, 10_050 * MOVR); + assert_eq!(candidates.0[1].owner, AccountId::from(BOB)); + assert_eq!(candidates.0[1].amount, 10_050 * MOVR); + assert_eq!(candidates.0[2].owner, AccountId::from(DAVE)); + assert_eq!(candidates.0[2].amount, 10_000 * MOVR); + }); +} + +#[test] +fn transfer_through_evm_to_stake() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 20_000 * MOVR)]) + .build() + .execute_with(|| { + // Charlie has no balance => fails to stake + assert_noop!( + ParachainStaking::join_candidates( + origin_of(AccountId::from(CHARLIE)), + 10_000 * MOVR, + 2u32 + ), + DispatchError::Module(ModuleError { + index: 20, + error: [8, 0, 0, 0], + message: Some("InsufficientBalance") + }) + ); + // Alice transfer from free balance 20000 MOVR to Bob + assert_ok!(Balances::transfer( + origin_of(AccountId::from(ALICE)), + AccountId::from(BOB), + 20_000 * MOVR, + )); + assert_eq!(Balances::free_balance(AccountId::from(BOB)), 20_000 * MOVR); + + let gas_limit = 100000u64; + let gas_price: U256 = BASE_FEE_GENESIS.into(); + // Bob transfers 10000 MOVR to Charlie via EVM + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(BOB), + target: H160::from(CHARLIE), + input: vec![], + value: (10_000 * MOVR).into(), + gas_limit, + max_fee_per_gas: gas_price, + max_priority_fee_per_gas: None, + nonce: None, + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + assert_eq!( + Balances::free_balance(AccountId::from(CHARLIE)), + 10_000 * MOVR, + ); + + // Charlie can stake now + assert_ok!(ParachainStaking::join_candidates( + origin_of(AccountId::from(CHARLIE)), + 10_000 * MOVR, + 2u32, + ),); + let candidates = ParachainStaking::candidate_pool(); + assert_eq!(candidates.0[0].owner, AccountId::from(CHARLIE)); + assert_eq!(candidates.0[0].amount, 10_000 * MOVR); + }); +} + +#[test] +fn reward_block_authors() { + ExtBuilder::default() + .with_balances(vec![ + // Alice gets 100 extra tokens for her mapping deposit + (AccountId::from(ALICE), 20_100 * MOVR), + (AccountId::from(BOB), 10_000 * MOVR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 10_000 * MOVR)]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 500 * MOVR, + )]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + for x in 2..1199 { + run_to_block(x, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + } + // no rewards doled out yet + assert_eq!( + Balances::usable_balance(AccountId::from(ALICE)), + 10_000 * MOVR, + ); + assert_eq!(Balances::usable_balance(AccountId::from(BOB)), 9500 * MOVR,); + run_to_block(1201, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + // rewards minted and distributed + assert_eq!( + Balances::usable_balance(AccountId::from(ALICE)), + 11447666666208000000000, + ); + assert_eq!( + Balances::usable_balance(AccountId::from(BOB)), + 9557333332588000000000, + ); + }); +} + +#[test] +fn reward_block_authors_with_parachain_bond_reserved() { + ExtBuilder::default() + .with_balances(vec![ + // Alice gets 100 extra tokens for her mapping deposit + (AccountId::from(ALICE), 20_100 * MOVR), + (AccountId::from(BOB), 10_000 * MOVR), + (AccountId::from(CHARLIE), MOVR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 10_000 * MOVR)]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 500 * MOVR, + )]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + assert_ok!(ParachainStaking::set_parachain_bond_account( + root_origin(), + AccountId::from(CHARLIE), + ),); + for x in 2..1199 { + run_to_block(x, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + } + // no rewards doled out yet + assert_eq!( + Balances::usable_balance(AccountId::from(ALICE)), + 10_000 * MOVR, + ); + assert_eq!(Balances::usable_balance(AccountId::from(BOB)), 9500 * MOVR,); + assert_eq!(Balances::usable_balance(AccountId::from(CHARLIE)), MOVR,); + run_to_block(1201, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + // rewards minted and distributed + assert_eq!( + Balances::usable_balance(AccountId::from(ALICE)), + 11017700475903800000000, + ); + assert_eq!( + Balances::usable_balance(AccountId::from(BOB)), + 9535834523343675000000, + ); + // 30% reserved for parachain bond + assert_eq!( + Balances::usable_balance(AccountId::from(CHARLIE)), + 452515000000000000000, + ); + }); +} + +#[test] +fn initialize_crowdloan_addresses_with_batch_and_pay() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * MOVR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * MOVR) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 48 * WEEKS; + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * MOVR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [5u8; 32].into(), + Some(AccountId::from(DAVE)), + 1_500_000 * MOVR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + // 30 percent initial payout + assert_eq!(Balances::balance(&AccountId::from(CHARLIE)), 450_000 * MOVR); + // 30 percent initial payout + assert_eq!(Balances::balance(&AccountId::from(DAVE)), 450_000 * MOVR); + let expected = RuntimeEvent::Utility(pallet_utility::Event::BatchCompleted); + assert_eq!(last_event(), expected); + // This one should fail, as we already filled our data + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch { + calls: vec![RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![([4u8; 32].into(), Some(AccountId::from(ALICE)), 432000)] + } + )] + }) + .dispatch(root_origin()) + ); + let expected_fail = RuntimeEvent::Utility(pallet_utility::Event::BatchInterrupted { + index: 0, + error: DispatchError::Module(ModuleError { + index: 90, + error: [8, 0, 0, 0], + message: None, + }), + }); + assert_eq!(last_event(), expected_fail); + // Claim 1 block. + assert_ok!(CrowdloanRewards::claim(origin_of(AccountId::from(CHARLIE)))); + assert_ok!(CrowdloanRewards::claim(origin_of(AccountId::from(DAVE)))); + + let vesting_period = 48 * WEEKS as u128; + let per_block = (1_050_000 * MOVR) / vesting_period; + + assert_eq!( + CrowdloanRewards::accounts_payable(&AccountId::from(CHARLIE)) + .unwrap() + .claimed_reward, + (450_000 * MOVR) + per_block + ); + assert_eq!( + CrowdloanRewards::accounts_payable(&AccountId::from(DAVE)) + .unwrap() + .claimed_reward, + (450_000 * MOVR) + per_block + ); + // The total claimed reward should be equal to the account balance at this point. + assert_eq!( + Balances::balance(&AccountId::from(CHARLIE)), + (450_000 * MOVR) + per_block + ); + assert_eq!( + Balances::balance(&AccountId::from(DAVE)), + (450_000 * MOVR) + per_block + ); + assert_noop!( + CrowdloanRewards::claim(origin_of(AccountId::from(ALICE))), + pallet_crowdloan_rewards::Error::::NoAssociatedClaim + ); + }); +} + +#[test] +fn initialize_crowdloan_address_and_change_with_relay_key_sig() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * MOVR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * MOVR) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + + let (pair1, _) = sp_core::sr25519::Pair::generate(); + let (pair2, _) = sp_core::sr25519::Pair::generate(); + + let public1 = pair1.public(); + let public2 = pair2.public(); + + // signature: + // WRAP_BYTES|| NetworkIdentifier|| new_account || previous_account || WRAP_BYTES + let mut message = pallet_crowdloan_rewards::WRAPPED_BYTES_PREFIX.to_vec(); + message.append(&mut b"moonriver-".to_vec()); + message.append(&mut AccountId::from(DAVE).encode()); + message.append(&mut AccountId::from(CHARLIE).encode()); + message.append(&mut pallet_crowdloan_rewards::WRAPPED_BYTES_POSTFIX.to_vec()); + let signature1 = pair1.sign(&message); + let signature2 = pair2.sign(&message); + + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + // two relay accounts pointing at the same reward account + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + public1.into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * MOVR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + public2.into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * MOVR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + // 30 percent initial payout + assert_eq!(Balances::balance(&AccountId::from(CHARLIE)), 900_000 * MOVR); + + // this should fail, as we are only providing one signature + assert_noop!( + CrowdloanRewards::change_association_with_relay_keys( + origin_of(AccountId::from(CHARLIE)), + AccountId::from(DAVE), + AccountId::from(CHARLIE), + vec![(public1.into(), signature1.clone().into())] + ), + pallet_crowdloan_rewards::Error::::InsufficientNumberOfValidProofs + ); + + // this should be valid + assert_ok!(CrowdloanRewards::change_association_with_relay_keys( + origin_of(AccountId::from(CHARLIE)), + AccountId::from(DAVE), + AccountId::from(CHARLIE), + vec![ + (public1.into(), signature1.into()), + (public2.into(), signature2.into()) + ] + )); + + assert_eq!( + CrowdloanRewards::accounts_payable(&AccountId::from(DAVE)) + .unwrap() + .claimed_reward, + (900_000 * MOVR) + ); + }); +} + +#[test] +fn claim_via_precompile() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * MOVR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * MOVR) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * MOVR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [5u8; 32].into(), + Some(AccountId::from(DAVE)), + 1_500_000 * MOVR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + + assert!(CrowdloanRewards::initialized()); + + // 30 percent initial payout + assert_eq!(Balances::balance(&AccountId::from(CHARLIE)), 450_000 * MOVR); + // 30 percent initial payout + assert_eq!(Balances::balance(&AccountId::from(DAVE)), 450_000 * MOVR); + + let crowdloan_precompile_address = H160::from_low_u64_be(2049); + + // Alice uses the crowdloan precompile to claim through the EVM + let gas_limit = 100000u64; + let gas_price: U256 = BASE_FEE_GENESIS.into(); + + // Construct the call data (selector, amount) + let mut call_data = Vec::::from([0u8; 4]); + call_data[0..4].copy_from_slice(&Keccak256::digest(b"claim()")[0..4]); + + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(CHARLIE), + target: crowdloan_precompile_address, + input: call_data, + value: U256::zero(), // No value sent in EVM + gas_limit, + max_fee_per_gas: gas_price, + max_priority_fee_per_gas: None, + nonce: None, // Use the next nonce + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + let vesting_period = 4 * WEEKS as u128; + let per_block = (1_050_000 * MOVR) / vesting_period; + + assert_eq!( + CrowdloanRewards::accounts_payable(&AccountId::from(CHARLIE)) + .unwrap() + .claimed_reward, + (450_000 * MOVR) + per_block + ); + }) +} + +#[test] +fn is_contributor_via_precompile() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * MOVR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * MOVR) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * MOVR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [5u8; 32].into(), + Some(AccountId::from(DAVE)), + 1_500_000 * MOVR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + + let crowdloan_precompile_address = H160::from_low_u64_be(2049); + + // Assert precompile reports Bob is not a contributor + Precompiles::new() + .prepare_test( + ALICE, + crowdloan_precompile_address, + CrowdloanRewardsPCall::is_contributor { + contributor: Address(AccountId::from(BOB).into()), + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(false); + + // Assert precompile reports Charlie is a nominator + Precompiles::new() + .prepare_test( + ALICE, + crowdloan_precompile_address, + CrowdloanRewardsPCall::is_contributor { + contributor: Address(AccountId::from(CHARLIE).into()), + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(true); + }) +} + +#[test] +fn reward_info_via_precompile() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * MOVR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * MOVR) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * MOVR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [5u8; 32].into(), + Some(AccountId::from(DAVE)), + 1_500_000 * MOVR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + + let crowdloan_precompile_address = H160::from_low_u64_be(2049); + + let expected_total: U256 = (1_500_000 * MOVR).into(); + let expected_claimed: U256 = (450_000 * MOVR).into(); + + // Assert precompile reports correct Charlie reward info. + Precompiles::new() + .prepare_test( + ALICE, + crowdloan_precompile_address, + CrowdloanRewardsPCall::reward_info { + contributor: Address(AccountId::from(CHARLIE).into()), + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns((expected_total, expected_claimed)); + }) +} + +#[test] +fn update_reward_address_via_precompile() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * MOVR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_crowdloan_fund(3_000_000 * MOVR) + .build() + .execute_with(|| { + // set parachain inherent data + set_parachain_inherent_data(); + let init_block = CrowdloanRewards::init_vesting_block(); + // This matches the previous vesting + let end_block = init_block + 4 * WEEKS; + // Batch calls always succeed. We just need to check the inner event + assert_ok!( + RuntimeCall::Utility(pallet_utility::Call::::batch_all { + calls: vec![ + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [4u8; 32].into(), + Some(AccountId::from(CHARLIE)), + 1_500_000 * MOVR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::initialize_reward_vec { + rewards: vec![( + [5u8; 32].into(), + Some(AccountId::from(DAVE)), + 1_500_000 * MOVR + )] + } + ), + RuntimeCall::CrowdloanRewards( + pallet_crowdloan_rewards::Call::::complete_initialization { + lease_ending_block: end_block + } + ) + ] + }) + .dispatch(root_origin()) + ); + + let crowdloan_precompile_address = H160::from_low_u64_be(2049); + + // Charlie uses the crowdloan precompile to update address through the EVM + let gas_limit = 100000u64; + let gas_price: U256 = BASE_FEE_GENESIS.into(); + + // Construct the input data to check if Bob is a contributor + let mut call_data = Vec::::from([0u8; 36]); + call_data[0..4] + .copy_from_slice(&Keccak256::digest(b"update_reward_address(address)")[0..4]); + call_data[16..36].copy_from_slice(&ALICE); + + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(CHARLIE), + target: crowdloan_precompile_address, + input: call_data, + value: U256::zero(), // No value sent in EVM + gas_limit, + max_fee_per_gas: gas_price, + max_priority_fee_per_gas: None, + nonce: None, // Use the next nonce + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + assert!(CrowdloanRewards::accounts_payable(&AccountId::from(CHARLIE)).is_none()); + assert_eq!( + CrowdloanRewards::accounts_payable(&AccountId::from(ALICE)) + .unwrap() + .claimed_reward, + (450_000 * MOVR) + ); + }) +} + +fn run_with_system_weight(w: Weight, mut assertions: F) +where + F: FnMut() -> (), +{ + let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap() + .into(); + t.execute_with(|| { + System::set_block_consumed_resources(w, 0); + assertions() + }); +} + +#[test] +#[rustfmt::skip] +fn length_fee_is_sensible() { + use sp_runtime::testing::TestXt; + + // tests that length fee is sensible for a few hypothetical transactions + ExtBuilder::default().build().execute_with(|| { + let call = frame_system::Call::remark:: { remark: vec![] }; + let uxt: TestXt<_, ()> = TestXt::new(call, Some((1u64, ()))); + + let calc_fee = |len: u32| -> Balance { + moonriver_runtime::TransactionPayment::query_fee_details(uxt.clone(), len) + .inclusion_fee + .expect("fee should be calculated") + .len_fee + }; + + // editorconfig-checker-disable + // left: cost of length fee, right: size in bytes + // /------------- proportional component: O(N * 1B) + // | /- exponential component: O(N ** 3) + // | | + assert_eq!( 1_000_000_001, calc_fee(1)); + assert_eq!( 10_000_001_000, calc_fee(10)); + assert_eq!( 100_001_000_000, calc_fee(100)); + assert_eq!( 1_001_000_000_000, calc_fee(1_000)); + assert_eq!( 11_000_000_000_000, calc_fee(10_000)); // inflection point + assert_eq!( 1_100_000_000_000_000, calc_fee(100_000)); + assert_eq!( 1_001_000_000_000_000_000, calc_fee(1_000_000)); // one MOVR, ~ 1MB + assert_eq!( 1_000_010_000_000_000_000_000, calc_fee(10_000_000)); + assert_eq!(1_000_000_100_000_000_000_000_000, calc_fee(100_000_000)); + // editorconfig-checker-enable + }); +} + +#[test] +fn multiplier_can_grow_from_zero() { + use frame_support::traits::Get; + + let minimum_multiplier = moonriver_runtime::MinimumMultiplier::get(); + let target = moonriver_runtime::TargetBlockFullness::get() + * RuntimeBlockWeights::get() + .get(DispatchClass::Normal) + .max_total + .unwrap(); + // if the min is too small, then this will not change, and we are doomed forever. + // the weight is 1/100th bigger than target. + run_with_system_weight(target * 101 / 100, || { + let next = + moonriver_runtime::SlowAdjustingFeeUpdate::::convert(minimum_multiplier); + assert!( + next > minimum_multiplier, + "{:?} !>= {:?}", + next, + minimum_multiplier + ); + }) +} + +#[test] +fn ethereum_invalid_transaction() { + ExtBuilder::default().build().execute_with(|| { + // Ensure an extrinsic not containing enough gas limit to store the transaction + // on chain is rejected. + assert_eq!( + Executive::apply_extrinsic(unchecked_eth_tx(INVALID_ETH_TX)), + Err( + sp_runtime::transaction_validity::TransactionValidityError::Invalid( + sp_runtime::transaction_validity::InvalidTransaction::Custom(3u8) + ) + ) + ); + }); +} + +#[test] +fn initial_gas_fee_is_correct() { + use fp_evm::FeeCalculator; + + ExtBuilder::default().build().execute_with(|| { + let multiplier = TransactionPayment::next_fee_multiplier(); + assert_eq!(multiplier, Multiplier::from(10u128)); + + assert_eq!( + TransactionPaymentAsGasPrice::min_gas_price(), + ( + 12_500_000_000u128.into(), + Weight::from_parts(25_000_000u64, 0) + ) + ); + }); +} + +#[test] +fn min_gas_fee_is_correct() { + use fp_evm::FeeCalculator; + use frame_support::traits::Hooks; + + ExtBuilder::default().build().execute_with(|| { + pallet_transaction_payment::NextFeeMultiplier::::put(Multiplier::from(0)); + TransactionPayment::on_finalize(System::block_number()); // should trigger min to kick in + + let multiplier = TransactionPayment::next_fee_multiplier(); + assert_eq!(multiplier, Multiplier::from(1u128)); + + assert_eq!( + TransactionPaymentAsGasPrice::min_gas_price(), + ( + 1_250_000_000u128.into(), + Weight::from_parts(25_000_000u64, 0) + ) + ); + }); +} + +#[test] +fn transfer_ed_0_substrate() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), (1 * MOVR) + (1 * WEI)), + (AccountId::from(BOB), 0), + ]) + .build() + .execute_with(|| { + // Substrate transfer + assert_ok!(Balances::transfer( + origin_of(AccountId::from(ALICE)), + AccountId::from(BOB), + 1 * MOVR, + )); + // 1 WEI is left in the account + assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 1 * WEI); + }); +} + +#[test] +fn transfer_ed_0_evm() { + ExtBuilder::default() + .with_balances(vec![ + ( + AccountId::from(ALICE), + ((1 * MOVR) + (21_000 * BASE_FEE_GENESIS)) + (1 * WEI), + ), + (AccountId::from(BOB), 0), + ]) + .build() + .execute_with(|| { + // EVM transfer + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(ALICE), + target: H160::from(BOB), + input: Vec::new(), + value: (1 * MOVR).into(), + gas_limit: 21_000u64, + max_fee_per_gas: U256::from(BASE_FEE_GENESIS), + max_priority_fee_per_gas: Some(U256::from(BASE_FEE_GENESIS)), + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + // 1 WEI is left in the account + assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 1 * WEI,); + }); +} + +#[test] +fn refund_ed_0_evm() { + ExtBuilder::default() + .with_balances(vec![ + ( + AccountId::from(ALICE), + ((1 * MOVR) + (21_777 * BASE_FEE_GENESIS)), + ), + (AccountId::from(BOB), 0), + ]) + .build() + .execute_with(|| { + // EVM transfer that zeroes ALICE + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(ALICE), + target: H160::from(BOB), + input: Vec::new(), + value: (1 * MOVR).into(), + gas_limit: 21_777u64, + max_fee_per_gas: U256::from(BASE_FEE_GENESIS), + max_priority_fee_per_gas: Some(U256::from(BASE_FEE_GENESIS)), + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + // ALICE is refunded + assert_eq!( + Balances::free_balance(AccountId::from(ALICE)), + 777 * BASE_FEE_GENESIS, + ); + }); +} + +#[test] +fn author_does_not_receive_priority_fee() { + ExtBuilder::default() + .with_balances(vec![( + AccountId::from(BOB), + (1 * MOVR) + (21_000 * (500 * GIGAWEI)), + )]) + .build() + .execute_with(|| { + // Some block author as seen by pallet-evm. + let author = AccountId::from(>::find_author()); + // Currently the default impl of the evm uses `deposit_into_existing`. + // If we were to use this implementation, and for an author to receive eventual tips, + // the account needs to be somehow initialized, otherwise the deposit would fail. + Balances::make_free_balance_be(&author, 100 * MOVR); + + // EVM transfer. + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(BOB), + target: H160::from(ALICE), + input: Vec::new(), + value: (1 * MOVR).into(), + gas_limit: 21_000u64, + max_fee_per_gas: U256::from(300 * GIGAWEI), + max_priority_fee_per_gas: Some(U256::from(200 * GIGAWEI)), + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + // Author free balance didn't change. + assert_eq!(Balances::free_balance(author), 100 * MOVR,); + }); +} + +#[test] +fn total_issuance_after_evm_transaction_with_priority_fee() { + ExtBuilder::default() + .with_balances(vec![( + AccountId::from(BOB), + (1 * MOVR) + (21_000 * (2 * BASE_FEE_GENESIS)), + )]) + .build() + .execute_with(|| { + let issuance_before = ::Currency::total_issuance(); + // EVM transfer. + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(BOB), + target: H160::from(ALICE), + input: Vec::new(), + value: (1 * MOVR).into(), + gas_limit: 21_000u64, + max_fee_per_gas: U256::from(2u128 * BASE_FEE_GENESIS), + max_priority_fee_per_gas: Some(U256::from(2u128 * BASE_FEE_GENESIS)), + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + let issuance_after = ::Currency::total_issuance(); + let fee = ((2 * BASE_FEE_GENESIS) * 21_000) as f64; + // 80% was burned. + let expected_burn = (fee * 0.8) as u128; + assert_eq!(issuance_after, issuance_before - expected_burn,); + // 20% was sent to treasury. + let expected_treasury = (fee * 0.2) as u128; + assert_eq!(moonriver_runtime::Treasury::pot(), expected_treasury); + }); +} + +#[test] +fn total_issuance_after_evm_transaction_without_priority_fee() { + ExtBuilder::default() + .with_balances(vec![( + AccountId::from(BOB), + (1 * MOVR) + (21_000 * (2 * BASE_FEE_GENESIS)), + )]) + .build() + .execute_with(|| { + let issuance_before = ::Currency::total_issuance(); + // EVM transfer. + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::::call { + source: H160::from(BOB), + target: H160::from(ALICE), + input: Vec::new(), + value: (1 * MOVR).into(), + gas_limit: 21_000u64, + max_fee_per_gas: U256::from(BASE_FEE_GENESIS), + max_priority_fee_per_gas: Some(U256::from(BASE_FEE_GENESIS)), + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + let issuance_after = ::Currency::total_issuance(); + let fee = ((1 * BASE_FEE_GENESIS) * 21_000) as f64; + // 80% was burned. + let expected_burn = (fee * 0.8) as u128; + assert_eq!(issuance_after, issuance_before - expected_burn,); + // 20% was sent to treasury. + let expected_treasury = (fee * 0.2) as u128; + assert_eq!(moonriver_runtime::Treasury::pot(), expected_treasury); + }); +} + +#[test] +fn root_can_change_default_xcm_vers() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000_000_000_000_000)], + is_sufficient: true, + }]) + .build() + .execute_with(|| { + let source_location = AssetType::Xcm(MultiLocation::parent()); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: [1u8; 32], + }), + }; + let source_id: moonriver_runtime::AssetId = source_location.clone().into(); + // Default XCM version is not set yet, so xtokens should fail because it does not + // know with which version to send + assert_noop!( + XTokens::transfer( + origin_of(AccountId::from(ALICE)), + CurrencyId::ForeignAsset(source_id), + 100_000_000_000_000, + Box::new(xcm::VersionedMultiLocation::V3(dest.clone())), + WeightLimit::Limited(4000000000.into()) + ), + orml_xtokens::Error::::XcmExecutionFailed + ); + + // Root sets the defaultXcm + assert_ok!(PolkadotXcm::force_default_xcm_version( + root_origin(), + Some(2) + )); + + // Now transferring does not fail + assert_ok!(XTokens::transfer( + origin_of(AccountId::from(ALICE)), + CurrencyId::ForeignAsset(source_id), + 100_000_000_000_000, + Box::new(xcm::VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(4000000000.into()) + )); + }) +} + +#[test] +fn asset_can_be_registered() { + ExtBuilder::default().build().execute_with(|| { + let source_location = AssetType::Xcm(MultiLocation::parent()); + let source_id: moonriver_runtime::AssetId = source_location.clone().into(); + let asset_metadata = AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }; + assert_ok!(AssetManager::register_foreign_asset( + moonriver_runtime::RuntimeOrigin::root(), + source_location, + asset_metadata, + 1u128, + true + )); + assert!(AssetManager::asset_id_type(source_id).is_some()); + }); +} + +#[test] +fn local_assets_cannot_be_create_by_signed_origins() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR * SUPPLY_FACTOR), + (AccountId::from(BOB), 1_000 * MOVR * SUPPLY_FACTOR), + ]) + .build() + .execute_with(|| { + assert_noop!( + RuntimeCall::LocalAssets( + pallet_assets::Call::::create { + id: 11u128.into(), + admin: AccountId::from(ALICE), + min_balance: 1u128 + } + ) + .dispatch(::RuntimeOrigin::signed( + AccountId::from(ALICE) + )), + frame_system::Error::::CallFiltered + ); + }); +} + +#[test] +fn asset_erc20_precompiles_supply_and_balance() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * MOVR)], + AccountId::from(ALICE), + )]) + .build() + .execute_with(|| { + // Assert the asset has been created with the correct supply + assert_eq!(LocalAssets::total_supply(0u128), 1_000 * MOVR); + + // Convert the assetId to its corresponding precompile address + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // The expected result for both total supply and balance of is the same, as only Alice + // holds balance. + + // Access totalSupply through precompile. + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::total_supply {}, + ) + .expect_cost(3000) + .expect_no_logs() + .execute_returns(U256::from(1000 * MOVR)); + + // Access balanceOf through precompile + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(ALICE.into()), + }, + ) + .expect_cost(3000) + .expect_no_logs() + .execute_returns(U256::from(1000 * MOVR)); + }); +} + +#[test] +fn asset_erc20_precompiles_transfer() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * MOVR)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Transfer tokens from Aice to Bob, 400 MOVR. + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::transfer { + to: Address(BOB.into()), + value: { 400 * MOVR }.into(), + }, + ) + .expect_cost(25775) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::from(ALICE), + H160::from(BOB), + solidity::encode_event_data(U256::from(400 * MOVR)), + )) + .execute_returns(true); + + // Make sure BOB has 400 MOVR + Precompiles::new() + .prepare_test( + BOB, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(BOB.into()), + }, + ) + .expect_cost(3000) + .expect_no_logs() + .execute_returns(U256::from(400 * MOVR)); + }); +} + +#[test] +fn asset_erc20_precompiles_approve() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * MOVR)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Aprove Bob for spending 400 MOVR from Alice + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::approve { + spender: Address(BOB.into()), + value: { 400 * MOVR }.into(), + }, + ) + .expect_cost(16048) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_APPROVAL, + H160::from(ALICE), + H160::from(BOB), + solidity::encode_event_data(U256::from(400 * MOVR)), + )) + .execute_returns(true); + + // Transfer tokens from Alice to Charlie by using BOB as origin + Precompiles::new() + .prepare_test( + BOB, + asset_precompile_address, + LocalAssetsPCall::transfer_from { + from: Address(ALICE.into()), + to: Address(CHARLIE.into()), + value: { 400 * MOVR }.into(), + }, + ) + .expect_cost(33145) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::from(ALICE), + H160::from(CHARLIE), + solidity::encode_event_data(U256::from(400 * MOVR)), + )) + .execute_returns(true); + + // Make sure CHARLIE has 400 MOVR + Precompiles::new() + .prepare_test( + CHARLIE, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(CHARLIE.into()), + }, + ) + .expect_cost(3000) + .expect_no_logs() + .execute_returns(U256::from(400 * MOVR)); + }); +} + +#[test] +fn asset_erc20_precompiles_mint_burn() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * MOVR)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Mint 1000 MOVRS to BOB + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::mint { + to: Address(BOB.into()), + value: { 1000 * MOVR }.into(), + }, + ) + .expect_cost(14932) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::default(), + H160::from(BOB), + solidity::encode_event_data(U256::from(1_000 * MOVR)), + )) + .execute_returns(true); + + // Assert the asset has been minted + assert_eq!(LocalAssets::total_supply(0u128), 2_000 * MOVR); + assert_eq!( + LocalAssets::balance(0u128, AccountId::from(BOB)), + 1_000 * MOVR + ); + + // Burn tokens + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::burn { + from: Address(BOB.into()), + value: { 500 * MOVR }.into(), + }, + ) + .expect_cost(15172) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::from(BOB), + H160::default(), + solidity::encode_event_data(U256::from(500 * MOVR)), + )) + .execute_returns(true); + + // Assert the asset has been burnt + assert_eq!(LocalAssets::total_supply(0u128), 1_500 * MOVR); + assert_eq!( + LocalAssets::balance(0u128, AccountId::from(BOB)), + 500 * MOVR + ); + }); +} + +#[test] +fn asset_erc20_precompiles_freeze_thaw_account() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * MOVR)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Freeze Account + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::freeze { + account: Address(ALICE.into()), + }, + ) + .expect_cost(8783) + .expect_no_logs() + .execute_returns(true); + + // Assert account is frozen + assert_eq!( + LocalAssets::can_withdraw(0u128, &AccountId::from(ALICE), 1).into_result(), + Err(TokenError::Frozen.into()) + ); + + // Thaw Account + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::thaw { + account: Address(ALICE.into()), + }, + ) + .expect_cost(8803) + .expect_no_logs() + .execute_returns(true); + + // Assert account is not frozen + assert!(LocalAssets::can_withdraw(0u128, &AccountId::from(ALICE), 1) + .into_result() + .is_ok()); + }); +} + +#[test] +fn asset_erc20_precompiles_freeze_thaw_asset() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * MOVR)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Freeze Asset + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::freeze_asset {}, + ) + .expect_cost(7623) + .expect_no_logs() + .execute_returns(true); + + // Assert account is frozen + assert_eq!( + LocalAssets::can_withdraw(0u128, &AccountId::from(ALICE), 1).into_result(), + Err(TokenError::Frozen.into()) + ); + + // Thaw Asset + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::thaw_asset {}, + ) + .expect_cost(7634) + .expect_no_logs() + .execute_returns(true); + + // Assert account is not frozen + assert!(LocalAssets::can_withdraw(0u128, &AccountId::from(ALICE), 1) + .into_result() + .is_ok()); + }); +} + +#[test] +fn asset_erc20_precompiles_freeze_transfer_ownership() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * MOVR)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Transfer ownerhsip of an asset + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::transfer_ownership { + owner: Address(BOB.into()), + }, + ) + .expect_cost(8706) + .expect_no_logs() + .execute_returns(true); + + // No clear way of testing BOB is new owner, other than doing a priviledged function + // e.g., transfer_ownership again + assert_ok!(LocalAssets::transfer_ownership( + origin_of(AccountId::from(BOB)), + 0u128.into(), + AccountId::from(ALICE) + )); + }); +} + +#[test] +fn asset_erc20_precompiles_freeze_set_team() { + ExtBuilder::default() + .with_local_assets(vec![( + 0u128, + vec![(AccountId::from(ALICE), 1_000 * MOVR)], + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .build() + .execute_with(|| { + let asset_precompile_address = + Runtime::asset_id_to_account(LOCAL_ASSET_PRECOMPILE_ADDRESS_PREFIX, 0u128); + + // Set Bob as issuer, admin and freezer + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::set_team { + admin: Address(BOB.into()), + issuer: Address(BOB.into()), + freezer: Address(BOB.into()), + }, + ) + .expect_cost(7657) + .expect_no_logs() + .execute_returns(true); + + // Bob should be able to mint, freeze, and thaw + assert_ok!(LocalAssets::mint( + origin_of(AccountId::from(BOB)), + 0u128.into(), + AccountId::from(BOB), + 1_000 * MOVR + )); + assert_ok!(LocalAssets::freeze( + origin_of(AccountId::from(BOB)), + 0u128.into(), + AccountId::from(ALICE) + )); + assert_ok!(LocalAssets::thaw( + origin_of(AccountId::from(BOB)), + 0u128.into(), + AccountId::from(ALICE) + )); + }); +} + +#[test] +fn xcm_asset_erc20_precompiles_supply_and_balance() { + ExtBuilder::default() + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000 * MOVR)], + is_sufficient: true, + }]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .build() + .execute_with(|| { + // We have the assetId that corresponds to the relay chain registered + let relay_asset_id: AssetId = AssetType::Xcm(MultiLocation::parent()).into(); + + // Its address is + let asset_precompile_address = Runtime::asset_id_to_account( + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + relay_asset_id, + ); + + // Assert the asset has been created with the correct supply + assert_eq!(Assets::total_supply(relay_asset_id), 1_000 * MOVR); + + // Access totalSupply through precompile. Important that the context is correct + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::total_supply {}, + ) + .expect_cost(2000) + .expect_no_logs() + .execute_returns(U256::from(1000 * MOVR)); + + // Access balanceOf through precompile + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(ALICE.into()), + }, + ) + .expect_cost(2000) + .expect_no_logs() + .execute_returns(U256::from(1000 * MOVR)); + }); +} + +#[test] +fn xcm_asset_erc20_precompiles_transfer() { + ExtBuilder::default() + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000 * MOVR)], + is_sufficient: true, + }]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .build() + .execute_with(|| { + // We have the assetId that corresponds to the relay chain registered + let relay_asset_id: AssetId = AssetType::Xcm(MultiLocation::parent()).into(); + + // Its address is + let asset_precompile_address = Runtime::asset_id_to_account( + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + relay_asset_id, + ); + + // Transfer tokens from Aice to Bob, 400 MOVR. + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::transfer { + to: Address(BOB.into()), + value: { 400 * MOVR }.into(), + }, + ) + .expect_cost(24775) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::from(ALICE), + H160::from(BOB), + solidity::encode_event_data(U256::from(400 * MOVR)), + )) + .execute_returns(true); + + // Make sure BOB has 400 MOVR + Precompiles::new() + .prepare_test( + BOB, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(BOB.into()), + }, + ) + .expect_cost(2000) + .expect_no_logs() + .execute_returns(U256::from(400 * MOVR)); + }); +} + +#[test] +fn xcm_asset_erc20_precompiles_approve() { + ExtBuilder::default() + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000 * MOVR)], + is_sufficient: true, + }]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .build() + .execute_with(|| { + // We have the assetId that corresponds to the relay chain registered + let relay_asset_id: AssetId = AssetType::Xcm(MultiLocation::parent()).into(); + + // Its address is + let asset_precompile_address = Runtime::asset_id_to_account( + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + relay_asset_id, + ); + + // Aprove Bob for spending 400 MOVR from Alice + Precompiles::new() + .prepare_test( + ALICE, + asset_precompile_address, + LocalAssetsPCall::approve { + spender: Address(BOB.into()), + value: { 400 * MOVR }.into(), + }, + ) + .expect_cost(15048) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_APPROVAL, + H160::from(ALICE), + H160::from(BOB), + solidity::encode_event_data(U256::from(400 * MOVR)), + )) + .execute_returns(true); + + // Transfer tokens from Alice to Charlie by using BOB as origin + Precompiles::new() + .prepare_test( + BOB, + asset_precompile_address, + LocalAssetsPCall::transfer_from { + from: Address(ALICE.into()), + to: Address(CHARLIE.into()), + value: { 400 * MOVR }.into(), + }, + ) + .expect_cost(32145) + .expect_log(log3( + asset_precompile_address, + SELECTOR_LOG_TRANSFER, + H160::from(ALICE), + H160::from(CHARLIE), + solidity::encode_event_data(U256::from(400 * MOVR)), + )) + .execute_returns(true); + + // Make sure CHARLIE has 400 MOVR + Precompiles::new() + .prepare_test( + CHARLIE, + asset_precompile_address, + LocalAssetsPCall::balance_of { + who: Address(CHARLIE.into()), + }, + ) + .expect_cost(2000) + .expect_no_logs() + .execute_returns(U256::from(400 * MOVR)); + }); +} + +#[test] +fn xtokens_precompiles_transfer() { + ExtBuilder::default() + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000_000_000_000_000)], + is_sufficient: true, + }]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + let xtokens_precompile_address = H160::from_low_u64_be(2052); + + // We have the assetId that corresponds to the relay chain registered + let relay_asset_id: moonriver_runtime::AssetId = + AssetType::Xcm(MultiLocation::parent()).into(); + + // Its address is + let asset_precompile_address = Runtime::asset_id_to_account( + FOREIGN_ASSET_PRECOMPILE_ADDRESS_PREFIX, + relay_asset_id, + ); + + // Alice has 1000 tokens. She should be able to send through precompile + let destination = MultiLocation::new( + 1, + Junctions::X1(Junction::AccountId32 { + network: None, + id: [1u8; 32], + }), + ); + + // We use the address of the asset as an identifier of the asset we want to transferS + Precompiles::new() + .prepare_test( + ALICE, + xtokens_precompile_address, + XtokensPCall::transfer { + currency_address: Address(asset_precompile_address.into()), + amount: 500_000_000_000_000u128.into(), + destination: destination.clone(), + weight: 4_000_000, + }, + ) + .expect_cost(57639) + .expect_no_logs() + .execute_returns(()) + }) +} + +#[test] +fn xtokens_precompiles_transfer_multiasset() { + ExtBuilder::default() + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000_000_000_000_000)], + is_sufficient: true, + }]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + let xtokens_precompile_address = H160::from_low_u64_be(2052); + + // Alice has 1000 tokens. She should be able to send through precompile + let destination = MultiLocation::new( + 1, + Junctions::X1(Junction::AccountId32 { + network: None, + id: [1u8; 32], + }), + ); + + // This time we transfer it through TransferMultiAsset + // Instead of the address, we encode directly the multilocation referencing the asset + Precompiles::new() + .prepare_test( + ALICE, + xtokens_precompile_address, + XtokensPCall::transfer_multiasset { + // We want to transfer the relay token + asset: MultiLocation::parent(), + amount: 500_000_000_000_000u128.into(), + destination, + weight: 4_000_000, + }, + ) + .expect_cost(57639) + .expect_no_logs() + .execute_returns(()); + }) +} + +#[test] +fn make_sure_polkadot_xcm_cannot_be_called() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 1_000 * MOVR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .build() + .execute_with(|| { + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: [1u8; 32], + }), + }; + let multiassets: MultiAssets = [MultiAsset { + id: Concrete(moonriver_runtime::xcm_config::SelfLocation::get()), + fun: Fungible(1000), + }] + .to_vec() + .into(); + assert_noop!( + RuntimeCall::PolkadotXcm(pallet_xcm::Call::::reserve_transfer_assets { + dest: Box::new(VersionedMultiLocation::V3(dest.clone())), + beneficiary: Box::new(VersionedMultiLocation::V3(dest)), + assets: Box::new(VersionedMultiAssets::V3(multiassets)), + fee_asset_item: 0, + }) + .dispatch(::RuntimeOrigin::signed( + AccountId::from(ALICE) + )), + frame_system::Error::::CallFiltered + ); + }); +} + +#[test] +fn transactor_cannot_use_more_than_max_weight() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000_000_000_000_000)], + is_sufficient: true, + }]) + .build() + .execute_with(|| { + let source_location = AssetType::Xcm(MultiLocation::parent()); + let source_id: moonriver_runtime::AssetId = source_location.clone().into(); + assert_ok!(XcmTransactor::register( + root_origin(), + AccountId::from(ALICE), + 0, + )); + + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + root_origin(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + // Relay charges 1000 for every instruction, and we have 3, so 3000 + 3000.into(), + 20000.into(), + None + )); + + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + root_origin(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + 1 + )); + + assert_noop!( + XcmTransactor::transact_through_derivative( + origin_of(AccountId::from(ALICE)), + moonriver_runtime::xcm_config::Transactors::Relay, + 0, + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new( + xcm::VersionedMultiLocation::V3(MultiLocation::parent()) + )), + fee_amount: None + }, + vec![], + // 2000 is the max + TransactWeights { + transact_required_weight_at_most: 17001.into(), + overall_weight: None + } + ), + pallet_xcm_transactor::Error::::MaxWeightTransactReached + ); + assert_noop!( + XcmTransactor::transact_through_derivative( + origin_of(AccountId::from(ALICE)), + moonriver_runtime::xcm_config::Transactors::Relay, + 0, + CurrencyPayment { + currency: Currency::AsCurrencyId(CurrencyId::ForeignAsset(source_id)), + fee_amount: None + }, + vec![], + // 20000 is the max + TransactWeights { + transact_required_weight_at_most: 17001.into(), + overall_weight: None + } + ), + pallet_xcm_transactor::Error::::MaxWeightTransactReached + ); + }) +} + +#[test] +fn transact_through_signed_precompile_works_v2() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + // Destination + let dest = MultiLocation::parent(); + + let fee_payer_asset = MultiLocation::parent(); + + let bytes = vec![1u8, 2u8, 3u8]; + + let total_weight = 1_000_000_000u64; + + let xcm_transactor_v2_precompile_address = H160::from_low_u64_be(2061); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_transactor_v2_precompile_address, + XcmTransactorV2PCall::transact_through_signed_multilocation { + dest, + fee_asset: fee_payer_asset, + weight: 4_000_000, + call: bytes.into(), + fee_amount: u128::from(total_weight).into(), + overall_weight: total_weight, + }, + ) + .expect_cost(18737) + .expect_no_logs() + .execute_returns(()); + }); +} + +#[test] +fn transact_through_signed_cannot_send_to_local_chain() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_safe_xcm_version(2) + .build() + .execute_with(|| { + // Destination + let dest = MultiLocation::here(); + + let fee_payer_asset = MultiLocation::parent(); + + let bytes = vec![1u8, 2u8, 3u8]; + + let total_weight = 1_000_000_000u64; + + let xcm_transactor_v2_precompile_address = H160::from_low_u64_be(2061); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_transactor_v2_precompile_address, + XcmTransactorV2PCall::transact_through_signed_multilocation { + dest, + fee_asset: fee_payer_asset, + weight: 4_000_000, + call: bytes.into(), + fee_amount: u128::from(total_weight).into(), + overall_weight: total_weight, + }, + ) + .execute_reverts(|output| { + from_utf8(&output) + .unwrap() + .contains("Dispatched call failed with error:") + && from_utf8(&output).unwrap().contains("ErrorValidating") + }); + }); +} + +#[test] +fn call_xtokens_with_fee() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_safe_xcm_version(2) + .with_xcm_assets(vec![XcmAssetInitialization { + asset_type: AssetType::Xcm(MultiLocation::parent()), + metadata: AssetRegistrarMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + is_frozen: false, + }, + balances: vec![(AccountId::from(ALICE), 1_000_000_000_000_000)], + is_sufficient: true, + }]) + .build() + .execute_with(|| { + let source_location = AssetType::Xcm(MultiLocation::parent()); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: [1u8; 32], + }), + }; + let source_id: moonriver_runtime::AssetId = source_location.clone().into(); + + let before_balance = Assets::balance(source_id, &AccountId::from(ALICE)); + + // We are able to transfer with fee + assert_ok!(XTokens::transfer_with_fee( + origin_of(AccountId::from(ALICE)), + CurrencyId::ForeignAsset(source_id), + 100_000_000_000_000, + 100, + Box::new(xcm::VersionedMultiLocation::V3(dest.clone())), + WeightLimit::Limited(4000000000.into()) + ),); + + let after_balance = Assets::balance(source_id, &AccountId::from(ALICE)); + // At least these much (plus fees) should have been charged + assert_eq!(before_balance - 100_000_000_000_000 - 100, after_balance); + }); +} + +#[test] +fn test_xcm_utils_ml_tp_account() { + ExtBuilder::default().build().execute_with(|| { + let xcm_utils_precompile_address = H160::from_low_u64_be(2060); + let expected_address_parent: H160 = + ParentIsPreset::::convert_ref(MultiLocation::parent()) + .unwrap() + .into(); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_utils_precompile_address, + XcmUtilsPCall::multilocation_to_address { + multilocation: MultiLocation::parent(), + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(Address(expected_address_parent)); + + let parachain_2000_multilocation = MultiLocation::new(1, X1(Parachain(2000))); + let expected_address_parachain: H160 = + SiblingParachainConvertsVia::::convert_ref( + parachain_2000_multilocation.clone(), + ) + .unwrap() + .into(); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_utils_precompile_address, + XcmUtilsPCall::multilocation_to_address { + multilocation: parachain_2000_multilocation, + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(Address(expected_address_parachain)); + + let alice_in_parachain_2000_multilocation = MultiLocation::new( + 1, + X2( + Parachain(2000), + AccountKey20 { + network: None, + key: ALICE, + }, + ), + ); + let expected_address_alice_in_parachain_2000: H160 = + xcm_builder::HashedDescriptionDescribeFamilyAllTerminal::::convert_ref( + alice_in_parachain_2000_multilocation.clone(), + ) + .unwrap() + .into(); + + Precompiles::new() + .prepare_test( + ALICE, + xcm_utils_precompile_address, + XcmUtilsPCall::multilocation_to_address { + multilocation: alice_in_parachain_2000_multilocation, + }, + ) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(Address(expected_address_alice_in_parachain_2000)); + }); +} + +#[test] +fn test_xcm_utils_weight_message() { + ExtBuilder::default().build().execute_with(|| { + let xcm_utils_precompile_address = H160::from_low_u64_be(2060); + let expected_weight = + XcmWeight::::clear_origin().ref_time(); + + let message: Vec = xcm::VersionedXcm::<()>::V3(Xcm(vec![ClearOrigin])).encode(); + + let input = XcmUtilsPCall::weight_message { + message: message.into(), + }; + + Precompiles::new() + .prepare_test(ALICE, xcm_utils_precompile_address, input) + .expect_cost(0) + .expect_no_logs() + .execute_returns(expected_weight); + }); +} + +#[test] +fn test_xcm_utils_get_units_per_second() { + ExtBuilder::default().build().execute_with(|| { + let xcm_utils_precompile_address = H160::from_low_u64_be(2060); + let multilocation = SelfReserve::get(); + + let input = XcmUtilsPCall::get_units_per_second { multilocation }; + + let expected_units = + WEIGHT_REF_TIME_PER_SECOND as u128 * moonriver_runtime::currency::WEIGHT_FEE; + + Precompiles::new() + .prepare_test(ALICE, xcm_utils_precompile_address, input) + .expect_cost(1000) + .expect_no_logs() + .execute_returns(expected_units); + }); +} + +#[test] +fn precompile_existence() { + ExtBuilder::default().build().execute_with(|| { + let precompiles = Precompiles::new(); + let precompile_addresses: std::collections::BTreeSet<_> = vec![ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 1024, 1025, 1026, 2048, 2049, 2050, 2051, 2052, 2053, 2054, + 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, + 2069, 2070, + ] + .into_iter() + .map(H160::from_low_u64_be) + .collect(); + + for i in 0..3000 { + let address = H160::from_low_u64_be(i); + + if precompile_addresses.contains(&address) { + assert!( + is_precompile_or_fail::(address, 100_000u64).expect("to be ok"), + "is_precompile({}) should return true", + i + ); + + assert!( + precompiles + .execute(&mut MockHandle::new( + address, + Context { + address, + caller: H160::zero(), + apparent_value: U256::zero() + } + ),) + .is_some(), + "execute({},..) should return Some(_)", + i + ); + } else { + assert!( + !is_precompile_or_fail::(address, 100_000u64).expect("to be ok"), + "is_precompile({}) should return false", + i + ); + + assert!( + precompiles + .execute(&mut MockHandle::new( + address, + Context { + address, + caller: H160::zero(), + apparent_value: U256::zero() + } + ),) + .is_none(), + "execute({},..) should return None", + i + ); + } + } + }); +} + +#[test] +fn removed_precompiles() { + ExtBuilder::default().build().execute_with(|| { + let precompiles = Precompiles::new(); + let removed_precompiles = [1025]; + + for i in 1..3000 { + let address = H160::from_low_u64_be(i); + + if !is_precompile_or_fail::(address, 100_000u64).expect("to be ok") { + continue; + } + + if !removed_precompiles.contains(&i) { + assert!( + match precompiles.is_active_precompile(address, 100_000u64) { + IsPrecompileResult::Answer { is_precompile, .. } => is_precompile, + _ => false, + }, + "{i} should be an active precompile" + ); + continue; + } + + assert!( + !match precompiles.is_active_precompile(address, 100_000u64) { + IsPrecompileResult::Answer { is_precompile, .. } => is_precompile, + _ => false, + }, + "{i} shouldn't be an active precompile" + ); + + precompiles + .prepare_test(Alice, address, []) + .execute_reverts(|out| out == b"Removed precompile"); + } + }) +} + +#[test] +fn deal_with_fees_handles_tip() { + use frame_support::traits::OnUnbalanced; + use moonriver_runtime::{DealWithFees, Treasury}; + use pallet_balances::NegativeImbalance; + + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 10_000)]) + .build() + .execute_with(|| { + // Alice has 10_000, which makes inital supply 10_000. + // drop()ing the NegativeImbalance below will cause the total_supply to be decreased + // incorrectly (since there was never a withdraw to begin with), which in this case has + // the desired effect of showing that currency was burned. + let total_supply_before = Balances::total_issuance(); + assert_eq!(total_supply_before, 10_000); + + let fees_then_tips = vec![ + NegativeImbalance::::new(100), + NegativeImbalance::::new(1_000), + ]; + DealWithFees::on_unbalanceds(fees_then_tips.into_iter()); + + // treasury should have received 20% + assert_eq!(Balances::free_balance(&Treasury::account_id()), 220); + + // verify 80% burned + let total_supply_after = Balances::total_issuance(); + assert_eq!(total_supply_before - total_supply_after, 880); + }); +} + +#[test] +fn evm_revert_substrate_events() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 1_000 * MOVR)]) + .build() + .execute_with(|| { + let batch_precompile_address = H160::from_low_u64_be(2056); + + // Batch a transfer followed by an invalid call to batch. + // Thus BatchAll will revert the transfer. + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::call { + source: ALICE.into(), + target: batch_precompile_address, + input: BatchPCall::batch_all { + to: vec![Address(BOB.into()), Address(batch_precompile_address)].into(), + value: vec![U256::from(1 * MOVR), U256::zero()].into(), + call_data: vec![].into(), + gas_limit: vec![].into() + } + .into(), + value: U256::zero(), // No value sent in EVM + gas_limit: 500_000, + max_fee_per_gas: U256::from(BASE_FEE_GENESIS), + max_priority_fee_per_gas: None, + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + let transfer_count = System::events() + .iter() + .filter(|r| match r.event { + RuntimeEvent::Balances(pallet_balances::Event::Transfer { .. }) => true, + _ => false, + }) + .count(); + + assert_eq!(transfer_count, 0, "there should be no transfer event"); + }); +} + +#[test] +fn evm_success_keeps_substrate_events() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 1_000 * MOVR)]) + .build() + .execute_with(|| { + let batch_precompile_address = H160::from_low_u64_be(2056); + + assert_ok!(RuntimeCall::EVM(pallet_evm::Call::call { + source: ALICE.into(), + target: batch_precompile_address, + input: BatchPCall::batch_all { + to: vec![Address(BOB.into())].into(), + value: vec![U256::from(1 * MOVR)].into(), + call_data: vec![].into(), + gas_limit: vec![].into() + } + .into(), + value: U256::zero(), // No value sent in EVM + gas_limit: 500_000, + max_fee_per_gas: U256::from(BASE_FEE_GENESIS), + max_priority_fee_per_gas: None, + nonce: Some(U256::from(0)), + access_list: Vec::new(), + }) + .dispatch(::RuntimeOrigin::root())); + + let transfer_count = System::events() + .iter() + .filter(|r| match r.event { + RuntimeEvent::Balances(pallet_balances::Event::Transfer { .. }) => true, + _ => false, + }) + .count(); + + assert_eq!(transfer_count, 1, "there should be 1 transfer event"); + }); +} + +#[cfg(test)] +mod fee_tests { + use super::*; + use frame_support::{ + traits::ConstU128, + weights::{ConstantMultiplier, WeightToFee}, + }; + use moonriver_runtime::{ + currency, LengthToFee, MinimumMultiplier, RuntimeBlockWeights, SlowAdjustingFeeUpdate, + TargetBlockFullness, TransactionPayment, + }; + use sp_core::Get; + use sp_runtime::FixedPointNumber; + + fn run_with_system_weight(w: Weight, mut assertions: F) + where + F: FnMut() -> (), + { + let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap() + .into(); + t.execute_with(|| { + System::set_block_consumed_resources(w, 0); + assertions() + }); + } + + #[test] + fn test_multiplier_can_grow_from_zero() { + let minimum_multiplier = MinimumMultiplier::get(); + let target = TargetBlockFullness::get() + * RuntimeBlockWeights::get() + .get(DispatchClass::Normal) + .max_total + .unwrap(); + // if the min is too small, then this will not change, and we are doomed forever. + // the weight is 1/100th bigger than target. + run_with_system_weight(target * 101 / 100, || { + let next = SlowAdjustingFeeUpdate::::convert(minimum_multiplier); + assert!( + next > minimum_multiplier, + "{:?} !>= {:?}", + next, + minimum_multiplier + ); + }) + } + + #[test] + fn test_fee_calculation() { + let base_extrinsic = RuntimeBlockWeights::get() + .get(DispatchClass::Normal) + .base_extrinsic; + let multiplier = sp_runtime::FixedU128::from_float(0.999000000000000000); + let extrinsic_len = 100u32; + let extrinsic_weight = Weight::from_parts(5_000u64, 1); + let tip = 42u128; + type WeightToFeeImpl = ConstantMultiplier>; + type LengthToFeeImpl = LengthToFee; + + // base_fee + (multiplier * extrinsic_weight_fee) + extrinsic_length_fee + tip + let expected_fee = WeightToFeeImpl::weight_to_fee(&base_extrinsic) + + multiplier.saturating_mul_int(WeightToFeeImpl::weight_to_fee(&extrinsic_weight)) + + LengthToFeeImpl::weight_to_fee(&(Weight::from_parts(extrinsic_len as u64, 1))) + + tip; + + let mut t: sp_io::TestExternalities = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap() + .into(); + t.execute_with(|| { + pallet_transaction_payment::NextFeeMultiplier::::set(multiplier); + let actual_fee = TransactionPayment::compute_fee( + extrinsic_len, + &frame_support::dispatch::DispatchInfo { + class: DispatchClass::Normal, + pays_fee: frame_support::dispatch::Pays::Yes, + weight: extrinsic_weight, + }, + tip, + ); + + assert_eq!( + expected_fee, + actual_fee, + "The actual fee did not match the expected fee, diff {}", + actual_fee - expected_fee + ); + }); + } +} diff --git a/tracing/2402/runtime/moonriver/tests/runtime_apis.rs b/tracing/2402/runtime/moonriver/tests/runtime_apis.rs new file mode 100644 index 0000000..13819c1 --- /dev/null +++ b/tracing/2402/runtime/moonriver/tests/runtime_apis.rs @@ -0,0 +1,396 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Moonriver Runtime Api Integration Tests + +mod common; +use common::*; + +use fp_evm::GenesisAccount; +use frame_support::assert_ok; +use nimbus_primitives::NimbusId; +use pallet_evm::{Account as EVMAccount, AddressMapping, FeeCalculator}; +use sp_core::{ByteArray, H160, H256, U256}; + +use fp_rpc::runtime_decl_for_ethereum_runtime_rpc_api::EthereumRuntimeRPCApi; +use moonbeam_rpc_primitives_txpool::runtime_decl_for_tx_pool_runtime_api::TxPoolRuntimeApi; +use nimbus_primitives::runtime_decl_for_nimbus_api::NimbusApi; +use std::{collections::BTreeMap, str::FromStr}; + +#[test] +fn ethereum_runtime_rpc_api_chain_id() { + ExtBuilder::default().build().execute_with(|| { + assert_eq!(Runtime::chain_id(), CHAIN_ID); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_account_basic() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 2_000 * MOVR)]) + .build() + .execute_with(|| { + assert_eq!( + Runtime::account_basic(H160::from(ALICE)), + EVMAccount { + balance: U256::from(2_000 * MOVR), + nonce: U256::zero() + } + ); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_gas_price() { + ExtBuilder::default().build().execute_with(|| { + assert_eq!( + Runtime::gas_price(), + TransactionPaymentAsGasPrice::min_gas_price().0 + ); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_account_code_at() { + let address = H160::from(EVM_CONTRACT); + let code: Vec = vec![1, 2, 3, 4, 5]; + ExtBuilder::default() + .with_evm_accounts({ + let mut map = BTreeMap::new(); + map.insert( + address, + GenesisAccount { + balance: U256::zero(), + code: code.clone(), + nonce: Default::default(), + storage: Default::default(), + }, + ); + map + }) + .build() + .execute_with(|| { + assert_eq!(Runtime::account_code_at(address), code); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_author() { + ExtBuilder::default() + .with_collators(vec![(AccountId::from(ALICE), 1_000 * MOVR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 500 * MOVR, + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + run_to_block(2, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + assert_eq!(Runtime::author(), H160::from(ALICE)); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_storage_at() { + let address = H160::from(EVM_CONTRACT); + let mut key = [0u8; 32]; + key[31..32].copy_from_slice(&[6u8][..]); + let mut value = [0u8; 32]; + value[31..32].copy_from_slice(&[7u8][..]); + let item = H256::from_slice(&key[..]); + let mut storage: BTreeMap = BTreeMap::new(); + storage.insert(H256::from_slice(&key[..]), item); + ExtBuilder::default() + .with_evm_accounts({ + let mut map = BTreeMap::new(); + map.insert( + address, + GenesisAccount { + balance: U256::zero(), + code: Vec::new(), + nonce: Default::default(), + storage: storage.clone(), + }, + ); + map + }) + .build() + .execute_with(|| { + assert_eq!(Runtime::storage_at(address, U256::from(6)), item); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_call() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 2_000 * MOVR), + ]) + .build() + .execute_with(|| { + let execution_result = Runtime::call( + H160::from(ALICE), // from + H160::from(BOB), // to + Vec::new(), // data + U256::from(1000u64), // value + U256::from(100000u64), // gas_limit + None, // max_fee_per_gas + None, // max_priority_fee_per_gas + None, // nonce + false, // estimate + None, // access_list + ); + assert!(execution_result.is_ok()); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_create() { + ExtBuilder::default() + .with_balances(vec![(AccountId::from(ALICE), 2_000 * MOVR)]) + .build() + .execute_with(|| { + let execution_result = Runtime::create( + H160::from(ALICE), // from + vec![0, 1, 1, 0], // data + U256::zero(), // value + U256::from(100000u64), // gas_limit + None, // max_fee_per_gas + None, // max_priority_fee_per_gas + None, // nonce + false, // estimate + None, // access_list + ); + assert!(execution_result.is_ok()); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_current_transaction_statuses() { + let alith = ::AddressMapping::into_account_id( + H160::from_str("f24ff3a9cf04c71dbc94d0b566f7a27b94566cac") + .expect("internal H160 is valid; qed"), + ); + ExtBuilder::default() + .with_collators(vec![(AccountId::from(ALICE), 1_000 * MOVR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (alith, 2_000 * MOVR), + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 500 * MOVR, + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + // set_author(NimbusId::from_slice(&ALICE_NIMBUS)); + let result = + Executive::apply_extrinsic(unchecked_eth_tx(VALID_ETH_TX)).expect("Apply result."); + assert_eq!(result, Ok(())); + rpc_run_to_block(2); + let statuses = + Runtime::current_transaction_statuses().expect("Transaction statuses result."); + assert_eq!(statuses.len(), 1); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_current_block() { + ExtBuilder::default() + .with_collators(vec![(AccountId::from(ALICE), 1_000 * MOVR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 500 * MOVR, + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + // set_author(NimbusId::from_slice(&ALICE_NIMBUS)); + rpc_run_to_block(2); + let block = Runtime::current_block().expect("Block result."); + assert_eq!(block.header.number, U256::from(1u8)); + }); +} + +#[test] +fn ethereum_runtime_rpc_api_current_receipts() { + let alith = ::AddressMapping::into_account_id( + H160::from_str("f24ff3a9cf04c71dbc94d0b566f7a27b94566cac") + .expect("internal H160 is valid; qed"), + ); + ExtBuilder::default() + .with_collators(vec![(AccountId::from(ALICE), 1_000 * MOVR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .with_balances(vec![ + (alith, 2_000 * MOVR), + (AccountId::from(ALICE), 2_000 * MOVR), + (AccountId::from(BOB), 1_000 * MOVR), + ]) + .with_delegations(vec![( + AccountId::from(BOB), + AccountId::from(ALICE), + 500 * MOVR, + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + // set_author(NimbusId::from_slice(&ALICE_NIMBUS)); + let result = + Executive::apply_extrinsic(unchecked_eth_tx(VALID_ETH_TX)).expect("Apply result."); + assert_eq!(result, Ok(())); + rpc_run_to_block(2); + let receipts = Runtime::current_receipts().expect("Receipts result."); + assert_eq!(receipts.len(), 1); + }); +} + +#[test] +fn txpool_runtime_api_extrinsic_filter() { + ExtBuilder::default().build().execute_with(|| { + let non_eth_uxt = UncheckedExtrinsic::new_unsigned( + pallet_balances::Call::::transfer { + dest: AccountId::from(BOB), + value: 1 * MOVR, + } + .into(), + ); + let eth_uxt = unchecked_eth_tx(VALID_ETH_TX); + let txpool = >::extrinsic_filter( + vec![eth_uxt.clone(), non_eth_uxt.clone()], + vec![unchecked_eth_tx(VALID_ETH_TX), non_eth_uxt], + ); + assert_eq!(txpool.ready.len(), 1); + assert_eq!(txpool.future.len(), 1); + }); +} + +#[test] +fn can_author_when_selected_is_empty() { + ExtBuilder::default() + .with_balances(vec![ + (AccountId::from(ALICE), 20_000_000 * MOVR), + (AccountId::from(BOB), 10_000_000 * MOVR), + ]) + .with_collators(vec![(AccountId::from(ALICE), 2_000_000 * MOVR)]) + .with_mappings(vec![( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + AccountId::from(ALICE), + )]) + .build() + .execute_with(|| { + set_parachain_inherent_data(); + run_to_block(2, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + + assert_eq!(ParachainStaking::candidate_pool().0.len(), 1); + + let slot_number = 0; + let parent = Header { + digest: Default::default(), + extrinsics_root: Default::default(), + number: Default::default(), + parent_hash: Default::default(), + state_root: Default::default(), + }; + + // Base case: ALICE can author blocks when she is the only candidate + let can_author_block = Runtime::can_author( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + slot_number, + &parent, + ); + + assert!(can_author_block); + + // Remove ALICE from candidate pool, leaving the candidate_pool empty + assert_ok!(ParachainStaking::go_offline(origin_of(AccountId::from( + ALICE + )))); + + // Need to fast forward to right before the next session, which is when selected candidates + // will be updated. We want to test the creation of the first block of the next session. + run_to_block(1799, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + + assert_eq!(ParachainStaking::candidate_pool().0.len(), 0); + + let slot_number = 0; + let parent = Header { + digest: Default::default(), + extrinsics_root: Default::default(), + number: 1799, + parent_hash: Default::default(), + state_root: Default::default(), + }; + + let can_author_block = Runtime::can_author( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + slot_number, + &parent, + ); + + assert!(can_author_block); + + // Check that it works as expected after session update + run_to_block(1800, Some(NimbusId::from_slice(&ALICE_NIMBUS).unwrap())); + + assert_eq!(ParachainStaking::candidate_pool().0.len(), 0); + + let slot_number = 0; + let parent = Header { + digest: Default::default(), + extrinsics_root: Default::default(), + number: 1800, + parent_hash: Default::default(), + state_root: Default::default(), + }; + + let can_author_block = Runtime::can_author( + NimbusId::from_slice(&ALICE_NIMBUS).unwrap(), + slot_number, + &parent, + ); + + assert!(can_author_block); + }); +} diff --git a/tracing/2402/runtime/moonriver/tests/xcm_mock/mod.rs b/tracing/2402/runtime/moonriver/tests/xcm_mock/mod.rs new file mode 100644 index 0000000..c127588 --- /dev/null +++ b/tracing/2402/runtime/moonriver/tests/xcm_mock/mod.rs @@ -0,0 +1,257 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +pub mod parachain; +pub mod relay_chain; +pub mod statemine_like; + +use cumulus_primitives_core::ParaId; +use sp_runtime::traits::AccountIdConversion; +use sp_runtime::AccountId32; +use xcm_simulator::{decl_test_network, decl_test_parachain, decl_test_relay_chain}; + +use polkadot_runtime_parachains::configuration::{ + GenesisConfig as ConfigurationGenesisConfig, HostConfiguration, +}; +use polkadot_runtime_parachains::paras::{ + GenesisConfig as ParasGenesisConfig, ParaGenesisArgs, ParaKind, +}; +use sp_core::{H160, U256}; +use std::{collections::BTreeMap, str::FromStr}; + +pub const PARAALICE: [u8; 20] = [1u8; 20]; +pub const RELAYALICE: AccountId32 = AccountId32::new([0u8; 32]); + +pub fn para_a_account() -> AccountId32 { + ParaId::from(1).into_account_truncating() +} + +pub fn para_b_account() -> AccountId32 { + ParaId::from(2).into_account_truncating() +} + +pub fn para_a_account_20() -> parachain::AccountId { + ParaId::from(1).into_account_truncating() +} + +pub fn evm_account() -> H160 { + H160::from_str("1000000000000000000000000000000000000001").unwrap() +} + +pub fn mock_para_genesis_info() -> ParaGenesisArgs { + ParaGenesisArgs { + genesis_head: vec![1u8].into(), + validation_code: vec![1u8].into(), + para_kind: ParaKind::Parachain, + } +} + +pub fn mock_relay_config() -> HostConfiguration { + HostConfiguration:: { + hrmp_channel_max_capacity: u32::MAX, + hrmp_channel_max_total_size: u32::MAX, + hrmp_max_parachain_inbound_channels: 10, + hrmp_max_parachain_outbound_channels: 10, + hrmp_channel_max_message_size: u32::MAX, + max_downward_message_size: u32::MAX, + ..Default::default() + } +} + +decl_test_parachain! { + pub struct ParaA { + Runtime = parachain::Runtime, + XcmpMessageHandler = parachain::MsgQueue, + DmpMessageHandler = parachain::MsgQueue, + new_ext = para_ext(1), + } +} + +decl_test_parachain! { + pub struct ParaB { + Runtime = parachain::Runtime, + XcmpMessageHandler = parachain::MsgQueue, + DmpMessageHandler = parachain::MsgQueue, + new_ext = para_ext(2), + } +} + +decl_test_parachain! { + pub struct ParaC { + Runtime = parachain::Runtime, + XcmpMessageHandler = parachain::MsgQueue, + DmpMessageHandler = parachain::MsgQueue, + new_ext = para_ext(3), + } +} + +decl_test_parachain! { + pub struct Statemine { + Runtime = statemine_like::Runtime, + XcmpMessageHandler = statemine_like::MsgQueue, + DmpMessageHandler = statemine_like::MsgQueue, + new_ext = statemine_ext(4), + } +} + +decl_test_relay_chain! { + pub struct Relay { + Runtime = relay_chain::Runtime, + XcmConfig = relay_chain::XcmConfig, + new_ext = relay_ext(vec![1, 2, 3, 4]), + } +} + +decl_test_network! { + pub struct MockNet { + relay_chain = Relay, + parachains = vec![ + (1, ParaA), + (2, ParaB), + (3, ParaC), + (4, Statemine), + ], + } +} + +pub const INITIAL_BALANCE: u128 = 10_000_000_000_000_000; + +pub const INITIAL_EVM_BALANCE: u128 = 0; +pub const INITIAL_EVM_NONCE: u32 = 1; + +pub fn para_ext(para_id: u32) -> sp_io::TestExternalities { + use parachain::{MsgQueue, Runtime, System}; + + let mut t = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap(); + + pallet_balances::GenesisConfig:: { + balances: vec![(PARAALICE.into(), INITIAL_BALANCE)], + } + .assimilate_storage(&mut t) + .unwrap(); + + // EVM accounts are self-sufficient. + let mut evm_accounts = BTreeMap::new(); + evm_accounts.insert( + evm_account(), + fp_evm::GenesisAccount { + nonce: U256::from(INITIAL_EVM_NONCE), + balance: U256::from(INITIAL_EVM_BALANCE), + storage: Default::default(), + code: vec![ + 0x00, // STOP + ], + }, + ); + + frame_support::traits::GenesisBuild::::assimilate_storage( + &pallet_evm::GenesisConfig { + accounts: evm_accounts, + }, + &mut t, + ) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| { + System::set_block_number(1); + MsgQueue::set_para_id(para_id.into()); + }); + ext +} + +pub fn statemine_ext(para_id: u32) -> sp_io::TestExternalities { + use statemine_like::{MsgQueue, Runtime, System}; + + let mut t = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap(); + + pallet_balances::GenesisConfig:: { + balances: vec![(RELAYALICE.into(), INITIAL_BALANCE)], + } + .assimilate_storage(&mut t) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| { + System::set_block_number(1); + MsgQueue::set_para_id(para_id.into()); + }); + ext +} + +pub fn relay_ext(paras: Vec) -> sp_io::TestExternalities { + use relay_chain::{Runtime, System}; + + let mut t = frame_system::GenesisConfig::default() + .build_storage::() + .unwrap(); + + pallet_balances::GenesisConfig:: { + balances: vec![(RELAYALICE, INITIAL_BALANCE)], + } + .assimilate_storage(&mut t) + .unwrap(); + + let para_genesis: Vec<(ParaId, ParaGenesisArgs)> = paras + .iter() + .map(|¶_id| (para_id.into(), mock_para_genesis_info())) + .collect(); + + frame_support::traits::GenesisBuild::::assimilate_storage( + &ConfigurationGenesisConfig { + config: mock_relay_config(), + }, + &mut t, + ) + .unwrap(); + + frame_support::traits::GenesisBuild::::assimilate_storage( + &ParasGenesisConfig { + paras: para_genesis, + }, + &mut t, + ) + .unwrap(); + + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| { + System::set_block_number(1); + }); + ext +} + +pub type RelayChainPalletXcm = pallet_xcm::Pallet; +pub type Hrmp = polkadot_runtime_parachains::hrmp::Pallet; + +pub type StatemineBalances = pallet_balances::Pallet; +pub type StatemineChainPalletXcm = pallet_xcm::Pallet; +pub type StatemineAssets = pallet_assets::Pallet; + +pub type ParachainPalletXcm = pallet_xcm::Pallet; +pub type Assets = pallet_assets::Pallet; +pub type LocalAssets = pallet_assets::Pallet; + +pub type Balances = pallet_balances::Pallet; +pub type Treasury = pallet_treasury::Pallet; +pub type AssetManager = pallet_asset_manager::Pallet; +pub type XTokens = orml_xtokens::Pallet; +pub type RelayBalances = pallet_balances::Pallet; +pub type ParaBalances = pallet_balances::Pallet; +pub type XcmTransactor = pallet_xcm_transactor::Pallet; diff --git a/tracing/2402/runtime/moonriver/tests/xcm_mock/parachain.rs b/tracing/2402/runtime/moonriver/tests/xcm_mock/parachain.rs new file mode 100644 index 0000000..23f48c9 --- /dev/null +++ b/tracing/2402/runtime/moonriver/tests/xcm_mock/parachain.rs @@ -0,0 +1,1186 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +//! Parachain runtime mock. + +use frame_support::{ + codec::MaxEncodedLen, + construct_runtime, + dispatch::GetDispatchInfo, + ensure, parameter_types, + traits::{ + AsEnsureOriginWithArg, ConstU32, Everything, Get, InstanceFilter, Nothing, PalletInfoAccess, + }, + weights::Weight, + PalletId, +}; +use frame_system::{EnsureNever, EnsureRoot}; +use parity_scale_codec::{Decode, Encode}; +use sp_core::H256; +use sp_runtime::{ + traits::{BlakeTwo256, Hash, IdentityLookup, Zero}, + Permill, +}; +use sp_std::{convert::TryFrom, prelude::*}; +use xcm::{latest::prelude::*, Version as XcmVersion, VersionedXcm}; + +use cumulus_primitives_core::relay_chain::HrmpChannelId; +use orml_traits::parameter_type_with_key; +use pallet_ethereum::PostLogContent; +use polkadot_core_primitives::BlockNumber as RelayBlockNumber; +use polkadot_parachain::primitives::{Id as ParaId, Sibling}; +use xcm::latest::{ + AssetId as XcmAssetId, Error as XcmError, ExecuteXcm, + Junction::{PalletInstance, Parachain}, + Junctions, MultiLocation, NetworkId, Outcome, Xcm, +}; +use xcm_builder::{ + AccountKey20Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, + AllowTopLevelPaidExecutionFrom, AsPrefixedGeneralIndex, ConvertedConcreteId, + CurrencyAdapter as XcmCurrencyAdapter, EnsureXcmOrigin, FixedRateOfFungible, FixedWeightBounds, + FungiblesAdapter, IsConcrete, NoChecking, ParentAsSuperuser, ParentIsPreset, + RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountKey20AsNative, SovereignSignedViaLocation, TakeWeightCredit, WithComputedOrigin, +}; +use xcm_executor::{traits::JustTry, Config, XcmExecutor}; + +use scale_info::TypeInfo; +use xcm_simulator::{ + DmpMessageHandlerT as DmpMessageHandler, XcmpMessageFormat, + XcmpMessageHandlerT as XcmpMessageHandler, +}; + +pub type AccountId = moonbeam_core_primitives::AccountId; +pub type Balance = u128; +pub type AssetId = u128; +pub type BlockNumber = u32; + +parameter_types! { + pub const BlockHashCount: u32 = 250; +} + +impl frame_system::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Index = u64; + type BlockNumber = BlockNumber; + type Hash = H256; + type Hashing = ::sp_runtime::traits::BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = sp_runtime::generic::Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type BlockWeights = (); + type BlockLength = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = (); + type BaseCallFilter = Everything; + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +parameter_types! { + pub ExistentialDeposit: Balance = 0; + pub const MaxLocks: u32 = 50; + pub const MaxReserves: u32 = 50; +} + +impl pallet_balances::Config for Runtime { + type MaxLocks = MaxLocks; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxReserves = MaxReserves; + type ReserveIdentifier = [u8; 8]; +} + +pub type ForeignAssetInstance = (); +pub type LocalAssetInstance = pallet_assets::Instance1; + +parameter_types! { + pub const AssetDeposit: Balance = 1; // Does not really matter as this will be only called by root + pub const ApprovalDeposit: Balance = 0; + pub const AssetsStringLimit: u32 = 50; + pub const MetadataDepositBase: Balance = 0; + pub const MetadataDepositPerByte: Balance = 0; + pub const AssetAccountDeposit: Balance = 0; +} + +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type Currency = Balances; + type ForceOrigin = EnsureRoot; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type AssetAccountDeposit = AssetAccountDeposit; + type WeightInfo = pallet_assets::weights::SubstrateWeight; + type RemoveItemsLimit = ConstU32<656>; + type AssetIdParameter = AssetId; + type CreateOrigin = AsEnsureOriginWithArg>; + type CallbackHandle = (); +} + +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type Currency = Balances; + type ForceOrigin = EnsureRoot; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type AssetAccountDeposit = AssetAccountDeposit; + type WeightInfo = pallet_assets::weights::SubstrateWeight; + type RemoveItemsLimit = ConstU32<656>; + type AssetIdParameter = AssetId; + type CreateOrigin = AsEnsureOriginWithArg>; + type CallbackHandle = (); +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the default `AccountId`. + ParentIsPreset, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + AccountKey20Aliases, + // Generate remote accounts according to polkadot standards + xcm_builder::HashedDescriptionDescribeFamilyAllTerminal, +); + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can +/// biases the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain which they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when + // recognised. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognised. + SiblingParachainAsNative, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, + // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. + pallet_xcm::XcmPassthrough, + SignedAccountKey20AsNative, +); + +parameter_types! { + pub const UnitWeightCost: Weight = Weight::from_parts(1u64, 1u64); + pub MaxInstructions: u32 = 100; +} + +// Instructing how incoming xcm assets will be handled +pub type ForeignFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + Assets, + // Use this currency when it is a fungible asset matching the given location or name: + ( + ConvertedConcreteId< + AssetId, + Balance, + xcm_primitives::AsAssetType, + JustTry, + >, + ), + // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont allow teleports. + NoChecking, + // We dont track any teleports + (), +>; + +pub type LocalAssetTransactor = XcmCurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching any of the locations in + // SelfReserveRepresentations + IsConcrete, + // We can convert the MultiLocations with our converter above: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont allow teleport + (), +>; + +/// Means for transacting local assets besides the native currency on this chain. +pub type LocalFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + LocalAssets, + // Use this currency when it is a fungible asset matching the given location or name: + ( + ConvertedConcreteId< + AssetId, + Balance, + AsPrefixedGeneralIndex, + JustTry, + >, + ), + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont want to allow teleporting assets + NoChecking, + // The account to use for tracking teleports. + (), +>; + +// We use both transactors +pub type AssetTransactors = ( + LocalAssetTransactor, + ForeignFungiblesTransactor, + LocalFungiblesTransactor, +); + +pub type XcmRouter = super::ParachainXcmRouter; + +pub type XcmBarrier = ( + // Weight that is paid for may be consumed. + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, +); + +parameter_types! { + /// Xcm fees will go to the treasury account + pub XcmFeesAccount: AccountId = Treasury::account_id(); +} + +/// This is the struct that will handle the revenue from xcm fees +pub type XcmFeesToAccount_ = xcm_primitives::XcmFeesToAccount< + Assets, + ( + ConvertedConcreteId< + AssetId, + Balance, + xcm_primitives::AsAssetType, + JustTry, + >, + ), + AccountId, + XcmFeesAccount, +>; + +parameter_types! { + // We cannot skip the native trader for some specific tests, so we will have to work with + // a native trader that charges same number of units as weight + pub ParaTokensPerSecond: (XcmAssetId, u128, u128) = ( + Concrete(SelfReserve::get()), + 1000000000000, + 0, + ); +} + +parameter_types! { + pub const RelayNetwork: NetworkId = NetworkId::Polkadot; + pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); + pub UniversalLocation: InteriorMultiLocation = + X2(GlobalConsensus(RelayNetwork::get()), Parachain(MsgQueue::parachain_id().into())); + + pub LocalAssetsPalletLocation: MultiLocation = MultiLocation { + parents:0, + interior: Junctions::X1( + PalletInstance(::index() as u8) + ) + }; + + // This is used to match it against our Balances pallet when we receive such a MultiLocation + // (Parent, Self Para Id, Self Balances pallet index) + pub SelfReserve: MultiLocation = MultiLocation { + parents:0, + interior: Junctions::X1( + PalletInstance(::index() as u8) + ) + }; + pub const MaxAssetsIntoHolding: u32 = 64; +} + +use frame_system::RawOrigin; +use sp_runtime::traits::PostDispatchInfoOf; +use sp_runtime::DispatchErrorWithPostInfo; +use xcm_executor::traits::CallDispatcher; +moonbeam_runtime_common::impl_moonbeam_xcm_call!(); + +pub struct XcmConfig; +impl Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = AssetTransactors; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + type IsReserve = orml_xcm_support::MultiNativeAsset< + xcm_primitives::AbsoluteAndRelativeReserve, + >; + type IsTeleporter = (); + type UniversalLocation = UniversalLocation; + type Barrier = XcmBarrier; + type Weigher = FixedWeightBounds; + // We use three traders + // When we receive either representation of the self-reserve asset, + // When we receive a non-reserve asset, we use AssetManager to fetch how many + // units per second we should charge + type Trader = ( + FixedRateOfFungible, + xcm_primitives::FirstAssetTrader, + ); + + type ResponseHandler = PolkadotXcm; + type SubscriptionService = PolkadotXcm; + type AssetTrap = PolkadotXcm; + type AssetClaims = PolkadotXcm; + type CallDispatcher = MoonbeamCall; + type AssetLocker = (); + type AssetExchanger = (); + type PalletInstancesInfo = (); + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type FeeManager = (); + type MessageExporter = (); + type UniversalAliases = Nothing; + type SafeCallFilter = Everything; + type AssetIsBurnable = Everything; +} + +impl cumulus_pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +// Our currencyId. We distinguish for now between SelfReserve, and Others, defined by their Id. +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum CurrencyId { + SelfReserve, + ForeignAsset(AssetId), + LocalAssetReserve(AssetId), +} + +// How to convert from CurrencyId to MultiLocation +pub struct CurrencyIdtoMultiLocation(sp_std::marker::PhantomData); +impl sp_runtime::traits::Convert> + for CurrencyIdtoMultiLocation +where + AssetXConverter: xcm_executor::traits::Convert, +{ + fn convert(currency: CurrencyId) -> Option { + match currency { + CurrencyId::SelfReserve => { + // For now and until Xtokens is adapted to handle 0.9.16 version we use + // the old anchoring here + // This is not a problem in either cases, since the view of the destination + // chain does not change + // TODO! change this to NewAnchoringSelfReserve once xtokens is adapted for it + let multi: MultiLocation = SelfReserve::get(); + Some(multi) + } + CurrencyId::ForeignAsset(asset) => AssetXConverter::reverse_ref(asset).ok(), + CurrencyId::LocalAssetReserve(asset) => { + let mut location = LocalAssetsPalletLocation::get(); + location.push_interior(Junction::GeneralIndex(asset)).ok(); + Some(location) + } + } + } +} + +parameter_types! { + pub const BaseXcmWeight: Weight = Weight::from_parts(100u64, 100u64); + pub const MaxAssetsForTransfer: usize = 2; + pub SelfLocation: MultiLocation = MultiLocation::here(); + pub SelfLocationAbsolute: MultiLocation = MultiLocation { + parents:1, + interior: Junctions::X1( + Parachain(MsgQueue::parachain_id().into()) + ) + }; +} + +parameter_type_with_key! { + pub ParachainMinFee: |_location: MultiLocation| -> Option { + Some(u128::MAX) + }; +} + +// The XCM message wrapper wrapper +impl orml_xtokens::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type CurrencyId = CurrencyId; + type AccountIdToMultiLocation = xcm_primitives::AccountIdToMultiLocation; + type CurrencyIdConvert = + CurrencyIdtoMultiLocation>; + type XcmExecutor = XcmExecutor; + type SelfLocation = SelfLocation; + type Weigher = xcm_builder::FixedWeightBounds; + type BaseXcmWeight = BaseXcmWeight; + type UniversalLocation = UniversalLocation; + type MaxAssetsForTransfer = MaxAssetsForTransfer; + type MinXcmFee = ParachainMinFee; + type MultiLocationsFilter = Everything; + type ReserveProvider = xcm_primitives::AbsoluteAndRelativeReserve; +} + +parameter_types! { + pub const ProposalBond: Permill = Permill::from_percent(5); + pub const ProposalBondMinimum: Balance = 0; + pub const SpendPeriod: u32 = 0; + pub const TreasuryId: PalletId = PalletId(*b"pc/trsry"); + pub const MaxApprovals: u32 = 100; +} + +impl pallet_treasury::Config for Runtime { + type PalletId = TreasuryId; + type Currency = Balances; + type ApproveOrigin = EnsureRoot; + type RejectOrigin = EnsureRoot; + type RuntimeEvent = RuntimeEvent; + type OnSlash = Treasury; + type ProposalBond = ProposalBond; + type ProposalBondMinimum = ProposalBondMinimum; + type SpendPeriod = SpendPeriod; + type Burn = (); + type BurnDestination = (); + type MaxApprovals = MaxApprovals; + type WeightInfo = (); + type SpendFunds = (); + type ProposalBondMaximum = (); + type SpendOrigin = frame_support::traits::NeverEnsureOrigin; // Same as Polkadot +} + +#[frame_support::pallet] +pub mod mock_msg_queue { + use super::*; + use frame_support::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + type XcmExecutor: ExecuteXcm; + } + + #[pallet::call] + impl Pallet {} + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::storage] + #[pallet::getter(fn parachain_id)] + pub(super) type ParachainId = StorageValue<_, ParaId, ValueQuery>; + + impl Get for Pallet { + fn get() -> ParaId { + Self::parachain_id() + } + } + + pub type MessageId = [u8; 32]; + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + // XCMP + /// Some XCM was executed OK. + Success(Option), + /// Some XCM failed. + Fail(Option, XcmError), + /// Bad XCM version used. + BadVersion(Option), + /// Bad XCM format used. + BadFormat(Option), + + // DMP + /// Downward message is invalid XCM. + InvalidFormat(MessageId), + /// Downward message is unsupported version of XCM. + UnsupportedVersion(MessageId), + /// Downward message executed with the given outcome. + ExecutedDownward(MessageId, Outcome), + } + + impl Pallet { + pub fn set_para_id(para_id: ParaId) { + ParachainId::::put(para_id); + } + + fn handle_xcmp_message( + sender: ParaId, + _sent_at: RelayBlockNumber, + xcm: VersionedXcm, + max_weight: Weight, + ) -> Result { + let hash = Encode::using_encoded(&xcm, T::Hashing::hash); + let (result, event) = match Xcm::::try_from(xcm) { + Ok(xcm) => { + let location = MultiLocation::new(1, Junctions::X1(Parachain(sender.into()))); + let mut id = [0u8; 32]; + id.copy_from_slice(hash.as_ref()); + match T::XcmExecutor::execute_xcm(location, xcm, id, max_weight) { + Outcome::Error(e) => (Err(e.clone()), Event::Fail(Some(hash), e)), + Outcome::Complete(w) => (Ok(w), Event::Success(Some(hash))), + // As far as the caller is concerned, this was dispatched without error, so + // we just report the weight used. + Outcome::Incomplete(w, e) => (Ok(w), Event::Fail(Some(hash), e)), + } + } + Err(()) => ( + Err(XcmError::UnhandledXcmVersion), + Event::BadVersion(Some(hash)), + ), + }; + Self::deposit_event(event); + result + } + } + + impl XcmpMessageHandler for Pallet { + fn handle_xcmp_messages<'a, I: Iterator>( + iter: I, + max_weight: Weight, + ) -> Weight { + for (sender, sent_at, data) in iter { + let mut data_ref = data; + let _ = XcmpMessageFormat::decode(&mut data_ref) + .expect("Simulator encodes with versioned xcm format; qed"); + + let mut remaining_fragments = &data_ref[..]; + while !remaining_fragments.is_empty() { + if let Ok(xcm) = + VersionedXcm::::decode(&mut remaining_fragments) + { + let _ = Self::handle_xcmp_message(sender, sent_at, xcm, max_weight); + } else { + debug_assert!(false, "Invalid incoming XCMP message data"); + } + } + } + max_weight + } + } + + impl DmpMessageHandler for Pallet { + fn handle_dmp_messages( + iter: impl Iterator)>, + limit: Weight, + ) -> Weight { + for (_i, (_sent_at, data)) in iter.enumerate() { + let id = sp_io::hashing::blake2_256(&data[..]); + let maybe_msg = VersionedXcm::::decode(&mut &data[..]) + .map(Xcm::::try_from); + match maybe_msg { + Err(_) => { + Self::deposit_event(Event::InvalidFormat(id)); + } + Ok(Err(())) => { + Self::deposit_event(Event::UnsupportedVersion(id)); + } + Ok(Ok(x)) => { + let outcome = T::XcmExecutor::execute_xcm(Parent, x, id, limit); + + Self::deposit_event(Event::ExecutedDownward(id, outcome)); + } + } + } + limit + } + } +} + +// Pallet to provide the version, used to test runtime upgrade version changes +#[frame_support::pallet] +pub mod mock_version_changer { + use super::*; + use frame_support::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + } + + #[pallet::call] + impl Pallet {} + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::storage] + #[pallet::getter(fn current_version)] + pub(super) type CurrentVersion = StorageValue<_, XcmVersion, ValueQuery>; + + impl Get for Pallet { + fn get() -> XcmVersion { + Self::current_version() + } + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + // XCMP + /// Some XCM was executed OK. + VersionChanged(XcmVersion), + } + + impl Pallet { + pub fn set_version(version: XcmVersion) { + CurrentVersion::::put(version); + Self::deposit_event(Event::VersionChanged(version)); + } + } +} + +impl mock_msg_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +impl mock_version_changer::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} + +pub type LocalOriginToLocation = + xcm_primitives::SignedToAccountId20; + +parameter_types! { + pub MatcherLocation: MultiLocation = MultiLocation::here(); +} + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = frame_support::traits::Nothing; + type XcmExecutor = XcmExecutor; + // Do not allow teleports + type XcmTeleportFilter = Nothing; + type XcmReserveTransferFilter = Everything; + type Weigher = FixedWeightBounds; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + // We use a custom one to test runtime ugprades + type AdvertisedXcmVersion = XcmVersioner; + type Currency = Balances; + type CurrencyMatcher = IsConcrete; + type TrustedLockers = (); + type SovereignAccountOf = (); + type MaxLockers = ConstU32<8>; + type WeightInfo = pallet_xcm::TestWeightInfo; +} + +// Our AssetType. For now we only handle Xcm Assets +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum AssetType { + Xcm(MultiLocation), +} +impl Default for AssetType { + fn default() -> Self { + Self::Xcm(MultiLocation::here()) + } +} + +impl From for AssetType { + fn from(location: MultiLocation) -> Self { + Self::Xcm(location) + } +} + +impl Into> for AssetType { + fn into(self) -> Option { + match self { + Self::Xcm(location) => Some(location), + } + } +} + +// Implementation on how to retrieve the AssetId from an AssetType +// We simply hash the AssetType and take the lowest 128 bits +impl From for AssetId { + fn from(asset: AssetType) -> AssetId { + match asset { + AssetType::Xcm(id) => { + let mut result: [u8; 16] = [0u8; 16]; + let hash: H256 = id.using_encoded(::Hashing::hash); + result.copy_from_slice(&hash.as_fixed_bytes()[0..16]); + u128::from_le_bytes(result) + } + } + } +} + +// We instruct how to register the Assets +// In this case, we tell it to Create an Asset in pallet-assets +pub struct AssetRegistrar; +use frame_support::pallet_prelude::DispatchResult; +impl pallet_asset_manager::AssetRegistrar for AssetRegistrar { + fn create_foreign_asset( + asset: AssetId, + min_balance: Balance, + metadata: AssetMetadata, + is_sufficient: bool, + ) -> DispatchResult { + Assets::force_create( + RuntimeOrigin::root(), + asset, + AssetManager::account_id(), + is_sufficient, + min_balance, + )?; + + Assets::force_set_metadata( + RuntimeOrigin::root(), + asset, + metadata.name, + metadata.symbol, + metadata.decimals, + false, + ) + } + + fn create_local_asset( + asset: AssetId, + _creator: AccountId, + min_balance: Balance, + is_sufficient: bool, + owner: AccountId, + ) -> DispatchResult { + LocalAssets::force_create( + RuntimeOrigin::root(), + asset, + owner, + is_sufficient, + min_balance, + )?; + + // TODO uncomment when we feel comfortable + /* + // The asset has been created. Let's put the revert code in the precompile address + let precompile_address = Runtime::asset_id_to_account(ASSET_PRECOMPILE_ADDRESS_PREFIX, asset); + pallet_evm::AccountCodes::::insert( + precompile_address, + vec![0x60, 0x00, 0x60, 0x00, 0xfd], + );*/ + Ok(()) + } + fn destroy_foreign_asset(asset: AssetId) -> DispatchResult { + // Mark the asset as destroying + Assets::start_destroy(RuntimeOrigin::root(), asset)?; + + Ok(()) + } + + fn destroy_local_asset(asset: AssetId) -> DispatchResult { + // Mark the asset as destroying + LocalAssets::start_destroy(RuntimeOrigin::root(), asset)?; + + Ok(()) + } + + fn destroy_asset_dispatch_info_weight(asset: AssetId) -> Weight { + RuntimeCall::Assets( + pallet_assets::Call::::start_destroy { id: asset }, + ) + .get_dispatch_info() + .weight + } +} + +#[derive(Clone, Default, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub struct AssetMetadata { + pub name: Vec, + pub symbol: Vec, + pub decimals: u8, +} +pub struct LocalAssetIdCreator; +impl pallet_asset_manager::LocalAssetIdCreator for LocalAssetIdCreator { + fn create_asset_id_from_metadata(local_asset_counter: u128) -> AssetId { + // Our means of converting a creator to an assetId + // We basically hash (local asset counter) + let mut result: [u8; 16] = [0u8; 16]; + let hash: H256 = + local_asset_counter.using_encoded(::Hashing::hash); + result.copy_from_slice(&hash.as_fixed_bytes()[0..16]); + u128::from_le_bytes(result) + } +} + +impl pallet_asset_manager::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type AssetRegistrarMetadata = AssetMetadata; + type ForeignAssetType = AssetType; + type AssetRegistrar = AssetRegistrar; + type ForeignAssetModifierOrigin = EnsureRoot; + type LocalAssetModifierOrigin = EnsureRoot; + type LocalAssetIdCreator = LocalAssetIdCreator; + type Currency = Balances; + type LocalAssetDeposit = AssetDeposit; + type WeightInfo = (); +} + +// 1 KSM should be enough +parameter_types! { + pub MaxHrmpRelayFee: MultiAsset = (MultiLocation::parent(), 1_000_000_000_000u128).into(); +} + +impl pallet_xcm_transactor::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type Transactor = MockTransactors; + type DerivativeAddressRegistrationOrigin = EnsureRoot; + type SovereignAccountDispatcherOrigin = frame_system::EnsureRoot; + type CurrencyId = CurrencyId; + type AccountIdToMultiLocation = xcm_primitives::AccountIdToMultiLocation; + type CurrencyIdToMultiLocation = + CurrencyIdtoMultiLocation>; + type SelfLocation = SelfLocation; + type Weigher = xcm_builder::FixedWeightBounds; + type UniversalLocation = UniversalLocation; + type XcmSender = XcmRouter; + type BaseXcmWeight = BaseXcmWeight; + type AssetTransactor = AssetTransactors; + type ReserveProvider = xcm_primitives::AbsoluteAndRelativeReserve; + type WeightInfo = (); + type HrmpManipulatorOrigin = EnsureRoot; + type MaxHrmpFee = xcm_builder::Case; + type HrmpEncoder = MockHrmpEncoder; +} + +parameter_types! { + pub const MinimumPeriod: u64 = 1000; +} +impl pallet_timestamp::Config for Runtime { + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = MinimumPeriod; + type WeightInfo = (); +} + +use sp_core::U256; + +const MAX_POV_SIZE: u64 = 5 * 1024 * 1024; + +parameter_types! { + pub BlockGasLimit: U256 = U256::from(u64::MAX); + pub WeightPerGas: Weight = Weight::from_parts(1, 0); + pub GasLimitPovSizeRatio: u64 = { + let block_gas_limit = BlockGasLimit::get().min(u64::MAX.into()).low_u64(); + block_gas_limit.saturating_div(MAX_POV_SIZE) + }; +} + +impl pallet_evm::Config for Runtime { + type FeeCalculator = (); + type GasWeightMapping = pallet_evm::FixedGasWeightMapping; + type WeightPerGas = WeightPerGas; + + type CallOrigin = pallet_evm::EnsureAddressRoot; + type WithdrawOrigin = pallet_evm::EnsureAddressNever; + + type AddressMapping = moonbeam_runtime_common::IntoAddressMapping; + type Currency = Balances; + type Runner = pallet_evm::runner::stack::Runner; + + type RuntimeEvent = RuntimeEvent; + type PrecompilesType = (); + type PrecompilesValue = (); + type ChainId = (); + type BlockGasLimit = BlockGasLimit; + type OnChargeTransaction = (); + type BlockHashMapping = pallet_evm::SubstrateBlockHashMapping; + type FindAuthor = (); + type OnCreate = (); + type GasLimitPovSizeRatio = GasLimitPovSizeRatio; + type Timestamp = Timestamp; + type WeightInfo = pallet_evm::weights::SubstrateWeight; +} + +pub struct NormalFilter; +impl frame_support::traits::Contains for NormalFilter { + fn contains(c: &RuntimeCall) -> bool { + match c { + _ => true, + } + } +} + +// We need to use the encoding from the relay mock runtime +#[derive(Encode, Decode)] +pub enum RelayCall { + #[codec(index = 5u8)] + // the index should match the position of the module in `construct_runtime!` + Utility(UtilityCall), + #[codec(index = 6u8)] + // the index should match the position of the module in `construct_runtime!` + Hrmp(HrmpCall), +} + +#[derive(Encode, Decode)] +pub enum UtilityCall { + #[codec(index = 1u8)] + AsDerivative(u16), +} + +// HRMP call encoding, needed for xcm transactor pallet +#[derive(Encode, Decode)] +pub enum HrmpCall { + #[codec(index = 0u8)] + InitOpenChannel(ParaId, u32, u32), + #[codec(index = 1u8)] + AcceptOpenChannel(ParaId), + #[codec(index = 2u8)] + CloseChannel(HrmpChannelId), + #[codec(index = 6u8)] + CancelOpenRequest(HrmpChannelId, u32), +} + +#[derive(Clone, Eq, Debug, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] +pub enum MockTransactors { + Relay, +} + +impl xcm_primitives::XcmTransact for MockTransactors { + fn destination(self) -> MultiLocation { + match self { + MockTransactors::Relay => MultiLocation::parent(), + } + } +} + +impl xcm_primitives::UtilityEncodeCall for MockTransactors { + fn encode_call(self, call: xcm_primitives::UtilityAvailableCalls) -> Vec { + match self { + MockTransactors::Relay => match call { + xcm_primitives::UtilityAvailableCalls::AsDerivative(a, b) => { + let mut call = + RelayCall::Utility(UtilityCall::AsDerivative(a.clone())).encode(); + call.append(&mut b.clone()); + call + } + }, + } + } +} + +pub struct MockHrmpEncoder; +impl xcm_primitives::HrmpEncodeCall for MockHrmpEncoder { + fn hrmp_encode_call( + call: xcm_primitives::HrmpAvailableCalls, + ) -> Result, xcm::latest::Error> { + match call { + xcm_primitives::HrmpAvailableCalls::InitOpenChannel(a, b, c) => Ok(RelayCall::Hrmp( + HrmpCall::InitOpenChannel(a.clone(), b.clone(), c.clone()), + ) + .encode()), + xcm_primitives::HrmpAvailableCalls::AcceptOpenChannel(a) => { + Ok(RelayCall::Hrmp(HrmpCall::AcceptOpenChannel(a.clone())).encode()) + } + xcm_primitives::HrmpAvailableCalls::CloseChannel(a) => { + Ok(RelayCall::Hrmp(HrmpCall::CloseChannel(a.clone())).encode()) + } + xcm_primitives::HrmpAvailableCalls::CancelOpenRequest(a, b) => { + Ok(RelayCall::Hrmp(HrmpCall::CancelOpenRequest(a.clone(), b.clone())).encode()) + } + } + } +} + +parameter_types! { + pub const PostBlockAndTxnHashes: PostLogContent = PostLogContent::BlockAndTxnHashes; +} + +impl pallet_ethereum::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type StateRoot = pallet_ethereum::IntermediateStateRoot; + type PostLogContent = PostBlockAndTxnHashes; + type ExtraDataLength = ConstU32<30>; +} + +parameter_types! { + pub ReservedXcmpWeight: Weight = Weight::from_parts(u64::max_value(), 0); +} + +#[derive( + Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, MaxEncodedLen, TypeInfo, +)] +pub enum ProxyType { + NotAllowed = 0, + Any = 1, +} + +impl pallet_evm_precompile_proxy::EvmProxyCallFilter for ProxyType {} + +impl InstanceFilter for ProxyType { + fn filter(&self, _c: &RuntimeCall) -> bool { + match self { + ProxyType::NotAllowed => false, + ProxyType::Any => true, + } + } + fn is_superset(&self, _o: &Self) -> bool { + false + } +} + +impl Default for ProxyType { + fn default() -> Self { + Self::NotAllowed + } +} + +parameter_types! { + pub const ProxyCost: u64 = 1; +} + +impl pallet_proxy::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type Currency = Balances; + type ProxyType = ProxyType; + type ProxyDepositBase = ProxyCost; + type ProxyDepositFactor = ProxyCost; + type MaxProxies = ConstU32<32>; + type WeightInfo = pallet_proxy::weights::SubstrateWeight; + type MaxPending = ConstU32<32>; + type CallHasher = BlakeTwo256; + type AnnouncementDepositBase = ProxyCost; + type AnnouncementDepositFactor = ProxyCost; +} + +pub struct EthereumXcmEnsureProxy; +impl xcm_primitives::EnsureProxy for EthereumXcmEnsureProxy { + fn ensure_ok(delegator: AccountId, delegatee: AccountId) -> Result<(), &'static str> { + // The EVM implicitely contains an Any proxy, so we only allow for "Any" proxies + let def: pallet_proxy::ProxyDefinition = + pallet_proxy::Pallet::::find_proxy( + &delegator, + &delegatee, + Some(ProxyType::Any), + ) + .map_err(|_| "proxy error: expected `ProxyType::Any`")?; + // We only allow to use it for delay zero proxies, as the call will iMmediatly be executed + ensure!(def.delay.is_zero(), "proxy delay is Non-zero`"); + Ok(()) + } +} + +impl pallet_ethereum_xcm::Config for Runtime { + type InvalidEvmTransactionError = pallet_ethereum::InvalidTransactionWrapper; + type ValidatedTransaction = pallet_ethereum::ValidatedTransaction; + type XcmEthereumOrigin = pallet_ethereum_xcm::EnsureXcmEthereumTransaction; + type ReservedXcmpWeight = ReservedXcmpWeight; + type EnsureProxy = EthereumXcmEnsureProxy; + type ControllerOrigin = EnsureRoot; +} + +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; + +construct_runtime!( + pub enum Runtime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Storage, Config, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + MsgQueue: mock_msg_queue::{Pallet, Storage, Event}, + XcmVersioner: mock_version_changer::{Pallet, Storage, Event}, + + PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin}, + Assets: pallet_assets::{Pallet, Call, Storage, Event}, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin}, + XTokens: orml_xtokens::{Pallet, Call, Storage, Event}, + AssetManager: pallet_asset_manager::{Pallet, Call, Storage, Event}, + XcmTransactor: pallet_xcm_transactor::{Pallet, Call, Storage, Event}, + Treasury: pallet_treasury::{Pallet, Storage, Config, Event, Call}, + LocalAssets: pallet_assets::::{Pallet, Call, Storage, Event}, + Proxy: pallet_proxy::{Pallet, Call, Storage, Event}, + + Timestamp: pallet_timestamp::{Pallet, Call, Storage}, + EVM: pallet_evm::{Pallet, Call, Storage, Config, Event}, + Ethereum: pallet_ethereum::{Pallet, Call, Storage, Event, Origin, Config}, + EthereumXcm: pallet_ethereum_xcm::{Pallet, Call, Origin}, + } +); + +pub(crate) fn para_events() -> Vec { + System::events() + .into_iter() + .map(|r| r.event) + .filter_map(|e| Some(e)) + .collect::>() +} + +use frame_support::traits::{OnFinalize, OnInitialize, OnRuntimeUpgrade}; +pub(crate) fn on_runtime_upgrade() { + PolkadotXcm::on_runtime_upgrade(); +} + +pub(crate) fn para_roll_to(n: BlockNumber) { + while System::block_number() < n { + PolkadotXcm::on_finalize(System::block_number()); + Balances::on_finalize(System::block_number()); + System::on_finalize(System::block_number()); + System::set_block_number(System::block_number() + 1); + System::on_initialize(System::block_number()); + Balances::on_initialize(System::block_number()); + PolkadotXcm::on_initialize(System::block_number()); + } +} diff --git a/tracing/2402/runtime/moonriver/tests/xcm_mock/relay_chain.rs b/tracing/2402/runtime/moonriver/tests/xcm_mock/relay_chain.rs new file mode 100644 index 0000000..f4d9e13 --- /dev/null +++ b/tracing/2402/runtime/moonriver/tests/xcm_mock/relay_chain.rs @@ -0,0 +1,349 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +//! Relay chain runtime mock. + +use frame_support::{ + construct_runtime, parameter_types, + traits::{Everything, Nothing}, +}; +use sp_core::H256; +use sp_runtime::{ + traits::{BlakeTwo256, ConstU32, IdentityLookup}, + AccountId32, +}; + +use frame_support::weights::Weight; +use polkadot_parachain::primitives::Id as ParaId; +use polkadot_runtime_parachains::{configuration, dmp, hrmp, origin, paras, shared, ump}; +use sp_runtime::transaction_validity::TransactionPriority; +use sp_runtime::Permill; +use xcm::latest::prelude::*; +use xcm_builder::{ + Account32Hash, AccountId32Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, + AllowTopLevelPaidExecutionFrom, ChildParachainAsNative, ChildParachainConvertsVia, + ChildSystemParachainAsSuperuser, CurrencyAdapter as XcmCurrencyAdapter, FixedRateOfFungible, + FixedWeightBounds, IsConcrete, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, WithComputedOrigin, +}; +use xcm_executor::{Config, XcmExecutor}; +pub type AccountId = AccountId32; +pub type Balance = u128; +pub type BlockNumber = u32; + +parameter_types! { + pub const BlockHashCount: u32 = 250; +} + +impl frame_system::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Index = u64; + type BlockNumber = BlockNumber; + type Hash = H256; + type Hashing = ::sp_runtime::traits::BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = sp_runtime::generic::Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type BlockWeights = (); + type BlockLength = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = (); + type BaseCallFilter = Everything; + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = ConstU32<16>; +} + +parameter_types! { + pub ExistentialDeposit: Balance = 1; + pub const MaxLocks: u32 = 50; + pub const MaxReserves: u32 = 50; +} + +impl pallet_balances::Config for Runtime { + type MaxLocks = MaxLocks; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxReserves = MaxReserves; + type ReserveIdentifier = [u8; 8]; +} + +impl pallet_utility::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type WeightInfo = (); + type PalletsOrigin = OriginCaller; +} + +impl shared::Config for Runtime {} + +impl configuration::Config for Runtime { + type WeightInfo = configuration::TestWeightInfo; +} + +parameter_types! { + pub KsmLocation: MultiLocation = Here.into(); + pub const KusamaNetwork: NetworkId = NetworkId::Kusama; + pub const AnyNetwork: Option = None; + pub UniversalLocation: InteriorMultiLocation = Here; +} + +pub type SovereignAccountOf = ( + ChildParachainConvertsVia, + AccountId32Aliases, + // Not enabled in the relay per se, but we enable it to test + // the transact_through_signed extrinsic + Account32Hash, +); + +pub type LocalAssetTransactor = + XcmCurrencyAdapter, SovereignAccountOf, AccountId, ()>; + +type LocalOriginConverter = ( + SovereignSignedViaLocation, + ChildParachainAsNative, + SignedAccountId32AsNative, + ChildSystemParachainAsSuperuser, +); + +parameter_types! { + pub const BaseXcmWeight: Weight = Weight::from_parts(1000u64, 1000u64); + pub KsmPerSecond: (AssetId, u128, u128) = (Concrete(KsmLocation::get()), 1, 1); + pub const MaxInstructions: u32 = 100; + pub const MaxAssetsIntoHolding: u32 = 64; + pub MatcherLocation: MultiLocation = MultiLocation::here(); +} + +pub type XcmRouter = super::RelayChainXcmRouter; + +pub type XcmBarrier = ( + // Weight that is paid for may be consumed. + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, +); + +pub struct XcmConfig; +impl Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = LocalAssetTransactor; + type OriginConverter = LocalOriginConverter; + type IsReserve = (); + type IsTeleporter = (); + type UniversalLocation = UniversalLocation; + type Barrier = XcmBarrier; + type Weigher = FixedWeightBounds; + type Trader = FixedRateOfFungible; + type ResponseHandler = XcmPallet; + type AssetTrap = XcmPallet; + type AssetClaims = XcmPallet; + type SubscriptionService = XcmPallet; + type CallDispatcher = RuntimeCall; + type AssetLocker = (); + type AssetExchanger = (); + type PalletInstancesInfo = (); + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type FeeManager = (); + type MessageExporter = (); + type UniversalAliases = Nothing; + type SafeCallFilter = Everything; + type AssetIsBurnable = Everything; +} + +pub type LocalOriginToLocation = SignedToAccountId32; + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type SendXcmOrigin = xcm_builder::EnsureXcmOrigin; + type XcmRouter = XcmRouter; + // Anyone can execute XCM messages locally... + type ExecuteXcmOrigin = xcm_builder::EnsureXcmOrigin; + type XcmExecuteFilter = Nothing; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Everything; + type XcmReserveTransferFilter = Everything; + type Weigher = FixedWeightBounds; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; + type Currency = Balances; + type CurrencyMatcher = (); + type TrustedLockers = (); + type SovereignAccountOf = (); + type MaxLockers = ConstU32<8>; + type WeightInfo = pallet_xcm::TestWeightInfo; +} + +parameter_types! { + pub const FirstMessageFactorPercent: u64 = 100; +} + +impl ump::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type UmpSink = ump::XcmSink, Runtime>; + type FirstMessageFactorPercent = FirstMessageFactorPercent; + type ExecuteOverweightOrigin = frame_system::EnsureRoot; + type WeightInfo = ump::TestWeightInfo; +} + +parameter_types! { + pub const ParasUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); +} + +/// A very dumb implementation of `EstimateNextSessionRotation`. At the moment of writing, this +/// is more to satisfy type requirements rather than to test anything. +pub struct TestNextSessionRotation; + +impl frame_support::traits::EstimateNextSessionRotation for TestNextSessionRotation { + fn average_session_length() -> u32 { + 10 + } + + fn estimate_current_session_progress(_now: u32) -> (Option, Weight) { + (None, Weight::zero()) + } + + fn estimate_next_session_rotation(_now: u32) -> (Option, Weight) { + (None, Weight::zero()) + } +} + +impl paras::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = paras::TestWeightInfo; + type UnsignedPriority = ParasUnsignedPriority; + type NextSessionRotation = TestNextSessionRotation; +} + +impl dmp::Config for Runtime {} + +impl hrmp::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type WeightInfo = TestHrmpWeightInfo; +} + +impl frame_system::offchain::SendTransactionTypes for Runtime +where + RuntimeCall: From, +{ + type Extrinsic = UncheckedExtrinsic; + type OverarchingCall = RuntimeCall; +} + +impl origin::Config for Runtime {} + +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; + +construct_runtime!( + pub enum Runtime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Storage, Config, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + ParasOrigin: origin::{Pallet, Origin}, + ParasUmp: ump::{Pallet, Call, Storage, Event}, + XcmPallet: pallet_xcm::{Pallet, Call, Storage, Event, Origin}, + Utility: pallet_utility::{Pallet, Call, Event}, + Hrmp: hrmp::{Pallet, Call, Storage, Event, Config}, + Dmp: dmp::{Pallet, Call, Storage}, + Paras: paras::{Pallet, Call, Storage, Event, Config, ValidateUnsigned}, + Configuration: configuration::{Pallet, Call, Storage, Config}, + } +); + +pub(crate) fn relay_events() -> Vec { + System::events() + .into_iter() + .map(|r| r.event) + .filter_map(|e| Some(e)) + .collect::>() +} + +use frame_support::traits::{OnFinalize, OnInitialize}; +pub(crate) fn relay_roll_to(n: BlockNumber) { + while System::block_number() < n { + XcmPallet::on_finalize(System::block_number()); + Balances::on_finalize(System::block_number()); + System::on_finalize(System::block_number()); + System::set_block_number(System::block_number() + 1); + System::on_initialize(System::block_number()); + Balances::on_initialize(System::block_number()); + XcmPallet::on_initialize(System::block_number()); + } +} + +/// A weight info that is only suitable for testing. +pub struct TestHrmpWeightInfo; + +impl hrmp::WeightInfo for TestHrmpWeightInfo { + fn hrmp_accept_open_channel() -> Weight { + Weight::from_parts(1, 0) + } + fn force_clean_hrmp(_: u32, _: u32) -> Weight { + Weight::from_parts(1, 0) + } + fn force_process_hrmp_close(_: u32) -> Weight { + Weight::from_parts(1, 0) + } + fn force_process_hrmp_open(_: u32) -> Weight { + Weight::from_parts(1, 0) + } + fn hrmp_cancel_open_request(_: u32) -> Weight { + Weight::from_parts(1, 0) + } + fn hrmp_close_channel() -> Weight { + Weight::from_parts(1, 0) + } + fn hrmp_init_open_channel() -> Weight { + Weight::from_parts(1, 0) + } + fn clean_open_channel_requests(_: u32) -> Weight { + Weight::from_parts(1, 0) + } + fn force_open_hrmp_channel() -> Weight { + Weight::from_parts(1, 0) + } +} diff --git a/tracing/2402/runtime/moonriver/tests/xcm_mock/statemine_like.rs b/tracing/2402/runtime/moonriver/tests/xcm_mock/statemine_like.rs new file mode 100644 index 0000000..268d0ec --- /dev/null +++ b/tracing/2402/runtime/moonriver/tests/xcm_mock/statemine_like.rs @@ -0,0 +1,529 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +//! Relay chain runtime mock. + +use frame_support::{ + construct_runtime, match_types, parameter_types, + traits::{AsEnsureOriginWithArg, Everything, Nothing}, + weights::Weight, +}; +use frame_system::{EnsureRoot, EnsureSigned}; + +use sp_core::H256; +use sp_runtime::{ + traits::{BlakeTwo256, ConstU32, Hash, IdentityLookup}, + AccountId32, +}; + +use polkadot_core_primitives::BlockNumber as RelayBlockNumber; + +use polkadot_parachain::primitives::Id as ParaId; +use polkadot_parachain::primitives::Sibling; +use sp_std::convert::TryFrom; +use xcm::latest::prelude::*; +use xcm::VersionedXcm; +use xcm_builder::{ + AccountId32Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, + AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, AsPrefixedGeneralIndex, + ConvertedConcreteId, CurrencyAdapter, EnsureXcmOrigin, FixedRateOfFungible, FixedWeightBounds, + FungiblesAdapter, IsConcrete, NoChecking, ParentAsSuperuser, ParentIsPreset, + RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, +}; +use xcm_executor::{traits::JustTry, Config, XcmExecutor}; +use xcm_simulator::{ + DmpMessageHandlerT as DmpMessageHandler, XcmpMessageFormat, + XcmpMessageHandlerT as XcmpMessageHandler, +}; +pub type AccountId = AccountId32; +pub type Balance = u128; +pub type AssetId = u128; +pub type BlockNumber = u32; + +parameter_types! { + pub const BlockHashCount: u32 = 250; +} + +impl frame_system::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Index = u64; + type BlockNumber = BlockNumber; + type Hash = H256; + type Hashing = ::sp_runtime::traits::BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = sp_runtime::generic::Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type BlockWeights = (); + type BlockLength = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type DbWeight = (); + type BaseCallFilter = Everything; + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +parameter_types! { + pub ExistentialDeposit: Balance = 1; + pub const MaxLocks: u32 = 50; + pub const MaxReserves: u32 = 50; +} + +impl pallet_balances::Config for Runtime { + type MaxLocks = MaxLocks; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = (); + type MaxReserves = MaxReserves; + type ReserveIdentifier = [u8; 8]; +} + +parameter_types! { + pub const AssetDeposit: Balance = 0; // 1 UNIT deposit to create asset + pub const ApprovalDeposit: Balance = 0; + pub const AssetsStringLimit: u32 = 50; + /// Key = 32 bytes, Value = 36 bytes (32+1+1+1+1) + // https://github.com/paritytech/substrate/blob/069917b/frame/assets/src/lib.rs#L257L271 + pub const MetadataDepositBase: Balance = 0; + pub const MetadataDepositPerByte: Balance = 0; + pub const ExecutiveBody: BodyId = BodyId::Executive; + pub const AssetAccountDeposit: Balance = 0; +} + +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetId; + type Currency = Balances; + type ForceOrigin = EnsureRoot; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type AssetAccountDeposit = AssetAccountDeposit; + type WeightInfo = (); + type RemoveItemsLimit = ConstU32<656>; + type AssetIdParameter = AssetId; + type CreateOrigin = AsEnsureOriginWithArg>; + type CallbackHandle = (); +} + +parameter_types! { + pub const KsmLocation: MultiLocation = MultiLocation::parent(); + pub const RelayNetwork: NetworkId = NetworkId::Kusama; + pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); + pub UniversalLocation: InteriorMultiLocation = + X2(GlobalConsensus(RelayNetwork::get()), Parachain(MsgQueue::parachain_id().into())); + pub Local: MultiLocation = Here.into(); + pub CheckingAccount: AccountId = PolkadotXcm::check_account(); + pub KsmPerSecond: (xcm::latest::prelude::AssetId, u128, u128) = + (Concrete(KsmLocation::get()), 1, 1); +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the default `AccountId`. + ParentIsPreset, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // Straight up local `AccountId32` origins just alias directly to `AccountId`. + AccountId32Aliases, +); + +/// Means for transacting the native currency on this chain. +pub type CurrencyTransactor = CurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We don't track any teleports of `Balances`. + (), +>; + +/// Means for transacting assets besides the native currency on this chain. +pub type FungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + Assets, + // Use this currency when it is a fungible asset matching the given location or name: + ConvertedConcreteId< + AssetId, + Balance, + AsPrefixedGeneralIndex, + JustTry, + >, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We only want to allow teleports of known assets. We use non-zero issuance as an indication + // that this asset is known. + NoChecking, + // The account to use for tracking teleports. + CheckingAccount, +>; +/// Means for transacting assets on this chain. +pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor); + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can +/// biases the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain which they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when + // recognised. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognised. + SiblingParachainAsNative, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, + // Native signed account converter; this just converts an `AccountId32` origin into a normal + // `Origin::Signed` origin of the same 32-byte value. + SignedAccountId32AsNative, + // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. + pallet_xcm::XcmPassthrough, +); + +parameter_types! { + // One XCM operation is 1_000_000_000 weight - almost certainly a conservative estimate. + pub UnitWeightCost: Weight = Weight::from_parts(100u64, 100u64); + pub const MaxInstructions: u32 = 100; +} + +match_types! { + pub type ParentOrParentsExecutivePlurality: impl Contains = { + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) } + }; +} +match_types! { + pub type ParentOrSiblings: impl Contains = { + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(_) } + }; +} + +pub type Barrier = ( + TakeWeightCredit, + AllowTopLevelPaidExecutionFrom, + // Parent and its exec plurality get free execution + AllowUnpaidExecutionFrom, + // Expected responses are OK. + AllowKnownQueryResponses, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, +); + +parameter_types! { + pub MatcherLocation: MultiLocation = MultiLocation::here(); + pub const MaxAssetsIntoHolding: u32 = 64; +} + +pub struct XcmConfig; +impl Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = AssetTransactors; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + type IsReserve = + orml_xcm_support::MultiNativeAsset; + type IsTeleporter = (); + type UniversalLocation = UniversalLocation; + type Barrier = Barrier; + type Weigher = FixedWeightBounds; + type Trader = FixedRateOfFungible; + type ResponseHandler = PolkadotXcm; + type AssetTrap = PolkadotXcm; + type AssetClaims = PolkadotXcm; + type SubscriptionService = PolkadotXcm; + type CallDispatcher = RuntimeCall; + type AssetLocker = (); + type AssetExchanger = (); + type PalletInstancesInfo = (); + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type FeeManager = (); + type MessageExporter = (); + type UniversalAliases = Nothing; + type SafeCallFilter = Everything; + type AssetIsBurnable = Everything; +} + +/// No local origins on this chain are allowed to dispatch XCM sends/executions. +pub type LocalOriginToLocation = SignedToAccountId32; + +pub type XcmRouter = super::ParachainXcmRouter; + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + type ExecuteXcmOrigin = EnsureXcmOrigin; + type XcmExecuteFilter = Nothing; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Everything; + type XcmReserveTransferFilter = Everything; + type Weigher = FixedWeightBounds; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; + type Currency = Balances; + type CurrencyMatcher = IsConcrete; + type TrustedLockers = (); + type SovereignAccountOf = (); + type MaxLockers = ConstU32<8>; + type WeightInfo = pallet_xcm::TestWeightInfo; +} + +impl cumulus_pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +#[frame_support::pallet] +pub mod mock_msg_queue { + use super::*; + use frame_support::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + type XcmExecutor: ExecuteXcm; + } + + #[pallet::call] + impl Pallet {} + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::storage] + #[pallet::getter(fn parachain_id)] + pub(super) type ParachainId = StorageValue<_, ParaId, ValueQuery>; + + impl Get for Pallet { + fn get() -> ParaId { + Self::parachain_id() + } + } + + pub type MessageId = [u8; 32]; + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + // XCMP + /// Some XCM was executed OK. + Success(Option), + /// Some XCM failed. + Fail(Option, XcmError), + /// Bad XCM version used. + BadVersion(Option), + /// Bad XCM format used. + BadFormat(Option), + + // DMP + /// Downward message is invalid XCM. + InvalidFormat(MessageId), + /// Downward message is unsupported version of XCM. + UnsupportedVersion(MessageId), + /// Downward message executed with the given outcome. + ExecutedDownward(MessageId, Outcome), + } + + impl Pallet { + pub fn set_para_id(para_id: ParaId) { + ParachainId::::put(para_id); + } + + fn handle_xcmp_message( + sender: ParaId, + _sent_at: RelayBlockNumber, + xcm: VersionedXcm, + max_weight: Weight, + ) -> Result { + let hash = Encode::using_encoded(&xcm, T::Hashing::hash); + let (result, event) = match Xcm::::try_from(xcm) { + Ok(xcm) => { + let location = MultiLocation::new(1, Junctions::X1(Parachain(sender.into()))); + let mut id = [0u8; 32]; + id.copy_from_slice(hash.as_ref()); + match T::XcmExecutor::execute_xcm(location, xcm, id, max_weight) { + Outcome::Error(e) => (Err(e.clone()), Event::Fail(Some(hash), e)), + Outcome::Complete(w) => (Ok(w), Event::Success(Some(hash))), + // As far as the caller is concerned, this was dispatched without error, so + // we just report the weight used. + Outcome::Incomplete(w, e) => (Ok(w), Event::Fail(Some(hash), e)), + } + } + Err(()) => ( + Err(XcmError::UnhandledXcmVersion), + Event::BadVersion(Some(hash)), + ), + }; + Self::deposit_event(event); + result + } + } + + impl XcmpMessageHandler for Pallet { + fn handle_xcmp_messages<'a, I: Iterator>( + iter: I, + max_weight: Weight, + ) -> Weight { + for (sender, sent_at, data) in iter { + let mut data_ref = data; + let _ = XcmpMessageFormat::decode(&mut data_ref) + .expect("Simulator encodes with versioned xcm format; qed"); + + let mut remaining_fragments = &data_ref[..]; + while !remaining_fragments.is_empty() { + if let Ok(xcm) = + VersionedXcm::::decode(&mut remaining_fragments) + { + let _ = Self::handle_xcmp_message(sender, sent_at, xcm, max_weight); + } else { + debug_assert!(false, "Invalid incoming XCMP message data"); + } + } + } + max_weight + } + } + + impl DmpMessageHandler for Pallet { + fn handle_dmp_messages( + iter: impl Iterator)>, + limit: Weight, + ) -> Weight { + for (_i, (_sent_at, data)) in iter.enumerate() { + let id = sp_io::hashing::blake2_256(&data[..]); + let maybe_msg = VersionedXcm::::decode(&mut &data[..]) + .map(Xcm::::try_from); + match maybe_msg { + Err(_) => { + Self::deposit_event(Event::InvalidFormat(id)); + } + Ok(Err(())) => { + Self::deposit_event(Event::UnsupportedVersion(id)); + } + Ok(Ok(x)) => { + let outcome = T::XcmExecutor::execute_xcm(Parent, x, id, limit); + + Self::deposit_event(Event::ExecutedDownward(id, outcome)); + } + } + } + limit + } + } +} +impl mock_msg_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +// Pallet to cover test cases for change https://github.com/paritytech/cumulus/pull/831 +#[frame_support::pallet] +pub mod mock_statemine_prefix { + use super::*; + use frame_support::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + } + + #[pallet::call] + impl Pallet {} + + #[pallet::pallet] + #[pallet::without_storage_info] + pub struct Pallet(_); + + #[pallet::storage] + #[pallet::getter(fn current_prefix)] + pub(super) type CurrentPrefix = StorageValue<_, MultiLocation, ValueQuery>; + + impl Get for Pallet { + fn get() -> MultiLocation { + Self::current_prefix() + } + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + // Changed Prefix + PrefixChanged(MultiLocation), + } + + impl Pallet { + pub fn set_prefix(prefix: MultiLocation) { + CurrentPrefix::::put(&prefix); + Self::deposit_event(Event::PrefixChanged(prefix)); + } + } +} + +impl mock_statemine_prefix::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} + +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; +construct_runtime!( + pub enum Runtime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system::{Pallet, Call, Storage, Config, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + PolkadotXcm: pallet_xcm::{Pallet, Call, Storage, Event, Origin}, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin}, + MsgQueue: mock_msg_queue::{Pallet, Storage, Event}, + Assets: pallet_assets::{Pallet, Storage, Event}, + PrefixChanger: mock_statemine_prefix::{Pallet, Storage, Event}, + + } +); diff --git a/tracing/2402/runtime/moonriver/tests/xcm_tests.rs b/tracing/2402/runtime/moonriver/tests/xcm_tests.rs new file mode 100644 index 0000000..6e89baa --- /dev/null +++ b/tracing/2402/runtime/moonriver/tests/xcm_tests.rs @@ -0,0 +1,3367 @@ +// Copyright 2019-2022 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam 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. + +// Moonbeam 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 Moonbeam. If not, see . + +//! Moonriver Runtime Xcm Tests + +mod xcm_mock; +use frame_support::{ + assert_ok, + traits::{PalletInfo, PalletInfoAccess}, + weights::{constants::WEIGHT_REF_TIME_PER_SECOND, Weight}, + BoundedVec, +}; +use pallet_asset_manager::LocalAssetIdCreator; +use sp_core::ConstU32; +use xcm::latest::prelude::*; +use xcm::{VersionedMultiLocation, WrapVersion}; +use xcm_builder::HashedDescriptionDescribeFamilyAllTerminal; +use xcm_executor::traits::Convert; +use xcm_mock::parachain; +use xcm_mock::relay_chain; +use xcm_mock::*; +use xcm_simulator::TestExt; +mod common; +use common::ExtBuilder; +use cumulus_primitives_core::relay_chain::HrmpChannelId; +use pallet_xcm_transactor::{ + Currency, CurrencyPayment, HrmpInitParams, HrmpOperation, TransactWeights, +}; +use xcm_primitives::{UtilityEncodeCall, DEFAULT_PROOF_SIZE}; + +// Send a relay asset (like DOT) to a parachain A +#[test] +fn receive_relay_asset_from_relay() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // Register relay asset in parachain A + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + // Verify that parachain received the asset + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 123); + }); +} + +// Send relay asset (like DOT) back from Parachain A to relaychain +#[test] +fn send_relay_asset_to_relay() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + // Register relay asset in paraA + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + // free execution + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + let dest: MultiLocation = Junction::AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + + // First send relay chain asset to Parachain like in previous test + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // Free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 123); + }); + + // Lets gather the balance before sending back money + let mut balance_before_sending = 0; + Relay::execute_with(|| { + balance_before_sending = RelayBalances::free_balance(&RELAYALICE); + }); + + // We now send back some money to the relay + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: RELAYALICE.into(), + }), + }; + + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 123, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // The balances in paraAlice should have been substracted + ParaA::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 0); + }); + + // Balances in the relay should have been received + Relay::execute_with(|| { + assert!(RelayBalances::free_balance(&RELAYALICE) > balance_before_sending); + }); +} + +#[test] +fn send_relay_asset_to_para_b() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + // Register asset in paraA. Free execution + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata.clone(), + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location.clone(), + 0u128, + 0 + )); + }); + + // Register asset in paraB. Free execution + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // First send relay chain asset to Parachain A like in previous test + let dest: MultiLocation = Junction::AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 123); + }); + + // Now send relay asset from para A to para B + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // Para A balances should have been substracted + ParaA::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 23); + }); + + // Para B balances should have been credited + ParaB::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); +} + +#[test] +fn send_para_a_asset_to_para_b() { + MockNet::reset(); + + // This represents the asset in paraA + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + // Register asset in paraB. Free execution + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Send para A asset from para A to para B + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(800000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // Native token is substracted in paraA + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + // Asset is minted in paraB + ParaB::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); +} + +#[test] +fn send_para_a_asset_from_para_b_to_para_c() { + MockNet::reset(); + + // Represents para A asset + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + // Register para A asset in parachain B. Free execution + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata.clone(), + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location.clone(), + 0u128, + 0 + )); + }); + + // Register para A asset in parachain C. Free execution + ParaC::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Send para A asset to para B + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // Para A balances have been substracted + ParaA::execute_with(|| { + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + // Para B balances have been credited + ParaB::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); + + // Send para A asset from para B to para C + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(3), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaB::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // The message passed through parachainA so we needed to pay since its the native token + ParaC::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 96); + }); +} + +#[test] +fn send_para_a_asset_to_para_b_and_back_to_para_a() { + MockNet::reset(); + + // Para A asset + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + // Register para A asset in para B + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Send para A asset to para B + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // Balances have been substracted + ParaA::execute_with(|| { + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + // Para B balances have been credited + ParaB::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); + + // Send back para A asset to para A + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(1), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + ParaB::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + }); + + // Para A asset has been credited + ParaA::execute_with(|| { + // Weight used is 4 + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 4 + ); + }); +} + +#[test] +fn send_para_a_asset_to_para_b_and_back_to_para_a_with_new_reanchoring() { + MockNet::reset(); + + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + // Free execution, full amount received + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + ParaB::execute_with(|| { + // Free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); + + // This time we will force the new reanchoring by manually sending the + // Message through polkadotXCM pallet + + let dest = MultiLocation { + parents: 1, + interior: X1(Parachain(1)), + }; + + let reanchored_para_a_balances = MultiLocation::new(0, X1(PalletInstance(1u8))); + + let message = xcm::VersionedXcm::<()>::V3(Xcm(vec![ + WithdrawAsset((reanchored_para_a_balances.clone(), 100).into()), + ClearOrigin, + BuyExecution { + fees: (reanchored_para_a_balances, 100).into(), + weight_limit: Limited(80.into()), + }, + DepositAsset { + assets: All.into(), + beneficiary: MultiLocation::new( + 0, + X1(AccountKey20 { + network: None, + key: PARAALICE, + }), + ), + }, + ])); + ParaB::execute_with(|| { + // Send a message to the sovereign account in ParaA to withdraw + // and deposit asset + assert_ok!(ParachainPalletXcm::send( + parachain::RuntimeOrigin::root(), + Box::new(dest.into()), + Box::new(message), + )); + }); + + ParaB::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); + + // This time we will force the new reanchoring by manually sending the + // Message through polkadotXCM pallet + + let dest = MultiLocation { + parents: 1, + interior: X1(Parachain(1)), + }; + + let reanchored_para_a_balances = MultiLocation::new(0, X1(PalletInstance(1u8))); + + let message = xcm::VersionedXcm::<()>::V3(Xcm(vec![ + WithdrawAsset((reanchored_para_a_balances.clone(), 100).into()), + ClearOrigin, + BuyExecution { + fees: (reanchored_para_a_balances, 100).into(), + weight_limit: Limited(80.into()), + }, + DepositAsset { + assets: All.into(), + beneficiary: MultiLocation::new( + 0, + X1(AccountKey20 { + network: None, + key: PARAALICE, + }), + ), + }, + ])); + ParaB::execute_with(|| { + // Send a message to the sovereign account in ParaA to withdraw + // and deposit asset + assert_ok!(ParachainPalletXcm::send( + parachain::RuntimeOrigin::root(), + Box::new(dest.into()), + Box::new(message), + )); + }); + + ParaA::execute_with(|| { + // Weight used is 4 + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 4 + ); + }); +} + +#[test] +fn receive_relay_asset_with_trader() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + // This time we are gonna put a rather high number of units per second + // we know later we will divide by 1e12 + // Lets put 1e6 as units per second + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 2500000000000u128, + 0 + )); + }); + + let dest: MultiLocation = Junction::AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + // We are sending 100 tokens from relay. + // Amount spent in fees is Units per second * weight / 1_000_000_000_000 (weight per second) + // weight is 4 since we are executing 4 instructions with a unitweightcost of 1. + // Units per second should be 2_500_000_000_000_000 + // Therefore with no refund, we should receive 10 tokens less + // Native trader fails for this, and we use the asset trader + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 100).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // non-free execution, not full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 90); + // Fee should have been received by treasury + assert_eq!(Assets::balance(source_id, &Treasury::account_id()), 10); + }); +} + +#[test] +fn send_para_a_asset_to_para_b_with_trader() { + MockNet::reset(); + + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 2500000000000u128, + 0 + )); + }); + + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + // In destination chain, we only need 4 weight + // We put 10 weight, 6 of which should be refunded and 4 of which should go to treasury + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(10u64, DEFAULT_PROOF_SIZE)) + )); + }); + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + // We are sending 100 tokens from para A. + // Amount spent in fees is Units per second * weight / 1_000_000_000_000 (weight per second) + // weight is 4 since we are executing 4 instructions with a unitweightcost of 1. + // Units per second should be 2_500_000_000_000_000 + // Since we set 10 weight in destination chain, 25 will be charged upfront + // 15 of those will be refunded, while 10 will go to treasury as the true weight used + // will be 4 + ParaB::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 90); + // Fee should have been received by treasury + assert_eq!(Assets::balance(source_id, &Treasury::account_id()), 10); + }); +} + +#[test] +fn send_para_a_asset_to_para_b_with_trader_and_fee() { + MockNet::reset(); + + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + // With these units per second, 80K weight convrets to 1 asset unit + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 12500000u128, + 0 + )); + }); + + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + // we use transfer_with_fee + ParaA::execute_with(|| { + assert_ok!(XTokens::transfer_with_fee( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + 1, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(800000u64, DEFAULT_PROOF_SIZE)) + )); + }); + ParaA::execute_with(|| { + // 100 tokens transferred plus 1 taken from fees + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 - 1 + ); + }); + + ParaB::execute_with(|| { + // free execution, full amount received because trully the xcm instruction does not cost + // what it is specified + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 101); + }); +} + +#[test] +fn error_when_not_paying_enough() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + let dest: MultiLocation = Junction::AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + // This time we are gonna put a rather high number of units per second + // we know later we will divide by 1e12 + // Lets put 1e6 as units per second + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 2500000000000u128, + 0 + )); + }); + + // We are sending 100 tokens from relay. + // If we set the dest weight to be 1e7, we know the buy_execution will spend 1e7*1e6/1e12 = 10 + // Therefore with no refund, we should receive 10 tokens less + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 5).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // amount not received as it is not paying enough + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 0); + }); +} + +#[test] +fn transact_through_derivative_multilocation() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 1u128, + 0 + )); + + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + // Relay charges 1000 for every instruction, and we have 3, so 3000 + 3000.into(), + 20000000000.into(), + None + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + WEIGHT_REF_TIME_PER_SECOND as u128, + )); + }); + + // Let's construct the call to know how much weight it is going to require + + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + // 4000000000 transact + 3000 correspond to 4000003000 tokens. 100 more for the transfer call + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 4000003100u128).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003100); + }); + + // Register address + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::register( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + 0, + )); + }); + + // Send to registered address + + let registered_address = derivative_account_id(para_a_account(), 0); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: registered_address.clone().into(), + }), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003000); + }); + + // What we will do now is transfer this relay tokens from the derived account to the sovereign + // again + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 4000003000); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_derivative( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::MockTransactors::Relay, + 0, + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: None + }, + encoded, + // 4000000000 + 3000 we should have taken out 4000003000 tokens from the caller + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(®istered_address) == 0); + }); +} + +#[test] +fn transact_through_derivative_with_custom_fee_weight() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 1u128, + 0 + )); + }); + + // Let's construct the call to know how much weight it is going to require + + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + // 4000000000 transact + 3000 correspond to 4000003000 tokens. 100 more for the transfer call + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 4000003100u128).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003100); + }); + + // Register address + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::register( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + 0, + )); + }); + + // Send to registered address + + let registered_address = derivative_account_id(para_a_account(), 0); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: registered_address.clone().into(), + }), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003000); + }); + + // What we will do now is transfer this relay tokens from the derived account to the sovereign + // again + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 4000003000); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + let overall_weight = 4000003000u64; + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_derivative( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::MockTransactors::Relay, + 0, + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + // 1-1 fee weight mapping + fee_amount: Some(overall_weight as u128) + }, + // 4000000000 + 3000 we should have taken out 4000003000 tokens from the caller + encoded, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: Some(overall_weight.into()) + } + )); + let event_found: Option = parachain::para_events() + .iter() + .find_map(|event| match event.clone() { + parachain::RuntimeEvent::PolkadotXcm(pallet_xcm::Event::AssetsTrapped(_, _, _)) => { + Some(event.clone()) + } + _ => None, + }); + // Assert that the events do not contain the assets being trapped + assert!(event_found.is_none()); + }); + + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(®istered_address) == 0); + }); +} + +#[test] +fn transact_through_sovereign() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 1u128, + 0 + )); + + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + // Relay charges 1000 for every instruction, and we have 3, so 3000 + 3000.into(), + 20000000000.into(), + None + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + WEIGHT_REF_TIME_PER_SECOND as u128, + )); + }); + + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 4000003100u128).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003100); + }); + + // Register address + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::register( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + 0, + )); + }); + + // Send to registered address + let registered_address = derivative_account_id(para_a_account(), 0); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: registered_address.clone().into(), + }), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003000); + }); + + // What we will do now is transfer this relay tokens from the derived account to the sovereign + // again + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 4000003000); + 0 + }); + + // We send the xcm transact operation to parent + let dest = MultiLocation { + parents: 1, + interior: Here, + }; + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + let utility_bytes = parachain::MockTransactors::Relay.encode_call( + xcm_primitives::UtilityAvailableCalls::AsDerivative(0, encoded), + ); + + // Root can directly pass the execution byes to the sovereign + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_sovereign( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(dest)), + PARAALICE.into(), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: None + }, + utility_bytes, + OriginKind::SovereignAccount, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(®istered_address) == 0); + }); +} + +#[test] +fn transact_through_sovereign_with_custom_fee_weight() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 1u128, + 0 + )); + }); + + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 4000003100u128).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003100); + }); + + // Register address + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::register( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + 0, + )); + }); + + // Send to registered address + let registered_address = derivative_account_id(para_a_account(), 0); + let dest = MultiLocation { + parents: 1, + interior: X1(AccountId32 { + network: None, + id: registered_address.clone().into(), + }), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::ForeignAsset(source_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(40000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 4000003000); + }); + + // What we will do now is transfer this relay tokens from the derived account to the sovereign + // again + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 4000003000); + 0 + }); + + // We send the xcm transact operation to parent + let dest = MultiLocation { + parents: 1, + interior: Here, + }; + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + let utility_bytes = parachain::MockTransactors::Relay.encode_call( + xcm_primitives::UtilityAvailableCalls::AsDerivative(0, encoded), + ); + + let total_weight = 4000003000u64; + // Root can directly pass the execution byes to the sovereign + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_sovereign( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(dest)), + PARAALICE.into(), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + // 1-1 fee-weight mapping + fee_amount: Some(total_weight as u128) + }, + utility_bytes, + OriginKind::SovereignAccount, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: Some(total_weight.into()) + } + )); + }); + + Relay::execute_with(|| { + // free execution,x full amount received + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(®istered_address) == 0); + }); +} + +#[test] +fn test_automatic_versioning_on_runtime_upgrade_with_relay() { + MockNet::reset(); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A and set XCM version to 1 + ParaA::execute_with(|| { + parachain::XcmVersioner::set_version(1); + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + let response = Response::Version(2); + let querier: MultiLocation = Here.into(); + + // This is irrelevant, nothing will be done with this message, + // but we need to pass a message as an argument to trigger the storage change + let mock_message: Xcm<()> = Xcm(vec![QueryResponse { + query_id: 0, + response, + max_weight: Weight::zero(), + querier: Some(querier), + }]); + // The router is mocked, and we cannot use WrapVersion in ChildParachainRouter. So we will force + // it directly here + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + + Relay::execute_with(|| { + // This sets the default version, for not known destinations + assert_ok!(RelayChainPalletXcm::force_default_xcm_version( + relay_chain::RuntimeOrigin::root(), + Some(2) + )); + + // Wrap version, which sets VersionedStorage + // This is necessary because the mock router does not use wrap_version, but + // this is not necessary in prod + assert_ok!(::wrap_version( + &Parachain(1).into(), + mock_message + )); + + // Transfer assets. Since it is an unknown destination, it will query for version + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + + // Let's advance the relay. This should trigger the subscription message + relay_chain::relay_roll_to(2); + + // queries should have been updated + assert!(RelayChainPalletXcm::query(0).is_some()); + }); + + let expected_supported_version: relay_chain::RuntimeEvent = + pallet_xcm::Event::SupportedVersionChanged( + MultiLocation { + parents: 0, + interior: X1(Parachain(1)), + }, + 1, + ) + .into(); + + Relay::execute_with(|| { + // Assert that the events vector contains the version change + assert!(relay_chain::relay_events().contains(&expected_supported_version)); + }); + + let expected_version_notified: parachain::RuntimeEvent = + pallet_xcm::Event::VersionChangeNotified( + MultiLocation { + parents: 1, + interior: Here, + }, + 2, + vec![].into(), + ) + .into(); + + // ParaA changes version to 2, and calls on_runtime_upgrade. This should notify the targets + // of the new version change + ParaA::execute_with(|| { + // Set version + parachain::XcmVersioner::set_version(2); + // Do runtime upgrade + parachain::on_runtime_upgrade(); + // Initialize block, to call on_initialize and notify targets + parachain::para_roll_to(2); + // Expect the event in the parachain + assert!(parachain::para_events().contains(&expected_version_notified)); + }); + + // This event should have been seen in the relay + let expected_supported_version_2: relay_chain::RuntimeEvent = + pallet_xcm::Event::SupportedVersionChanged( + MultiLocation { + parents: 0, + interior: X1(Parachain(1)), + }, + 2, + ) + .into(); + + Relay::execute_with(|| { + // Assert that the events vector contains the new version change + assert!(relay_chain::relay_events().contains(&expected_supported_version_2)); + }); +} + +#[test] +fn test_automatic_versioning_on_runtime_upgrade_with_para_b() { + MockNet::reset(); + + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location = parachain::AssetType::Xcm(para_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + let response = Response::Version(2); + let querier: MultiLocation = Here.into(); + + // This is irrelevant, nothing will be done with this message, + // but we need to pass a message as an argument to trigger the storage change + let mock_message: Xcm<()> = Xcm(vec![QueryResponse { + query_id: 0, + response, + max_weight: Weight::zero(), + querier: Some(querier), + }]); + + ParaA::execute_with(|| { + // advertised version + parachain::XcmVersioner::set_version(2); + }); + + ParaB::execute_with(|| { + // Let's try with v0 + parachain::XcmVersioner::set_version(0); + + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + ParaA::execute_with(|| { + // This sets the default version, for not known destinations + assert_ok!(ParachainPalletXcm::force_default_xcm_version( + parachain::RuntimeOrigin::root(), + Some(2) + )); + // Wrap version, which sets VersionedStorage + assert_ok!(::wrap_version( + &MultiLocation::new(1, X1(Parachain(2))).into(), + mock_message + )); + + parachain::para_roll_to(2); + + // queries should have been updated + assert!(ParachainPalletXcm::query(0).is_some()); + }); + + let expected_supported_version: parachain::RuntimeEvent = + pallet_xcm::Event::SupportedVersionChanged( + MultiLocation { + parents: 1, + interior: X1(Parachain(2)), + }, + 0, + ) + .into(); + + ParaA::execute_with(|| { + // Assert that the events vector contains the version change + assert!(parachain::para_events().contains(&expected_supported_version)); + }); + + // Let's ensure talking in v0 works + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::SelfReserve, + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(80u64, DEFAULT_PROOF_SIZE)) + )); + // free execution, full amount received + assert_eq!( + ParaBalances::free_balance(&PARAALICE.into()), + INITIAL_BALANCE - 100 + ); + }); + + ParaB::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); + + let expected_version_notified: parachain::RuntimeEvent = + pallet_xcm::Event::VersionChangeNotified( + MultiLocation { + parents: 1, + interior: X1(Parachain(1)), + }, + 2, + vec![].into(), + ) + .into(); + + // ParaB changes version to 2, and calls on_runtime_upgrade. This should notify the targets + // of the new version change + ParaB::execute_with(|| { + // Set version + parachain::XcmVersioner::set_version(2); + // Do runtime upgrade + parachain::on_runtime_upgrade(); + // Initialize block, to call on_initialize and notify targets + parachain::para_roll_to(2); + // Expect the event in the parachain + assert!(parachain::para_events().contains(&expected_version_notified)); + }); + + // This event should have been seen in para A + let expected_supported_version_2: parachain::RuntimeEvent = + pallet_xcm::Event::SupportedVersionChanged( + MultiLocation { + parents: 1, + interior: X1(Parachain(2)), + }, + 2, + ) + .into(); + + // Para A should have received the version change + ParaA::execute_with(|| { + // Assert that the events vector contains the new version change + assert!(parachain::para_events().contains(&expected_supported_version_2)); + }); +} + +#[test] +fn receive_asset_with_no_sufficients_not_possible_if_non_existent_account() { + MockNet::reset(); + + let fresh_account = [2u8; 20]; + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + false + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: fresh_account, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest.clone()).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + // parachain should not have received assets + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &fresh_account.into()), 0); + }); + + // Send native token to fresh_account + ParaA::execute_with(|| { + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + fresh_account.into(), + 100 + )); + }); + + // Re-send tokens + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + // parachain should have received assets + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &fresh_account.into()), 123); + }); +} + +#[test] +fn receive_assets_with_sufficients_true_allows_non_funded_account_to_receive_assets() { + MockNet::reset(); + + let fresh_account = [2u8; 20]; + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: fresh_account, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest.clone()).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + // parachain should have received assets + ParaA::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &fresh_account.into()), 123); + }); +} + +#[test] +fn evm_account_receiving_assets_should_handle_sufficients_ref_count() { + MockNet::reset(); + + let mut sufficient_account = [0u8; 20]; + sufficient_account[0..20].copy_from_slice(&evm_account()[..]); + + let evm_account_id = parachain::AccountId::from(sufficient_account); + + // Evm account is self sufficient + ParaA::execute_with(|| { + assert_eq!(parachain::System::account(evm_account_id).sufficients, 1); + }); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: sufficient_account, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest.clone()).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + // Evm account sufficient ref count increased by 1. + ParaA::execute_with(|| { + assert_eq!(parachain::System::account(evm_account_id).sufficients, 2); + }); + + ParaA::execute_with(|| { + // Remove the account from the evm context. + parachain::EVM::remove_account(&evm_account()); + // Evm account sufficient ref count decreased by 1. + assert_eq!(parachain::System::account(evm_account_id).sufficients, 1); + }); +} + +#[test] +fn empty_account_should_not_be_reset() { + MockNet::reset(); + + // Test account has nonce 1 on genesis. + let mut sufficient_account = [0u8; 20]; + sufficient_account[0..20].copy_from_slice(&evm_account()[..]); + + let evm_account_id = parachain::AccountId::from(sufficient_account); + + let source_location = parachain::AssetType::Xcm(MultiLocation::parent()); + let source_id: parachain::AssetId = source_location.clone().into(); + let asset_metadata = parachain::AssetMetadata { + name: b"RelayToken".to_vec(), + symbol: b"Relay".to_vec(), + decimals: 12, + }; + // register relay asset in parachain A + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + false + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + // Send native token to evm_account + ParaA::execute_with(|| { + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + evm_account_id, + 100 + )); + }); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: sufficient_account, + } + .into(); + Relay::execute_with(|| { + assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + Box::new(Parachain(1).into()), + Box::new(VersionedMultiLocation::V3(dest.clone()).clone().into()), + Box::new((Here, 123).into()), + 0, + )); + }); + + ParaA::execute_with(|| { + // Empty the assets from the account. + // As this makes the account go below the `min_balance`, the account is considered dead + // at eyes of pallet-assets, and the consumer reference is decreased by 1 and is now Zero. + assert_ok!(parachain::Assets::transfer( + parachain::RuntimeOrigin::signed(evm_account_id), + source_id, + PARAALICE.into(), + 123 + )); + // Verify account asset balance is Zero. + assert_eq!( + parachain::Assets::balance(source_id, &evm_account_id.into()), + 0 + ); + // Because we no longer have consumer references, we can set the balance to Zero. + // This would reset the account if our ED were to be > than Zero. + assert_ok!(ParaBalances::set_balance( + parachain::RuntimeOrigin::root(), + evm_account_id, + 0, + 0, + )); + // Verify account native balance is Zero. + assert_eq!(ParaBalances::free_balance(&evm_account_id), 0); + // Remove the account from the evm context. + // This decreases the sufficients reference by 1 and now is Zero. + parachain::EVM::remove_account(&evm_account()); + // Verify reference count. + let account = parachain::System::account(evm_account_id); + assert_eq!(account.sufficients, 0); + assert_eq!(account.consumers, 0); + assert_eq!(account.providers, 1); + // We expect the account to be alive in a Zero ED context. + assert_eq!(parachain::System::account_nonce(evm_account_id), 1); + }); +} + +#[test] +fn test_statemine_like() { + MockNet::reset(); + + let dest_para = MultiLocation::new(1, X1(Parachain(1))); + + let sov = xcm_builder::SiblingParachainConvertsVia::< + polkadot_parachain::primitives::Sibling, + statemine_like::AccountId, + >::convert_ref(dest_para) + .unwrap(); + + let statemine_asset_a_balances = MultiLocation::new( + 1, + X3( + Parachain(4), + PalletInstance(5), + xcm::latest::prelude::GeneralIndex(0u128), + ), + ); + let source_location = parachain::AssetType::Xcm(statemine_asset_a_balances); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"StatemineToken".to_vec(), + symbol: b"StatemineToken".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata.clone(), + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + Statemine::execute_with(|| { + // Set new prefix + statemine_like::PrefixChanger::set_prefix( + PalletInstance(::index() as u8).into(), + ); + assert_ok!(StatemineAssets::create( + statemine_like::RuntimeOrigin::signed(RELAYALICE), + 0, + RELAYALICE, + 1 + )); + + assert_ok!(StatemineAssets::mint( + statemine_like::RuntimeOrigin::signed(RELAYALICE), + 0, + RELAYALICE, + 300000000000000 + )); + + // This is needed, since the asset is created as non-sufficient + assert_ok!(StatemineBalances::transfer( + statemine_like::RuntimeOrigin::signed(RELAYALICE), + sov, + 100000000000000 + )); + + // Actually send relay asset to parachain + let dest: MultiLocation = AccountKey20 { + network: None, + key: PARAALICE, + } + .into(); + + // Send with new prefix + assert_ok!(StatemineChainPalletXcm::reserve_transfer_assets( + statemine_like::RuntimeOrigin::signed(RELAYALICE), + Box::new(MultiLocation::new(1, X1(Parachain(1))).into()), + Box::new(VersionedMultiLocation::V3(dest).clone().into()), + Box::new( + ( + X2( + xcm::latest::prelude::PalletInstance( + ::index() as u8 + ), + xcm::latest::prelude::GeneralIndex(0), + ), + 123 + ) + .into() + ), + 0, + )); + }); + + ParaA::execute_with(|| { + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 123); + }); +} + +#[test] +fn send_para_a_local_asset_to_para_b() { + ExtBuilder::default().build().execute_with(|| { + MockNet::reset(); + + let asset_id = parachain::LocalAssetIdCreator::create_asset_id_from_metadata(0); + let para_a_local_asset = MultiLocation::new( + 1, + X3(Parachain(1), PalletInstance(11u8), GeneralIndex(asset_id)), + ); + let source_location = parachain::AssetType::Xcm(para_a_local_asset); + let source_id: parachain::AssetId = source_location.clone().into(); + + let asset_metadata = parachain::AssetMetadata { + name: b"ParaALocalAsset".to_vec(), + symbol: b"ParaALocalAsset".to_vec(), + decimals: 12, + }; + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_local_asset( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + PARAALICE.into(), + true, + 1 + )); + + assert_ok!(LocalAssets::mint( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + asset_id, + PARAALICE.into(), + 300000000000000 + )); + }); + + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location.clone(), + asset_metadata, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location, + 0u128, + 0 + )); + }); + + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + parachain::CurrencyId::LocalAssetReserve(asset_id), + 100, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(800000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaB::execute_with(|| { + // free execution, full amount received + assert_eq!(Assets::balance(source_id, &PARAALICE.into()), 100); + }); + }); +} + +#[test] +fn send_para_a_local_asset_to_para_b_and_send_it_back_together_with_some_dev() { + ExtBuilder::default().build().execute_with(|| { + MockNet::reset(); + + let asset_id = parachain::LocalAssetIdCreator::create_asset_id_from_metadata(0); + let para_a_local_asset = MultiLocation::new( + 1, + X3(Parachain(1), PalletInstance(11u8), GeneralIndex(asset_id)), + ); + let source_location_local_asset = parachain::AssetType::Xcm(para_a_local_asset); + let source_id_local_asset: parachain::AssetId = source_location_local_asset.clone().into(); + + let asset_metadata_local_asset = parachain::AssetMetadata { + name: b"ParaALocalAsset".to_vec(), + symbol: b"ParaALocalAsset".to_vec(), + decimals: 12, + }; + + let para_a_balances = MultiLocation::new(1, X2(Parachain(1), PalletInstance(1u8))); + let source_location_balances = parachain::AssetType::Xcm(para_a_balances); + let source_id_balances: parachain::AssetId = source_location_balances.clone().into(); + + let asset_metadata_balances = parachain::AssetMetadata { + name: b"ParaAToken".to_vec(), + symbol: b"ParaA".to_vec(), + decimals: 18, + }; + + ParaB::execute_with(|| { + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location_local_asset.clone(), + asset_metadata_local_asset, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location_local_asset, + 0u128, + 0 + )); + + assert_ok!(AssetManager::register_foreign_asset( + parachain::RuntimeOrigin::root(), + source_location_balances.clone(), + asset_metadata_balances, + 1u128, + true + )); + assert_ok!(AssetManager::set_asset_units_per_second( + parachain::RuntimeOrigin::root(), + source_location_balances, + 0u128, + 1 + )); + }); + + ParaA::execute_with(|| { + assert_ok!(AssetManager::register_local_asset( + parachain::RuntimeOrigin::root(), + PARAALICE.into(), + PARAALICE.into(), + true, + 1 + )); + + assert_ok!(LocalAssets::mint( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + asset_id, + PARAALICE.into(), + 300000000000000 + )); + }); + + let dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(2), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaA::execute_with(|| { + // free execution, full amount received + assert_ok!(XTokens::transfer_multicurrencies( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + vec![ + (parachain::CurrencyId::LocalAssetReserve(asset_id), 100), + (parachain::CurrencyId::SelfReserve, 1000000) + ], + 0, + Box::new(VersionedMultiLocation::V3(dest)), + WeightLimit::Limited(Weight::from_parts(800000u64, DEFAULT_PROOF_SIZE)) + )); + }); + + let mut alith_balance_asset_before = 0; + let mut alith_balance_native_token_before = 0; + + ParaA::execute_with(|| { + alith_balance_asset_before = LocalAssets::balance(asset_id, &PARAALICE.into()); + alith_balance_native_token_before = Balances::free_balance(&PARAALICE.into()); + }); + + let new_dest = MultiLocation { + parents: 1, + interior: X2( + Parachain(1), + AccountKey20 { + network: None, + key: PARAALICE.into(), + }, + ), + }; + + ParaB::execute_with(|| { + // free execution, full amount received + assert_eq!( + Assets::balance(source_id_local_asset, &PARAALICE.into()), + 100 + ); + assert_eq!( + Assets::balance(source_id_balances, &PARAALICE.into()), + 1000000 + ); + + // free execution, full amount received + assert_ok!(XTokens::transfer_multicurrencies( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + vec![ + (parachain::CurrencyId::ForeignAsset(source_id_balances), 4), + ( + parachain::CurrencyId::ForeignAsset(source_id_local_asset), + 50 + ) + ], + 0, + Box::new(VersionedMultiLocation::V3(new_dest)), + WeightLimit::Limited(Weight::from_parts(4u64, DEFAULT_PROOF_SIZE)) + )); + }); + + ParaA::execute_with(|| { + let alith_balance_asset_after = LocalAssets::balance(asset_id, &PARAALICE.into()); + let alith_balance_native_token_after = Balances::free_balance(&PARAALICE.into()); + assert_eq!(alith_balance_asset_after, alith_balance_asset_before + 50); + assert_eq!( + alith_balance_native_token_before, + alith_balance_native_token_after + ); + }); + }); +} + +#[test] +fn transact_through_signed_multilocation() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + ParaA::execute_with(|| { + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + // Relay charges 1000 for every instruction, and we have 3, so 3000 + 3000.into(), + 20000000000.into(), + // 4 instructions in transact through signed + Some(4000.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + WEIGHT_REF_TIME_PER_SECOND as u128, + )); + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the relay will see instead of us + descend_origin_multilocation + .reanchor(&MultiLocation::parent(), ancestry.interior) + .unwrap(); + + let derived = xcm_builder::Account32Hash::< + relay_chain::KusamaNetwork, + relay_chain::AccountId, + >::convert_ref(descend_origin_multilocation) + .unwrap(); + + Relay::execute_with(|| { + // free execution, full amount received + assert_ok!(RelayBalances::transfer( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + derived.clone(), + 4000004100u128, + )); + // derived account has all funds + assert!(RelayBalances::free_balance(&derived) == 4000004100); + // sovereign account has 0 funds + assert!(RelayBalances::free_balance(¶_a_account()) == 0); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + // 100 to sovereign + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: None + }, + encoded, + // 4000000000 for transfer + 4000 for XCM + // 1-1 to fee + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + Relay::execute_with(|| { + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(&derived) == 0); + }); +} + +#[test] +fn transact_through_signed_multilocation_custom_fee_and_weight() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + ParaA::execute_with(|| { + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the relay will see instead of us + descend_origin_multilocation + .reanchor(&MultiLocation::parent(), ancestry.interior) + .unwrap(); + + let derived = xcm_builder::Account32Hash::< + relay_chain::KusamaNetwork, + relay_chain::AccountId, + >::convert_ref(descend_origin_multilocation) + .unwrap(); + + Relay::execute_with(|| { + // free execution, full amount received + assert_ok!(RelayBalances::transfer( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + derived.clone(), + 4000004100u128, + )); + // derived account has all funds + assert!(RelayBalances::free_balance(&derived) == 4000004100); + // sovereign account has 0 funds + assert!(RelayBalances::free_balance(¶_a_account()) == 0); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = ::PalletInfo::index::< + relay_chain::Balances, + >() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + // 100 to sovereign + dest: para_a_account(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + let total_weight = 4000004000u64; + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(MultiLocation::parent())), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: Some(total_weight as u128) + }, + encoded, + // 4000000000 for transfer + 4000 for XCM + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: Some(total_weight.into()) + } + )); + }); + + Relay::execute_with(|| { + assert!(RelayBalances::free_balance(¶_a_account()) == 100); + + assert!(RelayBalances::free_balance(&derived) == 0); + }); +} + +#[test] +fn transact_through_signed_multilocation_para_to_para() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + let para_b_location = MultiLocation::new(1, X1(Parachain(2))); + + let para_b_balances = MultiLocation::new(1, X2(Parachain(2), PalletInstance(1u8))); + + ParaA::execute_with(|| { + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + // ParaB + Box::new(xcm::VersionedMultiLocation::V3(para_b_location.clone())), + // Para charges 1000 for every instruction, and we have 3, so 3 + 3.into(), + 20000000000.into(), + // 4 instructions in transact through signed + Some(4.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(para_b_balances.clone())), + parachain::ParaTokensPerSecond::get().1 as u128, + )); + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the paraB will see instead of us + descend_origin_multilocation + .reanchor(¶_b_location, ancestry.interior) + .unwrap(); + + let derived = HashedDescriptionDescribeFamilyAllTerminal::::convert_ref( + descend_origin_multilocation, + ) + .unwrap(); + + ParaB::execute_with(|| { + // free execution, full amount received + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + derived.clone(), + 4000000104u128, + )); + // derived account has all funds + assert!(ParaBalances::free_balance(&derived) == 4000000104); + // sovereign account has 0 funds + assert!(ParaBalances::free_balance(¶_a_account_20()) == 0); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = + ::PalletInfo::index::() + .unwrap() as u8; + + encoded.push(index); + + // Then call bytes + let mut call_bytes = pallet_balances::Call::::transfer { + // 100 to sovereign + dest: para_a_account_20(), + value: 100u32.into(), + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(para_b_location)), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + para_b_balances + ))), + fee_amount: None + }, + encoded, + // 4000000000 for transfer + 4000 for XCM + // 1-1 to fee + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + ParaB::execute_with(|| { + assert!(ParaBalances::free_balance(&derived) == 0); + + assert!(ParaBalances::free_balance(¶_a_account_20()) == 100); + }); +} + +#[test] +fn transact_through_signed_multilocation_para_to_para_ethereum() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + let para_b_location = MultiLocation::new(1, X1(Parachain(2))); + + let para_b_balances = MultiLocation::new(1, X2(Parachain(2), PalletInstance(1u8))); + + ParaA::execute_with(|| { + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + // ParaB + Box::new(xcm::VersionedMultiLocation::V3(para_b_location.clone())), + // Para charges 1000 for every instruction, and we have 3, so 3 + 3.into(), + 20000000000.into(), + // 4 instructions in transact through signed + Some(4.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(para_b_balances.clone())), + parachain::ParaTokensPerSecond::get().1 as u128, + )); + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the paraB will see instead of us + descend_origin_multilocation + .reanchor(¶_b_location, ancestry.interior) + .unwrap(); + + let derived = HashedDescriptionDescribeFamilyAllTerminal::::convert_ref( + descend_origin_multilocation, + ) + .unwrap(); + + let mut parachain_b_alice_balances_before = 0; + ParaB::execute_with(|| { + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + derived.clone(), + 4000000104u128, + )); + // derived account has all funds + assert!(ParaBalances::free_balance(&derived) == 4000000104); + // sovereign account has 0 funds + assert!(ParaBalances::free_balance(¶_a_account_20()) == 0); + + parachain_b_alice_balances_before = ParaBalances::free_balance(&PARAALICE.into()) + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = + ::PalletInfo::index::() + .unwrap() as u8; + + encoded.push(index); + + use sp_core::U256; + // Let's do a EVM transfer + let eth_tx = + xcm_primitives::EthereumXcmTransaction::V1(xcm_primitives::EthereumXcmTransactionV1 { + gas_limit: U256::from(21000), + fee_payment: xcm_primitives::EthereumXcmFee::Auto, + action: pallet_ethereum::TransactionAction::Call(PARAALICE.into()), + value: U256::from(100), + input: BoundedVec::< + u8, + ConstU32<{ xcm_primitives::MAX_ETHEREUM_XCM_INPUT_SIZE }> + >::try_from(vec![]).unwrap(), + access_list: None, + }); + + // Then call bytes + let mut call_bytes = pallet_ethereum_xcm::Call::::transact { + xcm_transaction: eth_tx, + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(para_b_location)), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + para_b_balances + ))), + fee_amount: None + }, + encoded, + // 4000000000 for transfer + 4000 for XCM + // 1-1 to fee + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + ParaB::execute_with(|| { + // Make sure the EVM transfer went through + assert!( + ParaBalances::free_balance(&PARAALICE.into()) + == parachain_b_alice_balances_before + 100 + ); + }); +} + +#[test] +fn transact_through_signed_multilocation_para_to_para_ethereum_no_proxy_fails() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + let para_b_location = MultiLocation::new(1, X1(Parachain(2))); + + let para_b_balances = MultiLocation::new(1, X2(Parachain(2), PalletInstance(1u8))); + + ParaA::execute_with(|| { + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + // ParaB + Box::new(xcm::VersionedMultiLocation::V3(para_b_location.clone())), + // Para charges 1000 for every instruction, and we have 3, so 3 + 3.into(), + 20000000000.into(), + // 4 instructions in transact through signed + Some(4.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(para_b_balances.clone())), + parachain::ParaTokensPerSecond::get().1 as u128, + )); + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the paraB will see instead of us + descend_origin_multilocation + .reanchor(¶_b_location, ancestry.interior) + .unwrap(); + + let derived = HashedDescriptionDescribeFamilyAllTerminal::::convert_ref( + descend_origin_multilocation, + ) + .unwrap(); + + let mut parachain_b_alice_balances_before = 0; + ParaB::execute_with(|| { + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + derived.clone(), + 4000000104u128, + )); + // derived account has all funds + assert!(ParaBalances::free_balance(&derived) == 4000000104); + // sovereign account has 0 funds + assert!(ParaBalances::free_balance(¶_a_account_20()) == 0); + + parachain_b_alice_balances_before = ParaBalances::free_balance(&PARAALICE.into()) + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = + ::PalletInfo::index::() + .unwrap() as u8; + + encoded.push(index); + + use sp_core::U256; + // Let's do a EVM transfer + let eth_tx = + xcm_primitives::EthereumXcmTransaction::V1(xcm_primitives::EthereumXcmTransactionV1 { + gas_limit: U256::from(21000), + fee_payment: xcm_primitives::EthereumXcmFee::Auto, + action: pallet_ethereum::TransactionAction::Call(PARAALICE.into()), + value: U256::from(100), + input: BoundedVec::< + u8, + ConstU32<{ xcm_primitives::MAX_ETHEREUM_XCM_INPUT_SIZE }> + >::try_from(vec![]).unwrap(), + access_list: None, + }); + + // Then call bytes + let mut call_bytes = pallet_ethereum_xcm::Call::::transact_through_proxy { + transact_as: PARAALICE.into(), + xcm_transaction: eth_tx, + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(para_b_location)), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + para_b_balances + ))), + fee_amount: None + }, + encoded, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + ParaB::execute_with(|| { + // Make sure the EVM transfer wasn't executed + assert!(ParaBalances::free_balance(&PARAALICE.into()) == parachain_b_alice_balances_before); + }); +} + +#[test] +fn transact_through_signed_multilocation_para_to_para_ethereum_proxy_succeeds() { + MockNet::reset(); + let mut ancestry = MultiLocation::parent(); + + let para_b_location = MultiLocation::new(1, X1(Parachain(2))); + + let para_b_balances = MultiLocation::new(1, X2(Parachain(2), PalletInstance(1u8))); + + ParaA::execute_with(|| { + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + parachain::RuntimeOrigin::root(), + // ParaB + Box::new(xcm::VersionedMultiLocation::V3(para_b_location.clone())), + // Para charges 1000 for every instruction, and we have 3, so 3 + 3.into(), + 20000000000.into(), + // 4 instructions in transact through signed + Some(4.into()) + )); + // Root can set transact info + assert_ok!(XcmTransactor::set_fee_per_second( + parachain::RuntimeOrigin::root(), + Box::new(xcm::VersionedMultiLocation::V3(para_b_balances.clone())), + parachain::ParaTokensPerSecond::get().1 as u128, + )); + ancestry = parachain::UniversalLocation::get().into(); + }); + + // Let's construct the Junction that we will append with DescendOrigin + let signed_origin: Junctions = X1(AccountKey20 { + network: None, + key: PARAALICE, + }); + + let mut descend_origin_multilocation = parachain::SelfLocation::get(); + descend_origin_multilocation + .append_with(signed_origin) + .unwrap(); + + // To convert it to what the paraB will see instead of us + descend_origin_multilocation + .reanchor(¶_b_location, ancestry.interior) + .unwrap(); + + let derived = HashedDescriptionDescribeFamilyAllTerminal::::convert_ref( + descend_origin_multilocation, + ) + .unwrap(); + + let transfer_recipient = evm_account(); + let mut transfer_recipient_balance_before = 0; + ParaB::execute_with(|| { + assert_ok!(ParaBalances::transfer( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + derived.clone(), + 4000000104u128, + )); + // derived account has all funds + assert!(ParaBalances::free_balance(&derived) == 4000000104); + // sovereign account has 0 funds + assert!(ParaBalances::free_balance(¶_a_account_20()) == 0); + + transfer_recipient_balance_before = ParaBalances::free_balance(&transfer_recipient.into()); + + // Add proxy ALICE -> derived + let _ = parachain::Proxy::add_proxy_delegate( + &PARAALICE.into(), + derived, + parachain::ProxyType::Any, + 0, + ); + }); + + // Encode the call. Balances transact to para_a_account + // First index + let mut encoded: Vec = Vec::new(); + let index = + ::PalletInfo::index::() + .unwrap() as u8; + + encoded.push(index); + + use sp_core::U256; + // Let's do a EVM transfer + let eth_tx = + xcm_primitives::EthereumXcmTransaction::V2(xcm_primitives::EthereumXcmTransactionV2 { + gas_limit: U256::from(21000), + action: pallet_ethereum::TransactionAction::Call(transfer_recipient.into()), + value: U256::from(100), + input: BoundedVec::< + u8, + ConstU32<{ xcm_primitives::MAX_ETHEREUM_XCM_INPUT_SIZE }> + >::try_from(vec![]).unwrap(), + access_list: None, + }); + + // Then call bytes + let mut call_bytes = pallet_ethereum_xcm::Call::::transact_through_proxy { + transact_as: PARAALICE.into(), + xcm_transaction: eth_tx, + } + .encode(); + encoded.append(&mut call_bytes); + + ParaA::execute_with(|| { + assert_ok!(XcmTransactor::transact_through_signed( + parachain::RuntimeOrigin::signed(PARAALICE.into()), + Box::new(xcm::VersionedMultiLocation::V3(para_b_location)), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + para_b_balances + ))), + fee_amount: None + }, + encoded, + TransactWeights { + transact_required_weight_at_most: 4000000000.into(), + overall_weight: None + } + )); + }); + + ParaB::execute_with(|| { + // Make sure the EVM transfer was executed + assert!( + ParaBalances::free_balance(&transfer_recipient.into()) + == transfer_recipient_balance_before + 100 + ); + }); +} + +#[test] +fn hrmp_init_accept_through_root() { + MockNet::reset(); + + Relay::execute_with(|| { + assert_ok!(RelayBalances::transfer( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + para_a_account(), + 1000u128 + )); + assert_ok!(RelayBalances::transfer( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + para_b_account(), + 1000u128 + )); + }); + + ParaA::execute_with(|| { + let total_fee = 1_000u128; + let total_weight: u64 = 1_000_000_000; + let tx_weight: u64 = 500_000_000; + // Root can send hrmp init channel + assert_ok!(XcmTransactor::hrmp_manage( + parachain::RuntimeOrigin::root(), + HrmpOperation::InitOpen(HrmpInitParams { + para_id: 2u32.into(), + proposed_max_capacity: 1, + proposed_max_message_size: 1 + }), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: Some(total_fee) + }, + TransactWeights { + transact_required_weight_at_most: tx_weight.into(), + overall_weight: Some(total_weight.into()) + } + )); + }); + Relay::execute_with(|| { + let expected_event: relay_chain::RuntimeEvent = + polkadot_runtime_parachains::hrmp::Event::OpenChannelRequested( + 1u32.into(), + 2u32.into(), + 1u32, + 1u32, + ) + .into(); + assert!(relay_chain::relay_events().contains(&expected_event)); + }); + ParaB::execute_with(|| { + let total_fee = 1_000u128; + let total_weight: u64 = 1_000_000_000; + let tx_weight: u64 = 500_000_000; + // Root can send hrmp init channel + assert_ok!(XcmTransactor::hrmp_manage( + parachain::RuntimeOrigin::root(), + HrmpOperation::Accept { + para_id: 1u32.into() + }, + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: Some(total_fee) + }, + TransactWeights { + transact_required_weight_at_most: tx_weight.into(), + overall_weight: Some(total_weight.into()) + } + )); + }); + + Relay::execute_with(|| { + let expected_event: relay_chain::RuntimeEvent = + polkadot_runtime_parachains::hrmp::Event::OpenChannelAccepted(1u32.into(), 2u32.into()) + .into(); + assert!(relay_chain::relay_events().contains(&expected_event)); + }); +} + +#[test] +fn hrmp_close_works() { + MockNet::reset(); + + Relay::execute_with(|| { + assert_ok!(RelayBalances::transfer( + relay_chain::RuntimeOrigin::signed(RELAYALICE), + para_a_account(), + 1000u128 + )); + assert_ok!(Hrmp::force_open_hrmp_channel( + relay_chain::RuntimeOrigin::root(), + 1u32.into(), + 2u32.into(), + 1u32, + 1u32 + )); + assert_ok!(Hrmp::force_process_hrmp_open( + relay_chain::RuntimeOrigin::root(), + 0u32 + )); + }); + + ParaA::execute_with(|| { + let total_fee = 1_000u128; + let total_weight: u64 = 1_000_000_000; + let tx_weight: u64 = 500_000_000; + // Root can send hrmp close + assert_ok!(XcmTransactor::hrmp_manage( + parachain::RuntimeOrigin::root(), + HrmpOperation::Close(HrmpChannelId { + sender: 1u32.into(), + recipient: 2u32.into() + }), + CurrencyPayment { + currency: Currency::AsMultiLocation(Box::new(xcm::VersionedMultiLocation::V3( + MultiLocation::parent() + ))), + fee_amount: Some(total_fee) + }, + TransactWeights { + transact_required_weight_at_most: tx_weight.into(), + overall_weight: Some(total_weight.into()) + } + )); + }); + Relay::execute_with(|| { + let expected_event: relay_chain::RuntimeEvent = + polkadot_runtime_parachains::hrmp::Event::ChannelClosed( + 1u32.into(), + HrmpChannelId { + sender: 1u32.into(), + recipient: 2u32.into(), + }, + ) + .into(); + assert!(relay_chain::relay_events().contains(&expected_event)); + }); +} + +use parity_scale_codec::{Decode, Encode}; +use sp_io::hashing::blake2_256; + +// Helper to derive accountIds +pub fn derivative_account_id(who: sp_runtime::AccountId32, index: u16) -> sp_runtime::AccountId32 { + let entropy = (b"modlpy/utilisuba", who, index).using_encoded(blake2_256); + sp_runtime::AccountId32::decode(&mut &entropy[..]).expect("valid account id") +} diff --git a/tracing/2402/rust-toolchain b/tracing/2402/rust-toolchain new file mode 100644 index 0000000..9d6a572 --- /dev/null +++ b/tracing/2402/rust-toolchain @@ -0,0 +1,5 @@ +[toolchain] +channel = "1.69.0" +components = [ "rustfmt", "clippy" ] +targets = [ "wasm32-unknown-unknown" ] +profile = "minimal" diff --git a/wasm/moonbase-runtime-2402-substitute-tracing.wasm b/wasm/moonbase-runtime-2402-substitute-tracing.wasm new file mode 100644 index 0000000000000000000000000000000000000000..3eb3624b8fe5bafb7b750be539805ed43488ce38 GIT binary patch literal 1667577 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�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

Wg>25~BlBUz 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

-Rew|mHGbh3?3L!;A>jYpL@K}ZSN%E5>?zimH& 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

m<^;tKIK7Nix2(^+Qu#S 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

SC9}UV75?A2(C%|&g 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�a(60mJELJ?}K?0 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

HXtse$2fxkq%7 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 N3IP#82YP-L3^Kz(L_fud}XT)wVkKclInbJ09T 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

jfDiMO2>zPQ6C=kjt?ANgS76 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%0A!3ScF_|g(_p6s3<&2{ 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 m3jQqmU*$L3Grb>207`GK(1`B#TWW)5e4 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
pBlNG$)n7;{n~Ui#d5$|}Znd15{z(Ui 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

mC35!^OTCVEz&YgKYxBepP5l-`mr)iq9Q|9 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

b`TAsgAW>%;zW0y5<=-zYYjHe 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 Qf0jG$R&08}EwTBySo^TO8(N>95g2ZE+ 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 literal 0 HcmV?d00001 diff --git a/wasm/moonbeam-runtime-2402-substitute-tracing.wasm b/wasm/moonbeam-runtime-2402-substitute-tracing.wasm new file mode 100644 index 0000000000000000000000000000000000000000..16554b149c54b5a1bea6d626f9b4698e9cd2fa5f GIT binary patch literal 1654682 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ς`b3g~AmXX{t$NU|ec2cF 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

-_EY?9)F)kZ3* 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⪼??k18B{`^$ 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

nSRn5Ib=_t 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

MqV#FIP*`Hfoji~mrcI7`xF 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

bbb&)5F_-!2v^i}M7Ubair6)MHAqNE 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