From c4d582a0e4d4b68712f6f859a2d81491a89f2e09 Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Tue, 18 Feb 2025 10:54:26 +0100 Subject: [PATCH 1/8] [AHM] Sovereign account translation Signed-off-by: Oliver Tale-Yazdi --- Cargo.lock | 3 + integration-tests/ahm/Cargo.toml | 3 + integration-tests/ahm/src/tests.rs | 87 +++++++++++++++++++++++++++-- pallets/rc-migrator/src/accounts.rs | 30 ++++++++++ 4 files changed, 119 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 182cbc6898..f89e9e7c84 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10086,6 +10086,7 @@ dependencies = [ "polkadot-parachain-primitives", "polkadot-primitives 16.0.0", "polkadot-runtime", + "polkadot-runtime-common", "polkadot-runtime-constants", "polkadot-runtime-parachains", "sc-consensus-grandpa", @@ -10097,7 +10098,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..edd1aaadfa 100644 --- a/integration-tests/ahm/Cargo.toml +++ b/integration-tests/ahm/Cargo.toml @@ -35,3 +35,6 @@ 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 } diff --git a/integration-tests/ahm/src/tests.rs b/integration-tests/ahm/src/tests.rs index 3831ea1e93..4bb437b112 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::str::FromStr; +use xcm_emulator::ConvertLocation; use super::mock::*; @@ -113,3 +115,80 @@ 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 = 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_accounts = Vec::new(); + let mut ah_accounts = Vec::new(); + + let paras = rc.execute_with(|| { + let paras = paras_registrar::Paras::::iter_keys().collect::>(); + + for para_id in paras.clone() { + let rc_acc = xcm_builder::ChildParachainConvertsVia::::convert_location(&Location::new(0, Junction::Parachain(para_id.into()))).unwrap(); + rc_accounts.push(rc_acc.clone()); + + let ah_acc = pallet_rc_migrator::accounts::AccountsMigrator::::try_translate_rc_sovereign_to_ah(rc_acc).unwrap().unwrap(); + ah_accounts.push(ah_acc); + } + + paras + }); + + let mut csv: String = "para,rc,ah,exists_on_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_accounts.len()); + ah.execute_with(|| { + for (i, (rc_acc, ah_acc)) in rc_accounts.iter().zip(ah_accounts.iter()).enumerate() { + println!("[{}] {} -> {}", paras[i], rc_acc, ah_acc); + + csv.push_str(&format!("{},{},{},{}\n", paras[i], rc_acc, ah_acc)); + } + }); + + //std::fs::write("/tmp/sovereign_account_translation.csv", csv).unwrap(); +} diff --git a/pallets/rc-migrator/src/accounts.rs b/pallets/rc-migrator/src/accounts.rs index e00c956879..adc65bd7d1 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,32 @@ 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))` with the translated account + /// - `Err(())` otherwise + 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)) + } } From c694b701fd540b5ec48a7ba3b1d034bbf5dcb537 Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Tue, 18 Feb 2025 10:56:45 +0100 Subject: [PATCH 2/8] fix Signed-off-by: Oliver Tale-Yazdi --- integration-tests/ahm/src/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration-tests/ahm/src/tests.rs b/integration-tests/ahm/src/tests.rs index 4bb437b112..9a5a17000c 100644 --- a/integration-tests/ahm/src/tests.rs +++ b/integration-tests/ahm/src/tests.rs @@ -186,7 +186,7 @@ async fn print_sovereign_account_translation() { for (i, (rc_acc, ah_acc)) in rc_accounts.iter().zip(ah_accounts.iter()).enumerate() { println!("[{}] {} -> {}", paras[i], rc_acc, ah_acc); - csv.push_str(&format!("{},{},{},{}\n", paras[i], rc_acc, ah_acc)); + csv.push_str(&format!("{},{},{}\n", paras[i], rc_acc, ah_acc)); } }); From 414e3271de0a2580611eeec4ac475e725a4589b8 Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Tue, 18 Feb 2025 11:00:03 +0100 Subject: [PATCH 3/8] fix Signed-off-by: Oliver Tale-Yazdi --- integration-tests/ahm/src/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration-tests/ahm/src/tests.rs b/integration-tests/ahm/src/tests.rs index 9a5a17000c..5953ef6dbb 100644 --- a/integration-tests/ahm/src/tests.rs +++ b/integration-tests/ahm/src/tests.rs @@ -178,7 +178,7 @@ async fn print_sovereign_account_translation() { paras }); - let mut csv: String = "para,rc,ah,exists_on_ah\n".into(); + 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_accounts.len()); From c17033ef2920199cff6fff8bd7550e88482a16ef Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Tue, 18 Feb 2025 11:59:07 +0100 Subject: [PATCH 4/8] Add docs Signed-off-by: Oliver Tale-Yazdi --- integration-tests/ahm/src/tests.rs | 2 +- pallets/rc-migrator/src/accounts.md | 30 +++++ .../src/sovereign_account_translation.csv | 121 ++++++++++++++++++ 3 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 pallets/rc-migrator/src/accounts.md create mode 100644 pallets/rc-migrator/src/sovereign_account_translation.csv diff --git a/integration-tests/ahm/src/tests.rs b/integration-tests/ahm/src/tests.rs index 5953ef6dbb..d3c651dc0e 100644 --- a/integration-tests/ahm/src/tests.rs +++ b/integration-tests/ahm/src/tests.rs @@ -190,5 +190,5 @@ async fn print_sovereign_account_translation() { } }); - //std::fs::write("/tmp/sovereign_account_translation.csv", csv).unwrap(); + //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..02383741ac --- /dev/null +++ b/pallets/rc-migrator/src/accounts.md @@ -0,0 +1,30 @@ +# 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. 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..6099f1339f --- /dev/null +++ b/pallets/rc-migrator/src/sovereign_account_translation.csv @@ -0,0 +1,121 @@ +para,rc,ah +2094,5Ec4AhNvUjQJq2WvPG7xYQm2rkMdeNEFUdzQqeYWRD7jRyfD,5Eg2fnsjZTbCxdF4wG53f46r7E2wMnHMYHdr6c51Hw9JHShS +2097,5Ec4AhNw5bZrPPJLr9Z97xgF9eLt5T2cmmesjU3CC6De7DDB,5Eg2fnskAKkkWz2VQ9WEEc24Q82Bns5iqRJJzRZh4pFCy62B +2028,5Ec4AhPaYoC3zbxWgtHYzLuznU5n7SSm7M2S7memrmTLvifY,5Eg2fntPdXNx8CgfEtEe6zFp2wm5prVsAzfsNjBGjVUunTSX +2040,5Ec4AhPcxFrEE36CYS2HJYaqx42mqmeEHsgHh3dWxHryeNKs,5Eg2fntS2z38MdpM6RyNRBvfCXi5ZBhLMXKix1A1q1tYW66u +2038,5Ec4AhPcZ1jsBoEauB4pvBJhknhwZ3mz6TEeRqJPmho3C6LN,5Eg2fntRdjvmKPxjTB1v2peX1GPFGTq6A6t5gnpteRpc3ryZ +2010,5Ec4AhPWwcCneTFyuZgTX3Qj36AHWweZLZ3ekrgfDUqtrbFU,5Eg2fntL2LPgn3z8TZdYdgkYHZqbEMhfQCh61pDA6CsThxfG +2035,5Ec4AhPbx9aKdSTASHdeLdPVTtih7xycoKaBY1ohzph8Wgo9,5Eg2fntR2smDm3BJzHajTGjJiNPzqP2iryDcnyLCsYihNQk3 +3405,5Ec4AhP2hEGWSKPtT8GdTgzWVFVGj4ZkuJfvbojRFXjg5JAE,5Eg2fnsqmxTQZv8318DiaLLKjjAaSUcrxxKMrmFv8FmEvpp1 +2009,5Ec4AhPWjz9c8LLB5wCjKrmewTVsNaiSEqpq8FX6dBovdD75,5Eg2fntKpiLWFw4Kdw9pSW7UBwBB5zmYJVUGPD3bVuqVUsrN +3344,5Ec4AhNpUJvSm2oeMm7FhW1CZh5sw3eHtxBq6pg9BcfYG6rW,5Eg2fnsdZ37LtdXnum4Lp9M1pAmBeThPxbqGMnCe4Lh77jdD +3352,5Ec4AhNr5HMtuzE6vnw5Ey7mLkPD5w7GgdxQ9fzduxwJ55r9,5Eg2fnsfA1Yo3axFUntAMcTabE4WoMANkHbqQdX8ngxrvjZy +3370,5Ec4AhNugUMAG8vdi7YAiGd368JhgRuUTRwBWaxkZFYk9Pua,5Eg2fnsimCY4PjenG7VFpuxrLbz1PqxaX5acmYVFRyaK187n +3367,5Ec4AhNu5cBchn9DFE6z8ihpoEKTFM77AJGicmU4nNSqTuxN,5Eg2fnsiALNWqNsMoE45FN3e3hzkxmADDwv9sizZf6UQKZd1 +2086,5Ec4AhNtskxrg56TpEJ8zweU5h4JVUmGgxDqnoE1grqycu6q,5Eg2fnshxV9kofpcNEFE7azHLAjcCtpNkbsH3kkWZasYUVKs +2032,5Ec4AhPbMHQn55fjyQCTm5UHAzjSgtBFWBuieCK2DwbDqGSG,5Eg2fntQS1bgCgPtXQ9Ysip6RUQkQJEMZqZ9u9qX6fcnhB4H +2021,5Ec4AhPZ9SonMmTrwUwTe4SW73Ss6uuuRNUghXVqiiDZM2sh,5Eg2fntNEAzgVNC1VUtYkhnKMX8ApKy1V287xV2LbSF8CWXb +3333,5Ec4AhNnGUKT3ibmKqrFaUyRVjoJM5Nwp8koA9rxgPHsmUom,5Eg2fnsbMCWMBKKusqoLh8KEkDUc4VS3snQER7PTZ7KSdCJL +2020,5Ec4AhPYwpkbqeY47rTjSsoS1QnSxYynKfFs4vLH8RBb7mDs,5Eg2fntN2YwVyFGCfrQpZX9FFtTkfy2tPJuJKsrn19D9ySnb +2051,5Ec4AhNms13WVtdD5DZgFXGzgZsjSr6zF5V6haTLzaf3h7Wo,5Eg2fnsawjEQdVMMdDWmNAcow3Z3AGA6Jj8XxXyqsJgcZ15F +2106,5Ec4AhNxtC4V4TecEorgrcRt2LJdNhRifAeGQvXFWjXN9dwk,5Eg2fnsmxvFPC4NknoomyFmhGoyw67UpipHhft3kPTYw17UP +2039,5Ec4AhPckdo3hvAPioYZ7MwmrRNMhQi7CATU4STxMzq1RSrA,5Eg2fntRqMywqWtYGoVeE1Hb6u3fQpmDFp6uKPzTEiraGrq1 +3369,5Ec4AhNuUrHyk1zptV4SX5yxzVeHY4yMMiiMsyoBxxWmvVKj,5Eg2fnsiZaUssciySV1XdjKnEyKbFV2TRNMo8wKgqgYLn4RB +2001,5Ec4AhPV91i9yNuiWuNunPf6AQCYDhFTTA4G5QCbtqYApH9E,5Eg2fntJDju46yds4uKzu2zuQssqw7JZWohhLMj6mZZjg2pK +3414,5Ec4AhP4Vpm97Pk9qnaBCLk9MwT22JxrnhfKHGDUaB3Q7UJs,5Eg2fnssaYx3EzUJPnXGJz5xcR8Kjj1xrMJkYDjySu4xxsQ4 +3409,5Ec4AhP3ViVEWo77jeBYERYnsn8wJWJFJ9ZD8EPfchsYyYSV,5Eg2fnsraSg8ePqGHe8dM4tc8FpF1vMMMoCePBvAVRu7qDbw +3342,5Ec4AhNp54p5inx2iW9oK8j4NRm3eKn3hXkBqcM212bbotL6,5Eg2fnsd9nzyrPgBGW6tRn4scuSMMjq9mBPd6ZsWskdAfVwc +2027,5Ec4AhPaMB8sUV2hsFopoAGvgqRMy5We1docVAVDGURNhcqb,5Eg2fntPRuKmc5krRFkuuocjwK6fgVZk5HT3k81i9CSwZXpF +2008,5Ec4AhPWYN6RcDQNGJj18g8aqpqTEDnK98c1VeMY2tmxQGnq,5Eg2fntKd6HKjp8WpJg6FKUQ6JWkwdqRCnFSkbt2ucoXFitU +2025,5Ec4AhPZww2WSFB6DzrNQnznVa6XgMePpDMyDxA65tMSFVpp,5Eg2fntP2fDQZquEmzoTXSLbk3mqPmhVss1QUugaxcP174FB +2000,5Ec4AhPUwPeyTFyuhGuBbD224mY85LKLMSqSSo33JYWCazU4,5Eg2fntJ27qsari4FGrGhrMqKFDRnkNSR6UshkZYBGXmSuC8 +2048,5Ec4AhNmG8sxwXqncL8VfyMnPftV1mJcwwpdokxfDhZ91zK2,5Eg2fnsaLs4s58ZwAL5anchbe9ZnjBMj1bU54iVA6Rahsb2S +3375,5Ec4AhNvgad4rjZfpFvogBpPaHcnQEa5wz3HfcnZWiibGyyY,5Eg2fnsjmJoxzLHpNFstnqACpmJ67edC1dgivaK4PSkA8sQY +2092,5Ec4AhNv5VHwnnfJk1AWA3UtfV2oMeN1HDYmaSDPEd3nyXW4,5Eg2fnsjADUqvPPTJ17bGgphuxi754R7LsCCqPjt7M5MqVKB +2002,5Ec4AhPVLdmLVVqXLXrdyaJAG2rxN4BaYsH5i1NAV8a93XWr,5Eg2fntJRMxEd6ZftXoj6DdyWWYG5UEgcWvWxxtfMrbhu9Bg +2005,5Ec4AhPVwVvt3rcwoRHpZ8DNYvrCo8ywqzwYbprrG1g3ixrm,5Eg2fntK2E7nBTM6MREufmZBoQXWWZ33ueayrnPM8jhcaYgp +2055,5Ec4AhNnfVGEaNLSMjUb2FqH56XQ2HqUdvNPE17bMknvbf6x,5Eg2fnsbkDT8hy4aujRg8uB6KaChjhtaha1pUxe6EUpVTGFb +3353,5Ec4AhNrGuR5S79ukRQoS9kqSP3dEJ3PnMBDnHACWFyGJ8BP,5Eg2fnsfMdbyZht4JRMtYo6egrivwi6Vqzpf3EghNyzq9sPP +3360,5Ec4AhNsgFoM4weZVpktnSEL7ogYEpaFUKiyCXK8eKD3tAgY,5Eg2fnsgkyzFCYNi3phyu5a9NHMqxEdMXyNQTUqdX3EcjpTx +3359,5Ec4AhNsUdkAYpikgCHAbFbG2B286Te8NcW9Zv9a42B5fAxp,5Eg2fnsgZMw4gRSuECEFhtw5GehRoshESG9apsg4vkCeWbPd +2030,5Ec4AhPax3JR2qp8L9F1NiC8yjQcQAK1JmU5Nyyu3MXHPCmc,5Eg2fntQ2mVKASYGt9C6VMXxED5v7aN7NR7WdwWPv5YrEjkb +3378,5Ec4AhNwHSncR6M6H9MzFjjbsBc2qKNTF7hkZSHFHbpVxQe9,5Eg2fnskNAyWYh5Eq9K5NP5R7fHLYjRZJmMBpPokAKr4p9Zs +3358,5Ec4AhNsH1gz2hnwrZoSQ4xBvYMhx6i1GuHKwJz1Tj97RsyG,5Eg2fnsgMjstAJX6QZkXWiJ1B231fWm7LYvmCGWWLTAgHR3q +2104,5Ec4AhNxUwx82DnzbYuEUF9jq4yo5yZUTkCd9iC8L9TRhRhW,5Eg2fnsmZg929pX99YrKatVZ5Yf6oPcaXPr4QfidCsUzZ5Ye +2053,5Ec4AhNnGF9sY8UpiUX8dtZ8sqCZjZyESVvjxnnUBAiz9cfC,5Eg2fnsbLyLmfjCyGUUDkXtx8JssSz2LW9aBDkJy3tkZ1EmG +2046,5Ec4AhPe9zBKLkf3UCteTeRGXr1GhwExt91DUgctW44o18mb,5Eg2fntTEiNDUMPC2CqjaHm5nKgaRMJ4wneeje9PNn6Ms2cM +2015,5Ec4AhPXwiUhF3u21i56Uxc5XFUNEkKAq79kutWUAx1jyz47,5Eg2fntM2SfbNedAZi2Bbbwtmj9fxANGtkoCAr2y3g3JqoH4 +3345,5Ec4AhNpfvydH9jTBPaytgeGfKkJ5QaQzfQejRqhmuhWV6jh,5Eg2fnsdkfAXQkTbjPY51Kz5uoRbnpdX4K45zPNCedj5LtwL +2054,5Ec4AhNnTsD44FQdY6zrq5CCyTrysvuMYD9ZbPx2mTkxNmUj,5Eg2fnsbYbPxBr8n66wwwiY2DwYHbLxTbrnzrMUXeBnXE9rk +3340,5Ec4AhNofphigZ6R5FCLvmSvBASDMbuoW7JYaQ1tpSXfMWCr,5Eg2fnsckYtcp9pZdF9S3QnjRe7X51xuZkwyqMYPhAZECytb +3396,5Ec4AhNztdmsmF3d4Ty5j3EscZXXRpAf1ugXvMFMvtRx2sDy,5Eg2fnsoyMxmtqmmcTvAqgags3Cq9EDm5ZKyBJmrocTWtjjA +2018,5Ec4AhPYYaeEoQgSUbWH4WXHp9Tcfq7Y8EpDoi19wq7efgpT,5Eg2fntMdJq8w1Qb2bTNB9s74d8vPFAeBtTf4fXepZ9DXG9Z +2017,5Ec4AhPYLxb4HHkdey2YsKtDiWoCXUBR2XbQB6qbMY5gSL9P,5Eg2fntMRgmxQtUnCxydyyE2xzUWEtEX6BEqS4N6EG7FJ18T +3338,5Ec4AhNoGabMeKEoRzEtYQAmyu7P4t3ZJgruKBgmdrTiuDUN,5Eg2fnscMJnFmuxwyzByf3WbENngnJ6fNLWLa9DGWaVHkrJ4 +3341,5Ec4AhNosSkuCg2Dtsg57x5zGo6dVxqvbpXND1BTQjZdaj99,5Eg2fnscxAwoLGkNSsdAEbRoXGmwDNu2fUAoTxhxHTbCSCh1 +3372,5Ec4AhNv5iTXJNnFMNVd6duBHPdXy9mierNpmoHsjqcgbtQs,5Eg2fnsjASeRRyWPuNSiDHEzXsJqgZppiW2G2kpNcZeFTKJf +2011,5Ec4AhPX9EFyAaBnjCABiE3o8iphfJagSGGUPTrDomss5bxQ,5Eg2fntLDxSsJAuwHC7GpsPcPCW1NidnVuuueRNigVuRwREd +2004,5Ec4AhPVjsshXjh8ynp6MwaJTJBnen3pkHiiyDhHfie5VWkN,5Eg2fntJpc4bfLRHXnmBUav7hms6NC6vowNAEBDnYSfeMPCw +3356,5Ec4AhNrsmaczTwLDJqz1hg3jH2sfNqm5Uqgg6etH95Ayetd,5Eg2fnsfxVmX84fUmJo58M1rykiBNnts98V7w4BP9s6jqDpg +2019,5Ec4AhPYkChRKXcFJDz1FhAMun82pC3fDx33SKAiY89ctpT9,5Eg2fntMpvtKT8LPrDw6NLWBAFoLXc6mHbgUhGhDQrBBkFQ1 +3374,5Ec4AhNvUxZtLcdrzdT5V1BKUexNFsdxrGpU31czvRgd4351,5Eg2fnsjZgknUDN1YdQAbeX8j8dfyHh4uvTuHy9Vo9iBuoFM +3398,5Ec4AhP1HstEoUuEhivY7QX1oprMiY2uDL8BBZaV7UVtVNQ5,5Eg2fnspNc58w5dPFisdE3rq4JXfRx61GymcSX6yzCXTLogh +2052,5Ec4AhNn4d6h21Z1tr3QShv4nCY9bD37LnhvLBcuash1vHSs,5Eg2fnsb9MHb9cHASqzVZMFt2gDTJd6DQSMMb99QTbiamt6Z +2007,5Ec4AhPWLk3F66UZSgFGwVVWkCB35rrC3RPBs3BySbjzB588,5Eg2fntKRUE9DhChzgCN48qKzfrLoGuJ752d7ziUKKmZ2oqx +2056,5Ec4AhNns7KR6VGFBMxKDSUMAjBpAembjdbCrcH9x3ptq22p,5Eg2fnsbwqWKE5zPjMuQL5pARCs7t4phoHEe7ZoepmrTgd4J +3334,5Ec4AhNnU6NdZqXa9UKymfcVbNTiVSK4uqycnm2XGgKqzkKz,5Eg2fnsbYpZXhSFihUH4tJxJqr92CrNAyVd43iZ29QMQrVbc +3343,5Ec4AhNpGgsGEusqY8dXWKN8U4RTngiAoEy1UDWabKda31hC,5Eg2fnsdMR4ANWbz68accxhwiY6mW6mGrtcSjB35U3f8tbSD +3377,5Ec4AhNw5pjRtyRHTWtG4Z6XmYwcgxSL9QUvvq7ghJnXjSDS,5Eg2fnskAYvL2a9S1WqMBCSM22cvQNVSD48NBneBa2p6b4hv +3000,5Ec4AhPQ8esUzs1gsg6DiUp9q87vJgFNHhPmrXwYiU9FFR7H,5Eg2fntDDP4P8TjqRg3Jq89y5boE26JUMM3D7VU3bCAp76nc +1001,5Ec4AhPZwkVeRmswLWBsf7rxQ3cjzMKRWuVvffJ6Uuu89s1P,5Eg2fntP2UgYZNc5tW8xmmCmeXJ3hmNXaZ9MvcpbMdvh1bBJ +3408,5Ec4AhP3J6S3zgBJv1hp3Euin9UXA9N8CSLPVdE72Qqaka7b,5Eg2fnsrNpcx8GuTU1eu9tFY2d9psZREG5ypkakbu8s9cK5B +3336,5Ec4AhNnsLUzc5PBnjHSA2tdndnYnABK7GRG3yMeTGPnT4K1,5Eg2fnsbx4ftjg7LLjEXGgET37TrVaERAv4hJvt9KzRMJiWL +3373,5Ec4AhNvHLWhpVi4AzyMHpYFP2Hx7WhqkZbeQQTSL8eepki3,5Eg2fnsjN4hbx6SCizvSQTt4dVyFpvkwpDF5fMywCrgDgZWY +1002,5Ec4AhPa9NYpwtokA8fbrJW2VgHA8iFYccikJGTf5Cw6NqFT,5Eg2fntPE6jj5VXti8cgxwqqk9xTr8JegGNBZDz9wvxfEaAn +2042,5Ec4AhPdMVxbGGwpBgyjgurz9KMc8VWUVJ7vxFxe8svv6oCH,5Eg2fntSSE9VPsfxjgvpoZCoPo2uquZaYwmNDDV91bxUxEt7 +3361,5Ec4AhNsssrXb4aNKTEcycsQDSLxPBWNa2wnq8UhEcF27MVT,5Eg2fnsgxc3RifJWsTBi6GDDTv2G6bZUdgbE661C7LGaxpuk +2095,5Ec4AhNvgMTVM9SjCtbgjbQ6xP23njANaMDEUFi51W9hfAtf,5Eg2fnsjm5ePUkAsktYmrEjvCrhMW9DUdzrfjDEZtEBGWpe7 +3364,5Ec4AhNtUk259RMnnLfoZAncWLLCpGJjsAcFiwyP1VLvnihG,5Eg2fnshZUCyH25wLLctfp8Rkp1WXgMqvpFgyuVstDNVeMua +1000,5Ec4AhPZk8STuex8Wsi9TwDtJQxKqzPJRCH7348Xtcs9vZLJ,5Eg2fntNprdN3FgH4sfEaaZhYtddZQSQUqvYJ1f2mLtinVhV +2031,5Ec4AhPb9fMbYxjw9mijZtqD5N52YXF8QUgu1b9TdeZFcMRT,5Eg2fntQEPYVgZU5hmfpgYB2KqkLFwJEU8LLGYfxWNapU21z +3389,5Ec4AhNyVHPc8QYyK4czNkmNw8tcRHdoKw8nW76RnqCATA2U,5Eg2fnsna1aWG1H7s4a5VQ7CBcZv8hguPanDm4cvfZDjJizi +2087,5Ec4AhNu5P23CC2GdrmsC8HYBKiidqhPnfSfRQPaH9swr2b7,5Eg2fnsiA7CwKnkRBrixJmdMRoQ2MFkVrK66gMv59suWhjKi +2102,5Ec4AhNx5hqkyywNxHwn5ssbdoexoFhEGKkytVs19ZPVF12J,5Eg2fnsmAS2f7afXWHtsCXDQtHLGWfkLKyQR9TPW2HR46pMv +3401,5Ec4AhP1tk3nMqgfAcMigxSE6iqc9cqGWTne5P5AtMboAh4D,5Eg2fnspyUEgVSQoicJoobn3MCWus2tNa7S5LLbfm5dN2P2v +3395,5Ec4AhNzh1ihF87pEqVMXrboWvs7HTEXvCTiHk5oLbPyosy5,5Eg2fnsomjubNiqxnqSSeVwcmQYQzsHdyr79YhcJDKRYfPCL +3366,5Ec4AhNtsz8SBfDQRbdFwY4khbf36zAz4b3tzAJWC5QsEsZV,5Eg2fnshxiKLKFwYybaM4BQZx5LLpQE68EhLF7q14oSS6gLi +3399,5Ec4AhP1VVwRKbq3XMQGJbA5uTWmrty2K3LzpAk3hmXriGYa,5Eg2fnspaE8KTCZC5MMMREVu9wC5aK28NgzS58GYaVZRa3mZ +2016,5Ec4AhPY9LXsmAppqLYpg9F9ct8nP7FHvpNaYVg2mF3iD94p,5Eg2fntME4imtmYyPLVunnaxsMp66XJPzU21oTCXdy5H4pJp +3393,5Ec4AhNzHmcLCtGCbaXu9VKfKfYGzjNHin252XkgA1L3MYsR,5Eg2fnsoNVoELUzM9aUzG8fUa9Dai9RPnRfWHVHB2jMcDFnr +2037,5Ec4AhPcMPggfgJn5Yb6izfdfA3XQgqrzk1poE8qBQm4y4QU,5Eg2fntRS7saoH2vdYYBqe1Sudiq86ty4PfG4BfL48ndpk4X +3339,5Ec4AhNoUCeYASAcFcicjaor5XmoDEygQQ5iwnrLE9Vh8W5N,5Eg2fnscYvqSJ2tkocfhrE9fL1T6vf2nU3jACkNq6sXFyufK +2034,5Ec4AhPbkXX97KXMcf9v9SkRNG4Gyc3VhcMMuQe9QXfAHnrC,5Eg2fntQqFi3EvFWAf71G66Ecjjah26bmFzoANAeHFgj9Lia +2090,5Ec4AhNugFBakYoh6kD3mgCkUDhy4vVm5o78KDtG42yrXKwS,5Eg2fnsikyNUt9XqekA8tKYZihPGnLYs9SkZaBQkvm1RNvdh +1004,5Ec4AhPaYcfBz8fMoPd4EfnAgwbzRS7np3APZUnnFo12qEYk,5Eg2fntPdLr67jPWMPa9MK7ywRHJ8rAtsgoppSKH8X2bgiiV +3346,5Ec4AhNpsZ2ooGfG124i5sHLkxQiDmWY6NdUN31GNCjUiGZ1,5Eg2fnsdxHDhvsPQZ21oCWdA1S61wBZeA2GuczXmEvm3ZxHW +2041,5Ec4AhPd9suQkA21N4W1VjDv3ghBz8aMPau7Keo5YatwsSj1,5Eg2fntSEc6Jskk9v4T6cNZjJANVhYdTTEYYacKaRJvWjAY8 +3411,5Ec4AhP3txbbZ2xjNu8zcnpw53TmbEAVVZzrPSinoHwVS2Kb,5Eg2fnsrygnVgdgsvu65jSAkKX95JeDbZDeHeQFHg1y4HZEF +2012,5Ec4AhPXLrK9gh7bYpduuQgsEMV7ofWoXyVJ251nQ4uqJayU,5Eg2fntLRaW3pHqk6pb1242gUqARX5Zubd8jH2YHGnwQADmR +3397,5Ec4AhP16Fq4HMyRt6SovDswiCBwaB6n7cuMYxQvXBTvFznB,5Eg2fnspAz1xQxhaS6Pu2sDkxfsFHb9tBGYnouwRPuVV7cdu +1005,5Ec4AhPakEiNWFbAd26nRrREnaGQZo3uukPDC5xLr6314Dwg,5Eg2fntPpxuGdrKKB23sYVm433wiHD71yQ2eT3Uqip4ZuxdH +2047,5Ec4AhPeMcEVrsarHqNNeq4LdUfgrJB5yrE37HnT6M6mEFpq,5Eg2fntTSLRPzUJzqqKTmUQ9sxLzZiEC3VsUNFJwy58L61tZ +2043,5Ec4AhPdZ81mnPsd1KTTt6W4Ex22GrSbb1Lkas8CjAxtKyUX,5Eg2fntSdrCfuzbmZKQYzjqsVRhKzGVheezBqpehbtzTBYNj +3400,5Ec4AhP1h7zbqikrLyszVmoA16BC1Fu9QkZpSmucJ4ZpwPLL,5Eg2fnspmrBVyKUztyq5cR8yFZrVifxFUQDFhjS7AnbPnzeT +2058,5Ec4AhNoGMRn8j7rpcumbokVMzWeTNdqw42r7pcH8dtqH29G,5Eg2fnscM5cgGKr1NcrriT6JcUBxAngwzhgHNn8n1MvQ8tm4 +2091,5Ec4AhNussEmGfjVvNgmxrqpZrNPDHRtBWKwwq3peL1pkeKK,5Eg2fnsixbRfQGTeUNds5WBdpL3gvhUzF9yPCnaKX43Pc7Dk +3337,5Ec4AhNo4xYB8CJzcMmAMDXhtGSxvX7SCye5gaXD3ZRkgF5a,5Eg2fnsc9gj5Fo39AMiFTrsX8k8GdwAYGdHWwY3hvHTKXsPX +2093,5Ec4AhNvH7M8Jub7ZdeEME7xm7hDW1J8NvmbD3Nwpv5mCxVD,5Eg2fnsjMqY2SWKG7dbKTsTn1bNXDRMESaR2TzuShe7L4cZX +2026,5Ec4AhPa9Z5gxN6u3dL6bydrbCkwpiaWuvanrZKegBPQUXMk,5Eg2fntPEHGb5xq3bdHBicyfqgSFY8dcyaEE7Wr9YuQyLLX4 +3388,5Ec4AhNyHfLRcHdAVS9GBa8JqWECGvhgEDuxsVvsCYACE2sw,5Eg2fnsnNPXKjtMK3S6MJDU85yuVzLknHsZQ8TTN5GBm5PtP +2049,5Ec4AhNmTkw9TembRxcDs9zrVJYuA8Ek3f3TSN8Dozb7Eq4H,5Eg2fnsaYV83bFVjyxZJyoLfjnECsYHr7JgthKeigicg6aRH +3404,5Ec4AhP2VcDKvCU5dVnuGWMSPcprahddobT6yCZrfEhhrA3Y,5Eg2fnsqaLQE3oCEBVjzP9hFe6WAJ7gjsF6YEA6MXxjGhfGg +3403,5Ec4AhP2HzA9Q5YGosKB5KiNHzASSLhWhtEHLbQJ4wfjcrTX,5Eg2fnsqNiM3XgGRMsGGBy4BYTqk9kkcmXsibYvnwfhJUf6j +3407,5Ec4AhP36UNsUZFW6PE5r4GegWp71nS16j7Zs24YS7ocXMfP,5Eg2fnsrBCZmc9yeePBAxhcTvzVQjCV7ANm17yb3JqqBNu8p +3406,5Ec4AhP2trKgxSKhGkkMesdaat9gsRVt11tkEQtyqpmeJ8Hz,5Eg2fnsqyaWb633qpkhSmWyPqMpzaqYz4fYBVNRUiYoD9yqF +2101,5Ec4AhNwt5naTs1a8fU3thEXYAzYetm7AcYAFthSZGMX248D,5Eg2fnskxoyUbTjigfR91LaLnefrNJpDEGBbWrDwRzP5shQq +3354,5Ec4AhNrUXUFxE5ia3tXdLPuY1i3NeyWt4Q3QtKm6Z1EXL4e,5Eg2fnsfZFfA5pos83qcjyjinVPM652cwi3UfqrFyH2oNycW +2003,5Ec4AhPVYFpX1cmLAALNAkwEMfXNWR7heaVuLcXj5Rc7GY2i,5Eg2fntJcz1R9DVUiAHTHQH3c9CgDqAoiE9Lba4Dx9dg892X +2006,5Ec4AhPW97z4ZyYkd3mYkJrSeZWcwVv4wiANES2QrJi1x17F,5Eg2fntKDrAxhaGuB3idrxCFu3BveuyB1MooVPYuj2jaoSsw +3412,5Ec4AhP46aen59tYCXcioyU1Ag8Bjb6cbHDg23tMPayTfC5e,5Eg2fnssBJqgCkcgkXZovcopR9oVT19ievs7H1QrGK12Wdre +2013,5Ec4AhPXYUNLCp3QNT7e6bKwKz9Xx2Svdgi7egBLzMwoXqcD,5Eg2fntLdCZELQmYvT4jDEfkaTpqfSW2hLMYudhqs5yNPMzV +3413,5Ec4AhP4JChxbGpM2A6T1A75GJnbsx2jgzSVef3uyt1RtF6B,5Eg2fnssNvtrisYVaA3Y7oStWnTubN5qke5vucaQrc2zjhfF From 9d702515137af32d0b41dd8e54cb48223ef916ed Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Tue, 18 Feb 2025 12:29:31 +0100 Subject: [PATCH 5/8] docs Signed-off-by: Oliver Tale-Yazdi --- Cargo.lock | 1 + integration-tests/ahm/Cargo.toml | 1 + integration-tests/ahm/src/tests.rs | 36 +-- pallets/rc-migrator/src/accounts.rs | 6 +- .../src/sovereign_account_translation.csv | 208 +++++++++--------- 5 files changed, 132 insertions(+), 120 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f89e9e7c84..f29528f2e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10083,6 +10083,7 @@ dependencies = [ "pallet-message-queue", "pallet-rc-migrator", "parachains-common", + "parity-scale-codec", "polkadot-parachain-primitives", "polkadot-primitives 16.0.0", "polkadot-runtime", diff --git a/integration-tests/ahm/Cargo.toml b/integration-tests/ahm/Cargo.toml index edd1aaadfa..ee2b78fc34 100644 --- a/integration-tests/ahm/Cargo.toml +++ b/integration-tests/ahm/Cargo.toml @@ -38,3 +38,4 @@ 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 d3c651dc0e..19a7db6a3f 100644 --- a/integration-tests/ahm/src/tests.rs +++ b/integration-tests/ahm/src/tests.rs @@ -40,6 +40,7 @@ use polkadot_runtime_common::paras_registrar; use sp_runtime::AccountId32; use std::str::FromStr; use xcm_emulator::ConvertLocation; +use std::collections::BTreeMap; use super::mock::*; @@ -135,7 +136,7 @@ fn sovereign_account_translation() { let rc_acc = AccountId32::from_str(rc_acc).unwrap(); let ah_acc = AccountId32::from_str(ah_acc).unwrap(); - let translated = pallet_rc_migrator::accounts::AccountsMigrator::::try_translate_rc_sovereign_to_ah(rc_acc).unwrap().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); } @@ -161,32 +162,37 @@ fn sovereign_account_translation() { async fn print_sovereign_account_translation() { let (mut rc, mut ah) = load_externalities().await.unwrap(); - let mut rc_accounts = Vec::new(); - let mut ah_accounts = Vec::new(); + let mut rc_to_ah = BTreeMap::new(); - let paras = rc.execute_with(|| { - let paras = paras_registrar::Paras::::iter_keys().collect::>(); - - for para_id in paras.clone() { + 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(); - rc_accounts.push(rc_acc.clone()); - let ah_acc = pallet_rc_migrator::accounts::AccountsMigrator::::try_translate_rc_sovereign_to_ah(rc_acc).unwrap().unwrap(); - ah_accounts.push(ah_acc); + 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)); } - paras + 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_accounts.len()); + println!("Translating {} RC accounts to AH", rc_to_ah.len()); ah.execute_with(|| { - for (i, (rc_acc, ah_acc)) in rc_accounts.iter().zip(ah_accounts.iter()).enumerate() { - println!("[{}] {} -> {}", paras[i], rc_acc, ah_acc); + for (rc_acc, (ah_acc, para_id)) in rc_to_ah.iter() { + println!("[{}] {} -> {}", para_id, rc_acc, ah_acc); - csv.push_str(&format!("{},{},{}\n", paras[i], rc_acc, ah_acc)); + csv.push_str(&format!("{},{},{}\n", para_id, rc_acc, ah_acc)); } }); diff --git a/pallets/rc-migrator/src/accounts.rs b/pallets/rc-migrator/src/accounts.rs index adc65bd7d1..1260936078 100644 --- a/pallets/rc-migrator/src/accounts.rs +++ b/pallets/rc-migrator/src/accounts.rs @@ -549,9 +549,9 @@ impl AccountsMigrator { /// /// Returns: /// - `Ok(None)` if the account is not a Parachain sovereign account - /// - `Ok(Some(ah_account))` with the translated account + /// - `Ok(Some((ah_account, para_id)))` with the translated account and the para id /// - `Err(())` otherwise - pub fn try_translate_rc_sovereign_to_ah(acc: T::AccountId) -> Result, ()> { + pub fn try_translate_rc_sovereign_to_ah(acc: T::AccountId) -> Result, ()> { let raw = acc.to_raw_vec(); // Must start with "para" @@ -570,6 +570,6 @@ impl AccountsMigrator { ah_raw[4..6].copy_from_slice(¶_id.encode()); let ah_acc = ah_raw.try_into().map_err(|_| ()).defensive()?; - Ok(Some(ah_acc)) + 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 index 6099f1339f..d834afb018 100644 --- a/pallets/rc-migrator/src/sovereign_account_translation.csv +++ b/pallets/rc-migrator/src/sovereign_account_translation.csv @@ -1,121 +1,125 @@ para,rc,ah -2094,5Ec4AhNvUjQJq2WvPG7xYQm2rkMdeNEFUdzQqeYWRD7jRyfD,5Eg2fnsjZTbCxdF4wG53f46r7E2wMnHMYHdr6c51Hw9JHShS -2097,5Ec4AhNw5bZrPPJLr9Z97xgF9eLt5T2cmmesjU3CC6De7DDB,5Eg2fnskAKkkWz2VQ9WEEc24Q82Bns5iqRJJzRZh4pFCy62B -2028,5Ec4AhPaYoC3zbxWgtHYzLuznU5n7SSm7M2S7memrmTLvifY,5Eg2fntPdXNx8CgfEtEe6zFp2wm5prVsAzfsNjBGjVUunTSX -2040,5Ec4AhPcxFrEE36CYS2HJYaqx42mqmeEHsgHh3dWxHryeNKs,5Eg2fntS2z38MdpM6RyNRBvfCXi5ZBhLMXKix1A1q1tYW66u -2038,5Ec4AhPcZ1jsBoEauB4pvBJhknhwZ3mz6TEeRqJPmho3C6LN,5Eg2fntRdjvmKPxjTB1v2peX1GPFGTq6A6t5gnpteRpc3ryZ -2010,5Ec4AhPWwcCneTFyuZgTX3Qj36AHWweZLZ3ekrgfDUqtrbFU,5Eg2fntL2LPgn3z8TZdYdgkYHZqbEMhfQCh61pDA6CsThxfG -2035,5Ec4AhPbx9aKdSTASHdeLdPVTtih7xycoKaBY1ohzph8Wgo9,5Eg2fntR2smDm3BJzHajTGjJiNPzqP2iryDcnyLCsYihNQk3 -3405,5Ec4AhP2hEGWSKPtT8GdTgzWVFVGj4ZkuJfvbojRFXjg5JAE,5Eg2fnsqmxTQZv8318DiaLLKjjAaSUcrxxKMrmFv8FmEvpp1 -2009,5Ec4AhPWjz9c8LLB5wCjKrmewTVsNaiSEqpq8FX6dBovdD75,5Eg2fntKpiLWFw4Kdw9pSW7UBwBB5zmYJVUGPD3bVuqVUsrN -3344,5Ec4AhNpUJvSm2oeMm7FhW1CZh5sw3eHtxBq6pg9BcfYG6rW,5Eg2fnsdZ37LtdXnum4Lp9M1pAmBeThPxbqGMnCe4Lh77jdD -3352,5Ec4AhNr5HMtuzE6vnw5Ey7mLkPD5w7GgdxQ9fzduxwJ55r9,5Eg2fnsfA1Yo3axFUntAMcTabE4WoMANkHbqQdX8ngxrvjZy -3370,5Ec4AhNugUMAG8vdi7YAiGd368JhgRuUTRwBWaxkZFYk9Pua,5Eg2fnsimCY4PjenG7VFpuxrLbz1PqxaX5acmYVFRyaK187n -3367,5Ec4AhNu5cBchn9DFE6z8ihpoEKTFM77AJGicmU4nNSqTuxN,5Eg2fnsiALNWqNsMoE45FN3e3hzkxmADDwv9sizZf6UQKZd1 -2086,5Ec4AhNtskxrg56TpEJ8zweU5h4JVUmGgxDqnoE1grqycu6q,5Eg2fnshxV9kofpcNEFE7azHLAjcCtpNkbsH3kkWZasYUVKs -2032,5Ec4AhPbMHQn55fjyQCTm5UHAzjSgtBFWBuieCK2DwbDqGSG,5Eg2fntQS1bgCgPtXQ9Ysip6RUQkQJEMZqZ9u9qX6fcnhB4H -2021,5Ec4AhPZ9SonMmTrwUwTe4SW73Ss6uuuRNUghXVqiiDZM2sh,5Eg2fntNEAzgVNC1VUtYkhnKMX8ApKy1V287xV2LbSF8CWXb -3333,5Ec4AhNnGUKT3ibmKqrFaUyRVjoJM5Nwp8koA9rxgPHsmUom,5Eg2fnsbMCWMBKKusqoLh8KEkDUc4VS3snQER7PTZ7KSdCJL -2020,5Ec4AhPYwpkbqeY47rTjSsoS1QnSxYynKfFs4vLH8RBb7mDs,5Eg2fntN2YwVyFGCfrQpZX9FFtTkfy2tPJuJKsrn19D9ySnb -2051,5Ec4AhNms13WVtdD5DZgFXGzgZsjSr6zF5V6haTLzaf3h7Wo,5Eg2fnsawjEQdVMMdDWmNAcow3Z3AGA6Jj8XxXyqsJgcZ15F -2106,5Ec4AhNxtC4V4TecEorgrcRt2LJdNhRifAeGQvXFWjXN9dwk,5Eg2fnsmxvFPC4NknoomyFmhGoyw67UpipHhft3kPTYw17UP -2039,5Ec4AhPckdo3hvAPioYZ7MwmrRNMhQi7CATU4STxMzq1RSrA,5Eg2fntRqMywqWtYGoVeE1Hb6u3fQpmDFp6uKPzTEiraGrq1 -3369,5Ec4AhNuUrHyk1zptV4SX5yxzVeHY4yMMiiMsyoBxxWmvVKj,5Eg2fnsiZaUssciySV1XdjKnEyKbFV2TRNMo8wKgqgYLn4RB -2001,5Ec4AhPV91i9yNuiWuNunPf6AQCYDhFTTA4G5QCbtqYApH9E,5Eg2fntJDju46yds4uKzu2zuQssqw7JZWohhLMj6mZZjg2pK -3414,5Ec4AhP4Vpm97Pk9qnaBCLk9MwT22JxrnhfKHGDUaB3Q7UJs,5Eg2fnssaYx3EzUJPnXGJz5xcR8Kjj1xrMJkYDjySu4xxsQ4 -3409,5Ec4AhP3ViVEWo77jeBYERYnsn8wJWJFJ9ZD8EPfchsYyYSV,5Eg2fnsraSg8ePqGHe8dM4tc8FpF1vMMMoCePBvAVRu7qDbw -3342,5Ec4AhNp54p5inx2iW9oK8j4NRm3eKn3hXkBqcM212bbotL6,5Eg2fnsd9nzyrPgBGW6tRn4scuSMMjq9mBPd6ZsWskdAfVwc -2027,5Ec4AhPaMB8sUV2hsFopoAGvgqRMy5We1docVAVDGURNhcqb,5Eg2fntPRuKmc5krRFkuuocjwK6fgVZk5HT3k81i9CSwZXpF -2008,5Ec4AhPWYN6RcDQNGJj18g8aqpqTEDnK98c1VeMY2tmxQGnq,5Eg2fntKd6HKjp8WpJg6FKUQ6JWkwdqRCnFSkbt2ucoXFitU -2025,5Ec4AhPZww2WSFB6DzrNQnznVa6XgMePpDMyDxA65tMSFVpp,5Eg2fntP2fDQZquEmzoTXSLbk3mqPmhVss1QUugaxcP174FB -2000,5Ec4AhPUwPeyTFyuhGuBbD224mY85LKLMSqSSo33JYWCazU4,5Eg2fntJ27qsari4FGrGhrMqKFDRnkNSR6UshkZYBGXmSuC8 +0,5Ec4AhNmFmpEvbFUqLoWAd68CcvudkegML6YhBEg1keWpPaf,5Eg2fnsaLW194BydPLkbHGRwT6cDMAhnQyjyx8mAtUg5g6ei 2048,5Ec4AhNmG8sxwXqncL8VfyMnPftV1mJcwwpdokxfDhZ91zK2,5Eg2fnsaLs4s58ZwAL5anchbe9ZnjBMj1bU54iVA6Rahsb2S -3375,5Ec4AhNvgad4rjZfpFvogBpPaHcnQEa5wz3HfcnZWiibGyyY,5Eg2fnsjmJoxzLHpNFstnqACpmJ67edC1dgivaK4PSkA8sQY -2092,5Ec4AhNv5VHwnnfJk1AWA3UtfV2oMeN1HDYmaSDPEd3nyXW4,5Eg2fnsjADUqvPPTJ17bGgphuxi754R7LsCCqPjt7M5MqVKB -2002,5Ec4AhPVLdmLVVqXLXrdyaJAG2rxN4BaYsH5i1NAV8a93XWr,5Eg2fntJRMxEd6ZftXoj6DdyWWYG5UEgcWvWxxtfMrbhu9Bg -2005,5Ec4AhPVwVvt3rcwoRHpZ8DNYvrCo8ywqzwYbprrG1g3ixrm,5Eg2fntK2E7nBTM6MREufmZBoQXWWZ33ueayrnPM8jhcaYgp -2055,5Ec4AhNnfVGEaNLSMjUb2FqH56XQ2HqUdvNPE17bMknvbf6x,5Eg2fnsbkDT8hy4aujRg8uB6KaChjhtaha1pUxe6EUpVTGFb -3353,5Ec4AhNrGuR5S79ukRQoS9kqSP3dEJ3PnMBDnHACWFyGJ8BP,5Eg2fnsfMdbyZht4JRMtYo6egrivwi6Vqzpf3EghNyzq9sPP -3360,5Ec4AhNsgFoM4weZVpktnSEL7ogYEpaFUKiyCXK8eKD3tAgY,5Eg2fnsgkyzFCYNi3phyu5a9NHMqxEdMXyNQTUqdX3EcjpTx -3359,5Ec4AhNsUdkAYpikgCHAbFbG2B286Te8NcW9Zv9a42B5fAxp,5Eg2fnsgZMw4gRSuECEFhtw5GehRoshESG9apsg4vkCeWbPd -2030,5Ec4AhPax3JR2qp8L9F1NiC8yjQcQAK1JmU5Nyyu3MXHPCmc,5Eg2fntQ2mVKASYGt9C6VMXxED5v7aN7NR7WdwWPv5YrEjkb -3378,5Ec4AhNwHSncR6M6H9MzFjjbsBc2qKNTF7hkZSHFHbpVxQe9,5Eg2fnskNAyWYh5Eq9K5NP5R7fHLYjRZJmMBpPokAKr4p9Zs -3358,5Ec4AhNsH1gz2hnwrZoSQ4xBvYMhx6i1GuHKwJz1Tj97RsyG,5Eg2fnsgMjstAJX6QZkXWiJ1B231fWm7LYvmCGWWLTAgHR3q -2104,5Ec4AhNxUwx82DnzbYuEUF9jq4yo5yZUTkCd9iC8L9TRhRhW,5Eg2fnsmZg929pX99YrKatVZ5Yf6oPcaXPr4QfidCsUzZ5Ye +2049,5Ec4AhNmTkw9TembRxcDs9zrVJYuA8Ek3f3TSN8Dozb7Eq4H,5Eg2fnsaYV83bFVjyxZJyoLfjnECsYHr7JgthKeigicg6aRH +2050,5Ec4AhNmfNzKymhQFb5x4LdvawDKJVAs9NGH4yHnQHd5U6Af,5Eg2fnsak7BE7NRYob33AyyjqQtd1uDyD1uiKvpHH1eeKrjD +2051,5Ec4AhNms13WVtdD5DZgFXGzgZsjSr6zF5V6haTLzaf3h7Wo,5Eg2fnsawjEQdVMMdDWmNAcow3Z3AGA6Jj8XxXyqsJgcZ15F +2052,5Ec4AhNn4d6h21Z1tr3QShv4nCY9bD37LnhvLBcuash1vHSs,5Eg2fnsb9MHb9cHASqzVZMFt2gDTJd6DQSMMb99QTbiamt6Z 2053,5Ec4AhNnGF9sY8UpiUX8dtZ8sqCZjZyESVvjxnnUBAiz9cfC,5Eg2fnsbLyLmfjCyGUUDkXtx8JssSz2LW9aBDkJy3tkZ1EmG -2046,5Ec4AhPe9zBKLkf3UCteTeRGXr1GhwExt91DUgctW44o18mb,5Eg2fntTEiNDUMPC2CqjaHm5nKgaRMJ4wneeje9PNn6Ms2cM -2015,5Ec4AhPXwiUhF3u21i56Uxc5XFUNEkKAq79kutWUAx1jyz47,5Eg2fntM2SfbNedAZi2Bbbwtmj9fxANGtkoCAr2y3g3JqoH4 -3345,5Ec4AhNpfvydH9jTBPaytgeGfKkJ5QaQzfQejRqhmuhWV6jh,5Eg2fnsdkfAXQkTbjPY51Kz5uoRbnpdX4K45zPNCedj5LtwL +3333,5Ec4AhNnGUKT3ibmKqrFaUyRVjoJM5Nwp8koA9rxgPHsmUom,5Eg2fnsbMCWMBKKusqoLh8KEkDUc4VS3snQER7PTZ7KSdCJL 2054,5Ec4AhNnTsD44FQdY6zrq5CCyTrysvuMYD9ZbPx2mTkxNmUj,5Eg2fnsbYbPxBr8n66wwwiY2DwYHbLxTbrnzrMUXeBnXE9rk -3340,5Ec4AhNofphigZ6R5FCLvmSvBASDMbuoW7JYaQ1tpSXfMWCr,5Eg2fnsckYtcp9pZdF9S3QnjRe7X51xuZkwyqMYPhAZECytb -3396,5Ec4AhNztdmsmF3d4Ty5j3EscZXXRpAf1ugXvMFMvtRx2sDy,5Eg2fnsoyMxmtqmmcTvAqgags3Cq9EDm5ZKyBJmrocTWtjjA -2018,5Ec4AhPYYaeEoQgSUbWH4WXHp9Tcfq7Y8EpDoi19wq7efgpT,5Eg2fntMdJq8w1Qb2bTNB9s74d8vPFAeBtTf4fXepZ9DXG9Z -2017,5Ec4AhPYLxb4HHkdey2YsKtDiWoCXUBR2XbQB6qbMY5gSL9P,5Eg2fntMRgmxQtUnCxydyyE2xzUWEtEX6BEqS4N6EG7FJ18T +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 -3372,5Ec4AhNv5iTXJNnFMNVd6duBHPdXy9mierNpmoHsjqcgbtQs,5Eg2fnsjASeRRyWPuNSiDHEzXsJqgZppiW2G2kpNcZeFTKJf -2011,5Ec4AhPX9EFyAaBnjCABiE3o8iphfJagSGGUPTrDomss5bxQ,5Eg2fntLDxSsJAuwHC7GpsPcPCW1NidnVuuueRNigVuRwREd -2004,5Ec4AhPVjsshXjh8ynp6MwaJTJBnen3pkHiiyDhHfie5VWkN,5Eg2fntJpc4bfLRHXnmBUav7hms6NC6vowNAEBDnYSfeMPCw -3356,5Ec4AhNrsmaczTwLDJqz1hg3jH2sfNqm5Uqgg6etH95Ayetd,5Eg2fnsfxVmX84fUmJo58M1rykiBNnts98V7w4BP9s6jqDpg -2019,5Ec4AhPYkChRKXcFJDz1FhAMun82pC3fDx33SKAiY89ctpT9,5Eg2fntMpvtKT8LPrDw6NLWBAFoLXc6mHbgUhGhDQrBBkFQ1 -3374,5Ec4AhNvUxZtLcdrzdT5V1BKUexNFsdxrGpU31czvRgd4351,5Eg2fnsjZgknUDN1YdQAbeX8j8dfyHh4uvTuHy9Vo9iBuoFM -3398,5Ec4AhP1HstEoUuEhivY7QX1oprMiY2uDL8BBZaV7UVtVNQ5,5Eg2fnspNc58w5dPFisdE3rq4JXfRx61GymcSX6yzCXTLogh -2052,5Ec4AhNn4d6h21Z1tr3QShv4nCY9bD37LnhvLBcuash1vHSs,5Eg2fnsb9MHb9cHASqzVZMFt2gDTJd6DQSMMb99QTbiamt6Z -2007,5Ec4AhPWLk3F66UZSgFGwVVWkCB35rrC3RPBs3BySbjzB588,5Eg2fntKRUE9DhChzgCN48qKzfrLoGuJ752d7ziUKKmZ2oqx -2056,5Ec4AhNns7KR6VGFBMxKDSUMAjBpAembjdbCrcH9x3ptq22p,5Eg2fnsbwqWKE5zPjMuQL5pARCs7t4phoHEe7ZoepmrTgd4J -3334,5Ec4AhNnU6NdZqXa9UKymfcVbNTiVSK4uqycnm2XGgKqzkKz,5Eg2fnsbYpZXhSFihUH4tJxJqr92CrNAyVd43iZ29QMQrVbc +3342,5Ec4AhNp54p5inx2iW9oK8j4NRm3eKn3hXkBqcM212bbotL6,5Eg2fnsd9nzyrPgBGW6tRn4scuSMMjq9mBPd6ZsWskdAfVwc 3343,5Ec4AhNpGgsGEusqY8dXWKN8U4RTngiAoEy1UDWabKda31hC,5Eg2fnsdMR4ANWbz68accxhwiY6mW6mGrtcSjB35U3f8tbSD -3377,5Ec4AhNw5pjRtyRHTWtG4Z6XmYwcgxSL9QUvvq7ghJnXjSDS,5Eg2fnskAYvL2a9S1WqMBCSM22cvQNVSD48NBneBa2p6b4hv -3000,5Ec4AhPQ8esUzs1gsg6DiUp9q87vJgFNHhPmrXwYiU9FFR7H,5Eg2fntDDP4P8TjqRg3Jq89y5boE26JUMM3D7VU3bCAp76nc -1001,5Ec4AhPZwkVeRmswLWBsf7rxQ3cjzMKRWuVvffJ6Uuu89s1P,5Eg2fntP2UgYZNc5tW8xmmCmeXJ3hmNXaZ9MvcpbMdvh1bBJ -3408,5Ec4AhP3J6S3zgBJv1hp3Euin9UXA9N8CSLPVdE72Qqaka7b,5Eg2fnsrNpcx8GuTU1eu9tFY2d9psZREG5ypkakbu8s9cK5B -3336,5Ec4AhNnsLUzc5PBnjHSA2tdndnYnABK7GRG3yMeTGPnT4K1,5Eg2fnsbx4ftjg7LLjEXGgET37TrVaERAv4hJvt9KzRMJiWL -3373,5Ec4AhNvHLWhpVi4AzyMHpYFP2Hx7WhqkZbeQQTSL8eepki3,5Eg2fnsjN4hbx6SCizvSQTt4dVyFpvkwpDF5fMywCrgDgZWY -1002,5Ec4AhPa9NYpwtokA8fbrJW2VgHA8iFYccikJGTf5Cw6NqFT,5Eg2fntPE6jj5VXti8cgxwqqk9xTr8JegGNBZDz9wvxfEaAn -2042,5Ec4AhPdMVxbGGwpBgyjgurz9KMc8VWUVJ7vxFxe8svv6oCH,5Eg2fntSSE9VPsfxjgvpoZCoPo2uquZaYwmNDDV91bxUxEt7 +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 -2095,5Ec4AhNvgMTVM9SjCtbgjbQ6xP23njANaMDEUFi51W9hfAtf,5Eg2fnsjm5ePUkAsktYmrEjvCrhMW9DUdzrfjDEZtEBGWpe7 3364,5Ec4AhNtUk259RMnnLfoZAncWLLCpGJjsAcFiwyP1VLvnihG,5Eg2fnshZUCyH25wLLctfp8Rkp1WXgMqvpFgyuVstDNVeMua -1000,5Ec4AhPZk8STuex8Wsi9TwDtJQxKqzPJRCH7348Xtcs9vZLJ,5Eg2fntNprdN3FgH4sfEaaZhYtddZQSQUqvYJ1f2mLtinVhV -2031,5Ec4AhPb9fMbYxjw9mijZtqD5N52YXF8QUgu1b9TdeZFcMRT,5Eg2fntQEPYVgZU5hmfpgYB2KqkLFwJEU8LLGYfxWNapU21z -3389,5Ec4AhNyVHPc8QYyK4czNkmNw8tcRHdoKw8nW76RnqCATA2U,5Eg2fnsna1aWG1H7s4a5VQ7CBcZv8hguPanDm4cvfZDjJizi -2087,5Ec4AhNu5P23CC2GdrmsC8HYBKiidqhPnfSfRQPaH9swr2b7,5Eg2fnsiA7CwKnkRBrixJmdMRoQ2MFkVrK66gMv59suWhjKi -2102,5Ec4AhNx5hqkyywNxHwn5ssbdoexoFhEGKkytVs19ZPVF12J,5Eg2fnsmAS2f7afXWHtsCXDQtHLGWfkLKyQR9TPW2HR46pMv -3401,5Ec4AhP1tk3nMqgfAcMigxSE6iqc9cqGWTne5P5AtMboAh4D,5Eg2fnspyUEgVSQoicJoobn3MCWus2tNa7S5LLbfm5dN2P2v -3395,5Ec4AhNzh1ihF87pEqVMXrboWvs7HTEXvCTiHk5oLbPyosy5,5Eg2fnsomjubNiqxnqSSeVwcmQYQzsHdyr79YhcJDKRYfPCL +2086,5Ec4AhNtskxrg56TpEJ8zweU5h4JVUmGgxDqnoE1grqycu6q,5Eg2fnshxV9kofpcNEFE7azHLAjcCtpNkbsH3kkWZasYUVKs 3366,5Ec4AhNtsz8SBfDQRbdFwY4khbf36zAz4b3tzAJWC5QsEsZV,5Eg2fnshxiKLKFwYybaM4BQZx5LLpQE68EhLF7q14oSS6gLi -3399,5Ec4AhP1VVwRKbq3XMQGJbA5uTWmrty2K3LzpAk3hmXriGYa,5Eg2fnspaE8KTCZC5MMMREVu9wC5aK28NgzS58GYaVZRa3mZ -2016,5Ec4AhPY9LXsmAppqLYpg9F9ct8nP7FHvpNaYVg2mF3iD94p,5Eg2fntME4imtmYyPLVunnaxsMp66XJPzU21oTCXdy5H4pJp -3393,5Ec4AhNzHmcLCtGCbaXu9VKfKfYGzjNHin252XkgA1L3MYsR,5Eg2fnsoNVoELUzM9aUzG8fUa9Dai9RPnRfWHVHB2jMcDFnr -2037,5Ec4AhPcMPggfgJn5Yb6izfdfA3XQgqrzk1poE8qBQm4y4QU,5Eg2fntRS7saoH2vdYYBqe1Sudiq86ty4PfG4BfL48ndpk4X -3339,5Ec4AhNoUCeYASAcFcicjaor5XmoDEygQQ5iwnrLE9Vh8W5N,5Eg2fnscYvqSJ2tkocfhrE9fL1T6vf2nU3jACkNq6sXFyufK -2034,5Ec4AhPbkXX97KXMcf9v9SkRNG4Gyc3VhcMMuQe9QXfAHnrC,5Eg2fntQqFi3EvFWAf71G66Ecjjah26bmFzoANAeHFgj9Lia +2087,5Ec4AhNu5P23CC2GdrmsC8HYBKiidqhPnfSfRQPaH9swr2b7,5Eg2fnsiA7CwKnkRBrixJmdMRoQ2MFkVrK66gMv59suWhjKi +3367,5Ec4AhNu5cBchn9DFE6z8ihpoEKTFM77AJGicmU4nNSqTuxN,5Eg2fnsiALNWqNsMoE45FN3e3hzkxmADDwv9sizZf6UQKZd1 +3369,5Ec4AhNuUrHyk1zptV4SX5yxzVeHY4yMMiiMsyoBxxWmvVKj,5Eg2fnsiZaUssciySV1XdjKnEyKbFV2TRNMo8wKgqgYLn4RB 2090,5Ec4AhNugFBakYoh6kD3mgCkUDhy4vVm5o78KDtG42yrXKwS,5Eg2fnsikyNUt9XqekA8tKYZihPGnLYs9SkZaBQkvm1RNvdh -1004,5Ec4AhPaYcfBz8fMoPd4EfnAgwbzRS7np3APZUnnFo12qEYk,5Eg2fntPdLr67jPWMPa9MK7ywRHJ8rAtsgoppSKH8X2bgiiV -3346,5Ec4AhNpsZ2ooGfG124i5sHLkxQiDmWY6NdUN31GNCjUiGZ1,5Eg2fnsdxHDhvsPQZ21oCWdA1S61wBZeA2GuczXmEvm3ZxHW -2041,5Ec4AhPd9suQkA21N4W1VjDv3ghBz8aMPau7Keo5YatwsSj1,5Eg2fntSEc6Jskk9v4T6cNZjJANVhYdTTEYYacKaRJvWjAY8 -3411,5Ec4AhP3txbbZ2xjNu8zcnpw53TmbEAVVZzrPSinoHwVS2Kb,5Eg2fnsrygnVgdgsvu65jSAkKX95JeDbZDeHeQFHg1y4HZEF -2012,5Ec4AhPXLrK9gh7bYpduuQgsEMV7ofWoXyVJ251nQ4uqJayU,5Eg2fntLRaW3pHqk6pb1242gUqARX5Zubd8jH2YHGnwQADmR -3397,5Ec4AhP16Fq4HMyRt6SovDswiCBwaB6n7cuMYxQvXBTvFznB,5Eg2fnspAz1xQxhaS6Pu2sDkxfsFHb9tBGYnouwRPuVV7cdu -1005,5Ec4AhPakEiNWFbAd26nRrREnaGQZo3uukPDC5xLr6314Dwg,5Eg2fntPpxuGdrKKB23sYVm433wiHD71yQ2eT3Uqip4ZuxdH -2047,5Ec4AhPeMcEVrsarHqNNeq4LdUfgrJB5yrE37HnT6M6mEFpq,5Eg2fntTSLRPzUJzqqKTmUQ9sxLzZiEC3VsUNFJwy58L61tZ -2043,5Ec4AhPdZ81mnPsd1KTTt6W4Ex22GrSbb1Lkas8CjAxtKyUX,5Eg2fntSdrCfuzbmZKQYzjqsVRhKzGVheezBqpehbtzTBYNj -3400,5Ec4AhP1h7zbqikrLyszVmoA16BC1Fu9QkZpSmucJ4ZpwPLL,5Eg2fnspmrBVyKUztyq5cR8yFZrVifxFUQDFhjS7AnbPnzeT -2058,5Ec4AhNoGMRn8j7rpcumbokVMzWeTNdqw42r7pcH8dtqH29G,5Eg2fnscM5cgGKr1NcrriT6JcUBxAngwzhgHNn8n1MvQ8tm4 +3370,5Ec4AhNugUMAG8vdi7YAiGd368JhgRuUTRwBWaxkZFYk9Pua,5Eg2fnsimCY4PjenG7VFpuxrLbz1PqxaX5acmYVFRyaK187n 2091,5Ec4AhNussEmGfjVvNgmxrqpZrNPDHRtBWKwwq3peL1pkeKK,5Eg2fnsixbRfQGTeUNds5WBdpL3gvhUzF9yPCnaKX43Pc7Dk -3337,5Ec4AhNo4xYB8CJzcMmAMDXhtGSxvX7SCye5gaXD3ZRkgF5a,5Eg2fnsc9gj5Fo39AMiFTrsX8k8GdwAYGdHWwY3hvHTKXsPX +2092,5Ec4AhNv5VHwnnfJk1AWA3UtfV2oMeN1HDYmaSDPEd3nyXW4,5Eg2fnsjADUqvPPTJ17bGgphuxi754R7LsCCqPjt7M5MqVKB +3372,5Ec4AhNv5iTXJNnFMNVd6duBHPdXy9mierNpmoHsjqcgbtQs,5Eg2fnsjASeRRyWPuNSiDHEzXsJqgZppiW2G2kpNcZeFTKJf 2093,5Ec4AhNvH7M8Jub7ZdeEME7xm7hDW1J8NvmbD3Nwpv5mCxVD,5Eg2fnsjMqY2SWKG7dbKTsTn1bNXDRMESaR2TzuShe7L4cZX -2026,5Ec4AhPa9Z5gxN6u3dL6bydrbCkwpiaWuvanrZKegBPQUXMk,5Eg2fntPEHGb5xq3bdHBicyfqgSFY8dcyaEE7Wr9YuQyLLX4 +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 -2049,5Ec4AhNmTkw9TembRxcDs9zrVJYuA8Ek3f3TSN8Dozb7Eq4H,5Eg2fnsaYV83bFVjyxZJyoLfjnECsYHr7JgthKeigicg6aRH -3404,5Ec4AhP2VcDKvCU5dVnuGWMSPcprahddobT6yCZrfEhhrA3Y,5Eg2fnsqaLQE3oCEBVjzP9hFe6WAJ7gjsF6YEA6MXxjGhfGg +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 -3407,5Ec4AhP36UNsUZFW6PE5r4GegWp71nS16j7Zs24YS7ocXMfP,5Eg2fnsrBCZmc9yeePBAxhcTvzVQjCV7ANm17yb3JqqBNu8p +3404,5Ec4AhP2VcDKvCU5dVnuGWMSPcprahddobT6yCZrfEhhrA3Y,5Eg2fnsqaLQE3oCEBVjzP9hFe6WAJ7gjsF6YEA6MXxjGhfGg +3405,5Ec4AhP2hEGWSKPtT8GdTgzWVFVGj4ZkuJfvbojRFXjg5JAE,5Eg2fnsqmxTQZv8318DiaLLKjjAaSUcrxxKMrmFv8FmEvpp1 3406,5Ec4AhP2trKgxSKhGkkMesdaat9gsRVt11tkEQtyqpmeJ8Hz,5Eg2fnsqyaWb633qpkhSmWyPqMpzaqYz4fYBVNRUiYoD9yqF -2101,5Ec4AhNwt5naTs1a8fU3thEXYAzYetm7AcYAFthSZGMX248D,5Eg2fnskxoyUbTjigfR91LaLnefrNJpDEGBbWrDwRzP5shQq -3354,5Ec4AhNrUXUFxE5ia3tXdLPuY1i3NeyWt4Q3QtKm6Z1EXL4e,5Eg2fnsfZFfA5pos83qcjyjinVPM652cwi3UfqrFyH2oNycW +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 -3412,5Ec4AhP46aen59tYCXcioyU1Ag8Bjb6cbHDg23tMPayTfC5e,5Eg2fnssBJqgCkcgkXZovcopR9oVT19ievs7H1QrGK12Wdre +2007,5Ec4AhPWLk3F66UZSgFGwVVWkCB35rrC3RPBs3BySbjzB588,5Eg2fntKRUE9DhChzgCN48qKzfrLoGuJ752d7ziUKKmZ2oqx +2008,5Ec4AhPWYN6RcDQNGJj18g8aqpqTEDnK98c1VeMY2tmxQGnq,5Eg2fntKd6HKjp8WpJg6FKUQ6JWkwdqRCnFSkbt2ucoXFitU +2009,5Ec4AhPWjz9c8LLB5wCjKrmewTVsNaiSEqpq8FX6dBovdD75,5Eg2fntKpiLWFw4Kdw9pSW7UBwBB5zmYJVUGPD3bVuqVUsrN +2010,5Ec4AhPWwcCneTFyuZgTX3Qj36AHWweZLZ3ekrgfDUqtrbFU,5Eg2fntL2LPgn3z8TZdYdgkYHZqbEMhfQCh61pDA6CsThxfG +2011,5Ec4AhPX9EFyAaBnjCABiE3o8iphfJagSGGUPTrDomss5bxQ,5Eg2fntLDxSsJAuwHC7GpsPcPCW1NidnVuuueRNigVuRwREd +2012,5Ec4AhPXLrK9gh7bYpduuQgsEMV7ofWoXyVJ251nQ4uqJayU,5Eg2fntLRaW3pHqk6pb1242gUqARX5Zubd8jH2YHGnwQADmR 2013,5Ec4AhPXYUNLCp3QNT7e6bKwKz9Xx2Svdgi7egBLzMwoXqcD,5Eg2fntLdCZELQmYvT4jDEfkaTpqfSW2hLMYudhqs5yNPMzV -3413,5Ec4AhP4JChxbGpM2A6T1A75GJnbsx2jgzSVef3uyt1RtF6B,5Eg2fnssNvtrisYVaA3Y7oStWnTubN5qke5vucaQrc2zjhfF +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 From 345ebfea9a814188a9e656d003cdbc044549fd2a Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Tue, 18 Feb 2025 12:35:32 +0100 Subject: [PATCH 6/8] example Signed-off-by: Oliver Tale-Yazdi --- pallets/rc-migrator/src/accounts.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pallets/rc-migrator/src/accounts.md b/pallets/rc-migrator/src/accounts.md index 02383741ac..a8bbc99934 100644 --- a/pallets/rc-migrator/src/accounts.md +++ b/pallets/rc-migrator/src/accounts.md @@ -28,3 +28,5 @@ It is advised that parachains check that they can control their account on Asset 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). From c4b74973c8844287d2d42a48465e3c8be09764fe Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Tue, 18 Feb 2025 12:35:38 +0100 Subject: [PATCH 7/8] fmt Signed-off-by: Oliver Tale-Yazdi --- integration-tests/ahm/src/tests.rs | 6 +++--- pallets/rc-migrator/src/accounts.rs | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/integration-tests/ahm/src/tests.rs b/integration-tests/ahm/src/tests.rs index 19a7db6a3f..1e26a60eb4 100644 --- a/integration-tests/ahm/src/tests.rs +++ b/integration-tests/ahm/src/tests.rs @@ -38,9 +38,8 @@ use pallet_rc_migrator::{types::PalletMigrationChecks, MigrationStage, RcMigrati use polkadot_runtime::Runtime as Polkadot; use polkadot_runtime_common::paras_registrar; use sp_runtime::AccountId32; -use std::str::FromStr; +use std::{collections::BTreeMap, str::FromStr}; use xcm_emulator::ConvertLocation; -use std::collections::BTreeMap; use super::mock::*; @@ -196,5 +195,6 @@ async fn print_sovereign_account_translation() { } }); - //std::fs::write("../../pallets/rc-migrator/src/sovereign_account_translation.csv", csv).unwrap(); + //std::fs::write("../../pallets/rc-migrator/src/sovereign_account_translation.csv", + // csv).unwrap(); } diff --git a/pallets/rc-migrator/src/accounts.rs b/pallets/rc-migrator/src/accounts.rs index 1260936078..dc72d0b765 100644 --- a/pallets/rc-migrator/src/accounts.rs +++ b/pallets/rc-migrator/src/accounts.rs @@ -551,7 +551,9 @@ impl AccountsMigrator { /// - `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 - pub fn try_translate_rc_sovereign_to_ah(acc: T::AccountId) -> Result, ()> { + pub fn try_translate_rc_sovereign_to_ah( + acc: T::AccountId, + ) -> Result, ()> { let raw = acc.to_raw_vec(); // Must start with "para" From 0d4c211b51f9d012a98542794c18584f76e3034f Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Fri, 21 Feb 2025 12:38:26 +0100 Subject: [PATCH 8/8] link source Signed-off-by: Oliver Tale-Yazdi --- pallets/rc-migrator/src/accounts.rs | 11 +++++++++++ relay/polkadot/src/ah_migration/phase1.rs | 2 ++ 2 files changed, 13 insertions(+) diff --git a/pallets/rc-migrator/src/accounts.rs b/pallets/rc-migrator/src/accounts.rs index dc72d0b765..87d3cbfba5 100644 --- a/pallets/rc-migrator/src/accounts.rs +++ b/pallets/rc-migrator/src/accounts.rs @@ -551,6 +551,17 @@ impl AccountsMigrator { /// - `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, ()> { 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) {