diff --git a/Cargo.lock b/Cargo.lock index c844baee1fe7..78bc9573d6ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3237,6 +3237,7 @@ dependencies = [ "parity-scale-codec", "polkadot-primitives", "polkadot-runtime-common", + "polkadot-runtime-parachains", "rustc-hex", "separator", "serde", @@ -3263,6 +3264,9 @@ dependencies = [ "static_assertions", "substrate-wasm-builder", "tiny-keccak", + "xcm", + "xcm-builder", + "xcm-executor", ] [[package]] @@ -11277,6 +11281,7 @@ dependencies = [ "pallet-authorship", "pallet-babe", "pallet-balances", + "pallet-beefy", "pallet-collective", "pallet-democracy", "pallet-election-provider-multi-phase", @@ -11286,6 +11291,7 @@ dependencies = [ "pallet-im-online", "pallet-indices", "pallet-membership", + "pallet-mmr", "pallet-mmr-primitives", "pallet-multisig", "pallet-nicks", @@ -11337,6 +11343,9 @@ dependencies = [ "static_assertions", "substrate-wasm-builder", "tiny-keccak", + "xcm", + "xcm-builder", + "xcm-executor", ] [[package]] diff --git a/node/service/src/chain_spec.rs b/node/service/src/chain_spec.rs index 905238b2398b..765bc2f387cc 100644 --- a/node/service/src/chain_spec.rs +++ b/node/service/src/chain_spec.rs @@ -22,23 +22,23 @@ use babe_primitives::AuthorityId as BabeId; use beefy_primitives::ecdsa::AuthorityId as BeefyId; use grandpa::AuthorityId as GrandpaId; use hex_literal::hex; -use kusama::constants::currency::DOTS as KSM; use kusama_runtime as kusama; +use kusama_runtime::constants::currency::UNITS as KSM; use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use pallet_staking::Forcing; -use polkadot::constants::currency::DOTS; +use polkadot::constants::currency::UNITS as DOT; use polkadot_node_primitives::MAX_POV_SIZE; use polkadot_primitives::v1::{AccountId, AccountPublic, AssignmentId, ValidatorId}; use polkadot_runtime as polkadot; use rococo_runtime as rococo; -use rococo_runtime::constants::currency::DOTS as ROC; +use rococo_runtime::constants::currency::UNITS as ROC; use sc_chain_spec::{ChainSpecExtension, ChainType}; use serde::{Deserialize, Serialize}; use sp_core::{crypto::UncheckedInto, sr25519, Pair, Public}; use sp_runtime::{traits::IdentifyAccount, Perbill}; use telemetry::TelemetryEndpoints; -use westend::constants::currency::DOTS as WND; use westend_runtime as westend; +use westend_runtime::constants::currency::UNITS as WND; const POLKADOT_STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; const KUSAMA_STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; @@ -160,6 +160,7 @@ fn westend_session_keys( para_validator: ValidatorId, para_assignment: AssignmentId, authority_discovery: AuthorityDiscoveryId, + beefy: BeefyId, ) -> westend::SessionKeys { westend::SessionKeys { babe, @@ -168,6 +169,7 @@ fn westend_session_keys( para_validator, para_assignment, authority_discovery, + beefy, } } @@ -206,8 +208,8 @@ fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::Gene AuthorityDiscoveryId, )> = vec![]; - const ENDOWMENT: u128 = 1_000_000 * DOTS; - const STASH: u128 = 100 * DOTS; + const ENDOWMENT: u128 = 1_000_000 * DOT; + const STASH: u128 = 100 * DOT; polkadot::GenesisConfig { frame_system: polkadot::SystemConfig { @@ -290,15 +292,10 @@ fn polkadot_staging_testnet_config_genesis(wasm_binary: &[u8]) -> polkadot::Gene fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { // subkey inspect "$SECRET" let endowed_accounts = vec![ - // 5ENpP27BrVdJTdUfY6djmcw3d3xEJ6NzSUU52CCPmGpMrdEY - hex!["6648d7f3382690650c681aba1b993cd11e54deb4df21a3a18c3e2177de9f7342"].into(), + // 5DaVh5WRfazkGaKhx1jUu6hjz7EmRe4dtW6PKeVLim84KLe8 + hex!["42f4a4b3e0a89c835ee696205caa90dd85c8ea1d7364b646328ee919a6b2fc1e"].into(), ]; - - // for i in 1 2 3 4; do for j in stash controller; do subkey inspect "$SECRET//$i//$j"; done; done - // for i in 1 2 3 4; do for j in babe; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done - // for i in 1 2 3 4; do for j in grandpa; do subkey --ed25519 inspect "$SECRET//$i//$j"; done; done - // for i in 1 2 3 4; do for j in im_online; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done - // for i in 1 2 3 4; do for j in para_validator para_assignment; do subkey --sr25519 inspect "$SECRET//$i//$j"; done; done + // SECRET='...' ./scripts/prepare-test-net.sh 4 let initial_authorities: Vec<( AccountId, AccountId, @@ -308,81 +305,87 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi ValidatorId, AssignmentId, AuthorityDiscoveryId, - )> = vec![ - ( - //5FZoQhgUCmqBxnkHX7jCqThScS2xQWiwiF61msg63CFL3Y8f - hex!["9ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d"].into(), - //5ExdKyXFhtrjiFhexnyQPDyGSP8xU9qHc4KDwVrtWxaP2RP6 - hex!["8011fb3641f0641f5570ba8787a64a0ff7d9c9999481f333d7207c4abd7e981c"].into(), - //5Ef8qY8LRV6RFd4bThrwxBhhWfLjzqmd4rK8nX3Xs7zJqqp7 - hex!["72bae70a1398c0ba52f815cc5dfbc9ec5c013771e541ae28e05d1129243e3001"].unchecked_into(), - //5FSscBiPfaPaEhFbAt2qRhcYjryKBKf714X76F5nFfwtdXLa - hex!["959cebf18fecb305b96fd998c95f850145f52cbbb64b3ef937c0575cc7ebd652"].unchecked_into(), - //5CMC5eE4XvPLVTv8e4miXTvfMDEj1gGofT9ymAybwTZWU4Uu - hex!["0c92ef9543bd3d8ce7e31356ec19d1f539beb3bed293b056bfbe77c2627c1944"].unchecked_into(), - //5FRidgyc13cnzVZrav9gCamgdwoiy34er9ea6Hhk8wSzGnLQ - hex!["94bb7784e5d7f4e03f474d76bd00563b05968ba1c8a842f3f45c531cfe389329"].unchecked_into(), - //5CFHEhVjscbquPvaPmrH4yUxGfxC9xq2bDYJAK6ccQzMVZQb - hex!["0810d2113438bb14856b06383a4f0da4e5cc2f92a3fc18ef03a54b34c6007662"].unchecked_into(), - //5CkAdj1MpkMtQikrGXuzgzrRLvUnfLQH2JsnZa16u4cK2Xhf - hex!["1e18b5a9f872727189934a6988ff2a6732c87b9e31e2d694dd011aff9dfb2332"].unchecked_into(), - ), - ( - //5G1ojzh47Yt8KoYhuAjXpHcazvsoCXe3G8LZchKDvumozJJJ - hex!["aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934"].into(), - //5GeoZ1Mzix6Xnj32X8Xpj7q89X1SQHU5XTK1cnUVNXKTvXdK - hex!["caf27345aebc2fefeca85c9a67f4859eab3178d28ef92244714402290f3f415a"].into(), - //5Et8y49AyE7ncVKiSRgzN6zbqbYtMK6y7kKuUaS8YqvfLBD9 - hex!["7ca58770eb41c1a68ef77e92255e4635fc11f665cb89aee469e920511c48343a"].unchecked_into(), - //5Hpn3HVViECsuxMDFtinWjRj2dNfpRp1kB24nZHvQCJsSUek - hex!["feca0be2c87141f6074b221c919c0161a1c468d9173c5c1be59b68fab9a0ff93"].unchecked_into(), - //5HHHSvewgWiwEBX5BWeeeYBXTn5qNDZSsbk1WvWGum1ohp3t - hex!["e6c53033eabfad2f519eecfcb01e89cf86b014d0b9c2fad93d84fb59d759115f"].unchecked_into(), - //5GjwEr3FMP9hWd3WSrLccfCna7xEKnQhShp15F4UGGyB7X2j - hex!["cedc8dbcba3c51aab26a043306366c28791533df33b6d92b822b626939cf2217"].unchecked_into(), - //5Gv7xHsEeAivjxH4tniXQ3MonKBRWs88xEgHAWym2XzZxb5n - hex!["d6a113804a98728bb2af4f3721ab31a3644731292bffe0268995d8f8fb073b57"].unchecked_into(), - //5DUrcztb1pRz6DfA8Vo8JSUSpoQVr27Yo6gjPmnumhhubLeN - hex!["3ea7a06009d1b9b1d4233dea3e6bb6494b9aeda91edc443629a28afa9fab8c62"].unchecked_into(), - ), - ( - //5HYYWyhyUQ7Ae11f8fCid58bhJ7ikLHM9bU8A6Ynwoc3dStR - hex!["f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836"].into(), - //5DnUXT3xiQn6ZRttFT6eSCJbT9P2tiLdexr5WsvnbLG8igqW - hex!["4c17a9bfdd19411f452fa32420fa7acab622e87e57351f4ba3248ae40ce75123"].into(), - //5EhnN1SumSv5KxwLAdwE8ugJaw1S8xARZb8V2BMYCKaD7ure - hex!["74bfb70627416e6e6c4785e928ced384c6c06e5c8dd173a094bc3118da7b673e"].unchecked_into(), - //5Hmvd2qjb1zatrJTkPwgFicxPfZuwaTwa2L7adSRmz6mVxfb - hex!["fc9d33059580a69454179ffa41cbae6de2bc8d2bd2c3f1d018fe5484a5a91956"].unchecked_into(), - //5G1YwfKpir3fW3C4pHk1c8MX2XYpo1mQaTDxkpxyu8cQthEg - hex!["ae8930d06f23b0f0e1f31717f12b9f31e7150ceb735b22e35ad86fd94e10125f"].unchecked_into(), - //5GF6xvz37CmPyRsNgpQMFjBDv3crmh2rVRtxkASR8YWNJSKy - hex!["b8df2d1ea3d352cb818868c71e21c06e7929b3c7fda62bb93f2cff9152efc844"].unchecked_into(), - //5CPYVGRq4Gbntijd9FyoGX9QYVKXdeen4K9sFb8v3SuYoRWx - hex!["0e5e1fb2c0fa7db11cd83fef3493900292badf02f35812ba738efeab9978a46c"].unchecked_into(), - //5GvKehGrFVea8rywSeJhTopmpBDNHSFBoZp32g3CecppYa3V - hex!["d6c8735316211321cd85ccd7c583222ab024393b8c86c7c8d1192a1d4f35bb2e"].unchecked_into(), - ), - ( - //5CFPcUJgYgWryPaV1aYjSbTpbTLu42V32Ytw1L9rfoMAsfGh - hex!["08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d"].into(), - //5F6z64cYZFRAmyMUhp7rnge6jaZmbY6o7XfA9czJyuAUiaFD - hex!["8671d451c3d4f6de8c16ea0bc61cf714914d6b2ffa2899872620525419327478"].into(), - //5Ft7o2uqDq5pXCK4g5wR94BctmtLEzCBy5MvPqRa8753ZemD - hex!["a8ddd0891e14725841cd1b5581d23806a97f41c28a25436db6473c86e15dcd4f"].unchecked_into(), - //5FgBijJLL6p7nDZgQed56L3BM7ovgwc4t4FYsv9apYtRGAGv - hex!["9fc415cce1d0b2eed702c9e05f476217d23b46a8723fd56f08cddad650be7c2d"].unchecked_into(), - //5DwPxYdY9FcNjMPptwrcGeeu1jbpWYwCdGc8cvjQNkY7nE8m - hex!["52e57f2e1451ced7431c810cb4c3ad532ac4a37aeb9303f9a4a34d77a05aa269"].unchecked_into(), - //5Ew1qAPRe3oGVynud5eDg2aXdJUtV3Wy16MWfjzbqv9cnLbe - hex!["7ed73e3c97c7cf6a24d074e49d4ad750ecb2ed28886398a1b2916142c2bf5f62"].unchecked_into(), - //5GVzBxaAf7au8VKnsKFNvFvzamdqbnuzXUxDfp5xkFivfqKv - hex!["c4390ca0274f0262a4ef7cd4d3aa6cab0875a6efdd40d38c21be4f770b6c4b1a"].unchecked_into(), - //5CZd519gfE3gALMtFWa283VHikXwoGFmT92B3Nu3iN7YGcaR - hex!["160e0049b62d368c59d286275697e8d5e68d34ee8663ac4c3da646b0abb4a86f"].unchecked_into(), - ), - - ]; + BeefyId, + )> = vec![( + //5ERCqy118nnXDai8g4t3MjdX7ZC5PrQzQpe9vwex5cELWqbt + hex!["681af4f93073484e1acd6b27395d0d258f1a6b158c808846c8fd05ee2435056e"].into(), + //5GTS114cfQNBgpQULhMaNCPXGds6NokegCnikxDe1vqANhtn + hex!["c2463372598ebabd21ee5bc33e1d7e77f391d2df29ce2fbe6bed0d13be629a45"].into(), + //5FhGbceKeH7fuGogcBwd28ZCkAwDGYBADCTeHiYrvx2ztyRd + hex!["a097bfc6a33499ed843b711f52f523f8a7174f798a9f98620e52f4170dbe2948"].unchecked_into(), + //5Es7nDkJt2by5qVCCD7PZJdp76KJw1LdRCiNst5S5f4eecnz + hex!["7bde49dda82c2c9f082b807ef3ceebff96437d67b3e630c584db7a220ecafacf"].unchecked_into(), + //5D4e8zRjaYzFamqChGPPtu26PcKbKgUrhb7WqcNbKa2RDFUR + hex!["2c2fb730a7d9138e6d62fcf516f9ecc2d712af3f2f03ca330c9564b8c0c1bb33"].unchecked_into(), + //5DD3JY5ENkjcgVFbVSgUbZv7WmrnyJ8bxxu56ee6hZFiRdnh + hex!["3297a8622988cc23dd9c131e3fb8746d49e007f6e58a81d43420cd539e250e4c"].unchecked_into(), + //5Gpodowhud8FG9xENXR5YwTFbUAWyoEtw7sYFytFsG4z7SU6 + hex!["d2932edf775088bd088dc5a112ad867c24cc95858f77f8a1ab014de8d4f96a3f"].unchecked_into(), + //5GUMj8tnjL3PJZgXoiWtgLCaMVNHBNeSeTqDsvcxmaVAjKn9 + hex!["c2fb0f74591a00555a292bc4882d3158bafc4c632124cb60681f164ef81bcf72"].unchecked_into(), + //5D2gFBzbCNpxTkcqfan1Ra5rmpXDitvd3bHRzbWxvogMJjre + hex!["02b123c1695d142ac36d462ca131e0b9c4564ac8ef2726c0d36231d4d690541aa5"].unchecked_into(), + ), + ( + //5HgDCznTkHKUjzPkQoTZGWbvbyqB7sqHDBPDKdF1FyVYM7Er + hex!["f8418f189f84814fd40cc1b2e90873e72ea789487f3b98ed42811ba76d10fc37"].into(), + //5GQTryeFwuvgmZ2tH5ZeAKZHRM9ch5WGVGo6ND9P8f9uMsNY + hex!["c002bb4af4a1bd2f33d104aef8a41878fe1ac94ba007029c4dfdefa8b698d043"].into(), + //5C7YkWSVH1zrpsE5KwW1ua1qatyphzYxiZrL24mjkxz7mUbn + hex!["022b14fbcf65a93b81f453105b9892c3fc4aa74c22c53b4abab019e1d58fbd41"].unchecked_into(), + //5GwFC6Tmg4fhj4PxSqHycgJxi3PDfnC9RGDsNHoRwAvXvpnZ + hex!["d77cafd3b32c8b52b0e2780a586a6e527c94f1bdec117c4e4acb0a491461ffa3"].unchecked_into(), + //5DSVrGURuDuh8Luzo8FYq7o2NWiUSLSN6QAVNrj9BtswWH6R + hex!["3cdb36a5a14715999faffd06c5b9e5dcdc24d4b46bc3e4df1aaad266112a7b49"].unchecked_into(), + //5DLEG2AupawCXGwhJtrzBRc3zAhuP8V662dDrUTzAsCiB9Ec + hex!["38134245c9919ecb20bf2eedbe943b69ba92ceb9eb5477b92b0afd3cb6ce2858"].unchecked_into(), + //5D83o9fDgnHxaKPkSx59hk8zYzqcgzN2mrf7cp8fiVEi7V4E + hex!["2ec917690dc1d676002e3504c530b2595490aa5a4603d9cc579b9485b8d0d854"].unchecked_into(), + //5DwBJquZgncRWXFxj2ydbF8LBUPPUbiq86sXWXgm8Z38m8L2 + hex!["52bae9b8dedb8058dda93ec6f57d7e5a517c4c9f002a4636fada70fed0acf376"].unchecked_into(), + //5HXjJatAFhjC2PZdDuWZjtd8BzWdeXMM2TxQCurByaT1RZ15 + hex!["02c249407413bac607f885f17d9110111ca76395883c68b2773aea13eeefe1a9af"].unchecked_into(), + ), + ( + //5DMHpkRpQV7NWJFfn2zQxCLiAKv7R12PWFRPHKKk5X3JkYfP + hex!["38e280b35d08db46019a210a944e4b7177665232ab679df12d6a8bbb317a2276"].into(), + //5FbJpSHmFDe5FN3DVGe1R345ZePL9nhcC9V2Cczxo7q8q6rN + hex!["9c0bc0e2469924d718ae683737f818a47c46b0612376ecca06a2ac059fe1f870"].into(), + //5E5Pm3Udzxy26KGkLE5pc8JPfQrvkYHiaXWtuEfmQsBSgep9 + hex!["58fecadc2df8182a27e999e7e1fd7c99f8ec18f2a81f9a0db38b3653613f3f4d"].unchecked_into(), + //5FxcystSLHtaWoy2HEgRNerj9PrUs452B6AvHVnQZm5ZQmqE + hex!["ac4d0c5e8f8486de05135c10a707f58aa29126d5eb28fdaaba00f9a505f5249d"].unchecked_into(), + //5E7KqVXaVGuAqiqMigpuH8oXHLVh4tmijmpJABLYANpjMkem + hex!["5a781385a0235fe8594dd101ec55ef9ba01883f8563a0cdd37b89e0303f6a578"].unchecked_into(), + //5H9AybjkpyZ79yN5nHuBqs6RKuZPgM7aAVVvTQsDFovgXb2A + hex!["e09570f62a062450d4406b4eb43e7f775ff954e37606646cd590d1818189501f"].unchecked_into(), + //5Ccgs7VwJKBawMbwMENDmj2eFAxhFdGksVHdk8aTAf4w7xox + hex!["1864832dae34df30846d5cc65973f58a2d01b337d094b1284ec3466ecc90251d"].unchecked_into(), + //5EsSaZZ7niJs7hmAtp4QeK19AcAuTp7WXB7N7gRipVooerq4 + hex!["7c1d92535e6d94e21cffea6633a855a7e3c9684cd2f209e5ddbdeaf5111e395b"].unchecked_into(), + //5Gw2cEKF3XvYVwyWjXbv347hpkn7DEWfpKJhuFKbBZWEa8kv + hex!["021d79fcfa2696cbe13fa3a9f4360293d1defa8725324d7fd1fb73907584ce4fa3"].unchecked_into(), + ), + ( + //5Ea11qhmGRntQ7pyEkEydbwxvfrYwGMKW6rPERU4UiSBB6rd + hex!["6ed057d2c833c45629de2f14b9f6ce6df1edbf9421b7a638e1fb4828c2bd2651"].into(), + //5CZomCZwPB78BZMZsCiy7WSpkpHhdrN8QTSyjcK3FFEZHBor + hex!["1631ff446b3534d031adfc37b7f7aed26d2a6b3938d10496aab3345c54707429"].into(), + //5CSM6vppouFHzAVPkVFWN76DPRUG7B9qwJe892ccfSfJ8M5f + hex!["108188c43a7521e1abe737b343341c2179a3a89626c7b017c09a5b10df6f1c42"].unchecked_into(), + //5GwkG4std9KcjYi3ThSC7QWfhqokmYVvWEqTU9h7iswjhLnr + hex!["d7de8a43f7ee49fa3b3aaf32fb12617ec9ff7b246a46ab14e9c9d259261117fa"].unchecked_into(), + //5CoUk3wrCGJAWbiJEcsVjYhnd2JAHvR59jBRbSw77YrBtRL1 + hex!["209f680bc501f9b59358efe3636c51fd61238a8659bac146db909aea2595284b"].unchecked_into(), + //5EcSu96wprFM7G2HfJTjYu8kMParnYGznSUNTsoEKXywEsgG + hex!["70adf80395b3f59e4cab5d9da66d5a286a0b6e138652a06f72542e46912df922"].unchecked_into(), + //5Ge3sjpD43Cuy7rNoJQmE9WctgCn6Faw89Pe7xPs3i55eHwJ + hex!["ca5f6b970b373b303f64801a0c2cadc4fc05272c6047a2560a27d0c65589ca1d"].unchecked_into(), + //5EFcjHLvB2z5vd5g63n4gABmhzP5iPsKvTwd8sjfvTehNNrk + hex!["60cae7fa5a079d9fc8061d715fbcc35ef57c3b00005694c2badce22dcc5a9f1b"].unchecked_into(), + //5CfXn3rXE3vxT4oXZcwgKiap4hg457fajgqpGpwuf3MU7ApA + hex!["025f644b17a5be19cd8ecacadc86047a6212ce286f16b7775f12571c79934d3c04"].unchecked_into(), + )]; const ENDOWMENT: u128 = 1_000_000 * WND; const STASH: u128 = 100 * WND; @@ -399,6 +402,7 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) .collect(), }, + pallet_beefy: Default::default(), pallet_indices: westend::IndicesConfig { indices: vec![] }, pallet_session: westend::SessionConfig { keys: initial_authorities @@ -414,6 +418,7 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi x.5.clone(), x.6.clone(), x.7.clone(), + x.8.clone(), ), ) }) @@ -449,6 +454,7 @@ fn westend_staging_testnet_config_genesis(wasm_binary: &[u8]) -> westend::Genesi pallet_sudo: westend::SudoConfig { key: endowed_accounts[0].clone(), }, + parachains_configuration: Default::default(), } } @@ -650,6 +656,7 @@ fn kusama_staging_testnet_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisC }, pallet_vesting: kusama::VestingConfig { vesting: vec![] }, pallet_treasury: Default::default(), + parachains_configuration: Default::default(), } } @@ -1112,8 +1119,8 @@ pub fn polkadot_testnet_genesis( ) -> polkadot::GenesisConfig { let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); - const ENDOWMENT: u128 = 1_000_000 * DOTS; - const STASH: u128 = 100 * DOTS; + const ENDOWMENT: u128 = 1_000_000 * DOT; + const STASH: u128 = 100 * DOT; polkadot::GenesisConfig { frame_system: polkadot::SystemConfig { @@ -1287,6 +1294,7 @@ pub fn kusama_testnet_genesis( }, pallet_vesting: kusama::VestingConfig { vesting: vec![] }, pallet_treasury: Default::default(), + parachains_configuration: Default::default(), } } @@ -1302,14 +1310,15 @@ pub fn westend_testnet_genesis( ValidatorId, AssignmentId, AuthorityDiscoveryId, + BeefyId, )>, root_key: AccountId, endowed_accounts: Option>, ) -> westend::GenesisConfig { let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); - const ENDOWMENT: u128 = 1_000_000 * DOTS; - const STASH: u128 = 100 * DOTS; + const ENDOWMENT: u128 = 1_000_000 * DOT; + const STASH: u128 = 100 * DOT; westend::GenesisConfig { frame_system: westend::SystemConfig { @@ -1323,6 +1332,7 @@ pub fn westend_testnet_genesis( .map(|k| (k.clone(), ENDOWMENT)) .collect(), }, + pallet_beefy: Default::default(), pallet_session: westend::SessionConfig { keys: initial_authorities .iter() @@ -1337,6 +1347,7 @@ pub fn westend_testnet_genesis( x.5.clone(), x.6.clone(), x.7.clone(), + x.8.clone(), ), ) }) @@ -1370,6 +1381,7 @@ pub fn westend_testnet_genesis( pallet_authority_discovery: westend::AuthorityDiscoveryConfig { keys: vec![] }, pallet_vesting: westend::VestingConfig { vesting: vec![] }, pallet_sudo: westend::SudoConfig { key: root_key }, + parachains_configuration: Default::default(), } } @@ -1392,7 +1404,7 @@ pub fn rococo_testnet_genesis( ) -> rococo_runtime::GenesisConfig { let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); - const ENDOWMENT: u128 = 1_000_000 * DOTS; + const ENDOWMENT: u128 = 1_000_000 * DOT; rococo_runtime::GenesisConfig { frame_system: rococo_runtime::SystemConfig { @@ -1503,7 +1515,7 @@ fn kusama_development_config_genesis(wasm_binary: &[u8]) -> kusama::GenesisConfi fn westend_development_config_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { westend_testnet_genesis( wasm_binary, - vec![get_authority_keys_from_seed_no_beefy("Alice")], + vec![get_authority_keys_from_seed("Alice")], get_account_id_from_seed::("Alice"), None, ) @@ -1674,8 +1686,8 @@ fn westend_local_testnet_genesis(wasm_binary: &[u8]) -> westend::GenesisConfig { westend_testnet_genesis( wasm_binary, vec![ - get_authority_keys_from_seed_no_beefy("Alice"), - get_authority_keys_from_seed_no_beefy("Bob"), + get_authority_keys_from_seed("Alice"), + get_authority_keys_from_seed("Bob"), ], get_account_id_from_seed::("Alice"), None, diff --git a/runtime/kusama/Cargo.toml b/runtime/kusama/Cargo.toml index 1ba21b703d8b..8166e998eada 100644 --- a/runtime/kusama/Cargo.toml +++ b/runtime/kusama/Cargo.toml @@ -78,8 +78,13 @@ frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", b hex-literal = { version = "0.3.1", optional = true } runtime-common = { package = "polkadot-runtime-common", path = "../common", default-features = false } +runtime-parachains = { package = "polkadot-runtime-parachains", path = "../parachains", default-features = false } primitives = { package = "polkadot-primitives", path = "../../primitives", default-features = false } +xcm = { package = "xcm", path = "../../xcm", default-features = false } +xcm-executor = { package = "xcm-executor", path = "../../xcm/xcm-executor", default-features = false } +xcm-builder = { package = "xcm-builder", path = "../../xcm/xcm-builder", default-features = false } + [dev-dependencies] hex-literal = "0.3.1" libsecp256k1 = "0.3.5" @@ -154,10 +159,14 @@ std = [ "babe-primitives/std", "sp-session/std", "runtime-common/std", + "runtime-parachains/std", "frame-try-runtime/std", "sp-npos-elections/std", "beefy-primitives/std", "pallet-mmr-primitives/std", + "xcm/std", + "xcm-executor/std", + "xcm-builder/std", ] runtime-benchmarks = [ "runtime-common/runtime-benchmarks", @@ -191,6 +200,7 @@ runtime-benchmarks = [ "pallet-session-benchmarking", "frame-system-benchmarking", "hex-literal", + "xcm-builder/runtime-benchmarks", ] try-runtime = [ "frame-executive/try-runtime", diff --git a/runtime/kusama/src/constants.rs b/runtime/kusama/src/constants.rs index 13efedea0bed..e1e460f22b96 100644 --- a/runtime/kusama/src/constants.rs +++ b/runtime/kusama/src/constants.rs @@ -18,35 +18,28 @@ pub mod currency { use primitives::v0::Balance; - pub const DOTS: Balance = 1_000_000_000_000; - pub const DOLLARS: Balance = DOTS / 300; - pub const CENTS: Balance = DOLLARS / 100; + pub const UNITS: Balance = 1_000_000_000_000; + pub const CENTS: Balance = UNITS / 30_000; + pub const GRAND: Balance = CENTS * 100_000; pub const MILLICENTS: Balance = CENTS / 1_000; pub const fn deposit(items: u32, bytes: u32) -> Balance { - items as Balance * 20 * DOLLARS + (bytes as Balance) * 100 * MILLICENTS + items as Balance * 2_000 * CENTS + (bytes as Balance) * 100 * MILLICENTS } } /// Time and blocks. pub mod time { use primitives::v0::{Moment, BlockNumber}; - // Kusama & mainnet pub const MILLISECS_PER_BLOCK: Moment = 6000; - // Testnet -// pub const MILLISECS_PER_BLOCK: Moment = 1000; pub const SLOT_DURATION: Moment = MILLISECS_PER_BLOCK; - // Kusama pub const EPOCH_DURATION_IN_SLOTS: BlockNumber = 1 * HOURS; - // Mainnet -// pub const EPOCH_DURATION_IN_SLOTS: BlockNumber = 4 * HOURS; - // Testnet -// pub const EPOCH_DURATION_IN_SLOTS: BlockNumber = 10 * MINUTES; // These time units are defined in number of blocks. 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; // 1 in 4 blocks (on average, not counting collisions) will be primary babe blocks. pub const PRIMARY_PROBABILITY: (u64, u64) = (1, 4); @@ -92,20 +85,30 @@ pub mod fee { } } +/// Parachains-related. +pub mod paras { + /// Maximum parachain code blob size. + pub const MAX_CODE_SIZE: u32 = 10 * 1024 * 1024; + /// Maximum parachain head size. + pub const MAX_HEAD_SIZE: u32 = 20 * 1024; + /// Maximum PoV size. + pub const MAX_POV_SIZE: u32 = 5 * 1024 * 1024; +} + #[cfg(test)] mod tests { use frame_support::weights::WeightToFeePolynomial; use runtime_common::{MAXIMUM_BLOCK_WEIGHT, ExtrinsicBaseWeight}; use super::fee::WeightToFee; - use super::currency::{CENTS, DOLLARS, MILLICENTS}; + use super::currency::{CENTS, MILLICENTS}; #[test] // This function tests that the fee for `MAXIMUM_BLOCK_WEIGHT` of weight is correct fn full_block_fee_is_correct() { - // A full block should cost 16 DOLLARS + // A full block should cost 1,600 CENTS println!("Base: {}", ExtrinsicBaseWeight::get()); let x = WeightToFee::calc(&MAXIMUM_BLOCK_WEIGHT); - let y = 16 * DOLLARS; + let y = 16 * 100 * CENTS; assert!(x.max(y) - x.min(y) < MILLICENTS); } diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index b1a6f4c9f2de..abc43dfef3b6 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -27,17 +27,39 @@ use sp_core::u32_trait::{_1, _2, _3, _5}; use parity_scale_codec::{Encode, Decode}; use primitives::v1::{ AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CommittedCandidateReceipt, - CoreState, GroupRotationInfo, Hash, Id, Moment, Nonce, OccupiedCoreAssumption, + CoreState, GroupRotationInfo, Hash, Id as ParaId, Moment, Nonce, OccupiedCoreAssumption, PersistedValidationData, Signature, ValidationCode, ValidatorId, ValidatorIndex, InboundDownwardMessage, InboundHrmpMessage, SessionInfo, }; use runtime_common::{ - claims, SlowAdjustingFeeUpdate, CurrencyToVote, - impls::DealWithFees, - BlockHashCount, RocksDbWeight, BlockWeights, BlockLength, - OffchainSolutionWeightLimit, OffchainSolutionLengthLimit, - ParachainSessionKeyPlaceholder, AssignmentSessionKeyPlaceholder, + claims, SlowAdjustingFeeUpdate, CurrencyToVote, paras_registrar, xcm_sender, slots, impls::DealWithFees, + BlockHashCount, RocksDbWeight, BlockWeights, BlockLength, OffchainSolutionWeightLimit, OffchainSolutionLengthLimit, + ParachainSessionKeyPlaceholder, AssignmentSessionKeyPlaceholder, ToAuthor, }; + +use runtime_parachains::origin as parachains_origin; +use runtime_parachains::configuration as parachains_configuration; +use runtime_parachains::shared as parachains_shared; +use runtime_parachains::inclusion as parachains_inclusion; +use runtime_parachains::paras_inherent as parachains_paras_inherent; +use runtime_parachains::initializer as parachains_initializer; +use runtime_parachains::session_info as parachains_session_info; +use runtime_parachains::paras as parachains_paras; +use runtime_parachains::dmp as parachains_dmp; +use runtime_parachains::ump as parachains_ump; +use runtime_parachains::hrmp as parachains_hrmp; +use runtime_parachains::scheduler as parachains_scheduler; +use runtime_parachains::reward_points as parachains_reward_points; +use runtime_parachains::runtime_api_impl::v1 as parachains_runtime_api_impl; + +use xcm::v0::{MultiLocation, NetworkId}; +use xcm_builder::{ + AccountId32Aliases, ChildParachainConvertsVia, SovereignSignedViaLocation, CurrencyAdapter as XcmCurrencyAdapter, + ChildParachainAsNative, SignedAccountId32AsNative, ChildSystemParachainAsSuperuser, LocationInverter, IsConcrete, + FixedWeightBounds, TakeWeightCredit, AllowTopLevelPaidExecutionFrom, + AllowUnpaidExecutionFrom, IsChildSystemParachain, UsingComponents, +}; +use xcm_executor::XcmExecutor; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, ApplyExtrinsicResult, KeyTypeId, Percent, Permill, Perbill, @@ -58,7 +80,7 @@ use sp_core::OpaqueMetadata; use sp_staking::SessionIndex; use frame_support::{ parameter_types, construct_runtime, RuntimeDebug, PalletId, - traits::{KeyOwnerProofSystem, Randomness, LockIdentifier, Filter, InstanceFilter}, + traits::{KeyOwnerProofSystem, Randomness, LockIdentifier, Filter, InstanceFilter, All}, weights::Weight, }; use frame_system::{EnsureRoot, EnsureOneOf}; @@ -79,7 +101,7 @@ pub use pallet_balances::Call as BalancesCall; /// Constant values used within the runtime. pub mod constants; -use constants::{time::*, currency::*, fee::*}; +use constants::{time::*, currency::*, fee::*, paras::*}; // Weights used in the runtime. mod weights; @@ -118,11 +140,14 @@ pub fn native_version() -> NativeVersion { } } -/// Avoid processing transactions from slots and parachain registrar. +/// Avoid processing transactions from slots and parachain registrar except by root. pub struct BaseFilter; impl Filter for BaseFilter { - fn filter(_: &Call) -> bool { - true + fn filter(c: &Call) -> bool { + !matches!(c, + Call::Registrar(..) | + Call::Slots(..) + ) } } @@ -213,7 +238,7 @@ impl pallet_babe::Config for Runtime { } parameter_types! { - pub const IndexDeposit: Balance = 1 * DOLLARS; + pub const IndexDeposit: Balance = 100 * CENTS; } impl pallet_indices::Config for Runtime { @@ -409,7 +434,7 @@ parameter_types! { pub const LaunchPeriod: BlockNumber = 7 * DAYS; pub const VotingPeriod: BlockNumber = 7 * DAYS; pub const FastTrackVotingPeriod: BlockNumber = 3 * HOURS; - pub const MinimumDeposit: Balance = 1 * DOLLARS; + pub const MinimumDeposit: Balance = 100 * CENTS; pub const EnactmentPeriod: BlockNumber = 8 * DAYS; pub const CooloffPeriod: BlockNumber = 7 * DAYS; // One cent: $10,000 / MB @@ -487,7 +512,7 @@ impl pallet_collective::Config for Runtime { } parameter_types! { - pub const CandidacyBond: Balance = 1 * DOLLARS; + pub const CandidacyBond: Balance = 100 * CENTS; // 1 storage item created, key size is 32 bytes, value size is 16+16. pub const VotingBondBase: Balance = deposit(1, 64); // additional data per vote is 32 bytes (account id). @@ -553,21 +578,21 @@ impl pallet_membership::Config for Runtime { parameter_types! { pub const ProposalBond: Permill = Permill::from_percent(5); - pub const ProposalBondMinimum: Balance = 20 * DOLLARS; + pub const ProposalBondMinimum: Balance = 2000 * CENTS; pub const SpendPeriod: BlockNumber = 6 * DAYS; pub const Burn: Permill = Permill::from_perthousand(2); pub const TreasuryPalletId: PalletId = PalletId(*b"py/trsry"); pub const TipCountdown: BlockNumber = 1 * DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); - pub const TipReportDepositBase: Balance = 1 * DOLLARS; + pub const TipReportDepositBase: Balance = 100 * CENTS; pub const DataDepositPerByte: Balance = 1 * CENTS; - pub const BountyDepositBase: Balance = 1 * DOLLARS; + pub const BountyDepositBase: Balance = 100 * CENTS; pub const BountyDepositPayoutDelay: BlockNumber = 4 * DAYS; pub const BountyUpdatePeriod: BlockNumber = 90 * DAYS; pub const MaximumReasonLength: u32 = 16384; pub const BountyCuratorDeposit: Permill = Permill::from_percent(50); - pub const BountyValueMinimum: Balance = 2 * DOLLARS; + pub const BountyValueMinimum: Balance = 200 * CENTS; pub const MaxApprovals: u32 = 100; } @@ -738,9 +763,9 @@ impl claims::Config for Runtime { parameter_types! { // Minimum 100 bytes/KSM deposited (1 CENT/byte) - pub const BasicDeposit: Balance = 10 * DOLLARS; // 258 bytes on-chain + pub const BasicDeposit: Balance = 1000 * CENTS; // 258 bytes on-chain pub const FieldDeposit: Balance = 250 * CENTS; // 66 bytes on-chain - pub const SubAccountDeposit: Balance = 2 * DOLLARS; // 53 bytes on-chain + pub const SubAccountDeposit: Balance = 200 * CENTS; // 53 bytes on-chain pub const MaxSubAccounts: u32 = 100; pub const MaxAdditionalFields: u32 = 100; pub const MaxRegistrars: u32 = 20; @@ -786,10 +811,10 @@ impl pallet_multisig::Config for Runtime { } parameter_types! { - pub const ConfigDepositBase: Balance = 5 * DOLLARS; + pub const ConfigDepositBase: Balance = 500 * CENTS; pub const FriendDepositFactor: Balance = 50 * CENTS; pub const MaxFriends: u16 = 9; - pub const RecoveryDeposit: Balance = 5 * DOLLARS; + pub const RecoveryDeposit: Balance = 500 * CENTS; } impl pallet_recovery::Config for Runtime { @@ -803,11 +828,11 @@ impl pallet_recovery::Config for Runtime { } parameter_types! { - pub const CandidateDeposit: Balance = 10 * DOLLARS; - pub const WrongSideDeduction: Balance = 2 * DOLLARS; + pub const CandidateDeposit: Balance = 1000 * CENTS; + pub const WrongSideDeduction: Balance = 200 * CENTS; pub const MaxStrikes: u32 = 10; pub const RotationPeriod: BlockNumber = 7 * DAYS; - pub const PeriodSpend: Balance = 500 * DOLLARS; + pub const PeriodSpend: Balance = 50000 * CENTS; pub const MaxLockDuration: BlockNumber = 36 * 30 * DAYS; pub const ChallengePeriod: BlockNumber = 7 * DAYS; pub const MaxCandidateIntake: u32 = 1; @@ -833,7 +858,7 @@ impl pallet_society::Config for Runtime { } parameter_types! { - pub const MinVestedTransfer: Balance = 1 * DOLLARS; + pub const MinVestedTransfer: Balance = 100 * CENTS; } impl pallet_vesting::Config for Runtime { @@ -962,6 +987,168 @@ impl pallet_proxy::Config for Runtime { type AnnouncementDepositFactor = AnnouncementDepositFactor; } +impl parachains_origin::Config for Runtime {} + +impl parachains_configuration::Config for Runtime {} + +impl parachains_shared::Config for Runtime {} + +impl parachains_session_info::Config for Runtime {} + +impl parachains_inclusion::Config for Runtime { + type Event = Event; + type RewardValidators = parachains_reward_points::RewardValidatorsWithEraPoints; +} + +impl parachains_paras::Config for Runtime { + type Origin = Origin; + type Event = Event; +} + +parameter_types! { + pub const FirstMessageFactorPercent: u64 = 100; +} + +impl parachains_ump::Config for Runtime { + type UmpSink = crate::parachains_ump::XcmSink, Call>; + type FirstMessageFactorPercent = FirstMessageFactorPercent; +} + +impl parachains_dmp::Config for Runtime {} + +impl parachains_hrmp::Config for Runtime { + type Event = Event; + type Origin = Origin; + type Currency = Balances; +} + +impl parachains_paras_inherent::Config for Runtime {} + +impl parachains_scheduler::Config for Runtime {} + +impl parachains_initializer::Config for Runtime { + type Randomness = pallet_babe::RandomnessFromOneEpochAgo; + type ForceOrigin = EnsureRoot; +} + +parameter_types! { + pub const ParaDeposit: Balance = deposit(10, MAX_CODE_SIZE + MAX_HEAD_SIZE); + pub const MaxCodeSize: u32 = MAX_CODE_SIZE; + pub const MaxHeadSize: u32 = MAX_HEAD_SIZE; +} + +impl paras_registrar::Config for Runtime { + type Event = Event; + type Origin = Origin; + type Currency = Balances; + type OnSwap = Slots; + type ParaDeposit = ParaDeposit; + type DataDepositPerByte = DataDepositPerByte; + type MaxCodeSize = MaxCodeSize; + type MaxHeadSize = MaxHeadSize; + type WeightInfo = weights::runtime_common_paras_registrar::WeightInfo; +} + +parameter_types! { + // 6 weeks + pub const LeasePeriod: BlockNumber = 6 * WEEKS; +} + +impl slots::Config for Runtime { + type Event = Event; + type Currency = Balances; + type Registrar = Registrar; + type LeasePeriod = LeasePeriod; + type WeightInfo = weights::runtime_common_slots::WeightInfo; +} + +parameter_types! { + /// The location of the KSM token, from the context of this chain. Since this token is native to this + /// chain, we make it synonymous with it and thus it is the `Null` location, which means "equivalent to + /// the context". + pub const KsmLocation: MultiLocation = MultiLocation::Null; + /// The Kusama network ID. This is named. + pub const KusamaNetwork: NetworkId = NetworkId::Kusama; + /// Our XCM location ancestry - i.e. what, if anything, `Parent` means evaluated in our context. Since + /// Kusama is a top-level relay-chain, there is no ancestry. + pub const Ancestry: MultiLocation = MultiLocation::Null; +} + +/// The canonical means of converting a `MultiLocation` into an `AccountId`, used when we want to determine +/// the sovereign account controlled by a location. +pub type SovereignAccountOf = ( + // We can convert a child parachain using the standard `AccountId` conversion. + ChildParachainConvertsVia, + // We can directly alias an `AccountId32` into a local account. + AccountId32Aliases, +); + +/// Our asset transactor. This is what allows us to interest with the runtime facilities from the point of +/// view of XCM-only concepts like `MultiLocation` and `MultiAsset`. +/// +/// Ours is only aware of the Balances pallet, which is mapped to `KsmLocation`. +pub type LocalAssetTransactor = + XcmCurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // We can convert the MultiLocations with our converter above: + SovereignAccountOf, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + >; + +/// The means that we convert an the XCM message origin location into a local dispatch origin. +type LocalOriginConverter = ( + // A `Signed` origin of the sovereign account that the original location controls. + SovereignSignedViaLocation, + // A child parachain, natively expressed, has the `Parachain` origin. + ChildParachainAsNative, + // The AccountId32 location type can be expressed natively as a `Signed` origin. + SignedAccountId32AsNative, + // A system child parachain, expressed as a Superuser, converts to the `Root` origin. + ChildSystemParachainAsSuperuser, +); + +parameter_types! { + /// The amount of weight an XCM operation takes. This is a safe overestimate. + pub const BaseXcmWeight: Weight = 1_000_000_000; +} + +/// The XCM router. When we want to send an XCM message, we use this type. It amalgamates all of our +/// individual routers. +pub type XcmRouter = ( + // Only one router so far - use DMP to communicate with child parachains. + xcm_sender::ChildParachainRouter, +); + +/// The barriers one of which must be passed for an XCM message to be executed. +pub type Barrier = ( + // Weight that is paid for may be consumed. + TakeWeightCredit, + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom>, + // Messages coming from system parachains need not pay for execution. + AllowUnpaidExecutionFrom>, +); + +pub struct XcmConfig; +impl xcm_executor::Config for XcmConfig { + type Call = Call; + type XcmSender = XcmRouter; + type AssetTransactor = LocalAssetTransactor; + type OriginConverter = LocalOriginConverter; + type IsReserve = (); + type IsTeleporter = (); + type LocationInverter = LocationInverter; + type Barrier = Barrier; + type Weigher = FixedWeightBounds; + // The weight trader piggybacks on the existing transaction-fee conversion logic. + type Trader = UsingComponents>; + type ResponseHandler = (); +} + construct_runtime! { pub enum Runtime where Block = Block, @@ -1033,6 +1220,24 @@ construct_runtime! { // Election pallet. Only works with staking, but placed here to maintain indices. ElectionProviderMultiPhase: pallet_election_provider_multi_phase::{Pallet, Call, Storage, Event, ValidateUnsigned} = 37, + + // Parachains pallets. Start indices at 50 to leave room. + ParachainsOrigin: parachains_origin::{Pallet, Origin} = 50, + ParachainsConfiguration: parachains_configuration::{Pallet, Call, Storage, Config} = 51, + ParasShared: parachains_shared::{Pallet, Call, Storage} = 52, + ParasInclusion: parachains_inclusion::{Pallet, Call, Storage, Event} = 53, + ParasInherent: parachains_paras_inherent::{Pallet, Call, Storage, Inherent} = 54, + ParasScheduler: parachains_scheduler::{Pallet, Call, Storage} = 55, + Paras: parachains_paras::{Pallet, Call, Storage, Event} = 56, + ParasInitializer: parachains_initializer::{Pallet, Call, Storage} = 57, + ParasDmp: parachains_dmp::{Pallet, Call, Storage} = 58, + ParasUmp: parachains_ump::{Pallet, Call, Storage} = 59, + ParasHrmp: parachains_hrmp::{Pallet, Call, Storage, Event} = 60, + ParasSessionInfo: parachains_session_info::{Pallet, Call, Storage} = 61, + + // Parachain Onboarding Pallets. Start indices at 70 to leave room. + Registrar: paras_registrar::{Pallet, Call, Storage, Event} = 70, + Slots: slots::{Pallet, Call, Storage, Event} = 71, } } @@ -1042,6 +1247,57 @@ impl pallet_babe::migrations::BabePalletPrefix for Runtime { } } +pub struct ParachainHostConfigurationMigration; +impl frame_support::traits::OnRuntimeUpgrade for ParachainHostConfigurationMigration { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + let config = parachains_configuration::HostConfiguration { + max_code_size: MaxCodeSize::get(), + max_head_data_size: MaxHeadSize::get(), + max_upward_queue_count: 10, + max_upward_queue_size: 50 * 1024, + max_upward_message_size: 50 * 1024, + max_upward_message_num_per_candidate: 10, + hrmp_max_message_num_per_candidate: 10, + validation_upgrade_frequency: 1 * DAYS, + validation_upgrade_delay: EPOCH_DURATION_IN_SLOTS, + max_pov_size: MAX_POV_SIZE, + max_downward_message_size: 50 * 1024, + preferred_dispatchable_upward_messages_step_weight: 0, + hrmp_max_parachain_outbound_channels: 10, + hrmp_max_parathread_outbound_channels: 0, + hrmp_open_request_ttl: 2, + hrmp_sender_deposit: deposit(1004, 100 * 1024), + hrmp_recipient_deposit: deposit(1004, 100 * 1024), + hrmp_channel_max_capacity: 1000, + hrmp_channel_max_total_size: 100 * 1024, + hrmp_max_parachain_inbound_channels: 10, + hrmp_max_parathread_inbound_channels: 0, + hrmp_channel_max_message_size: 100 * 1024, + code_retention_period: 2 * DAYS, + parathread_cores: 0, + parathread_retries: 0, + group_rotation_frequency: 1 * MINUTES, + chain_availability_period: 1 * MINUTES, + thread_availability_period: 1 * MINUTES, + scheduling_lookahead: 1, + max_validators_per_core: Some(5), + max_validators: Some(200), + dispute_period: 6, + dispute_post_conclusion_acceptance_period: 1 * HOURS, + dispute_max_spam_slots: 2, + dispute_conclusion_by_time_out_period: 1 * HOURS, + no_show_slots: 2, + n_delay_tranches: 89, + zeroth_delay_tranche_width: 0, + needed_approvals: 30, + relay_vrf_modulo_samples: 1, + }; + + ParachainsConfiguration::force_set_active_config(config); + RocksDbWeight::get().writes(1) + } +} + /// The address format for describing accounts. pub type Address = sp_runtime::MultiAddress; /// Block header type as expected by this runtime. @@ -1071,7 +1327,7 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPallets, - (), + ParachainHostConfigurationMigration, >; /// The payload being signed in the transactions. pub type SignedPayload = generic::SignedPayload; @@ -1140,66 +1396,75 @@ sp_api::impl_runtime_apis! { impl primitives::v1::ParachainHost for Runtime { fn validators() -> Vec { - Vec::new() + parachains_runtime_api_impl::validators::() } fn validator_groups() -> (Vec>, GroupRotationInfo) { - (Vec::new(), GroupRotationInfo { session_start_block: 0, group_rotation_frequency: 0, now: 0 }) + parachains_runtime_api_impl::validator_groups::() } fn availability_cores() -> Vec> { - Vec::new() + parachains_runtime_api_impl::availability_cores::() } - fn persisted_validation_data(_: Id, _: OccupiedCoreAssumption) + fn persisted_validation_data(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option> { - None + parachains_runtime_api_impl::persisted_validation_data::(para_id, assumption) } + fn check_validation_outputs( - _: Id, - _: primitives::v1::CandidateCommitments, + para_id: ParaId, + outputs: primitives::v1::CandidateCommitments, ) -> bool { - false + parachains_runtime_api_impl::check_validation_outputs::(para_id, outputs) } fn session_index_for_child() -> SessionIndex { - 0 + parachains_runtime_api_impl::session_index_for_child::() } - fn session_info(_: SessionIndex) -> Option { - None + fn validation_code(para_id: ParaId, assumption: OccupiedCoreAssumption) + -> Option { + parachains_runtime_api_impl::validation_code::(para_id, assumption) } - fn validation_code(_: Id, _: OccupiedCoreAssumption) -> Option { - None + fn historical_validation_code(para_id: ParaId, context_height: BlockNumber) + -> Option + { + parachains_runtime_api_impl::historical_validation_code::(para_id, context_height) } - fn historical_validation_code(_: Id, _: BlockNumber) -> Option { - None + fn candidate_pending_availability(para_id: ParaId) -> Option> { + parachains_runtime_api_impl::candidate_pending_availability::(para_id) } - fn candidate_pending_availability(_: Id) -> Option> { - None + fn candidate_events() -> Vec> { + parachains_runtime_api_impl::candidate_events::(|ev| { + match ev { + Event::parachains_inclusion(ev) => { + Some(ev) + } + _ => None, + } + }) } - fn candidate_events() -> Vec> { - Vec::new() + fn session_info(index: SessionIndex) -> Option { + parachains_runtime_api_impl::session_info::(index) } - fn dmq_contents( - _recipient: Id, - ) -> Vec> { - Vec::new() + fn dmq_contents(recipient: ParaId) -> Vec> { + parachains_runtime_api_impl::dmq_contents::(recipient) } fn inbound_hrmp_channels_contents( - _recipient: Id - ) -> BTreeMap>> { - BTreeMap::new() + recipient: ParaId + ) -> BTreeMap>> { + parachains_runtime_api_impl::inbound_hrmp_channels_contents::(recipient) } - fn validation_code_by_hash(_hash: Hash) -> Option { - None + fn validation_code_by_hash(hash: Hash) -> Option { + parachains_runtime_api_impl::validation_code_by_hash::(hash) } } @@ -1322,7 +1587,7 @@ sp_api::impl_runtime_apis! { impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { fn authorities() -> Vec { - AuthorityDiscovery::authorities() + parachains_runtime_api_impl::relevant_authority_ids::() } } @@ -1400,7 +1665,11 @@ sp_api::impl_runtime_apis! { let mut batches = Vec::::new(); let params = (&config, &whitelist); // Polkadot + // NOTE: Make sure to prefix these `runtime_common::` so that path resolves correctly + // in the generated file. add_benchmark!(params, batches, runtime_common::claims, Claims); + add_benchmark!(params, batches, runtime_common::slots, Slots); + add_benchmark!(params, batches, runtime_common::paras_registrar, Registrar); // Substrate add_benchmark!(params, batches, pallet_balances, Balances); add_benchmark!(params, batches, pallet_bounties, Bounties); diff --git a/runtime/kusama/src/weights/mod.rs b/runtime/kusama/src/weights/mod.rs index 5b8325b42331..7d84a7aebc8b 100644 --- a/runtime/kusama/src/weights/mod.rs +++ b/runtime/kusama/src/weights/mod.rs @@ -37,3 +37,5 @@ pub mod pallet_treasury; pub mod pallet_utility; pub mod pallet_vesting; pub mod runtime_common_claims; +pub mod runtime_common_paras_registrar; +pub mod runtime_common_slots; diff --git a/runtime/kusama/src/weights/runtime_common_paras_registrar.rs b/runtime/kusama/src/weights/runtime_common_paras_registrar.rs new file mode 100644 index 000000000000..2d5a4b20f196 --- /dev/null +++ b/runtime/kusama/src/weights/runtime_common_paras_registrar.rs @@ -0,0 +1,66 @@ +// Copyright 2017-2020 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 . +//! Autogenerated weights for runtime_common::paras_registrar +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-10, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_common::paras_registrar +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/runtime_common_paras_registrar.rs + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for runtime_common::paras_registrar. +pub struct WeightInfo(PhantomData); +impl runtime_common::paras_registrar::WeightInfo for WeightInfo { + fn register() -> Weight { + (8_427_766_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn force_register() -> Weight { + (8_394_534_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn deregister() -> Weight { + (88_992_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn swap() -> Weight { + (69_480_000 as Weight) + .saturating_add(T::DbWeight::get().reads(8 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + } +} diff --git a/runtime/kusama/src/weights/runtime_common_slots.rs b/runtime/kusama/src/weights/runtime_common_slots.rs new file mode 100644 index 000000000000..b1d5c8594226 --- /dev/null +++ b/runtime/kusama/src/weights/runtime_common_slots.rs @@ -0,0 +1,74 @@ +// Copyright 2017-2020 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 . +//! Autogenerated weights for runtime_common::slots +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-10, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("kusama-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=kusama-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_common::slots +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/kusama/src/weights/runtime_common_slots.rs + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for runtime_common::slots. +pub struct WeightInfo(PhantomData); +impl runtime_common::slots::WeightInfo for WeightInfo { + fn force_lease() -> Weight { + (49_464_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn manage_lease_period_start(c: u32, t: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 21_000 + .saturating_add((18_456_000 as Weight).saturating_mul(c as Weight)) + // Standard Error: 21_000 + .saturating_add((37_487_000 as Weight).saturating_mul(t as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(t as Weight))) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(t as Weight))) + } + fn clear_all_leases() -> Weight { + (211_951_000 as Weight) + .saturating_add(T::DbWeight::get().reads(9 as Weight)) + .saturating_add(T::DbWeight::get().writes(9 as Weight)) + } + fn trigger_onboard() -> Weight { + (45_003_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } +} diff --git a/runtime/parachains/src/configuration.rs b/runtime/parachains/src/configuration.rs index b6d7a67bb769..2425ddc83fd3 100644 --- a/runtime/parachains/src/configuration.rs +++ b/runtime/parachains/src/configuration.rs @@ -227,7 +227,7 @@ impl HostConfiguration { /// # Panic /// /// This function panics if any member is not set properly. - fn check_consistency(&self) { + pub fn check_consistency(&self) { if self.group_rotation_frequency.is_zero() { panic!("`group_rotation_frequency` must be non-zero!") } @@ -719,6 +719,13 @@ impl Module { shared::Module::::scheduled_session() } + /// Forcibly set the active config. This should be used with extreme care, and typically + /// only when enabling parachains runtime modules for the first time on a chain which has + /// been running without them. + pub fn force_set_active_config(config: HostConfiguration) { + ::ActiveConfig::set(config); + } + // NOTE: Explicitly tell rustc not to inline this because otherwise heuristics note the incoming // closure making it's attractive to inline. However, in this case, we will end up with lots of // duplicated code (making this function to show up in the top of heaviest functions) only for diff --git a/runtime/polkadot/src/constants.rs b/runtime/polkadot/src/constants.rs index 27a674fe9b4f..ecfa74d78664 100644 --- a/runtime/polkadot/src/constants.rs +++ b/runtime/polkadot/src/constants.rs @@ -18,8 +18,8 @@ pub mod currency { use primitives::v0::Balance; - pub const DOTS: Balance = 1_000_000_000_000; - pub const DOLLARS: Balance = DOTS / 100; // 10_000_000_000 + pub const UNITS: Balance = 10_000_000_000; + pub const DOLLARS: Balance = UNITS; // 10_000_000_000 pub const CENTS: Balance = DOLLARS / 100; // 100_000_000 pub const MILLICENTS: Balance = CENTS / 1_000; // 100_000 diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index 9f4ed6c19910..c857fa932dea 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -1393,6 +1393,8 @@ sp_api::impl_runtime_apis! { let mut batches = Vec::::new(); let params = (&config, &whitelist); // Polkadot + // NOTE: Make sure to prefix these `runtime_common::` so that path resolves correctly + // in the generated file. add_benchmark!(params, batches, runtime_common::claims, Claims); // Substrate add_benchmark!(params, batches, pallet_balances, Balances); diff --git a/runtime/rococo/src/constants.rs b/runtime/rococo/src/constants.rs index 0df97b457e6d..1ff2a7103f18 100644 --- a/runtime/rococo/src/constants.rs +++ b/runtime/rococo/src/constants.rs @@ -18,8 +18,8 @@ pub mod currency { use primitives::v0::Balance; - pub const DOTS: Balance = 1_000_000_000_000; - pub const DOLLARS: Balance = DOTS; + pub const UNITS: Balance = 1_000_000_000_000; + pub const DOLLARS: Balance = UNITS; pub const CENTS: Balance = DOLLARS / 100; pub const MILLICENTS: Balance = CENTS / 1_000; diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index f4b131980318..d9a2f491f202 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -564,7 +564,7 @@ parameter_types! { pub const Ancestry: MultiLocation = MultiLocation::Null; } -pub type LocationConverter = ( +pub type SovereignAccountOf = ( ChildParachainConvertsVia, AccountId32Aliases, ); @@ -576,13 +576,13 @@ pub type LocalAssetTransactor = // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, // We can convert the MultiLocations with our converter above: - LocationConverter, + SovereignAccountOf, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, >; type LocalOriginConverter = ( - SovereignSignedViaLocation, + SovereignSignedViaLocation, ChildParachainAsNative, SignedAccountId32AsNative, ChildSystemParachainAsSuperuser, diff --git a/runtime/westend/Cargo.toml b/runtime/westend/Cargo.toml index e422fdb8c730..a44a47eba487 100644 --- a/runtime/westend/Cargo.toml +++ b/runtime/westend/Cargo.toml @@ -32,22 +32,25 @@ tx-pool-api = { package = "sp-transaction-pool", git = "https://github.com/parit block-builder-api = { package = "sp-block-builder", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-npos-elections = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-executive = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system = {git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-babe = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-beefy = { git = "https://github.com/paritytech/grandpa-bridge-gadget", branch = "master", default-features = false } pallet-collective = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-democracy = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-elections-phragmen = { package = "pallet-elections-phragmen", git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-election-provider-multi-phase = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-executive = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-identity = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-indices = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-membership = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-mmr = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-mmr-primitives = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-multisig = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-nicks = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -58,13 +61,12 @@ pallet-recovery = { git = "https://github.com/paritytech/substrate", branch = "m pallet-scheduler = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-session = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-society = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-staking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-staking-reward-curve = { package = "pallet-staking-reward-curve", git = "https://github.com/paritytech/substrate", branch = "master" } pallet-sudo = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-system = {git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-treasury = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } pallet-vesting = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } @@ -81,6 +83,10 @@ primitives = { package = "polkadot-primitives", path = "../../primitives", defau polkadot-parachain = { path = "../../parachain", default-features = false } runtime-parachains = { package = "polkadot-runtime-parachains", path = "../parachains", default-features = false } +xcm = { package = "xcm", path = "../../xcm", default-features = false } +xcm-executor = { package = "xcm-executor", path = "../../xcm/xcm-executor", default-features = false } +xcm-builder = { package = "xcm-builder", path = "../../xcm/xcm-builder", default-features = false } + [dev-dependencies] hex-literal = "0.3.1" libsecp256k1 = "0.3.5" @@ -115,6 +121,7 @@ std = [ "pallet-authority-discovery/std", "pallet-authorship/std", "pallet-balances/std", + "pallet-beefy/std", "pallet-transaction-payment/std", "pallet-transaction-payment-rpc-runtime-api/std", "pallet-collective/std", @@ -126,6 +133,7 @@ std = [ "pallet-im-online/std", "pallet-indices/std", "pallet-membership/std", + "pallet-mmr/std", "pallet-mmr-primitives/std", "beefy-primitives/std", "pallet-multisig/std", @@ -156,8 +164,12 @@ std = [ "babe-primitives/std", "sp-session/std", "runtime-common/std", + "runtime-parachains/std", "frame-try-runtime/std", "sp-npos-elections/std", + "xcm/std", + "xcm-executor/std", + "xcm-builder/std", ] runtime-benchmarks = [ "runtime-common/runtime-benchmarks", @@ -188,6 +200,7 @@ runtime-benchmarks = [ "pallet-session-benchmarking", "frame-system-benchmarking", "hex-literal", + "xcm-builder/runtime-benchmarks", ] try-runtime = [ "frame-executive/try-runtime", diff --git a/runtime/westend/src/constants.rs b/runtime/westend/src/constants.rs index 08eaa8dcb453..b5b6b354fcb7 100644 --- a/runtime/westend/src/constants.rs +++ b/runtime/westend/src/constants.rs @@ -18,13 +18,13 @@ pub mod currency { use primitives::v0::Balance; - pub const DOTS: Balance = 1_000_000_000_000; - pub const DOLLARS: Balance = DOTS; - pub const CENTS: Balance = DOLLARS / 100; + pub const UNITS: Balance = 1_000_000_000_000; + pub const CENTS: Balance = UNITS / 100; pub const MILLICENTS: Balance = CENTS / 1_000; + pub const GRAND: Balance = CENTS * 100_000; pub const fn deposit(items: u32, bytes: u32) -> Balance { - items as Balance * 1 * DOLLARS + (bytes as Balance) * 5 * MILLICENTS + items as Balance * 100 * CENTS + (bytes as Balance) * 5 * MILLICENTS } } @@ -89,15 +89,15 @@ mod tests { use frame_support::weights::WeightToFeePolynomial; use runtime_common::{MAXIMUM_BLOCK_WEIGHT, ExtrinsicBaseWeight}; use super::fee::WeightToFee; - use super::currency::{CENTS, DOLLARS, MILLICENTS}; + use super::currency::{CENTS, MILLICENTS}; #[test] // This function tests that the fee for `MAXIMUM_BLOCK_WEIGHT` of weight is correct fn full_block_fee_is_correct() { - // A full block should cost 16 DOLLARS + // A full block should cost 1,600 CENTS println!("Base: {}", ExtrinsicBaseWeight::get()); let x = WeightToFee::calc(&MAXIMUM_BLOCK_WEIGHT); - let y = 16 * DOLLARS; + let y = 16 * 100 * CENTS; assert!(x.max(y) - x.min(y) < MILLICENTS); } diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 2f39b48d17ca..d9817112986b 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -26,17 +26,42 @@ use sp_std::collections::btree_map::BTreeMap; use parity_scale_codec::{Encode, Decode}; use primitives::v1::{ AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CommittedCandidateReceipt, - CoreState, GroupRotationInfo, Hash, Id, Moment, Nonce, OccupiedCoreAssumption, + CoreState, GroupRotationInfo, Hash, Id as ParaId, Moment, Nonce, OccupiedCoreAssumption, PersistedValidationData, Signature, ValidationCode, ValidatorId, ValidatorIndex, InboundDownwardMessage, InboundHrmpMessage, SessionInfo, }; use runtime_common::{ + mmr as mmr_common, paras_sudo_wrapper, paras_registrar, xcm_sender, slots, SlowAdjustingFeeUpdate, CurrencyToVote, impls::ToAuthor, BlockHashCount, BlockWeights, BlockLength, RocksDbWeight, OffchainSolutionWeightLimit, OffchainSolutionLengthLimit, ParachainSessionKeyPlaceholder, AssignmentSessionKeyPlaceholder, }; + +use runtime_parachains::origin as parachains_origin; +use runtime_parachains::configuration as parachains_configuration; +use runtime_parachains::shared as parachains_shared; +use runtime_parachains::inclusion as parachains_inclusion; +use runtime_parachains::paras_inherent as parachains_paras_inherent; +use runtime_parachains::initializer as parachains_initializer; +use runtime_parachains::session_info as parachains_session_info; +use runtime_parachains::paras as parachains_paras; +use runtime_parachains::dmp as parachains_dmp; +use runtime_parachains::ump as parachains_ump; +use runtime_parachains::hrmp as parachains_hrmp; +use runtime_parachains::scheduler as parachains_scheduler; +use runtime_parachains::reward_points as parachains_reward_points; +use runtime_parachains::runtime_api_impl::v1 as parachains_runtime_api_impl; + +use xcm::v0::{MultiLocation, NetworkId}; +use xcm_executor::XcmExecutor; +use xcm_builder::{ + AccountId32Aliases, ChildParachainConvertsVia, SovereignSignedViaLocation, CurrencyAdapter as XcmCurrencyAdapter, + ChildParachainAsNative, SignedAccountId32AsNative, ChildSystemParachainAsSuperuser, LocationInverter, IsConcrete, + FixedWeightBounds, TakeWeightCredit, AllowTopLevelPaidExecutionFrom, + AllowUnpaidExecutionFrom, IsChildSystemParachain, UsingComponents,}; + use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, ApplyExtrinsicResult, KeyTypeId, Perbill, curve::PiecewiseLinear, @@ -56,7 +81,7 @@ use sp_core::OpaqueMetadata; use sp_staking::SessionIndex; use frame_support::{ parameter_types, construct_runtime, RuntimeDebug, - traits::{KeyOwnerProofSystem, Randomness, Filter, InstanceFilter}, + traits::{KeyOwnerProofSystem, Randomness, Filter, InstanceFilter, All}, weights::Weight, }; use pallet_im_online::sr25519::AuthorityId as ImOnlineId; @@ -77,6 +102,7 @@ pub use pallet_balances::Call as BalancesCall; /// Constant values used within the runtime. pub mod constants; use constants::{time::*, currency::*, fee::*}; +use sp_runtime::traits::Keccak256; // Weights used in the runtime mod weights; @@ -115,11 +141,14 @@ pub fn native_version() -> NativeVersion { } } -/// Accept all transactions. +/// Avoid processing transactions from slots and parachain registrar except by root. pub struct BaseFilter; impl Filter for BaseFilter { - fn filter(_: &Call) -> bool { - true + fn filter(c: &Call) -> bool { + !matches!(c, + Call::Registrar(..) | + Call::Slots(..) + ) } } @@ -204,7 +233,7 @@ impl pallet_babe::Config for Runtime { } parameter_types! { - pub const IndexDeposit: Balance = 1 * DOLLARS; + pub const IndexDeposit: Balance = 100 * CENTS; } impl pallet_indices::Config for Runtime { @@ -275,6 +304,7 @@ impl_opaque_keys! { pub para_validator: ParachainSessionKeyPlaceholder, pub para_assignment: AssignmentSessionKeyPlaceholder, pub authority_discovery: AuthorityDiscovery, + pub beefy: Beefy, } } @@ -390,7 +420,7 @@ parameter_types! { pub const LaunchPeriod: BlockNumber = 7 * DAYS; pub const VotingPeriod: BlockNumber = 7 * DAYS; pub const FastTrackVotingPeriod: BlockNumber = 3 * HOURS; - pub const MinimumDeposit: Balance = 1 * DOLLARS; + pub const MinimumDeposit: Balance = 100 * CENTS; pub const EnactmentPeriod: BlockNumber = 8 * DAYS; pub const CooloffPeriod: BlockNumber = 7 * DAYS; // One cent: $10,000 / MB @@ -505,9 +535,9 @@ impl frame_system::offchain::SendTransactionTypes for Runtime where parameter_types! { // Minimum 100 bytes/KSM deposited (1 CENT/byte) - pub const BasicDeposit: Balance = 10 * DOLLARS; // 258 bytes on-chain + pub const BasicDeposit: Balance = 1000 * CENTS; // 258 bytes on-chain pub const FieldDeposit: Balance = 250 * CENTS; // 66 bytes on-chain - pub const SubAccountDeposit: Balance = 2 * DOLLARS; // 53 bytes on-chain + pub const SubAccountDeposit: Balance = 200 * CENTS; // 53 bytes on-chain pub const MaxSubAccounts: u32 = 100; pub const MaxAdditionalFields: u32 = 100; pub const MaxRegistrars: u32 = 20; @@ -553,10 +583,10 @@ impl pallet_multisig::Config for Runtime { } parameter_types! { - pub const ConfigDepositBase: Balance = 5 * DOLLARS; + pub const ConfigDepositBase: Balance = 500 * CENTS; pub const FriendDepositFactor: Balance = 50 * CENTS; pub const MaxFriends: u16 = 9; - pub const RecoveryDeposit: Balance = 5 * DOLLARS; + pub const RecoveryDeposit: Balance = 500 * CENTS; } impl pallet_recovery::Config for Runtime { @@ -570,7 +600,7 @@ impl pallet_recovery::Config for Runtime { } parameter_types! { - pub const MinVestedTransfer: Balance = 1 * DOLLARS; + pub const MinVestedTransfer: Balance = 100 * CENTS; } impl pallet_vesting::Config for Runtime { @@ -586,6 +616,24 @@ impl pallet_sudo::Config for Runtime { type Call = Call; } +impl pallet_beefy::Config for Runtime { + type AuthorityId = BeefyId; +} + +impl pallet_mmr::Config for Runtime { + const INDEXING_PREFIX: &'static [u8] = b"mmr"; + type Hashing = Keccak256; + type Hash = ::Output; + type LeafData = mmr_common::Pallet; + type OnNewRoot = mmr_common::DepositBeefyDigest; + type WeightInfo = (); +} + +impl mmr_common::Config for Runtime { + type BeefyAuthorityToMerkleLeaf = mmr_common::UncompressBeefyEcdsaKeys; + type ParachainHeads = (); +} + parameter_types! { // One storage item; key size 32, value size 8; . pub const ProxyDepositBase: Balance = deposit(1, 8); @@ -690,6 +738,149 @@ impl pallet_proxy::Config for Runtime { type AnnouncementDepositFactor = AnnouncementDepositFactor; } +impl parachains_origin::Config for Runtime {} + +impl parachains_configuration::Config for Runtime {} + +impl parachains_shared::Config for Runtime {} + +impl parachains_session_info::Config for Runtime {} + +impl parachains_inclusion::Config for Runtime { + type Event = Event; + type RewardValidators = parachains_reward_points::RewardValidatorsWithEraPoints; +} + +impl parachains_paras::Config for Runtime { + type Origin = Origin; + type Event = Event; +} + +parameter_types! { + pub const FirstMessageFactorPercent: u64 = 100; +} + +impl parachains_ump::Config for Runtime { + type UmpSink = crate::parachains_ump::XcmSink, Call>; + type FirstMessageFactorPercent = FirstMessageFactorPercent; +} + +impl parachains_dmp::Config for Runtime {} + +impl parachains_hrmp::Config for Runtime { + type Event = Event; + type Origin = Origin; + type Currency = Balances; +} + +impl parachains_paras_inherent::Config for Runtime {} + +impl parachains_scheduler::Config for Runtime {} + +impl parachains_initializer::Config for Runtime { + type Randomness = pallet_babe::RandomnessFromOneEpochAgo; + type ForceOrigin = EnsureRoot; +} + +impl paras_sudo_wrapper::Config for Runtime {} + +parameter_types! { + pub const ParaDeposit: Balance = 2000 * CENTS; + pub const DataDepositPerByte: Balance = deposit(0, 1); + pub const MaxCodeSize: u32 = 5 * 1024 * 1024; // 10 MB + pub const MaxHeadSize: u32 = 20 * 1024; // 20 KB +} + +impl paras_registrar::Config for Runtime { + type Event = Event; + type Origin = Origin; + type Currency = Balances; + type OnSwap = Slots; + type ParaDeposit = ParaDeposit; + type DataDepositPerByte = DataDepositPerByte; + type MaxCodeSize = MaxCodeSize; + type MaxHeadSize = MaxHeadSize; + type WeightInfo = weights::runtime_common_paras_registrar::WeightInfo; +} + +parameter_types! { + pub const LeasePeriod: BlockNumber = 28 * DAYS; +} + +impl slots::Config for Runtime { + type Event = Event; + type Currency = Balances; + type Registrar = Registrar; + type LeasePeriod = LeasePeriod; + type WeightInfo = weights::runtime_common_slots::WeightInfo; +} + +parameter_types! { + pub const WndLocation: MultiLocation = MultiLocation::Null; + pub const Ancestry: MultiLocation = MultiLocation::Null; + pub WestendNetwork: NetworkId = NetworkId::Named(b"Westend".to_vec()); +} + +pub type LocationConverter = ( + ChildParachainConvertsVia, + AccountId32Aliases, +); + +pub type LocalAssetTransactor = + XcmCurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // We can convert the MultiLocations with our converter above: + LocationConverter, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + >; + +type LocalOriginConverter = ( + SovereignSignedViaLocation, + ChildParachainAsNative, + SignedAccountId32AsNative, + ChildSystemParachainAsSuperuser, +); + +parameter_types! { + pub const BaseXcmWeight: Weight = 10_000_000; +} + +/// The XCM router. When we want to send an XCM message, we use this type. It amalgamates all of our +/// individual routers. +pub type XcmRouter = ( + // Only one router so far - use DMP to communicate with child parachains. + xcm_sender::ChildParachainRouter, +); + +/// The barriers one of which must be passed for an XCM message to be executed. +pub type Barrier = ( + // Weight that is paid for may be consumed. + TakeWeightCredit, + // If the message is one that immediately attemps to pay for execution, then allow it. + AllowTopLevelPaidExecutionFrom>, + // Messages coming from system parachains need not pay for execution. + AllowUnpaidExecutionFrom>, +); + +pub struct XcmConfig; +impl xcm_executor::Config for XcmConfig { + type Call = Call; + type XcmSender = XcmRouter; + type AssetTransactor = LocalAssetTransactor; + type OriginConverter = LocalOriginConverter; + type IsReserve = (); + type IsTeleporter = (); + type LocationInverter = LocationInverter; + type Barrier = (); + type Weigher = FixedWeightBounds; + type Trader = UsingComponents>; + type ResponseHandler = (); +} + construct_runtime! { pub enum Runtime where Block = Block, @@ -744,6 +935,30 @@ construct_runtime! { // Election pallet. Only works with staking, but placed here to maintain indices. ElectionProviderMultiPhase: pallet_election_provider_multi_phase::{Pallet, Call, Storage, Event, ValidateUnsigned} = 24, + + // Bridges support. + Mmr: pallet_mmr::{Pallet, Call, Storage} = 28, + Beefy: pallet_beefy::{Pallet, Config, Storage} = 29, + MmrLeaf: mmr_common::{Pallet, Storage} = 30, + + // Parachains pallets. Start indices at 40 to leave room. + ParachainsOrigin: parachains_origin::{Pallet, Origin} = 41, + ParachainsConfiguration: parachains_configuration::{Pallet, Call, Storage, Config} = 42, + ParasShared: parachains_shared::{Pallet, Call, Storage} = 43, + ParasInclusion: parachains_inclusion::{Pallet, Call, Storage, Event} = 44, + ParasInherent: parachains_paras_inherent::{Pallet, Call, Storage, Inherent} = 45, + ParasScheduler: parachains_scheduler::{Pallet, Call, Storage} = 46, + Paras: parachains_paras::{Pallet, Call, Storage, Event} = 47, + ParasInitializer: parachains_initializer::{Pallet, Call, Storage} = 48, + ParasDmp: parachains_dmp::{Pallet, Call, Storage} = 49, + ParasUmp: parachains_ump::{Pallet, Call, Storage} = 50, + ParasHrmp: parachains_hrmp::{Pallet, Call, Storage, Event} = 51, + ParasSessionInfo: parachains_session_info::{Pallet, Call, Storage} = 52, + + // Parachain Onboarding Pallets. Start indices at 60 to leave room. + Registrar: paras_registrar::{Pallet, Call, Storage, Event} = 60, + Slots: slots::{Pallet, Call, Storage, Event} = 61, + ParasSudoWrapper: paras_sudo_wrapper::{Pallet, Call} = 62, } } @@ -753,6 +968,57 @@ impl pallet_babe::migrations::BabePalletPrefix for Runtime { } } +pub struct ParachainHostConfigurationMigration; +impl frame_support::traits::OnRuntimeUpgrade for ParachainHostConfigurationMigration { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + let config = parachains_configuration::HostConfiguration { + max_code_size: MaxCodeSize::get(), + max_head_data_size: MaxHeadSize::get(), + max_upward_queue_count: 10, + max_upward_queue_size: 50 * 1024, + max_upward_message_size: 50 * 1024, + max_upward_message_num_per_candidate: 10, + hrmp_max_message_num_per_candidate: 10, + validation_upgrade_frequency: 1 * DAYS, + validation_upgrade_delay: EPOCH_DURATION_IN_SLOTS, + max_pov_size: 5 * 1024 * 1024, + max_downward_message_size: 50 * 1024, + preferred_dispatchable_upward_messages_step_weight: 0, + hrmp_max_parachain_outbound_channels: 10, + hrmp_max_parathread_outbound_channels: 0, + hrmp_open_request_ttl: 2, + hrmp_sender_deposit: deposit(1004, 100 * 1024), + hrmp_recipient_deposit: deposit(1004, 100 * 1024), + hrmp_channel_max_capacity: 1000, + hrmp_channel_max_total_size: 100 * 1024, + hrmp_max_parachain_inbound_channels: 10, + hrmp_max_parathread_inbound_channels: 0, + hrmp_channel_max_message_size: 100 * 1024, + code_retention_period: 2 * DAYS, + parathread_cores: 0, + parathread_retries: 0, + group_rotation_frequency: 1 * MINUTES, + chain_availability_period: MINUTES / 2, + thread_availability_period: MINUTES / 2, + scheduling_lookahead: 1, + max_validators_per_core: Some(5), + max_validators: Some(200), + dispute_period: 6, + dispute_post_conclusion_acceptance_period: 1 * HOURS, + dispute_max_spam_slots: 2, + dispute_conclusion_by_time_out_period: 1 * HOURS, + no_show_slots: 2, + n_delay_tranches: 40, + zeroth_delay_tranche_width: 0, + needed_approvals: 15, + relay_vrf_modulo_samples: 1, + }; + + ParachainsConfiguration::force_set_active_config(config); + RocksDbWeight::get().writes(1) + } +} + /// The address format for describing accounts. pub type Address = sp_runtime::MultiAddress; /// Block header type as expected by this runtime. @@ -782,7 +1048,7 @@ pub type Executive = frame_executive::Executive< frame_system::ChainContext, Runtime, AllPallets, - (), + ParachainHostConfigurationMigration, >; /// The payload being signed in transactions. pub type SignedPayload = generic::SignedPayload; @@ -851,67 +1117,75 @@ sp_api::impl_runtime_apis! { impl primitives::v1::ParachainHost for Runtime { fn validators() -> Vec { - Vec::new() + parachains_runtime_api_impl::validators::() } fn validator_groups() -> (Vec>, GroupRotationInfo) { - (Vec::new(), GroupRotationInfo { session_start_block: 0, group_rotation_frequency: 0, now: 0 }) + parachains_runtime_api_impl::validator_groups::() } fn availability_cores() -> Vec> { - Vec::new() + parachains_runtime_api_impl::availability_cores::() } - fn persisted_validation_data(_: Id, _: OccupiedCoreAssumption) + fn persisted_validation_data(para_id: ParaId, assumption: OccupiedCoreAssumption) -> Option> { - None - } - - fn historical_validation_code(_: Id, _: BlockNumber) -> Option { - None + parachains_runtime_api_impl::persisted_validation_data::(para_id, assumption) } fn check_validation_outputs( - _: Id, - _: primitives::v1::CandidateCommitments + para_id: ParaId, + outputs: primitives::v1::CandidateCommitments, ) -> bool { - false + parachains_runtime_api_impl::check_validation_outputs::(para_id, outputs) } fn session_index_for_child() -> SessionIndex { - 0 + parachains_runtime_api_impl::session_index_for_child::() } - fn session_info(_: SessionIndex) -> Option { - None + fn validation_code(para_id: ParaId, assumption: OccupiedCoreAssumption) + -> Option { + parachains_runtime_api_impl::validation_code::(para_id, assumption) } - fn validation_code(_: Id, _: OccupiedCoreAssumption) -> Option { - None + fn historical_validation_code(para_id: ParaId, context_height: BlockNumber) + -> Option + { + parachains_runtime_api_impl::historical_validation_code::(para_id, context_height) } - fn candidate_pending_availability(_: Id) -> Option> { - None + fn candidate_pending_availability(para_id: ParaId) -> Option> { + parachains_runtime_api_impl::candidate_pending_availability::(para_id) } fn candidate_events() -> Vec> { - Vec::new() + parachains_runtime_api_impl::candidate_events::(|ev| { + match ev { + Event::parachains_inclusion(ev) => { + Some(ev) + } + _ => None, + } + }) + } + + fn session_info(index: SessionIndex) -> Option { + parachains_runtime_api_impl::session_info::(index) } - fn dmq_contents( - _recipient: Id, - ) -> Vec> { - Vec::new() + fn dmq_contents(recipient: ParaId) -> Vec> { + parachains_runtime_api_impl::dmq_contents::(recipient) } fn inbound_hrmp_channels_contents( - _recipient: Id - ) -> BTreeMap>> { - BTreeMap::new() + recipient: ParaId + ) -> BTreeMap>> { + parachains_runtime_api_impl::inbound_hrmp_channels_contents::(recipient) } - fn validation_code_by_hash(_hash: Hash) -> Option { - None + fn validation_code_by_hash(hash: Hash) -> Option { + parachains_runtime_api_impl::validation_code_by_hash::(hash) } } @@ -1034,7 +1308,7 @@ sp_api::impl_runtime_apis! { impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { fn authorities() -> Vec { - AuthorityDiscovery::authorities() + parachains_runtime_api_impl::relevant_authority_ids::() } } @@ -1112,6 +1386,12 @@ sp_api::impl_runtime_apis! { let mut batches = Vec::::new(); let params = (&config, &whitelist); + // Polkadot + // NOTE: Make sure to prefix these `runtime_common::` so that path resolves correctly + // in the generated file. + add_benchmark!(params, batches, runtime_common::slots, Slots); + add_benchmark!(params, batches, runtime_common::paras_registrar, Registrar); + // Substrate add_benchmark!(params, batches, pallet_balances, Balances); add_benchmark!(params, batches, pallet_election_provider_multi_phase, ElectionProviderMultiPhase); add_benchmark!(params, batches, pallet_identity, Identity); diff --git a/runtime/westend/src/weights/mod.rs b/runtime/westend/src/weights/mod.rs index f3141b932bbb..fc5606ea37fc 100644 --- a/runtime/westend/src/weights/mod.rs +++ b/runtime/westend/src/weights/mod.rs @@ -29,3 +29,5 @@ pub mod pallet_staking; pub mod pallet_timestamp; pub mod pallet_utility; pub mod pallet_vesting; +pub mod runtime_common_paras_registrar; +pub mod runtime_common_slots; diff --git a/runtime/westend/src/weights/runtime_common_paras_registrar.rs b/runtime/westend/src/weights/runtime_common_paras_registrar.rs new file mode 100644 index 000000000000..2baa4b5af5f8 --- /dev/null +++ b/runtime/westend/src/weights/runtime_common_paras_registrar.rs @@ -0,0 +1,66 @@ +// Copyright 2017-2020 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 . +//! Autogenerated weights for runtime_common::paras_registrar +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-10, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_common::paras_registrar +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/runtime_common_paras_registrar.rs + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for runtime_common::paras_registrar. +pub struct WeightInfo(PhantomData); +impl runtime_common::paras_registrar::WeightInfo for WeightInfo { + fn register() -> Weight { + (8_391_121_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn force_register() -> Weight { + (8_404_663_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn deregister() -> Weight { + (88_109_000 as Weight) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn swap() -> Weight { + (66_711_000 as Weight) + .saturating_add(T::DbWeight::get().reads(8 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + } +} diff --git a/runtime/westend/src/weights/runtime_common_slots.rs b/runtime/westend/src/weights/runtime_common_slots.rs new file mode 100644 index 000000000000..50052db1ff09 --- /dev/null +++ b/runtime/westend/src/weights/runtime_common_slots.rs @@ -0,0 +1,74 @@ +// Copyright 2017-2020 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 . +//! Autogenerated weights for runtime_common::slots +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 3.0.0 +//! DATE: 2021-04-10, STEPS: `[50, ]`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 128 + +// Executed Command: +// target/release/polkadot +// benchmark +// --chain=westend-dev +// --steps=50 +// --repeat=20 +// --pallet=runtime_common::slots +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --heap-pages=4096 +// --header=./file_header.txt +// --output=./runtime/westend/src/weights/runtime_common_slots.rs + + +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for runtime_common::slots. +pub struct WeightInfo(PhantomData); +impl runtime_common::slots::WeightInfo for WeightInfo { + fn force_lease() -> Weight { + (49_583_000 as Weight) + .saturating_add(T::DbWeight::get().reads(2 as Weight)) + .saturating_add(T::DbWeight::get().writes(2 as Weight)) + } + fn manage_lease_period_start(c: u32, t: u32, ) -> Weight { + (0 as Weight) + // Standard Error: 23_000 + .saturating_add((18_056_000 as Weight).saturating_mul(c as Weight)) + // Standard Error: 23_000 + .saturating_add((37_012_000 as Weight).saturating_mul(t as Weight)) + .saturating_add(T::DbWeight::get().reads(4 as Weight)) + .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().reads((3 as Weight).saturating_mul(t as Weight))) + .saturating_add(T::DbWeight::get().writes(1 as Weight)) + .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(c as Weight))) + .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(t as Weight))) + } + fn clear_all_leases() -> Weight { + (208_632_000 as Weight) + .saturating_add(T::DbWeight::get().reads(9 as Weight)) + .saturating_add(T::DbWeight::get().writes(9 as Weight)) + } + fn trigger_onboard() -> Weight { + (45_240_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(3 as Weight)) + } +} diff --git a/xcm/xcm-builder/src/barriers.rs b/xcm/xcm-builder/src/barriers.rs index 770104ec6092..551732fefda8 100644 --- a/xcm/xcm-builder/src/barriers.rs +++ b/xcm/xcm-builder/src/barriers.rs @@ -15,9 +15,10 @@ // along with Polkadot. If not, see . use sp_std::{result::Result, marker::PhantomData}; -use xcm::v0::{Xcm, Order, MultiLocation}; +use xcm::v0::{Xcm, Order, MultiLocation, Junction}; use frame_support::{ensure, traits::Contains, weights::Weight}; use xcm_executor::traits::{OnResponse, ShouldExecute}; +use polkadot_parachain::primitives::IsSystem; pub struct TakeWeightCredit; impl ShouldExecute for TakeWeightCredit { @@ -72,6 +73,15 @@ impl> ShouldExecute for AllowUnpaidExecutionFrom { } } +pub struct IsChildSystemParachain(PhantomData); +impl< + ParaId: IsSystem + From, +> Contains for IsChildSystemParachain { + fn contains(l: &MultiLocation) -> bool { + matches!(l, MultiLocation::X1(Junction::Parachain(id)) if ParaId::from(*id).is_system()) + } +} + pub struct AllowKnownQueryResponses(PhantomData); impl ShouldExecute for AllowKnownQueryResponses { fn should_execute( diff --git a/xcm/xcm-builder/src/lib.rs b/xcm/xcm-builder/src/lib.rs index aeb981c19250..958f4e83598d 100644 --- a/xcm/xcm-builder/src/lib.rs +++ b/xcm/xcm-builder/src/lib.rs @@ -37,6 +37,7 @@ pub use origin_conversion::{ mod barriers; pub use barriers::{ TakeWeightCredit, AllowUnpaidExecutionFrom, AllowTopLevelPaidExecutionFrom, AllowKnownQueryResponses, + IsChildSystemParachain, }; mod currency_adapter;