diff --git a/Cargo.lock b/Cargo.lock index 182cbc6898..f29528f2e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10083,9 +10083,11 @@ dependencies = [ "pallet-message-queue", "pallet-rc-migrator", "parachains-common", + "parity-scale-codec", "polkadot-parachain-primitives", "polkadot-primitives 16.0.0", "polkadot-runtime", + "polkadot-runtime-common", "polkadot-runtime-constants", "polkadot-runtime-parachains", "sc-consensus-grandpa", @@ -10097,7 +10099,9 @@ dependencies = [ "sp-runtime 39.0.5", "sp-storage 21.0.0", "sp-tracing 17.0.1", + "staging-xcm-builder", "tokio", + "xcm-emulator", ] [[package]] diff --git a/integration-tests/ahm/Cargo.toml b/integration-tests/ahm/Cargo.toml index c69ea5c468..ee2b78fc34 100644 --- a/integration-tests/ahm/Cargo.toml +++ b/integration-tests/ahm/Cargo.toml @@ -35,3 +35,7 @@ sp-runtime = { workspace = true, default-features = true } sp-storage = { workspace = true, default-features = true } sp-tracing = { workspace = true, default-features = true } tokio = { features = ["full", "macros"], workspace = true } +xcm-builder = { workspace = true, default-features = true } +xcm-emulator = { workspace = true, default-features = true } +polkadot-runtime-common = { workspace = true, default-features = true } +codec = { workspace = true, default-features = true } diff --git a/integration-tests/ahm/src/tests.rs b/integration-tests/ahm/src/tests.rs index 3831ea1e93..1e26a60eb4 100644 --- a/integration-tests/ahm/src/tests.rs +++ b/integration-tests/ahm/src/tests.rs @@ -31,13 +31,15 @@ //! SNAP_RC="../../polkadot.snap" SNAP_AH="../../ah-polkadot.snap" RUST_LOG="info" ct polkadot-integration-tests-ahm -r on_initialize_works -- --nocapture //! ``` -use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; +use asset_hub_polkadot_runtime::Runtime as AssetHub; +use cumulus_primitives_core::{AggregateMessageOrigin, Junction, Location, ParaId}; use frame_support::traits::*; use pallet_rc_migrator::{types::PalletMigrationChecks, MigrationStage, RcMigrationStage}; -use std::str::FromStr; - -use asset_hub_polkadot_runtime::Runtime as AssetHub; use polkadot_runtime::Runtime as Polkadot; +use polkadot_runtime_common::paras_registrar; +use sp_runtime::AccountId32; +use std::{collections::BTreeMap, str::FromStr}; +use xcm_emulator::ConvertLocation; use super::mock::*; @@ -113,3 +115,86 @@ async fn account_migration_works() { // some overweight ones. }); } + +#[test] +fn sovereign_account_translation() { + let good_cases = [ + ( + // para 2094 account https://polkadot.subscan.io/account/13YMK2dzLWfnGZXSLuAxgZbBiNMHLfnPZ8itzwXryJ9FcWsE + "13YMK2dzLWfnGZXSLuAxgZbBiNMHLfnPZ8itzwXryJ9FcWsE", + // on ah (different account id) https://assethub-polkadot.subscan.io/account/13cKp88oRErgQAFatu83oCvzxr2b45qVcnNLFu4Mr2ApU6ZC + "13cKp88oRErgQAFatu83oCvzxr2b45qVcnNLFu4Mr2ApU6ZC", + ), + ( + "13YMK2dsXbyC866w2tFM4vH52nRs3uTwac32jh1FNXZBXv18", + "13cKp88gcLA6Fgq5atCSBZctHG7AmKX3eFgTzeXkFFakPWuo", + ), + ]; + + for (rc_acc, ah_acc) in good_cases { + let rc_acc = AccountId32::from_str(rc_acc).unwrap(); + let ah_acc = AccountId32::from_str(ah_acc).unwrap(); + + let (translated, _para_id) = pallet_rc_migrator::accounts::AccountsMigrator::::try_translate_rc_sovereign_to_ah(rc_acc).unwrap().unwrap(); + assert_eq!(translated, ah_acc); + } + + let bad_cases = [ + "13yJaZUmhMDG91AftfdNeJm6hMVSL9Jq2gqiyFdhiJgXf6AY", // wrong prefix + "13ddruDZgGbfVmbobzfNLV4momSgjkFnMXkfogizb4uEbHtQ", // " + "13cF4T4kfi8VYw2nTZfkYkn9BjGpmRDsivYxFqGYUWkU8L2d", // " + "13cKp88gcLA6Fgq5atCSBZctHG7AmKX3eFgTzeXkFFakPo6e", // last byte not 0 + "13cF4T4kfiJ39NqGh4DAZSMo6NuWT1fYfZzCo9f5HH8dUFBJ", // 7 byte not zero + "13cKp88gcLA6Fgq5atCSBZctHGenFzUo3qmmReNVKzpnGvFg", // some center byte not zero + ]; + + for rc_acc in bad_cases { + let rc_acc = AccountId32::from_str(rc_acc).unwrap(); + + let translated = pallet_rc_migrator::accounts::AccountsMigrator::::try_translate_rc_sovereign_to_ah(rc_acc).unwrap(); + assert!(translated.is_none()); + } +} + +/// For human consumption. +#[tokio::test] +async fn print_sovereign_account_translation() { + let (mut rc, mut ah) = load_externalities().await.unwrap(); + + let mut rc_to_ah = BTreeMap::new(); + + rc.execute_with(|| { + for para_id in paras_registrar::Paras::::iter_keys().collect::>() { + let rc_acc = xcm_builder::ChildParachainConvertsVia::::convert_location(&Location::new(0, Junction::Parachain(para_id.into()))).unwrap(); + + let (ah_acc, para_id) = pallet_rc_migrator::accounts::AccountsMigrator::::try_translate_rc_sovereign_to_ah(rc_acc.clone()).unwrap().unwrap(); + rc_to_ah.insert(rc_acc, (ah_acc, para_id)); + } + + for account in frame_system::Account::::iter_keys() { + let translated = pallet_rc_migrator::accounts::AccountsMigrator::::try_translate_rc_sovereign_to_ah(account.clone()).unwrap(); + + if let Some((ah_acc, para_id)) = translated { + if !rc_to_ah.contains_key(&account) { + println!("Account belongs to an unregistered para {}: {}", para_id, account); + rc_to_ah.insert(account, (ah_acc, para_id)); + } + } + } + }); + + let mut csv: String = "para,rc,ah\n".into(); + + // Sanity check that they all exist. Note that they dont *have to*, but all do. + println!("Translating {} RC accounts to AH", rc_to_ah.len()); + ah.execute_with(|| { + for (rc_acc, (ah_acc, para_id)) in rc_to_ah.iter() { + println!("[{}] {} -> {}", para_id, rc_acc, ah_acc); + + csv.push_str(&format!("{},{},{}\n", para_id, rc_acc, ah_acc)); + } + }); + + //std::fs::write("../../pallets/rc-migrator/src/sovereign_account_translation.csv", + // csv).unwrap(); +} diff --git a/pallets/rc-migrator/src/accounts.md b/pallets/rc-migrator/src/accounts.md new file mode 100644 index 0000000000..a8bbc99934 --- /dev/null +++ b/pallets/rc-migrator/src/accounts.md @@ -0,0 +1,32 @@ +# Account Migration + +Accounts are migrated with all their balance, locks and reserves at the beginning of the Asset Hub +migration. + +## User Impact + +Users need to be aware that all of their funds will be moved from the Relay chain to the Asset Hub. +The Account ID will stay the same. This ensures that normal user accounts will be to control their +funds on Asset Hub. + +## Sovereign Account Translation + +For parachain sovereign accounts, it is not possible to just use the same account ID. The sovereign +account address of a parachain is calculated differently, depending on whether it is the account on +the Relay or a parachain (like Asset Hub). + +There are different kinds of sovereign accounts. In this context, we only focus on these parachain +sovereign accounts: +- On the Relay: derived from `"para" ++ para_id ++ 00..` +- On the Asset Hub and all other sibling parachains: derived from `"sibl" ++ para_id ++ 00..` + +Our translation logic inverts the derivation and changes the prefix from `"para"` to `"sibl"` for +all accounts that match the pattern `"para" ++ para_id ++ 00..`. The full list of translated +accounts is in [this CSV file](./sovereign_account_translation.csv). + +It is advised that parachains check that they can control their account on Asset Hub. They can also +forego this check if they do not need control thereof - for example when they are not holding any +funds on their relay sovereign account. However, please note that someone could still send funds to +that address before or after the migration. + +Example for Bifrost: this is the [relay sovereign account](https://polkadot.subscan.io/account/13YMK2eeopZtUNpeHnJ1Ws2HqMQG6Ts9PGCZYGyFbSYoZfcm) and it gets translated to this [sibling sovereign account](https://assethub-polkadot.subscan.io/account/13cKp89TtYknbyYnqnF6dWN75q5ZosvFSuqzoEVkUAaNR47A). diff --git a/pallets/rc-migrator/src/accounts.rs b/pallets/rc-migrator/src/accounts.rs index e00c956879..87d3cbfba5 100644 --- a/pallets/rc-migrator/src/accounts.rs +++ b/pallets/rc-migrator/src/accounts.rs @@ -71,9 +71,11 @@ AH: mint_into(checking, checking_total - total_issuance) // publishes Balances:: */ use crate::{types::*, *}; +use codec::DecodeAll; use frame_support::{traits::tokens::IdAmount, weights::WeightMeter}; use frame_system::Account as SystemAccount; use pallet_balances::{AccountData, BalanceLock}; +use sp_core::ByteArray; use sp_runtime::traits::Zero; /// Account type meant to transfer data between RC and AH. @@ -542,4 +544,45 @@ impl AccountsMigrator { // TODO: define actual weight Weight::from_all(1) } + + /// Try to translate a Parachain sovereign account to the Parachain AH sovereign account. + /// + /// Returns: + /// - `Ok(None)` if the account is not a Parachain sovereign account + /// - `Ok(Some((ah_account, para_id)))` with the translated account and the para id + /// - `Err(())` otherwise + /// + /// The way that this normally works is through the configured `SiblingParachainConvertsVia`: + /// https://github.com/polkadot-fellows/runtimes/blob/7b096c14c2b16cc81ca4e2188eea9103f120b7a4/system-parachains/asset-hubs/asset-hub-polkadot/src/xcm_config.rs#L93-L94 + /// it passes the `Sibling` type into it which has type-ID `sibl`: + /// https://github.com/paritytech/polkadot-sdk/blob/c10e25aaa8b8afd8665b53f0a0b02e4ea44caa77/polkadot/parachain/src/primitives.rs#L272-L274. + /// This type-ID gets used by the converter here: + /// https://github.com/paritytech/polkadot-sdk/blob/7ecf3f757a5d6f622309cea7f788e8a547a5dce8/polkadot/xcm/xcm-builder/src/location_conversion.rs#L314 + /// and eventually ends up in the encoding here + /// https://github.com/paritytech/polkadot-sdk/blob/cdf107de700388a52a17b2fb852c98420c78278e/substrate/primitives/runtime/src/traits/mod.rs#L1997-L1999 + /// The `para` conversion is likewise with `ChildParachainConvertsVia` and the `para` type-ID + /// https://github.com/paritytech/polkadot-sdk/blob/c10e25aaa8b8afd8665b53f0a0b02e4ea44caa77/polkadot/parachain/src/primitives.rs#L162-L164 + pub fn try_translate_rc_sovereign_to_ah( + acc: T::AccountId, + ) -> Result, ()> { + let raw = acc.to_raw_vec(); + + // Must start with "para" + let Some(raw) = raw.strip_prefix(b"para") else { + return Ok(None); + }; + // Must end with 26 zero bytes + let Some(raw) = raw.strip_suffix(&[0u8; 26]) else { + return Ok(None); + }; + let para_id = u16::decode_all(&mut &raw[..]).map_err(|_| ())?; + + // Translate to AH sibling account + let mut ah_raw = [0u8; 32]; + ah_raw[0..4].copy_from_slice(b"sibl"); + ah_raw[4..6].copy_from_slice(¶_id.encode()); + let ah_acc = ah_raw.try_into().map_err(|_| ()).defensive()?; + + Ok(Some((ah_acc, para_id))) + } } diff --git a/pallets/rc-migrator/src/sovereign_account_translation.csv b/pallets/rc-migrator/src/sovereign_account_translation.csv new file mode 100644 index 0000000000..d834afb018 --- /dev/null +++ b/pallets/rc-migrator/src/sovereign_account_translation.csv @@ -0,0 +1,125 @@ +para,rc,ah +0,5Ec4AhNmFmpEvbFUqLoWAd68CcvudkegML6YhBEg1keWpPaf,5Eg2fnsaLW194BydPLkbHGRwT6cDMAhnQyjyx8mAtUg5g6ei +2048,5Ec4AhNmG8sxwXqncL8VfyMnPftV1mJcwwpdokxfDhZ91zK2,5Eg2fnsaLs4s58ZwAL5anchbe9ZnjBMj1bU54iVA6Rahsb2S +2049,5Ec4AhNmTkw9TembRxcDs9zrVJYuA8Ek3f3TSN8Dozb7Eq4H,5Eg2fnsaYV83bFVjyxZJyoLfjnECsYHr7JgthKeigicg6aRH +2050,5Ec4AhNmfNzKymhQFb5x4LdvawDKJVAs9NGH4yHnQHd5U6Af,5Eg2fnsak7BE7NRYob33AyyjqQtd1uDyD1uiKvpHH1eeKrjD +2051,5Ec4AhNms13WVtdD5DZgFXGzgZsjSr6zF5V6haTLzaf3h7Wo,5Eg2fnsawjEQdVMMdDWmNAcow3Z3AGA6Jj8XxXyqsJgcZ15F +2052,5Ec4AhNn4d6h21Z1tr3QShv4nCY9bD37LnhvLBcuash1vHSs,5Eg2fnsb9MHb9cHASqzVZMFt2gDTJd6DQSMMb99QTbiamt6Z +2053,5Ec4AhNnGF9sY8UpiUX8dtZ8sqCZjZyESVvjxnnUBAiz9cfC,5Eg2fnsbLyLmfjCyGUUDkXtx8JssSz2LW9aBDkJy3tkZ1EmG +3333,5Ec4AhNnGUKT3ibmKqrFaUyRVjoJM5Nwp8koA9rxgPHsmUom,5Eg2fnsbMCWMBKKusqoLh8KEkDUc4VS3snQER7PTZ7KSdCJL +2054,5Ec4AhNnTsD44FQdY6zrq5CCyTrysvuMYD9ZbPx2mTkxNmUj,5Eg2fnsbYbPxBr8n66wwwiY2DwYHbLxTbrnzrMUXeBnXE9rk +3334,5Ec4AhNnU6NdZqXa9UKymfcVbNTiVSK4uqycnm2XGgKqzkKz,5Eg2fnsbYpZXhSFihUH4tJxJqr92CrNAyVd43iZ29QMQrVbc +2055,5Ec4AhNnfVGEaNLSMjUb2FqH56XQ2HqUdvNPE17bMknvbf6x,5Eg2fnsbkDT8hy4aujRg8uB6KaChjhtaha1pUxe6EUpVTGFb +2056,5Ec4AhNns7KR6VGFBMxKDSUMAjBpAembjdbCrcH9x3ptq22p,5Eg2fnsbwqWKE5zPjMuQL5pARCs7t4phoHEe7ZoepmrTgd4J +3336,5Ec4AhNnsLUzc5PBnjHSA2tdndnYnABK7GRG3yMeTGPnT4K1,5Eg2fnsbx4ftjg7LLjEXGgET37TrVaERAv4hJvt9KzRMJiWL +3337,5Ec4AhNo4xYB8CJzcMmAMDXhtGSxvX7SCye5gaXD3ZRkgF5a,5Eg2fnsc9gj5Fo39AMiFTrsX8k8GdwAYGdHWwY3hvHTKXsPX +2058,5Ec4AhNoGMRn8j7rpcumbokVMzWeTNdqw42r7pcH8dtqH29G,5Eg2fnscM5cgGKr1NcrriT6JcUBxAngwzhgHNn8n1MvQ8tm4 +3338,5Ec4AhNoGabMeKEoRzEtYQAmyu7P4t3ZJgruKBgmdrTiuDUN,5Eg2fnscMJnFmuxwyzByf3WbENngnJ6fNLWLa9DGWaVHkrJ4 +3339,5Ec4AhNoUCeYASAcFcicjaor5XmoDEygQQ5iwnrLE9Vh8W5N,5Eg2fnscYvqSJ2tkocfhrE9fL1T6vf2nU3jACkNq6sXFyufK +3340,5Ec4AhNofphigZ6R5FCLvmSvBASDMbuoW7JYaQ1tpSXfMWCr,5Eg2fnsckYtcp9pZdF9S3QnjRe7X51xuZkwyqMYPhAZECytb +3341,5Ec4AhNosSkuCg2Dtsg57x5zGo6dVxqvbpXND1BTQjZdaj99,5Eg2fnscxAwoLGkNSsdAEbRoXGmwDNu2fUAoTxhxHTbCSCh1 +3342,5Ec4AhNp54p5inx2iW9oK8j4NRm3eKn3hXkBqcM212bbotL6,5Eg2fnsd9nzyrPgBGW6tRn4scuSMMjq9mBPd6ZsWskdAfVwc +3343,5Ec4AhNpGgsGEusqY8dXWKN8U4RTngiAoEy1UDWabKda31hC,5Eg2fnsdMR4ANWbz68accxhwiY6mW6mGrtcSjB35U3f8tbSD +3344,5Ec4AhNpUJvSm2oeMm7FhW1CZh5sw3eHtxBq6pg9BcfYG6rW,5Eg2fnsdZ37LtdXnum4Lp9M1pAmBeThPxbqGMnCe4Lh77jdD +3345,5Ec4AhNpfvydH9jTBPaytgeGfKkJ5QaQzfQejRqhmuhWV6jh,5Eg2fnsdkfAXQkTbjPY51Kz5uoRbnpdX4K45zPNCedj5LtwL +3346,5Ec4AhNpsZ2ooGfG124i5sHLkxQiDmWY6NdUN31GNCjUiGZ1,5Eg2fnsdxHDhvsPQZ21oCWdA1S61wBZeA2GuczXmEvm3ZxHW +3352,5Ec4AhNr5HMtuzE6vnw5Ey7mLkPD5w7GgdxQ9fzduxwJ55r9,5Eg2fnsfA1Yo3axFUntAMcTabE4WoMANkHbqQdX8ngxrvjZy +3353,5Ec4AhNrGuR5S79ukRQoS9kqSP3dEJ3PnMBDnHACWFyGJ8BP,5Eg2fnsfMdbyZht4JRMtYo6egrivwi6Vqzpf3EghNyzq9sPP +3354,5Ec4AhNrUXUFxE5ia3tXdLPuY1i3NeyWt4Q3QtKm6Z1EXL4e,5Eg2fnsfZFfA5pos83qcjyjinVPM652cwi3UfqrFyH2oNycW +3356,5Ec4AhNrsmaczTwLDJqz1hg3jH2sfNqm5Uqgg6etH95Ayetd,5Eg2fnsfxVmX84fUmJo58M1rykiBNnts98V7w4BP9s6jqDpg +3358,5Ec4AhNsH1gz2hnwrZoSQ4xBvYMhx6i1GuHKwJz1Tj97RsyG,5Eg2fnsgMjstAJX6QZkXWiJ1B231fWm7LYvmCGWWLTAgHR3q +3359,5Ec4AhNsUdkAYpikgCHAbFbG2B286Te8NcW9Zv9a42B5fAxp,5Eg2fnsgZMw4gRSuECEFhtw5GehRoshESG9apsg4vkCeWbPd +3360,5Ec4AhNsgFoM4weZVpktnSEL7ogYEpaFUKiyCXK8eKD3tAgY,5Eg2fnsgkyzFCYNi3phyu5a9NHMqxEdMXyNQTUqdX3EcjpTx +3361,5Ec4AhNsssrXb4aNKTEcycsQDSLxPBWNa2wnq8UhEcF27MVT,5Eg2fnsgxc3RifJWsTBi6GDDTv2G6bZUdgbE661C7LGaxpuk +3364,5Ec4AhNtUk259RMnnLfoZAncWLLCpGJjsAcFiwyP1VLvnihG,5Eg2fnshZUCyH25wLLctfp8Rkp1WXgMqvpFgyuVstDNVeMua +2086,5Ec4AhNtskxrg56TpEJ8zweU5h4JVUmGgxDqnoE1grqycu6q,5Eg2fnshxV9kofpcNEFE7azHLAjcCtpNkbsH3kkWZasYUVKs +3366,5Ec4AhNtsz8SBfDQRbdFwY4khbf36zAz4b3tzAJWC5QsEsZV,5Eg2fnshxiKLKFwYybaM4BQZx5LLpQE68EhLF7q14oSS6gLi +2087,5Ec4AhNu5P23CC2GdrmsC8HYBKiidqhPnfSfRQPaH9swr2b7,5Eg2fnsiA7CwKnkRBrixJmdMRoQ2MFkVrK66gMv59suWhjKi +3367,5Ec4AhNu5cBchn9DFE6z8ihpoEKTFM77AJGicmU4nNSqTuxN,5Eg2fnsiALNWqNsMoE45FN3e3hzkxmADDwv9sizZf6UQKZd1 +3369,5Ec4AhNuUrHyk1zptV4SX5yxzVeHY4yMMiiMsyoBxxWmvVKj,5Eg2fnsiZaUssciySV1XdjKnEyKbFV2TRNMo8wKgqgYLn4RB +2090,5Ec4AhNugFBakYoh6kD3mgCkUDhy4vVm5o78KDtG42yrXKwS,5Eg2fnsikyNUt9XqekA8tKYZihPGnLYs9SkZaBQkvm1RNvdh +3370,5Ec4AhNugUMAG8vdi7YAiGd368JhgRuUTRwBWaxkZFYk9Pua,5Eg2fnsimCY4PjenG7VFpuxrLbz1PqxaX5acmYVFRyaK187n +2091,5Ec4AhNussEmGfjVvNgmxrqpZrNPDHRtBWKwwq3peL1pkeKK,5Eg2fnsixbRfQGTeUNds5WBdpL3gvhUzF9yPCnaKX43Pc7Dk +2092,5Ec4AhNv5VHwnnfJk1AWA3UtfV2oMeN1HDYmaSDPEd3nyXW4,5Eg2fnsjADUqvPPTJ17bGgphuxi754R7LsCCqPjt7M5MqVKB +3372,5Ec4AhNv5iTXJNnFMNVd6duBHPdXy9mierNpmoHsjqcgbtQs,5Eg2fnsjASeRRyWPuNSiDHEzXsJqgZppiW2G2kpNcZeFTKJf +2093,5Ec4AhNvH7M8Jub7ZdeEME7xm7hDW1J8NvmbD3Nwpv5mCxVD,5Eg2fnsjMqY2SWKG7dbKTsTn1bNXDRMESaR2TzuShe7L4cZX +3373,5Ec4AhNvHLWhpVi4AzyMHpYFP2Hx7WhqkZbeQQTSL8eepki3,5Eg2fnsjN4hbx6SCizvSQTt4dVyFpvkwpDF5fMywCrgDgZWY +2094,5Ec4AhNvUjQJq2WvPG7xYQm2rkMdeNEFUdzQqeYWRD7jRyfD,5Eg2fnsjZTbCxdF4wG53f46r7E2wMnHMYHdr6c51Hw9JHShS +3374,5Ec4AhNvUxZtLcdrzdT5V1BKUexNFsdxrGpU31czvRgd4351,5Eg2fnsjZgknUDN1YdQAbeX8j8dfyHh4uvTuHy9Vo9iBuoFM +2095,5Ec4AhNvgMTVM9SjCtbgjbQ6xP23njANaMDEUFi51W9hfAtf,5Eg2fnsjm5ePUkAsktYmrEjvCrhMW9DUdzrfjDEZtEBGWpe7 +3375,5Ec4AhNvgad4rjZfpFvogBpPaHcnQEa5wz3HfcnZWiibGyyY,5Eg2fnsjmJoxzLHpNFstnqACpmJ67edC1dgivaK4PSkA8sQY +2097,5Ec4AhNw5bZrPPJLr9Z97xgF9eLt5T2cmmesjU3CC6De7DDB,5Eg2fnskAKkkWz2VQ9WEEc24Q82Bns5iqRJJzRZh4pFCy62B +3377,5Ec4AhNw5pjRtyRHTWtG4Z6XmYwcgxSL9QUvvq7ghJnXjSDS,5Eg2fnskAYvL2a9S1WqMBCSM22cvQNVSD48NBneBa2p6b4hv +3378,5Ec4AhNwHSncR6M6H9MzFjjbsBc2qKNTF7hkZSHFHbpVxQe9,5Eg2fnskNAyWYh5Eq9K5NP5R7fHLYjRZJmMBpPokAKr4p9Zs +2101,5Ec4AhNwt5naTs1a8fU3thEXYAzYetm7AcYAFthSZGMX248D,5Eg2fnskxoyUbTjigfR91LaLnefrNJpDEGBbWrDwRzP5shQq +2102,5Ec4AhNx5hqkyywNxHwn5ssbdoexoFhEGKkytVs19ZPVF12J,5Eg2fnsmAS2f7afXWHtsCXDQtHLGWfkLKyQR9TPW2HR46pMv +2104,5Ec4AhNxUwx82DnzbYuEUF9jq4yo5yZUTkCd9iC8L9TRhRhW,5Eg2fnsmZg929pX99YrKatVZ5Yf6oPcaXPr4QfidCsUzZ5Ye +2106,5Ec4AhNxtC4V4TecEorgrcRt2LJdNhRifAeGQvXFWjXN9dwk,5Eg2fnsmxvFPC4NknoomyFmhGoyw67UpipHhft3kPTYw17UP +3388,5Ec4AhNyHfLRcHdAVS9GBa8JqWECGvhgEDuxsVvsCYACE2sw,5Eg2fnsnNPXKjtMK3S6MJDU85yuVzLknHsZQ8TTN5GBm5PtP +3389,5Ec4AhNyVHPc8QYyK4czNkmNw8tcRHdoKw8nW76RnqCATA2U,5Eg2fnsna1aWG1H7s4a5VQ7CBcZv8hguPanDm4cvfZDjJizi +3393,5Ec4AhNzHmcLCtGCbaXu9VKfKfYGzjNHin252XkgA1L3MYsR,5Eg2fnsoNVoELUzM9aUzG8fUa9Dai9RPnRfWHVHB2jMcDFnr +3395,5Ec4AhNzh1ihF87pEqVMXrboWvs7HTEXvCTiHk5oLbPyosy5,5Eg2fnsomjubNiqxnqSSeVwcmQYQzsHdyr79YhcJDKRYfPCL +3396,5Ec4AhNztdmsmF3d4Ty5j3EscZXXRpAf1ugXvMFMvtRx2sDy,5Eg2fnsoyMxmtqmmcTvAqgags3Cq9EDm5ZKyBJmrocTWtjjA +3397,5Ec4AhP16Fq4HMyRt6SovDswiCBwaB6n7cuMYxQvXBTvFznB,5Eg2fnspAz1xQxhaS6Pu2sDkxfsFHb9tBGYnouwRPuVV7cdu +3398,5Ec4AhP1HstEoUuEhivY7QX1oprMiY2uDL8BBZaV7UVtVNQ5,5Eg2fnspNc58w5dPFisdE3rq4JXfRx61GymcSX6yzCXTLogh +3399,5Ec4AhP1VVwRKbq3XMQGJbA5uTWmrty2K3LzpAk3hmXriGYa,5Eg2fnspaE8KTCZC5MMMREVu9wC5aK28NgzS58GYaVZRa3mZ +3400,5Ec4AhP1h7zbqikrLyszVmoA16BC1Fu9QkZpSmucJ4ZpwPLL,5Eg2fnspmrBVyKUztyq5cR8yFZrVifxFUQDFhjS7AnbPnzeT +3401,5Ec4AhP1tk3nMqgfAcMigxSE6iqc9cqGWTne5P5AtMboAh4D,5Eg2fnspyUEgVSQoicJoobn3MCWus2tNa7S5LLbfm5dN2P2v +3403,5Ec4AhP2HzA9Q5YGosKB5KiNHzASSLhWhtEHLbQJ4wfjcrTX,5Eg2fnsqNiM3XgGRMsGGBy4BYTqk9kkcmXsibYvnwfhJUf6j +3404,5Ec4AhP2VcDKvCU5dVnuGWMSPcprahddobT6yCZrfEhhrA3Y,5Eg2fnsqaLQE3oCEBVjzP9hFe6WAJ7gjsF6YEA6MXxjGhfGg +3405,5Ec4AhP2hEGWSKPtT8GdTgzWVFVGj4ZkuJfvbojRFXjg5JAE,5Eg2fnsqmxTQZv8318DiaLLKjjAaSUcrxxKMrmFv8FmEvpp1 +3406,5Ec4AhP2trKgxSKhGkkMesdaat9gsRVt11tkEQtyqpmeJ8Hz,5Eg2fnsqyaWb633qpkhSmWyPqMpzaqYz4fYBVNRUiYoD9yqF +3407,5Ec4AhP36UNsUZFW6PE5r4GegWp71nS16j7Zs24YS7ocXMfP,5Eg2fnsrBCZmc9yeePBAxhcTvzVQjCV7ANm17yb3JqqBNu8p +3408,5Ec4AhP3J6S3zgBJv1hp3Euin9UXA9N8CSLPVdE72Qqaka7b,5Eg2fnsrNpcx8GuTU1eu9tFY2d9psZREG5ypkakbu8s9cK5B +3409,5Ec4AhP3ViVEWo77jeBYERYnsn8wJWJFJ9ZD8EPfchsYyYSV,5Eg2fnsraSg8ePqGHe8dM4tc8FpF1vMMMoCePBvAVRu7qDbw +3411,5Ec4AhP3txbbZ2xjNu8zcnpw53TmbEAVVZzrPSinoHwVS2Kb,5Eg2fnsrygnVgdgsvu65jSAkKX95JeDbZDeHeQFHg1y4HZEF +3412,5Ec4AhP46aen59tYCXcioyU1Ag8Bjb6cbHDg23tMPayTfC5e,5Eg2fnssBJqgCkcgkXZovcopR9oVT19ievs7H1QrGK12Wdre +3413,5Ec4AhP4JChxbGpM2A6T1A75GJnbsx2jgzSVef3uyt1RtF6B,5Eg2fnssNvtrisYVaA3Y7oStWnTubN5qke5vucaQrc2zjhfF +3414,5Ec4AhP4Vpm97Pk9qnaBCLk9MwT22JxrnhfKHGDUaB3Q7UJs,5Eg2fnssaYx3EzUJPnXGJz5xcR8Kjj1xrMJkYDjySu4xxsQ4 +666,5Ec4AhPJ7bXbuDmNjwknEi5vCjAugLX1fS53Ah4CsU6xjpNJ,5Eg2fnt7CKiW2pVXHwhsMMRjTCrDPka7j5iUReahkC8XbV4C +4009,5Ec4AhPM8WadDYPjSjaoaQMvUAfTqGaW7LwVwjL7T361xNHX,5Eg2fntADEmXM97szjXth3hjieLmYgdcAzawCgrcKm7aox6A +3000,5Ec4AhPQ8esUzs1gsg6DiUp9q87vJgFNHhPmrXwYiU9FFR7H,5Eg2fntDDP4P8TjqRg3Jq89y5boE26JUMM3D7VU3bCAp76nc +2000,5Ec4AhPUwPeyTFyuhGuBbD224mY85LKLMSqSSo33JYWCazU4,5Eg2fntJ27qsari4FGrGhrMqKFDRnkNSR6UshkZYBGXmSuC8 +2001,5Ec4AhPV91i9yNuiWuNunPf6AQCYDhFTTA4G5QCbtqYApH9E,5Eg2fntJDju46yds4uKzu2zuQssqw7JZWohhLMj6mZZjg2pK +2002,5Ec4AhPVLdmLVVqXLXrdyaJAG2rxN4BaYsH5i1NAV8a93XWr,5Eg2fntJRMxEd6ZftXoj6DdyWWYG5UEgcWvWxxtfMrbhu9Bg +2003,5Ec4AhPVYFpX1cmLAALNAkwEMfXNWR7heaVuLcXj5Rc7GY2i,5Eg2fntJcz1R9DVUiAHTHQH3c9CgDqAoiE9Lba4Dx9dg892X +2004,5Ec4AhPVjsshXjh8ynp6MwaJTJBnen3pkHiiyDhHfie5VWkN,5Eg2fntJpc4bfLRHXnmBUav7hms6NC6vowNAEBDnYSfeMPCw +2005,5Ec4AhPVwVvt3rcwoRHpZ8DNYvrCo8ywqzwYbprrG1g3ixrm,5Eg2fntK2E7nBTM6MREufmZBoQXWWZ33ueayrnPM8jhcaYgp +2006,5Ec4AhPW97z4ZyYkd3mYkJrSeZWcwVv4wiANES2QrJi1x17F,5Eg2fntKDrAxhaGuB3idrxCFu3BveuyB1MooVPYuj2jaoSsw +2007,5Ec4AhPWLk3F66UZSgFGwVVWkCB35rrC3RPBs3BySbjzB588,5Eg2fntKRUE9DhChzgCN48qKzfrLoGuJ752d7ziUKKmZ2oqx +2008,5Ec4AhPWYN6RcDQNGJj18g8aqpqTEDnK98c1VeMY2tmxQGnq,5Eg2fntKd6HKjp8WpJg6FKUQ6JWkwdqRCnFSkbt2ucoXFitU +2009,5Ec4AhPWjz9c8LLB5wCjKrmewTVsNaiSEqpq8FX6dBovdD75,5Eg2fntKpiLWFw4Kdw9pSW7UBwBB5zmYJVUGPD3bVuqVUsrN +2010,5Ec4AhPWwcCneTFyuZgTX3Qj36AHWweZLZ3ekrgfDUqtrbFU,5Eg2fntL2LPgn3z8TZdYdgkYHZqbEMhfQCh61pDA6CsThxfG +2011,5Ec4AhPX9EFyAaBnjCABiE3o8iphfJagSGGUPTrDomss5bxQ,5Eg2fntLDxSsJAuwHC7GpsPcPCW1NidnVuuueRNigVuRwREd +2012,5Ec4AhPXLrK9gh7bYpduuQgsEMV7ofWoXyVJ251nQ4uqJayU,5Eg2fntLRaW3pHqk6pb1242gUqARX5Zubd8jH2YHGnwQADmR +2013,5Ec4AhPXYUNLCp3QNT7e6bKwKz9Xx2Svdgi7egBLzMwoXqcD,5Eg2fntLdCZELQmYvT4jDEfkaTpqfSW2hLMYudhqs5yNPMzV +2015,5Ec4AhPXwiUhF3u21i56Uxc5XFUNEkKAq79kutWUAx1jyz47,5Eg2fntM2SfbNedAZi2Bbbwtmj9fxANGtkoCAr2y3g3JqoH4 +2016,5Ec4AhPY9LXsmAppqLYpg9F9ct8nP7FHvpNaYVg2mF3iD94p,5Eg2fntME4imtmYyPLVunnaxsMp66XJPzU21oTCXdy5H4pJp +2017,5Ec4AhPYLxb4HHkdey2YsKtDiWoCXUBR2XbQB6qbMY5gSL9P,5Eg2fntMRgmxQtUnCxydyyE2xzUWEtEX6BEqS4N6EG7FJ18T +2018,5Ec4AhPYYaeEoQgSUbWH4WXHp9Tcfq7Y8EpDoi19wq7efgpT,5Eg2fntMdJq8w1Qb2bTNB9s74d8vPFAeBtTf4fXepZ9DXG9Z +2019,5Ec4AhPYkChRKXcFJDz1FhAMun82pC3fDx33SKAiY89ctpT9,5Eg2fntMpvtKT8LPrDw6NLWBAFoLXc6mHbgUhGhDQrBBkFQ1 +2020,5Ec4AhPYwpkbqeY47rTjSsoS1QnSxYynKfFs4vLH8RBb7mDs,5Eg2fntN2YwVyFGCfrQpZX9FFtTkfy2tPJuJKsrn19D9ySnb +2021,5Ec4AhPZ9SonMmTrwUwTe4SW73Ss6uuuRNUghXVqiiDZM2sh,5Eg2fntNEAzgVNC1VUtYkhnKMX8ApKy1V287xV2LbSF8CWXb +1000,5Ec4AhPZk8STuex8Wsi9TwDtJQxKqzPJRCH7348Xtcs9vZLJ,5Eg2fntNprdN3FgH4sfEaaZhYtddZQSQUqvYJ1f2mLtinVhV +1001,5Ec4AhPZwkVeRmswLWBsf7rxQ3cjzMKRWuVvffJ6Uuu89s1P,5Eg2fntP2UgYZNc5tW8xmmCmeXJ3hmNXaZ9MvcpbMdvh1bBJ +2025,5Ec4AhPZww2WSFB6DzrNQnznVa6XgMePpDMyDxA65tMSFVpp,5Eg2fntP2fDQZquEmzoTXSLbk3mqPmhVss1QUugaxcP174FB +1002,5Ec4AhPa9NYpwtokA8fbrJW2VgHA8iFYccikJGTf5Cw6NqFT,5Eg2fntPE6jj5VXti8cgxwqqk9xTr8JegGNBZDz9wvxfEaAn +2026,5Ec4AhPa9Z5gxN6u3dL6bydrbCkwpiaWuvanrZKegBPQUXMk,5Eg2fntPEHGb5xq3bdHBicyfqgSFY8dcyaEE7Wr9YuQyLLX4 +2027,5Ec4AhPaMB8sUV2hsFopoAGvgqRMy5We1docVAVDGURNhcqb,5Eg2fntPRuKmc5krRFkuuocjwK6fgVZk5HT3k81i9CSwZXpF +1004,5Ec4AhPaYcfBz8fMoPd4EfnAgwbzRS7np3APZUnnFo12qEYk,5Eg2fntPdLr67jPWMPa9MK7ywRHJ8rAtsgoppSKH8X2bgiiV +2028,5Ec4AhPaYoC3zbxWgtHYzLuznU5n7SSm7M2S7memrmTLvifY,5Eg2fntPdXNx8CgfEtEe6zFp2wm5prVsAzfsNjBGjVUunTSX +1005,5Ec4AhPakEiNWFbAd26nRrREnaGQZo3uukPDC5xLr6314Dwg,5Eg2fntPpxuGdrKKB23sYVm433wiHD71yQ2eT3Uqip4ZuxdH +2030,5Ec4AhPax3JR2qp8L9F1NiC8yjQcQAK1JmU5Nyyu3MXHPCmc,5Eg2fntQ2mVKASYGt9C6VMXxED5v7aN7NR7WdwWPv5YrEjkb +2031,5Ec4AhPb9fMbYxjw9mijZtqD5N52YXF8QUgu1b9TdeZFcMRT,5Eg2fntQEPYVgZU5hmfpgYB2KqkLFwJEU8LLGYfxWNapU21z +2032,5Ec4AhPbMHQn55fjyQCTm5UHAzjSgtBFWBuieCK2DwbDqGSG,5Eg2fntQS1bgCgPtXQ9Ysip6RUQkQJEMZqZ9u9qX6fcnhB4H +2034,5Ec4AhPbkXX97KXMcf9v9SkRNG4Gyc3VhcMMuQe9QXfAHnrC,5Eg2fntQqFi3EvFWAf71G66Ecjjah26bmFzoANAeHFgj9Lia +2035,5Ec4AhPbx9aKdSTASHdeLdPVTtih7xycoKaBY1ohzph8Wgo9,5Eg2fntR2smDm3BJzHajTGjJiNPzqP2iryDcnyLCsYihNQk3 +2037,5Ec4AhPcMPggfgJn5Yb6izfdfA3XQgqrzk1poE8qBQm4y4QU,5Eg2fntRS7saoH2vdYYBqe1Sudiq86ty4PfG4BfL48ndpk4X +2038,5Ec4AhPcZ1jsBoEauB4pvBJhknhwZ3mz6TEeRqJPmho3C6LN,5Eg2fntRdjvmKPxjTB1v2peX1GPFGTq6A6t5gnpteRpc3ryZ +2039,5Ec4AhPckdo3hvAPioYZ7MwmrRNMhQi7CATU4STxMzq1RSrA,5Eg2fntRqMywqWtYGoVeE1Hb6u3fQpmDFp6uKPzTEiraGrq1 +2040,5Ec4AhPcxFrEE36CYS2HJYaqx42mqmeEHsgHh3dWxHryeNKs,5Eg2fntS2z38MdpM6RyNRBvfCXi5ZBhLMXKix1A1q1tYW66u +2041,5Ec4AhPd9suQkA21N4W1VjDv3ghBz8aMPau7Keo5YatwsSj1,5Eg2fntSEc6Jskk9v4T6cNZjJANVhYdTTEYYacKaRJvWjAY8 +2042,5Ec4AhPdMVxbGGwpBgyjgurz9KMc8VWUVJ7vxFxe8svv6oCH,5Eg2fntSSE9VPsfxjgvpoZCoPo2uquZaYwmNDDV91bxUxEt7 +2043,5Ec4AhPdZ81mnPsd1KTTt6W4Ex22GrSbb1Lkas8CjAxtKyUX,5Eg2fntSdrCfuzbmZKQYzjqsVRhKzGVheezBqpehbtzTBYNj +2046,5Ec4AhPe9zBKLkf3UCteTeRGXr1GhwExt91DUgctW44o18mb,5Eg2fntTEiNDUMPC2CqjaHm5nKgaRMJ4wneeje9PNn6Ms2cM +2047,5Ec4AhPeMcEVrsarHqNNeq4LdUfgrJB5yrE37HnT6M6mEFpq,5Eg2fntTSLRPzUJzqqKTmUQ9sxLzZiEC3VsUNFJwy58L61tZ diff --git a/relay/polkadot/src/ah_migration/phase1.rs b/relay/polkadot/src/ah_migration/phase1.rs index 776197055b..69c073f4ef 100644 --- a/relay/polkadot/src/ah_migration/phase1.rs +++ b/relay/polkadot/src/ah_migration/phase1.rs @@ -50,10 +50,12 @@ impl Contains<::RuntimeCall> for CallsEnabledAf /// /// Visually: /// +/// ```text /// |-----1-----| /// |---2----> /// --------|-----------|---------> /// Start End +/// ``` /// /// This call returns a 2-tuple to indicate whether a call is enabled during these periods. pub fn call_allowed_status(call: &::RuntimeCall) -> (bool, bool) {