chore: bump spec versions for mainnet upgrade (RC 1_020_005, AH 1_020_005, People 1_020_008)

This commit is contained in:
2026-02-20 15:26:17 +03:00
parent 81625173a0
commit a162dcd694
12 changed files with 68 additions and 134 deletions
@@ -138,7 +138,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
spec_name: alloc::borrow::Cow::Borrowed("asset-hub-pezkuwichain"),
impl_name: alloc::borrow::Cow::Borrowed("asset-hub-pezkuwichain"),
authoring_version: 1,
spec_version: 1_020_007,
spec_version: 1_020_005,
impl_version: 0,
apis: RUNTIME_API_VERSIONS,
transaction_version: 16,
@@ -157,7 +157,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
spec_name: alloc::borrow::Cow::Borrowed("people-pezkuwichain"),
impl_name: alloc::borrow::Cow::Borrowed("people-pezkuwichain"),
authoring_version: 1,
spec_version: 1_020_007,
spec_version: 1_020_008,
impl_version: 0,
apis: RUNTIME_API_VERSIONS,
transaction_version: 1,
@@ -134,10 +134,9 @@ impl xcm_executor::traits::ConvertOrigin<RuntimeOrigin> for RelayWelatiPlurality
) -> Result<RuntimeOrigin, Location> {
let origin = origin.into();
match (kind, origin.unpack()) {
(
OriginKind::Superuser,
(1, [Plurality { id: BodyId::Index(40 | 41 | 42), .. }]),
) => Ok(RuntimeOrigin::root()),
(OriginKind::Superuser, (1, [Plurality { id: BodyId::Index(40..=42), .. }])) => {
Ok(RuntimeOrigin::root())
},
_ => Err(origin),
}
}
+5 -8
View File
@@ -68,12 +68,12 @@ use pezkuwi_runtime_teyrchains::{
inclusion::{AggregateMessageOrigin, UmpQueueId},
initializer as teyrchains_initializer, on_demand as teyrchains_on_demand,
origin as teyrchains_origin, paras as teyrchains_paras,
paras_inherent as teyrchains_paras_inherent,
paras_inherent as teyrchains_paras_inherent, reward_points as teyrchains_reward_points,
runtime_api_impl::{
v13 as teyrchains_runtime_api_impl, vstaging as teyrchains_staging_runtime_api_impl,
},
scheduler as teyrchains_scheduler, session_info as teyrchains_session_info,
reward_points as teyrchains_reward_points, shared as teyrchains_shared,
shared as teyrchains_shared,
};
use pezkuwichain_runtime_constants::system_teyrchain::{
coretime::TIMESLICE_PERIOD, ASSET_HUB_ID, BROKER_ID,
@@ -174,7 +174,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
spec_name: alloc::borrow::Cow::Borrowed("pezkuwichain"),
impl_name: alloc::borrow::Cow::Borrowed("parity-pezkuwichain"),
authoring_version: 0,
spec_version: 1_020_008,
spec_version: 1_020_005,
impl_version: 0,
apis: RUNTIME_API_VERSIONS,
transaction_version: 26,
@@ -461,12 +461,9 @@ pub struct ExposureOfOrDefault;
impl pezsp_runtime::traits::Convert<AccountId, Option<pezsp_staking::Exposure<AccountId, Balance>>>
for ExposureOfOrDefault
{
fn convert(
validator: AccountId,
) -> Option<pezsp_staking::Exposure<AccountId, Balance>> {
fn convert(validator: AccountId) -> Option<pezsp_staking::Exposure<AccountId, Balance>> {
Some(
<pezpallet_staking::DefaultExposureOf<Runtime>>::convert(validator)
.unwrap_or_default(),
<pezpallet_staking::DefaultExposureOf<Runtime>>::convert(validator).unwrap_or_default(),
)
}
}
+21 -24
View File
@@ -148,11 +148,7 @@ fn governance_tracks_total_count() {
fn governance_track_ids_are_unique() {
let mut seen = HashSet::new();
for track in <TracksInfo as TracksInfoTrait<Balance, BlockNumber>>::tracks() {
assert!(
seen.insert(track.id),
"Duplicate track ID: {}",
track.id
);
assert!(seen.insert(track.id), "Duplicate track ID: {}", track.id);
}
}
@@ -185,24 +181,24 @@ fn governance_no_test_periods_remain() {
fn governance_production_periods_match_spec() {
// Build expected values: (track_id, prepare, decision, confirm, enact)
let expected: Vec<(u16, &str, BlockNumber, BlockNumber, BlockNumber, BlockNumber)> = vec![
(0, "root", 2 * HOURS, 28 * DAYS, 24 * HOURS, 24 * HOURS),
(1, "whitelisted_caller", 30 * MINUTES, 28 * DAYS, 10 * MINUTES, 10 * MINUTES),
(10, "staking_admin", 2 * HOURS, 14 * DAYS, 3 * HOURS, 10 * MINUTES),
(11, "treasurer", 2 * HOURS, 28 * DAYS, 3 * HOURS, 24 * HOURS),
(12, "lease_admin", 2 * HOURS, 14 * DAYS, 3 * HOURS, 10 * MINUTES),
(13, "fellowship_admin", 2 * HOURS, 14 * DAYS, 3 * HOURS, 10 * MINUTES),
(14, "general_admin", 2 * HOURS, 14 * DAYS, 3 * HOURS, 10 * MINUTES),
(15, "auction_admin", 2 * HOURS, 14 * DAYS, 3 * HOURS, 10 * MINUTES),
(20, "referendum_canceller", 2 * HOURS, 7 * DAYS, 3 * HOURS, 10 * MINUTES),
(21, "referendum_killer", 2 * HOURS, 14 * DAYS, 3 * HOURS, 10 * MINUTES),
(30, "small_tipper", 1 * MINUTES, 7 * DAYS, 10 * MINUTES, 1 * MINUTES),
(31, "big_tipper", 10 * MINUTES, 7 * DAYS, 1 * HOURS, 10 * MINUTES),
(32, "small_spender", 4 * HOURS, 28 * DAYS, 12 * HOURS, 24 * HOURS),
(33, "medium_spender", 4 * HOURS, 28 * DAYS, 24 * HOURS, 24 * HOURS),
(34, "big_spender", 4 * HOURS, 28 * DAYS, 48 * HOURS, 24 * HOURS),
(40, "welati_election", 2 * HOURS, 14 * DAYS, 12 * HOURS, 24 * HOURS),
(41, "welati_admin", 2 * HOURS, 7 * DAYS, 3 * HOURS, 10 * MINUTES),
(42, "citizenship_admin", 2 * HOURS, 14 * DAYS, 6 * HOURS, 24 * HOURS),
(0, "root", 2 * HOURS, 28 * DAYS, 24 * HOURS, 24 * HOURS),
(1, "whitelisted_caller", 30 * MINUTES, 28 * DAYS, 10 * MINUTES, 10 * MINUTES),
(10, "staking_admin", 2 * HOURS, 14 * DAYS, 3 * HOURS, 10 * MINUTES),
(11, "treasurer", 2 * HOURS, 28 * DAYS, 3 * HOURS, 24 * HOURS),
(12, "lease_admin", 2 * HOURS, 14 * DAYS, 3 * HOURS, 10 * MINUTES),
(13, "fellowship_admin", 2 * HOURS, 14 * DAYS, 3 * HOURS, 10 * MINUTES),
(14, "general_admin", 2 * HOURS, 14 * DAYS, 3 * HOURS, 10 * MINUTES),
(15, "auction_admin", 2 * HOURS, 14 * DAYS, 3 * HOURS, 10 * MINUTES),
(20, "referendum_canceller", 2 * HOURS, 7 * DAYS, 3 * HOURS, 10 * MINUTES),
(21, "referendum_killer", 2 * HOURS, 14 * DAYS, 3 * HOURS, 10 * MINUTES),
(30, "small_tipper", 1 * MINUTES, 7 * DAYS, 10 * MINUTES, 1 * MINUTES),
(31, "big_tipper", 10 * MINUTES, 7 * DAYS, 1 * HOURS, 10 * MINUTES),
(32, "small_spender", 4 * HOURS, 28 * DAYS, 12 * HOURS, 24 * HOURS),
(33, "medium_spender", 4 * HOURS, 28 * DAYS, 24 * HOURS, 24 * HOURS),
(34, "big_spender", 4 * HOURS, 28 * DAYS, 48 * HOURS, 24 * HOURS),
(40, "welati_election", 2 * HOURS, 14 * DAYS, 12 * HOURS, 24 * HOURS),
(41, "welati_admin", 2 * HOURS, 7 * DAYS, 3 * HOURS, 10 * MINUTES),
(42, "citizenship_admin", 2 * HOURS, 14 * DAYS, 6 * HOURS, 24 * HOURS),
];
let tracks: HashMap<u16, _> = <TracksInfo as TracksInfoTrait<Balance, BlockNumber>>::tracks()
@@ -303,7 +299,8 @@ fn governance_track_for_origin_mapping() {
for (origin, expected_id) in origin_to_track {
let pallet_origin: <RuntimeOrigin as pezframe_support::traits::OriginTrait>::PalletsOrigin =
origin.clone().into();
let result = <TracksInfo as TracksInfoTrait<Balance, BlockNumber>>::track_for(&pallet_origin);
let result =
<TracksInfo as TracksInfoTrait<Balance, BlockNumber>>::track_for(&pallet_origin);
assert_eq!(
result,
Ok(expected_id),
@@ -146,7 +146,9 @@ impl<T: Config + pezpallet_session::historical::Config>
pezpallet_session::historical::SessionManager<T::ValidatorId, T::FullIdentification>
for Pezpallet<T>
{
fn new_session(new_index: SessionIndex) -> Option<Vec<(T::ValidatorId, T::FullIdentification)>> {
fn new_session(
new_index: SessionIndex,
) -> Option<Vec<(T::ValidatorId, T::FullIdentification)>> {
<Self as pezpallet_session::SessionManager<_>>::new_session(new_index).map(|r| {
r.into_iter()
.filter_map(|v| {
@@ -22,9 +22,7 @@ use super::{
XcmPallet,
};
use crate::governance::{
CitizenshipAdmin, StakingAdmin, WelatiAdmin, WelatiElection,
};
use crate::governance::{CitizenshipAdmin, StakingAdmin, WelatiAdmin, WelatiElection};
use pezframe_support::{
parameter_types,
+9 -34
View File
@@ -20,10 +20,8 @@ use std::str::FromStr;
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== ASSET HUB RUNTIME UPGRADE ===\n");
let rc_url =
std::env::var("RC_RPC").unwrap_or_else(|_| "ws://127.0.0.1:9944".to_string());
let ah_url =
std::env::var("AH_RPC").unwrap_or_else(|_| "ws://127.0.0.1:40944".to_string());
let rc_url = std::env::var("RC_RPC").unwrap_or_else(|_| "ws://127.0.0.1:9944".to_string());
let ah_url = std::env::var("AH_RPC").unwrap_or_else(|_| "ws://127.0.0.1:40944".to_string());
let wasm_path = std::env::var("WASM_FILE").expect("WASM_FILE environment variable required");
let mnemonic_str =
@@ -34,11 +32,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Load WASM
let wasm_data = std::fs::read(&wasm_path)?;
println!(
"WASM: {} ({:.2} MB)",
wasm_path,
wasm_data.len() as f64 / 1_048_576.0
);
println!("WASM: {} ({:.2} MB)", wasm_path, wasm_data.len() as f64 / 1_048_576.0);
// Blake2-256 hash of WASM
let code_hash = pezsp_crypto_hashing::blake2_256(&wasm_data);
@@ -50,11 +44,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Connect to AH
let ah_api = OnlineClient::<PezkuwiConfig>::from_url(&ah_url).await?;
println!(
"AH connected: {} (spec {})\n",
ah_url,
ah_api.runtime_version().spec_version
);
println!("AH connected: {} (spec {})\n", ah_url, ah_api.runtime_version().spec_version);
// ═══════════════════════════════════════════
// STEP 1: Authorize upgrade via XCM from RC
@@ -77,10 +67,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
"interior",
Value::unnamed_variant(
"X1",
vec![Value::unnamed_variant(
"Teyrchain",
vec![Value::u128(1000)],
)],
vec![Value::unnamed_variant("Teyrchain", vec![Value::u128(1000)])],
),
),
])],
@@ -113,8 +100,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
])],
);
let xcm_send =
pezkuwi_subxt::dynamic::tx("XcmPallet", "send", vec![dest, message]);
let xcm_send = pezkuwi_subxt::dynamic::tx("XcmPallet", "send", vec![dest, message]);
let sudo_tx = pezkuwi_subxt::dynamic::tx(
"Sudo",
"sudo_unchecked_weight",
@@ -127,10 +113,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
],
);
let progress = rc_api
.tx()
.sign_and_submit_then_watch_default(&sudo_tx, &sudo_keypair)
.await?;
let progress = rc_api.tx().sign_and_submit_then_watch_default(&sudo_tx, &sudo_keypair).await?;
let events = progress.wait_for_finalized_success().await?;
let mut sent = false;
@@ -168,12 +151,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
.chain(pezsp_crypto_hashing::twox_128(b"AuthorizedUpgrade").iter())
.copied()
.collect::<Vec<u8>>();
let result = ah_check
.storage()
.at_latest()
.await?
.fetch_raw(auth_key)
.await?;
let result = ah_check.storage().at_latest().await?.fetch_raw(auth_key).await?;
if !result.is_empty() {
println!(
" AuthorizedUpgrade found on AH at block {} (attempt {})!",
@@ -233,10 +211,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
"interior",
Value::unnamed_variant(
"X1",
vec![Value::unnamed_variant(
"Teyrchain",
vec![Value::u128(1000)],
)],
vec![Value::unnamed_variant("Teyrchain", vec![Value::u128(1000)])],
),
),
])],
+15 -31
View File
@@ -19,8 +19,7 @@ use std::str::FromStr;
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== ASSIGN CORETIME ===\n");
let rc_url =
std::env::var("RC_RPC").unwrap_or_else(|_| "ws://127.0.0.1:9944".to_string());
let rc_url = std::env::var("RC_RPC").unwrap_or_else(|_| "ws://127.0.0.1:9944".to_string());
let api = OnlineClient::<PezkuwiConfig>::from_url(&rc_url).await?;
println!("Connected to RC: {}", rc_url);
@@ -38,18 +37,11 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Step 1: Set core count to 2
// Coretime.request_core_count(count: u16) - call_index 1, pallet 74
println!("Step 1: Setting core count to 2...");
let set_cores = pezkuwi_subxt::dynamic::tx(
"Coretime",
"request_core_count",
vec![Value::u128(2)],
);
let sudo_tx =
pezkuwi_subxt::dynamic::tx("Sudo", "sudo", vec![set_cores.into_value()]);
let set_cores =
pezkuwi_subxt::dynamic::tx("Coretime", "request_core_count", vec![Value::u128(2)]);
let sudo_tx = pezkuwi_subxt::dynamic::tx("Sudo", "sudo", vec![set_cores.into_value()]);
let progress = api
.tx()
.sign_and_submit_then_watch_default(&sudo_tx, &sudo_keypair)
.await?;
let progress = api.tx().sign_and_submit_then_watch_default(&sudo_tx, &sudo_keypair).await?;
let events = progress.wait_for_finalized_success().await?;
for event in events.iter() {
let event = event?;
@@ -76,19 +68,15 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
"Coretime",
"assign_core",
vec![
Value::u128(0), // core index
begin.clone(), // begin
assignment_ah, // assignment
Value::u128(0), // core index
begin.clone(), // begin
assignment_ah, // assignment
Value::unnamed_variant("None", vec![]), // end_hint
],
);
let sudo_ah =
pezkuwi_subxt::dynamic::tx("Sudo", "sudo", vec![assign_ah.into_value()]);
let sudo_ah = pezkuwi_subxt::dynamic::tx("Sudo", "sudo", vec![assign_ah.into_value()]);
let progress = api
.tx()
.sign_and_submit_then_watch_default(&sudo_ah, &sudo_keypair)
.await?;
let progress = api.tx().sign_and_submit_then_watch_default(&sudo_ah, &sudo_keypair).await?;
let events = progress.wait_for_finalized_success().await?;
for event in events.iter() {
let event = event?;
@@ -108,19 +96,15 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
"Coretime",
"assign_core",
vec![
Value::u128(1), // core index
begin, // begin
assignment_people, // assignment
Value::u128(1), // core index
begin, // begin
assignment_people, // assignment
Value::unnamed_variant("None", vec![]), // end_hint
],
);
let sudo_people =
pezkuwi_subxt::dynamic::tx("Sudo", "sudo", vec![assign_people.into_value()]);
let sudo_people = pezkuwi_subxt::dynamic::tx("Sudo", "sudo", vec![assign_people.into_value()]);
let progress = api
.tx()
.sign_and_submit_then_watch_default(&sudo_people, &sudo_keypair)
.await?;
let progress = api.tx().sign_and_submit_then_watch_default(&sudo_people, &sudo_keypair).await?;
let events = progress.wait_for_finalized_success().await?;
for event in events.iter() {
let event = event?;
+5 -18
View File
@@ -23,17 +23,12 @@ use std::str::FromStr;
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== RELAY CHAIN RUNTIME UPGRADE ===\n");
let rc_url =
std::env::var("RC_RPC").unwrap_or_else(|_| "ws://127.0.0.1:9944".to_string());
let rc_url = std::env::var("RC_RPC").unwrap_or_else(|_| "ws://127.0.0.1:9944".to_string());
let wasm_path = std::env::var("WASM_FILE").expect("WASM_FILE environment variable required");
// Load WASM
let wasm_data = std::fs::read(&wasm_path)?;
println!(
"WASM: {} ({:.2} MB)",
wasm_path,
wasm_data.len() as f64 / 1_048_576.0
);
println!("WASM: {} ({:.2} MB)", wasm_path, wasm_data.len() as f64 / 1_048_576.0);
let code_hash = pezsp_crypto_hashing::blake2_256(&wasm_data);
println!("Code hash: 0x{}", hex::encode(code_hash));
@@ -68,14 +63,8 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
],
);
let tx_progress = api
.tx()
.sign_and_submit_then_watch_default(&sudo_tx, &sudo_keypair)
.await?;
println!(
" TX: 0x{}",
hex::encode(tx_progress.extrinsic_hash().as_ref())
);
let tx_progress = api.tx().sign_and_submit_then_watch_default(&sudo_tx, &sudo_keypair).await?;
println!(" TX: 0x{}", hex::encode(tx_progress.extrinsic_hash().as_ref()));
let mut progress = tx_progress;
let mut upgrade_ok = false;
@@ -87,9 +76,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
Ok(events) => {
for ev in events.iter().flatten() {
println!(" {}::{}", ev.pallet_name(), ev.variant_name());
if ev.pallet_name() == "System"
&& ev.variant_name() == "CodeUpdated"
{
if ev.pallet_name() == "System" && ev.variant_name() == "CodeUpdated" {
upgrade_ok = true;
}
}
@@ -14,8 +14,7 @@ use std::str::FromStr;
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== SET StakingAhClient MODE → Active ===\n");
let rc_url =
std::env::var("RC_RPC").unwrap_or_else(|_| "ws://127.0.0.1:9944".to_string());
let rc_url = std::env::var("RC_RPC").unwrap_or_else(|_| "ws://127.0.0.1:9944".to_string());
let api = OnlineClient::<PezkuwiConfig>::from_url(&rc_url).await?;
println!("RC connected: spec {}", api.runtime_version().spec_version);
@@ -53,14 +52,10 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
"set_mode",
vec![Value::unnamed_variant("Active", vec![])],
);
let sudo_tx =
pezkuwi_subxt::dynamic::tx("Sudo", "sudo", vec![set_mode.into_value()]);
let sudo_tx = pezkuwi_subxt::dynamic::tx("Sudo", "sudo", vec![set_mode.into_value()]);
println!("Submitting sudo(StakingAhClient.set_mode(Active))...");
let progress = api
.tx()
.sign_and_submit_then_watch_default(&sudo_tx, &sudo_keypair)
.await?;
let progress = api.tx().sign_and_submit_then_watch_default(&sudo_tx, &sudo_keypair).await?;
let events = progress.wait_for_finalized_success().await?;
for event in events.iter() {
+1 -1
View File
@@ -69,7 +69,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
}
// Decode Vec length
let (count, mut offset) = decode_compact(&raw_data);
let (count, offset) = decode_compact(&raw_data);
println!("QueuedKeys entries: {}", count);
// Each entry: AccountId32 (32 bytes) + SessionKeys