From 7e93f313a7f7b5e92af7a538671df14f51a4bb4e Mon Sep 17 00:00:00 2001 From: Anton Gavrilov Date: Mon, 24 Nov 2025 16:41:48 +0100 Subject: [PATCH 01/70] Migration to fix StakingHotKeys added --- pallets/subtensor/src/macros/hooks.rs | 4 +- .../migrate_fix_staking_hot_keys.rs | 55 +++++++++++++++++++ pallets/subtensor/src/migrations/mod.rs | 1 + pallets/subtensor/src/tests/migration.rs | 37 +++++++++++++ 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 pallets/subtensor/src/migrations/migrate_fix_staking_hot_keys.rs diff --git a/pallets/subtensor/src/macros/hooks.rs b/pallets/subtensor/src/macros/hooks.rs index 1b7d5fd77e..8f6a823a29 100644 --- a/pallets/subtensor/src/macros/hooks.rs +++ b/pallets/subtensor/src/macros/hooks.rs @@ -162,7 +162,9 @@ mod hooks { // Migrate pending emissions .saturating_add(migrations::migrate_pending_emissions::migrate_pending_emissions::()) // Reset unactive subnets - .saturating_add(migrations::migrate_reset_unactive_sn::migrate_reset_unactive_sn::()); + .saturating_add(migrations::migrate_reset_unactive_sn::migrate_reset_unactive_sn::()) + // Fix staking hot keys + .saturating_add(migrations::migrate_fix_staking_hot_keys::migrate_fix_staking_hot_keys::()); weight } diff --git a/pallets/subtensor/src/migrations/migrate_fix_staking_hot_keys.rs b/pallets/subtensor/src/migrations/migrate_fix_staking_hot_keys.rs new file mode 100644 index 0000000000..72fae1fdd7 --- /dev/null +++ b/pallets/subtensor/src/migrations/migrate_fix_staking_hot_keys.rs @@ -0,0 +1,55 @@ +use super::*; +use frame_support::{traits::Get, weights::Weight}; +use log; +use scale_info::prelude::string::String; +use sp_std::collections::btree_map::BTreeMap; + +pub fn migrate_fix_staking_hot_keys() -> Weight { + let migration_name = b"migrate_fix_staking_hot_keys".to_vec(); + let mut weight = T::DbWeight::get().reads(1); + + // Skip if already executed + if HasMigrationRun::::get(&migration_name) { + log::info!( + target: "runtime", + "Migration '{}' already run - skipping.", + String::from_utf8_lossy(&migration_name) + ); + return weight; + } + + let mut cache: BTreeMap> = BTreeMap::new(); + let mut storage_reads: u64 = 0; + let mut storage_writes: u64 = 0; + + for ((hotkey, coldkey, _netuid), alpha) in Alpha::::iter() { + if alpha == 0 { + continue; + } + + let staking_hotkeys = cache.entry(coldkey.clone()) + .or_insert_with(|| { + storage_reads = storage_reads.saturating_add(1); + StakingHotkeys::::get(&coldkey) + }); + + if !staking_hotkeys.contains(&hotkey) { + staking_hotkeys.push(hotkey.clone()); + storage_writes = storage_writes.saturating_add(1); + StakingHotkeys::::insert(&coldkey, staking_hotkeys.clone()); + } + } + weight = weight.saturating_add(T::DbWeight::get().reads_writes(storage_reads, storage_writes)); + + // Mark migration done + HasMigrationRun::::insert(&migration_name, true); + weight = weight.saturating_add(T::DbWeight::get().writes(1)); + + log::info!( + target: "runtime", + "Migration '{}' completed.", + String::from_utf8_lossy(&migration_name) + ); + + weight +} \ No newline at end of file diff --git a/pallets/subtensor/src/migrations/mod.rs b/pallets/subtensor/src/migrations/mod.rs index 41c1333a89..a4473a9dc8 100644 --- a/pallets/subtensor/src/migrations/mod.rs +++ b/pallets/subtensor/src/migrations/mod.rs @@ -58,6 +58,7 @@ pub mod migrate_to_v1_separate_emission; pub mod migrate_to_v2_fixed_total_stake; pub mod migrate_transfer_ownership_to_foundation; pub mod migrate_upgrade_revealed_commitments; +pub mod migrate_fix_staking_hot_keys; pub(crate) fn migrate_storage( migration_name: &'static str, diff --git a/pallets/subtensor/src/tests/migration.rs b/pallets/subtensor/src/tests/migration.rs index b694459eaa..9f5b005ed8 100644 --- a/pallets/subtensor/src/tests/migration.rs +++ b/pallets/subtensor/src/tests/migration.rs @@ -1138,6 +1138,43 @@ fn test_migrate_rate_limit_keys() { }); } +#[test] +fn test_migrate_fix_staking_hot_keys() { + new_test_ext(1).execute_with(|| { + const MIGRATION_NAME: &[u8] = b"migrate_fix_staking_hot_keys"; + + assert!( + !HasMigrationRun::::get(MIGRATION_NAME.to_vec()), + "Migration should not have run yet" + ); + + // Add some data + Alpha::::insert( + (U256::from(1), + U256::from(2), + NetUid::ROOT), + U64F64::from(1_u64) + ); + // Run migration + let weight = migrations::migrate_fix_staking_hot_keys::migrate_fix_staking_hot_keys::(); + + assert!( + HasMigrationRun::::get(MIGRATION_NAME.to_vec()), + "Migration should be marked as completed" + ); + + // Check migration has been marked as run + assert!(HasMigrationRun::::get(MIGRATION_NAME.to_vec())); + + // Verify results + assert_eq!( + StakingHotkeys::::get(U256::from(2)), + vec![U256::from(1)] + ); + }); +} + + #[test] fn test_migrate_fix_root_subnet_tao() { new_test_ext(1).execute_with(|| { From dbc85206c956948a651fdd68e8c5920f4f092ff1 Mon Sep 17 00:00:00 2001 From: John Reed <87283488+JohnReedV@users.noreply.github.com> Date: Wed, 10 Dec 2025 14:15:45 -0800 Subject: [PATCH 02/70] Update proposer.rs --- node/src/mev_shield/proposer.rs | 62 ++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/node/src/mev_shield/proposer.rs b/node/src/mev_shield/proposer.rs index 614cb785fd..6bc0bc312c 100644 --- a/node/src/mev_shield/proposer.rs +++ b/node/src/mev_shield/proposer.rs @@ -14,6 +14,22 @@ use std::{ }; use tokio::time::sleep; +/// Helper to build a `mark_decryption_failed` runtime call with a bounded reason string. +fn create_failed_call(id: H256, reason: &str) -> node_subtensor_runtime::RuntimeCall { + use sp_runtime::BoundedVec; + + let reason_bytes = reason.as_bytes(); + let reason_bounded = BoundedVec::try_from(reason_bytes.to_vec()).unwrap_or_else(|_| { + // Fallback if the reason is too long for the bounded vector. + BoundedVec::try_from(b"Decryption failed".to_vec()).unwrap_or_default() + }); + + node_subtensor_runtime::RuntimeCall::MevShield(pallet_shield::Call::mark_decryption_failed { + id, + reason: reason_bounded, + }) +} + /// Buffer of wrappers keyed by the block number in which they were included. #[derive(Default, Clone)] struct WrapperBuffer { @@ -34,10 +50,12 @@ impl WrapperBuffer { /// Drain only wrappers whose `block_number` matches the given `block`. /// - Wrappers with `block_number > block` are kept for future decrypt windows. - /// - Wrappers with `block_number < block` are considered stale and dropped. + /// - Wrappers with `block_number < block` are considered stale and dropped, and + /// we emit `mark_decryption_failed` calls for them so they are visible on-chain. fn drain_for_block( &mut self, block: u64, + failed_calls: &mut Vec<(H256, node_subtensor_runtime::RuntimeCall)>, ) -> Vec<(H256, u64, sp_runtime::AccountId32, Vec)> { let mut ready = Vec::new(); let mut kept_future: usize = 0; @@ -53,7 +71,7 @@ impl WrapperBuffer { kept_future = kept_future.saturating_add(1); true } else { - // block_number < block => stale / missed reveal window; drop. + // block_number < block => stale / missed reveal window; drop and mark failed. dropped_past = dropped_past.saturating_add(1); log::debug!( target: "mev-shield", @@ -62,6 +80,16 @@ impl WrapperBuffer { *block_number, block ); + + // Mark decryption failed on-chain so clients can observe the missed wrapper. + failed_calls.push(( + *id, + create_failed_call( + *id, + "missed decrypt window (wrapper submitted in an earlier block)", + ), + )); + false } }); @@ -325,10 +353,16 @@ pub fn spawn_revealer( next_pk_len ); + // Prepare containers for decrypted extrinsics and failed decryptions. + let mut to_submit: Vec<(H256, node_subtensor_runtime::UncheckedExtrinsic)> = + Vec::new(); + let mut failed_calls: Vec<(H256, node_subtensor_runtime::RuntimeCall)> = + Vec::new(); + // Only process wrappers whose originating block matches the reveal_block. let drained: Vec<(H256, u64, sp_runtime::AccountId32, Vec)> = match buffer.lock() { - Ok(mut buf) => buf.drain_for_block(curr_block), + Ok(mut buf) => buf.drain_for_block(curr_block, &mut failed_calls), Err(e) => { log::debug!( target: "mev-shield", @@ -345,28 +379,6 @@ pub fn spawn_revealer( curr_block ); - let mut to_submit: Vec<(H256, node_subtensor_runtime::UncheckedExtrinsic)> = - Vec::new(); - let mut failed_calls: Vec<(H256, node_subtensor_runtime::RuntimeCall)> = - Vec::new(); - - // Helper to create mark_decryption_failed call - let create_failed_call = |id: H256, reason: &str| -> node_subtensor_runtime::RuntimeCall { - use sp_runtime::BoundedVec; - let reason_bytes = reason.as_bytes(); - let reason_bounded = BoundedVec::try_from(reason_bytes.to_vec()) - .unwrap_or_else(|_| { // Fallback if the reason is too long - BoundedVec::try_from(b"Decryption failed".to_vec()).unwrap_or_default() - }); - - node_subtensor_runtime::RuntimeCall::MevShield( - pallet_shield::Call::mark_decryption_failed { - id, - reason: reason_bounded, - }, - ) - }; - for (id, block_number, author, blob) in drained.into_iter() { log::debug!( target: "mev-shield", From f8ea50cee1700fef149eb6e438f4e02648f3adbb Mon Sep 17 00:00:00 2001 From: John Reed <87283488+JohnReedV@users.noreply.github.com> Date: Thu, 11 Dec 2025 13:48:34 -0800 Subject: [PATCH 03/70] update timing --- node/src/mev_shield/author.rs | 4 +- node/src/mev_shield/proposer.rs | 197 +++++++++----------------------- 2 files changed, 52 insertions(+), 149 deletions(-) diff --git a/node/src/mev_shield/author.rs b/node/src/mev_shield/author.rs index 7d9238a809..9dca9dcff9 100644 --- a/node/src/mev_shield/author.rs +++ b/node/src/mev_shield/author.rs @@ -91,11 +91,10 @@ impl Default for ShieldKeys { } /// Shared context state. -#[freeze_struct("62af7d26cf7c1271")] +#[freeze_struct("245b565abca7d403")] #[derive(Clone)] pub struct ShieldContext { pub keys: Arc>, - pub timing: TimeParams, } /// Derive AEAD key directly from the 32‑byte ML‑KEM shared secret. @@ -153,7 +152,6 @@ where { let ctx = ShieldContext { keys: Arc::new(Mutex::new(ShieldKeys::new())), - timing: timing.clone(), }; let aura_keys: Vec = keystore.sr25519_public_keys(AURA_KEY_TYPE); diff --git a/node/src/mev_shield/proposer.rs b/node/src/mev_shield/proposer.rs index 6bc0bc312c..23dbfdbcb0 100644 --- a/node/src/mev_shield/proposer.rs +++ b/node/src/mev_shield/proposer.rs @@ -4,15 +4,14 @@ use ml_kem::kem::{Decapsulate, DecapsulationKey}; use ml_kem::{Ciphertext, Encoded, EncodedSizeUser, MlKem768, MlKem768Params}; use sc_service::SpawnTaskHandle; use sc_transaction_pool_api::{TransactionPool, TransactionSource}; +use sp_consensus::BlockOrigin; use sp_core::H256; use sp_runtime::traits::{Header, SaturatedConversion}; use sp_runtime::{AccountId32, OpaqueExtrinsic}; use std::{ collections::HashMap, sync::{Arc, Mutex}, - time::Duration, }; -use tokio::time::sleep; /// Helper to build a `mark_decryption_failed` runtime call with a bounded reason string. fn create_failed_call(id: H256, reason: &str) -> node_subtensor_runtime::RuntimeCall { @@ -49,7 +48,7 @@ impl WrapperBuffer { } /// Drain only wrappers whose `block_number` matches the given `block`. - /// - Wrappers with `block_number > block` are kept for future decrypt windows. + /// - Wrappers with `block_number > block` are kept for future decrypt passes. /// - Wrappers with `block_number < block` are considered stale and dropped, and /// we emit `mark_decryption_failed` calls for them so they are visible on-chain. fn drain_for_block( @@ -71,7 +70,7 @@ impl WrapperBuffer { kept_future = kept_future.saturating_add(1); true } else { - // block_number < block => stale / missed reveal window; drop and mark failed. + // block_number < block => stale / missed decrypt opportunity; drop and mark failed. dropped_past = dropped_past.saturating_add(1); log::debug!( target: "mev-shield", @@ -110,7 +109,8 @@ impl WrapperBuffer { /// Start a background worker that: /// • watches imported blocks and captures `MevShield::submit_encrypted` /// • buffers those wrappers per originating block, -/// • during the last `decrypt_window_ms` of the slot: decrypt & submit `submit_one` +/// • on each **locally authored** block: decrypt & submit wrappers for that block. +/// pub fn spawn_revealer( task_spawner: &SpawnTaskHandle, client: Arc, @@ -133,19 +133,24 @@ pub fn spawn_revealer( let buffer: Arc> = Arc::new(Mutex::new(WrapperBuffer::default())); - // ── 1) buffer wrappers ─────────────────────────────────────── { let client = Arc::clone(&client); + let pool = Arc::clone(&pool); let buffer = Arc::clone(&buffer); + let ctx = ctx.clone(); task_spawner.spawn( - "mev-shield-buffer-wrappers", + "mev-shield-block-revealer", None, async move { - log::debug!(target: "mev-shield", "buffer-wrappers task started"); + log::debug!(target: "mev-shield", "Revealer task started"); let mut import_stream = client.import_notification_stream(); while let Some(notif) = import_stream.next().await { + if notif.origin != BlockOrigin::Own { + continue; + } + let at_hash = notif.hash; let block_number_u64: u64 = (*notif.header.number()).saturated_into(); @@ -157,6 +162,7 @@ pub fn spawn_revealer( notif.origin ); + // ── 1) buffer wrappers from this (locally authored) block ─────────── match client.block_body(at_hash) { Ok(Some(body)) => { log::debug!( @@ -260,55 +266,8 @@ pub fn spawn_revealer( " block_body error for hash={at_hash:?}: {e:?}", ), } - } - }, - ); - } - - // ── 2) decrypt window revealer ────────────────────────────── - { - let client = Arc::clone(&client); - let pool = Arc::clone(&pool); - let buffer = Arc::clone(&buffer); - let ctx = ctx.clone(); - - task_spawner.spawn( - "mev-shield-last-window-revealer", - None, - async move { - log::debug!(target: "mev-shield", "last-window-revealer task started"); - - // Respect the configured slot_ms, but clamp the decrypt window so it never - // exceeds the slot length (important for fast runtimes). - let slot_ms = ctx.timing.slot_ms; - let mut decrypt_window_ms = ctx.timing.decrypt_window_ms; - - if decrypt_window_ms > slot_ms { - log::warn!( - target: "mev-shield", - "spawn_revealer: decrypt_window_ms ({decrypt_window_ms}) > slot_ms ({slot_ms}); clamping to slot_ms", - ); - decrypt_window_ms = slot_ms; - } - - let tail_ms = slot_ms.saturating_sub(decrypt_window_ms); - - log::debug!( - target: "mev-shield", - "revealer timing: slot_ms={slot_ms} decrypt_window_ms={decrypt_window_ms} (effective) tail_ms={tail_ms}", - ); - - loop { - log::debug!( - target: "mev-shield", - "revealer: sleeping {tail_ms} ms before decrypt window (slot_ms={slot_ms}, decrypt_window_ms={decrypt_window_ms})", - ); - - if tail_ms > 0 { - sleep(Duration::from_millis(tail_ms)).await; - } - // Snapshot the current ML‑KEM secret. + // ── 2) snapshot current ML‑KEM secret for this block ──────────────── let snapshot_opt = match ctx.keys.lock() { Ok(k) => { let sk_hash = sp_core::hashing::blake2_256(&k.current_sk); @@ -328,24 +287,23 @@ pub fn spawn_revealer( } }; - let (curr_sk_bytes, curr_pk_len, next_pk_len, sk_hash) = - match snapshot_opt { - Some(v) => v, - None => { - // Skip this decrypt window entirely, without holding any guard. - if decrypt_window_ms > 0 { - sleep(Duration::from_millis(decrypt_window_ms)).await; - } - continue; - } - }; + let (curr_sk_bytes, curr_pk_len, next_pk_len, sk_hash) = match snapshot_opt { + Some(v) => v, + None => { + log::debug!( + target: "mev-shield", + "revealer: Cannot snapshot key for this block", + ); + continue; + } + }; - // Use best block number as the block whose submissions we reveal now. - let curr_block: u64 = client.info().best_number.saturated_into(); + // Use this block as the reveal block. + let curr_block: u64 = block_number_u64; log::debug!( target: "mev-shield", - "revealer: decrypt window start. reveal_block={} sk_len={} sk_hash=0x{} curr_pk_len={} next_pk_len={}", + "revealer: decrypt for block {}. sk_len={} sk_hash=0x{} curr_pk_len={} next_pk_len={}", curr_block, curr_sk_bytes.len(), hex::encode(sk_hash), @@ -353,13 +311,13 @@ pub fn spawn_revealer( next_pk_len ); - // Prepare containers for decrypted extrinsics and failed decryptions. + // ── 3) drain & decrypt wrappers for this block ───────────────────── let mut to_submit: Vec<(H256, node_subtensor_runtime::UncheckedExtrinsic)> = Vec::new(); let mut failed_calls: Vec<(H256, node_subtensor_runtime::RuntimeCall)> = Vec::new(); - // Only process wrappers whose originating block matches the reveal_block. + // Only process wrappers whose originating block matches this block. let drained: Vec<(H256, u64, sp_runtime::AccountId32, Vec)> = match buffer.lock() { Ok(mut buf) => buf.drain_for_block(curr_block, &mut failed_calls), @@ -374,7 +332,7 @@ pub fn spawn_revealer( log::debug!( target: "mev-shield", - "revealer: drained {} buffered wrappers for reveal_block={}", + "revealer: drained {} buffered wrappers for block={}", drained.len(), curr_block ); @@ -382,7 +340,7 @@ pub fn spawn_revealer( for (id, block_number, author, blob) in drained.into_iter() { log::debug!( target: "mev-shield", - "revealer: candidate id=0x{} submitted_in={} (reveal_block={}) author={} blob_len={}", + "revealer: candidate id=0x{} submitted_in={} (block={}) author={} blob_len={}", hex::encode(id.as_bytes()), block_number, curr_block, @@ -399,10 +357,7 @@ pub fn spawn_revealer( hex::encode(id.as_bytes()), error_message ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } @@ -419,10 +374,7 @@ pub fn spawn_revealer( hex::encode(id.as_bytes()), error_message ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } }; @@ -439,10 +391,7 @@ pub fn spawn_revealer( cursor, kem_len_end ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } }; @@ -457,10 +406,7 @@ pub fn spawn_revealer( hex::encode(id.as_bytes()), error_message ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } }; @@ -481,10 +427,7 @@ pub fn spawn_revealer( cursor, kem_len ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } }; @@ -501,10 +444,7 @@ pub fn spawn_revealer( cursor, kem_ct_end ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } }; @@ -523,10 +463,7 @@ pub fn spawn_revealer( error_message, cursor ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } }; @@ -543,10 +480,7 @@ pub fn spawn_revealer( cursor, nonce_end ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } }; @@ -564,10 +498,7 @@ pub fn spawn_revealer( error_message, cursor ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } }; @@ -602,10 +533,7 @@ pub fn spawn_revealer( curr_sk_bytes.len(), e ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } }; @@ -622,10 +550,7 @@ pub fn spawn_revealer( error_message, e ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } }; @@ -640,10 +565,7 @@ pub fn spawn_revealer( hex::encode(id.as_bytes()), error_message ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } }; @@ -658,10 +580,7 @@ pub fn spawn_revealer( error_message, ss_bytes.len() ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } let mut ss32 = [0u8; 32]; @@ -712,6 +631,7 @@ pub fn spawn_revealer( error_message, hex::encode(aead_body_hash), ); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } }; @@ -735,10 +655,7 @@ pub fn spawn_revealer( plaintext.len(), 1 ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } @@ -752,15 +669,11 @@ pub fn spawn_revealer( hex::encode(id.as_bytes()), error_message ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } }; - let signed_extrinsic: node_subtensor_runtime::UncheckedExtrinsic = match Decode::decode(&mut &signed_extrinsic_bytes[..]) { Ok(c) => c, @@ -774,10 +687,7 @@ pub fn spawn_revealer( signed_extrinsic_bytes.len(), e ); - failed_calls.push(( - id, - create_failed_call(id, error_message), - )); + failed_calls.push((id, create_failed_call(id, error_message))); continue; } }; @@ -785,7 +695,7 @@ pub fn spawn_revealer( to_submit.push((id, signed_extrinsic)); } - // Submit as external the signed extrinsics. + // ── 4) submit decrypted extrinsics to pool ────────────────────────── let at = client.info().best_hash; log::debug!( target: "mev-shield", @@ -841,7 +751,7 @@ pub fn spawn_revealer( } } - // Submit failed decryption calls + // ── 5) submit decryption-failed markers ───────────────────────────── if !failed_calls.is_empty() { log::debug!( target: "mev-shield", @@ -899,11 +809,6 @@ pub fn spawn_revealer( } } } - - // Let the decrypt window elapse. - if decrypt_window_ms > 0 { - sleep(Duration::from_millis(decrypt_window_ms)).await; - } } }, ); From 3b8fcef673eda06738b3a18ae30a922b6cf9548d Mon Sep 17 00:00:00 2001 From: Anton Gavrilov Date: Tue, 16 Dec 2025 17:26:03 +0100 Subject: [PATCH 04/70] Fix the build after the merge --- pallets/subtensor/src/macros/hooks.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/subtensor/src/macros/hooks.rs b/pallets/subtensor/src/macros/hooks.rs index 8af5a9d0cc..ed57d52c8b 100644 --- a/pallets/subtensor/src/macros/hooks.rs +++ b/pallets/subtensor/src/macros/hooks.rs @@ -162,7 +162,7 @@ mod hooks { // Remove old identity map entries(Identities, SubnetIdentities, SubnetIdentitiesV2) .saturating_add(migrations::migrate_remove_old_identity_maps::migrate_remove_old_identity_maps::()) // Remove unknown neuron axon, certificate prom - .saturating_add(migrations::migrate_remove_unknown_neuron_axon_cert_prom::migrate_remove_unknown_neuron_axon_cert_prom::()); + .saturating_add(migrations::migrate_remove_unknown_neuron_axon_cert_prom::migrate_remove_unknown_neuron_axon_cert_prom::()) // Fix staking hot keys .saturating_add(migrations::migrate_fix_staking_hot_keys::migrate_fix_staking_hot_keys::()); weight From 0aa2055d7856bcc38127211f11c42018500b0531 Mon Sep 17 00:00:00 2001 From: Anton Gavrilov Date: Tue, 16 Dec 2025 17:38:55 +0100 Subject: [PATCH 05/70] cargo fmt --- .../src/migrations/migrate_fix_staking_hot_keys.rs | 11 +++++------ pallets/subtensor/src/migrations/mod.rs | 2 +- pallets/subtensor/src/tests/migration.rs | 10 ++++------ 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/pallets/subtensor/src/migrations/migrate_fix_staking_hot_keys.rs b/pallets/subtensor/src/migrations/migrate_fix_staking_hot_keys.rs index 72fae1fdd7..7728ff0a6a 100644 --- a/pallets/subtensor/src/migrations/migrate_fix_staking_hot_keys.rs +++ b/pallets/subtensor/src/migrations/migrate_fix_staking_hot_keys.rs @@ -27,11 +27,10 @@ pub fn migrate_fix_staking_hot_keys() -> Weight { continue; } - let staking_hotkeys = cache.entry(coldkey.clone()) - .or_insert_with(|| { - storage_reads = storage_reads.saturating_add(1); - StakingHotkeys::::get(&coldkey) - }); + let staking_hotkeys = cache.entry(coldkey.clone()).or_insert_with(|| { + storage_reads = storage_reads.saturating_add(1); + StakingHotkeys::::get(&coldkey) + }); if !staking_hotkeys.contains(&hotkey) { staking_hotkeys.push(hotkey.clone()); @@ -52,4 +51,4 @@ pub fn migrate_fix_staking_hot_keys() -> Weight { ); weight -} \ No newline at end of file +} diff --git a/pallets/subtensor/src/migrations/mod.rs b/pallets/subtensor/src/migrations/mod.rs index 7eb8a52835..a03da9289e 100644 --- a/pallets/subtensor/src/migrations/mod.rs +++ b/pallets/subtensor/src/migrations/mod.rs @@ -19,6 +19,7 @@ pub mod migrate_fix_childkeys; pub mod migrate_fix_is_network_member; pub mod migrate_fix_root_subnet_tao; pub mod migrate_fix_root_tao_and_alpha_in; +pub mod migrate_fix_staking_hot_keys; pub mod migrate_init_tao_flow; pub mod migrate_init_total_issuance; pub mod migrate_kappa_map_to_default; @@ -58,7 +59,6 @@ pub mod migrate_to_v1_separate_emission; pub mod migrate_to_v2_fixed_total_stake; pub mod migrate_transfer_ownership_to_foundation; pub mod migrate_upgrade_revealed_commitments; -pub mod migrate_fix_staking_hot_keys; pub(crate) fn migrate_storage( migration_name: &'static str, diff --git a/pallets/subtensor/src/tests/migration.rs b/pallets/subtensor/src/tests/migration.rs index 39b00be94a..bed77e797f 100644 --- a/pallets/subtensor/src/tests/migration.rs +++ b/pallets/subtensor/src/tests/migration.rs @@ -1150,13 +1150,12 @@ fn test_migrate_fix_staking_hot_keys() { // Add some data Alpha::::insert( - (U256::from(1), - U256::from(2), - NetUid::ROOT), - U64F64::from(1_u64) + (U256::from(1), U256::from(2), NetUid::ROOT), + U64F64::from(1_u64), ); // Run migration - let weight = migrations::migrate_fix_staking_hot_keys::migrate_fix_staking_hot_keys::(); + let weight = + migrations::migrate_fix_staking_hot_keys::migrate_fix_staking_hot_keys::(); assert!( HasMigrationRun::::get(MIGRATION_NAME.to_vec()), @@ -1174,7 +1173,6 @@ fn test_migrate_fix_staking_hot_keys() { }); } - #[test] fn test_migrate_fix_root_subnet_tao() { new_test_ext(1).execute_with(|| { From 5e6becf900f3e70dbd580e65873999d8985b351a Mon Sep 17 00:00:00 2001 From: Anton Gavrilov Date: Thu, 18 Dec 2025 13:46:09 +0100 Subject: [PATCH 06/70] Consider iteration read --- .../subtensor/src/migrations/migrate_fix_staking_hot_keys.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pallets/subtensor/src/migrations/migrate_fix_staking_hot_keys.rs b/pallets/subtensor/src/migrations/migrate_fix_staking_hot_keys.rs index 7728ff0a6a..8c0358614d 100644 --- a/pallets/subtensor/src/migrations/migrate_fix_staking_hot_keys.rs +++ b/pallets/subtensor/src/migrations/migrate_fix_staking_hot_keys.rs @@ -23,6 +23,8 @@ pub fn migrate_fix_staking_hot_keys() -> Weight { let mut storage_writes: u64 = 0; for ((hotkey, coldkey, _netuid), alpha) in Alpha::::iter() { + storage_reads = storage_reads.saturating_add(1); + if alpha == 0 { continue; } From 354f1ee61ae3183cac298b42599a31ee16458efe Mon Sep 17 00:00:00 2001 From: Shamil Gadelshin Date: Fri, 19 Dec 2025 15:16:57 +0300 Subject: [PATCH 07/70] Set default weights for system pallets. --- runtime/src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 52746675f9..6c2798c97f 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -340,7 +340,7 @@ impl frame_system::Config for Runtime { // The data to be stored in an account. type AccountData = pallet_balances::AccountData; // Weight information for the extrinsics of this pallet. - type SystemWeightInfo = (); + type SystemWeightInfo = frame_system::weights::SubstrateWeight; // This is used as an identifier of the chain. 42 is the generic substrate prefix. type SS58Prefix = SS58Prefix; // The set code logic, just the default since we're not a parachain. @@ -353,7 +353,7 @@ impl frame_system::Config for Runtime { type PreInherents = (); type PostInherents = (); type PostTransactions = (); - type ExtensionsWeightInfo = (); + type ExtensionsWeightInfo = (); // frame_system exports only default extension weights } impl pallet_insecure_randomness_collective_flip::Config for Runtime {} @@ -371,7 +371,7 @@ impl pallet_grandpa::Config for Runtime { type KeyOwnerProof = sp_core::Void; - type WeightInfo = (); + type WeightInfo = (); // pallet_grandpa exports only default implementation type MaxAuthorities = ConstU32<32>; type MaxSetIdSessionEntries = ConstU64<0>; type MaxNominators = ConstU32<20>; @@ -409,7 +409,7 @@ impl pallet_timestamp::Config for Runtime { type Moment = u64; type OnTimestampSet = Aura; type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; - type WeightInfo = (); + type WeightInfo = pallet_timestamp::weights::SubstrateWeight; } impl pallet_utility::Config for Runtime { From face3f4dc3381722e31761f77d4da9196ed67bae Mon Sep 17 00:00:00 2001 From: Shamil Gadelshin Date: Fri, 19 Dec 2025 15:44:14 +0300 Subject: [PATCH 08/70] Bump spec version --- runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 6c2798c97f..98fab814ba 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -241,7 +241,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // `spec_version`, and `authoring_version` are the same between Wasm and native. // This value is set to 100 to notify Polkadot-JS App (https://polkadot.js.org/apps) to use // the compatible custom types. - spec_version: 365, + spec_version: 366, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, From 94a4f4104554fb23f1cd6a27096897f2c5fecd22 Mon Sep 17 00:00:00 2001 From: Loris Moulin Date: Fri, 19 Dec 2025 16:11:48 +0100 Subject: [PATCH 09/70] add frame_system extensions weight info --- runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 98fab814ba..22d7e84ea6 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -353,7 +353,7 @@ impl frame_system::Config for Runtime { type PreInherents = (); type PostInherents = (); type PostTransactions = (); - type ExtensionsWeightInfo = (); // frame_system exports only default extension weights + type ExtensionsWeightInfo = frame_system::SubstrateExtensionsWeight; } impl pallet_insecure_randomness_collective_flip::Config for Runtime {} From 3954bf0f3f0b455bca1b44038092a154d51ef750 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Sun, 21 Dec 2025 11:47:54 +0000 Subject: [PATCH 10/70] Add sudo-only hyperparameter for start call delay Prompt: "make a sudo-only hyperparameter for the delay before calling start call which is hardcoded to 50400 or 7*7200 currently" This commit converts the hardcoded DurationOfStartCall constant (50400 blocks, or ~7 days) into a runtime-configurable hyperparameter called StartCallDelay that can be modified via sudo extrinsic. Changes: - Added StartCallDelay storage value with DefaultStartCallDelay type_value - Renamed DurationOfStartCall config constant to InitialStartCallDelay - Added StartCallDelaySet event for hyperparameter updates - Added get_start_call_delay() and set_start_call_delay() functions - Added sudo_set_start_call_delay() extrinsic in admin-utils (call_index 84) - Updated subnet.rs to read from storage instead of config constant - Updated runtime constant from DurationOfStartCall to InitialStartCallDelay - Updated all mock files and test usages to use new parameter name - Updated benchmarks and tests to use StartCallDelay::::get() The delay can now be modified at runtime via the sudo_set_start_call_delay() extrinsic without requiring a runtime upgrade, providing more flexibility for network governance. Users can read the current value through: - Direct storage queries via state_getStorage RPC call - The get_start_call_delay() getter function for internal use - Client libraries (polkadot-js, subxt) which auto-generate storage accessors --- chain-extensions/src/mock.rs | 4 ++-- pallets/admin-utils/src/lib.rs | 18 ++++++++++++++++++ pallets/admin-utils/src/tests/mock.rs | 4 ++-- pallets/subtensor/src/benchmarks.rs | 2 +- pallets/subtensor/src/coinbase/root.rs | 7 +++++++ pallets/subtensor/src/lib.rs | 11 +++++++++++ pallets/subtensor/src/macros/config.rs | 4 ++-- pallets/subtensor/src/macros/events.rs | 2 ++ pallets/subtensor/src/subnets/subnet.rs | 2 +- pallets/subtensor/src/tests/coinbase.rs | 2 +- pallets/subtensor/src/tests/mock.rs | 4 ++-- pallets/subtensor/src/tests/subnet.rs | 10 +++++----- pallets/transaction-fee/src/tests/mock.rs | 4 ++-- runtime/src/lib.rs | 4 ++-- 14 files changed, 58 insertions(+), 20 deletions(-) diff --git a/chain-extensions/src/mock.rs b/chain-extensions/src/mock.rs index 98ea096199..660aa0c77c 100644 --- a/chain-extensions/src/mock.rs +++ b/chain-extensions/src/mock.rs @@ -331,7 +331,7 @@ parameter_types! { pub const InitialDissolveNetworkScheduleDuration: u64 = 5 * 24 * 60 * 60 / 12; // Default as 5 days pub const InitialTaoWeight: u64 = 0; // 100% global weight. pub const InitialEmaPriceHalvingPeriod: u64 = 201_600_u64; // 4 weeks - pub const DurationOfStartCall: u64 = 7 * 24 * 60 * 60 / 12; // Default as 7 days + pub const InitialStartCallDelay: u64 = 7 * 24 * 60 * 60 / 12; // Default as 7 days pub const InitialKeySwapOnSubnetCost: u64 = 10_000_000; pub const HotkeySwapOnSubnetInterval: u64 = 15; // 15 block, should be bigger than subnet number, then trigger clean up for all subnets pub const MaxContributorsPerLeaseToRemove: u32 = 3; @@ -402,7 +402,7 @@ impl pallet_subtensor::Config for Test { type InitialDissolveNetworkScheduleDuration = InitialDissolveNetworkScheduleDuration; type InitialTaoWeight = InitialTaoWeight; type InitialEmaPriceHalvingPeriod = InitialEmaPriceHalvingPeriod; - type DurationOfStartCall = DurationOfStartCall; + type InitialStartCallDelay = InitialStartCallDelay; type SwapInterface = pallet_subtensor_swap::Pallet; type KeySwapOnSubnetCost = InitialKeySwapOnSubnetCost; type HotkeySwapOnSubnetInterval = HotkeySwapOnSubnetInterval; diff --git a/pallets/admin-utils/src/lib.rs b/pallets/admin-utils/src/lib.rs index de6ac5825b..ebb239fff9 100644 --- a/pallets/admin-utils/src/lib.rs +++ b/pallets/admin-utils/src/lib.rs @@ -2213,6 +2213,24 @@ pub mod pallet { log::debug!("set_tao_flow_smoothing_factor( {smoothing_factor:?} ) "); Ok(()) } + + /// Sets the delay before a subnet can call start + #[pallet::call_index(84)] + #[pallet::weight(( + Weight::from_parts(14_000_000, 0) + .saturating_add(::DbWeight::get().writes(1)), + DispatchClass::Operational, + Pays::Yes + ))] + pub fn sudo_set_start_call_delay( + origin: OriginFor, + delay: u64, + ) -> DispatchResult { + ensure_root(origin)?; + pallet_subtensor::Pallet::::set_start_call_delay(delay); + log::debug!("StartCallDelay( delay: {delay:?} ) "); + Ok(()) + } } } diff --git a/pallets/admin-utils/src/tests/mock.rs b/pallets/admin-utils/src/tests/mock.rs index 0140808baa..e1ab02d911 100644 --- a/pallets/admin-utils/src/tests/mock.rs +++ b/pallets/admin-utils/src/tests/mock.rs @@ -145,7 +145,7 @@ parameter_types! { pub const InitialDissolveNetworkScheduleDuration: u64 = 5 * 24 * 60 * 60 / 12; // 5 days pub const InitialTaoWeight: u64 = u64::MAX/10; // 10% global weight. pub const InitialEmaPriceHalvingPeriod: u64 = 201_600_u64; // 4 weeks - pub const DurationOfStartCall: u64 = 7 * 24 * 60 * 60 / 12; // 7 days + pub const InitialStartCallDelay: u64 = 7 * 24 * 60 * 60 / 12; // 7 days pub const InitialKeySwapOnSubnetCost: u64 = 10_000_000; pub const HotkeySwapOnSubnetInterval: u64 = 7 * 24 * 60 * 60 / 12; // 7 days pub const LeaseDividendsDistributionInterval: u32 = 100; // 100 blocks @@ -215,7 +215,7 @@ impl pallet_subtensor::Config for Test { type InitialDissolveNetworkScheduleDuration = InitialDissolveNetworkScheduleDuration; type InitialTaoWeight = InitialTaoWeight; type InitialEmaPriceHalvingPeriod = InitialEmaPriceHalvingPeriod; - type DurationOfStartCall = DurationOfStartCall; + type InitialStartCallDelay = InitialStartCallDelay; type SwapInterface = Swap; type KeySwapOnSubnetCost = InitialKeySwapOnSubnetCost; type HotkeySwapOnSubnetInterval = HotkeySwapOnSubnetInterval; diff --git a/pallets/subtensor/src/benchmarks.rs b/pallets/subtensor/src/benchmarks.rs index 223c086419..062732c51f 100644 --- a/pallets/subtensor/src/benchmarks.rs +++ b/pallets/subtensor/src/benchmarks.rs @@ -647,7 +647,7 @@ mod pallet_benchmarks { assert_eq!(FirstEmissionBlockNumber::::get(netuid), None); let current_block: u64 = Subtensor::::get_current_block_as_u64(); - let duration = ::DurationOfStartCall::get(); + let duration = StartCallDelay::::get(); let block: BlockNumberFor = (current_block + duration) .try_into() .ok() diff --git a/pallets/subtensor/src/coinbase/root.rs b/pallets/subtensor/src/coinbase/root.rs index 893f855f3e..27d927afb6 100644 --- a/pallets/subtensor/src/coinbase/root.rs +++ b/pallets/subtensor/src/coinbase/root.rs @@ -542,6 +542,13 @@ impl Pallet { NetworkImmunityPeriod::::set(net_immunity_period); Self::deposit_event(Event::NetworkImmunityPeriodSet(net_immunity_period)); } + pub fn get_start_call_delay() -> u64 { + StartCallDelay::::get() + } + pub fn set_start_call_delay(delay: u64) { + StartCallDelay::::set(delay); + Self::deposit_event(Event::StartCallDelaySet(delay)); + } pub fn set_network_min_lock(net_min_lock: TaoCurrency) { NetworkMinLockCost::::set(net_min_lock); Self::deposit_event(Event::NetworkMinLockCostSet(net_min_lock)); diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index bbec3ce934..1b89354edf 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -645,6 +645,12 @@ pub mod pallet { T::InitialSubnetOwnerCut::get() } + /// Default value for start call delay. + #[pallet::type_value] + pub fn DefaultStartCallDelay() -> u64 { + T::InitialStartCallDelay::get() + } + /// Default value for recycle or burn. #[pallet::type_value] pub fn DefaultRecycleOrBurn() -> RecycleOrBurnEnum { @@ -1490,6 +1496,11 @@ pub mod pallet { pub type NetworkImmunityPeriod = StorageValue<_, u64, ValueQuery, DefaultNetworkImmunityPeriod>; + /// ITEM( start_call_delay ) + #[pallet::storage] + pub type StartCallDelay = + StorageValue<_, u64, ValueQuery, DefaultStartCallDelay>; + /// ITEM( min_network_lock_cost ) #[pallet::storage] pub type NetworkMinLockCost = diff --git a/pallets/subtensor/src/macros/config.rs b/pallets/subtensor/src/macros/config.rs index a735bde1e1..ce6dfd57c2 100644 --- a/pallets/subtensor/src/macros/config.rs +++ b/pallets/subtensor/src/macros/config.rs @@ -233,9 +233,9 @@ mod config { /// Initial EMA price halving period #[pallet::constant] type InitialEmaPriceHalvingPeriod: Get; - /// Block number after a new subnet accept the start call extrinsic. + /// Initial block number after a new subnet accept the start call extrinsic. #[pallet::constant] - type DurationOfStartCall: Get; + type InitialStartCallDelay: Get; /// Cost of swapping a hotkey in a subnet. #[pallet::constant] type KeySwapOnSubnetCost: Get; diff --git a/pallets/subtensor/src/macros/events.rs b/pallets/subtensor/src/macros/events.rs index d015205d4d..1551ec48c4 100644 --- a/pallets/subtensor/src/macros/events.rs +++ b/pallets/subtensor/src/macros/events.rs @@ -147,6 +147,8 @@ mod events { NetworkRateLimitSet(u64), /// the network immunity period is set. NetworkImmunityPeriodSet(u64), + /// the start call delay is set. + StartCallDelaySet(u64), /// the network minimum locking cost is set. NetworkMinLockCostSet(TaoCurrency), /// the maximum number of subnets is set diff --git a/pallets/subtensor/src/subnets/subnet.rs b/pallets/subtensor/src/subnets/subnet.rs index 4185aee624..0de55e61bd 100644 --- a/pallets/subtensor/src/subnets/subnet.rs +++ b/pallets/subtensor/src/subnets/subnet.rs @@ -358,7 +358,7 @@ impl Pallet { ensure!( current_block_number - >= registration_block_number.saturating_add(T::DurationOfStartCall::get()), + >= registration_block_number.saturating_add(StartCallDelay::::get()), Error::::NeedWaitingMoreBlocksToStarCall ); let next_block_number = current_block_number.saturating_add(1); diff --git a/pallets/subtensor/src/tests/coinbase.rs b/pallets/subtensor/src/tests/coinbase.rs index 2ba9f93556..a318d7941d 100644 --- a/pallets/subtensor/src/tests/coinbase.rs +++ b/pallets/subtensor/src/tests/coinbase.rs @@ -2691,7 +2691,7 @@ fn test_run_coinbase_not_started_start_after() { // We expect that the epoch ran. assert_eq!(BlocksSinceLastStep::::get(netuid), 0); - let block_number = DurationOfStartCall::get(); + let block_number = StartCallDelay::::get(); run_to_block_no_epoch(netuid, block_number); let current_block = System::block_number(); diff --git a/pallets/subtensor/src/tests/mock.rs b/pallets/subtensor/src/tests/mock.rs index 090fcf8f75..c33be9068c 100644 --- a/pallets/subtensor/src/tests/mock.rs +++ b/pallets/subtensor/src/tests/mock.rs @@ -218,7 +218,7 @@ parameter_types! { pub const InitialDissolveNetworkScheduleDuration: u64 = 5 * 24 * 60 * 60 / 12; // Default as 5 days pub const InitialTaoWeight: u64 = 0; // 100% global weight. pub const InitialEmaPriceHalvingPeriod: u64 = 201_600_u64; // 4 weeks - pub const DurationOfStartCall: u64 = 7 * 24 * 60 * 60 / 12; // Default as 7 days + pub const InitialStartCallDelay: u64 = 7 * 24 * 60 * 60 / 12; // Default as 7 days pub const InitialKeySwapOnSubnetCost: u64 = 10_000_000; pub const HotkeySwapOnSubnetInterval: u64 = 15; // 15 block, should be bigger than subnet number, then trigger clean up for all subnets pub const MaxContributorsPerLeaseToRemove: u32 = 3; @@ -289,7 +289,7 @@ impl crate::Config for Test { type InitialDissolveNetworkScheduleDuration = InitialDissolveNetworkScheduleDuration; type InitialTaoWeight = InitialTaoWeight; type InitialEmaPriceHalvingPeriod = InitialEmaPriceHalvingPeriod; - type DurationOfStartCall = DurationOfStartCall; + type InitialStartCallDelay = InitialStartCallDelay; type SwapInterface = pallet_subtensor_swap::Pallet; type KeySwapOnSubnetCost = InitialKeySwapOnSubnetCost; type HotkeySwapOnSubnetInterval = HotkeySwapOnSubnetInterval; diff --git a/pallets/subtensor/src/tests/subnet.rs b/pallets/subtensor/src/tests/subnet.rs index a11eae759e..3dd94ed2a7 100644 --- a/pallets/subtensor/src/tests/subnet.rs +++ b/pallets/subtensor/src/tests/subnet.rs @@ -27,7 +27,7 @@ fn test_do_start_call_ok() { // account 0 is the default owner for any subnet assert_eq!(SubnetOwner::::get(netuid), coldkey_account_id); - let block_number = System::block_number() + DurationOfStartCall::get(); + let block_number = System::block_number() + StartCallDelay::::get(); System::set_block_number(block_number); assert_ok!(SubtensorModule::start_call( @@ -76,7 +76,7 @@ fn test_do_start_call_fail_not_owner() { assert_eq!(SubnetOwner::::get(netuid), coldkey_account_id); - System::set_block_number(System::block_number() + DurationOfStartCall::get()); + System::set_block_number(System::block_number() + StartCallDelay::::get()); assert_noop!( SubtensorModule::start_call( @@ -143,7 +143,7 @@ fn test_do_start_call_fail_for_set_again() { assert_eq!(SubnetOwner::::get(netuid), coldkey_account_id); - let block_number = System::block_number() + DurationOfStartCall::get(); + let block_number = System::block_number() + StartCallDelay::::get(); System::set_block_number(block_number); assert_ok!(SubtensorModule::start_call( @@ -174,7 +174,7 @@ fn test_do_start_call_ok_with_same_block_number_after_coinbase() { assert_eq!(SubnetOwner::::get(netuid), coldkey_account_id); - let block_number = System::block_number() + DurationOfStartCall::get(); + let block_number = System::block_number() + StartCallDelay::::get(); System::set_block_number(block_number); assert_ok!(SubtensorModule::start_call( @@ -368,7 +368,7 @@ fn test_subtoken_enable() { add_network_disable_subtoken(netuid, 10, 0); assert!(!SubtokenEnabled::::get(netuid)); - let block_number = System::block_number() + DurationOfStartCall::get(); + let block_number = System::block_number() + StartCallDelay::::get(); System::set_block_number(block_number); assert_ok!(SubtensorModule::start_call( diff --git a/pallets/transaction-fee/src/tests/mock.rs b/pallets/transaction-fee/src/tests/mock.rs index ee5b1693ba..75e90346b4 100644 --- a/pallets/transaction-fee/src/tests/mock.rs +++ b/pallets/transaction-fee/src/tests/mock.rs @@ -210,7 +210,7 @@ parameter_types! { pub const InitialDissolveNetworkScheduleDuration: u64 = 5 * 24 * 60 * 60 / 12; // 5 days pub const InitialTaoWeight: u64 = u64::MAX/10; // 10% global weight. pub const InitialEmaPriceHalvingPeriod: u64 = 201_600_u64; // 4 weeks - pub const DurationOfStartCall: u64 = 7 * 24 * 60 * 60 / 12; // 7 days + pub const InitialStartCallDelay: u64 = 7 * 24 * 60 * 60 / 12; // 7 days pub const InitialKeySwapOnSubnetCost: u64 = 10_000_000; pub const HotkeySwapOnSubnetInterval: u64 = 7 * 24 * 60 * 60 / 12; // 7 days pub const LeaseDividendsDistributionInterval: u32 = 100; // 100 blocks @@ -280,7 +280,7 @@ impl pallet_subtensor::Config for Test { type InitialDissolveNetworkScheduleDuration = InitialDissolveNetworkScheduleDuration; type InitialTaoWeight = InitialTaoWeight; type InitialEmaPriceHalvingPeriod = InitialEmaPriceHalvingPeriod; - type DurationOfStartCall = DurationOfStartCall; + type InitialStartCallDelay = InitialStartCallDelay; type SwapInterface = Swap; type KeySwapOnSubnetCost = InitialKeySwapOnSubnetCost; type HotkeySwapOnSubnetInterval = HotkeySwapOnSubnetInterval; diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 9ece1dd025..e6fd56fb61 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -1034,7 +1034,7 @@ parameter_types! { pub const SubtensorInitialTaoWeight: u64 = 971_718_665_099_567_868; // 0.05267697438728329% tao weight. pub const InitialEmaPriceHalvingPeriod: u64 = 201_600_u64; // 4 weeks // 7 * 24 * 60 * 60 / 12 = 7 days - pub const DurationOfStartCall: u64 = prod_or_fast!(7 * 24 * 60 * 60 / 12, 10); + pub const InitialStartCallDelay: u64 = prod_or_fast!(7 * 24 * 60 * 60 / 12, 10); pub const SubtensorInitialKeySwapOnSubnetCost: u64 = 1_000_000; // 0.001 TAO pub const HotkeySwapOnSubnetInterval : BlockNumber = 5 * 24 * 60 * 60 / 12; // 5 days pub const LeaseDividendsDistributionInterval: BlockNumber = 100; // 100 blocks @@ -1104,7 +1104,7 @@ impl pallet_subtensor::Config for Runtime { type InitialColdkeySwapRescheduleDuration = InitialColdkeySwapRescheduleDuration; type InitialDissolveNetworkScheduleDuration = InitialDissolveNetworkScheduleDuration; type InitialEmaPriceHalvingPeriod = InitialEmaPriceHalvingPeriod; - type DurationOfStartCall = DurationOfStartCall; + type InitialStartCallDelay = InitialStartCallDelay; type SwapInterface = Swap; type KeySwapOnSubnetCost = SubtensorInitialKeySwapOnSubnetCost; type HotkeySwapOnSubnetInterval = HotkeySwapOnSubnetInterval; From b5ce250fa36095e72635491962b46eadbbfdb71c Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Mon, 22 Dec 2025 00:23:52 +0000 Subject: [PATCH 11/70] Add comprehensive test for start call delay hyperparameter Added test_sudo_set_start_call_delay_permissions_and_zero_delay which: 1. Verifies permission checking - non-root accounts cannot set the delay 2. Creates a subnet 3. Attempts to start it immediately - FAILS (delay not passed) 4. Sets delay to zero via sudo_set_start_call_delay() 5. Verifies StartCallDelaySet event is emitted 6. Attempts to start the same subnet again - SUCCEEDS (delay now zero) 7. Attempts to start it a third time - FAILS (already started) This test validates the key scenario: a subnet that couldn't be started due to the delay can be started after reducing the delay to zero, proving the hyperparameter change takes immediate effect. The test calls start_call three times to thoroughly verify the state transitions and confirms the proper event is emitted when the delay is changed. --- pallets/admin-utils/src/tests/mod.rs | 95 ++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/pallets/admin-utils/src/tests/mod.rs b/pallets/admin-utils/src/tests/mod.rs index 1aaefc8f8d..8e61e8c1ac 100644 --- a/pallets/admin-utils/src/tests/mod.rs +++ b/pallets/admin-utils/src/tests/mod.rs @@ -2865,3 +2865,98 @@ fn test_sudo_set_min_allowed_uids() { ); }); } + +#[test] +fn test_sudo_set_start_call_delay_permissions_and_zero_delay() { + new_test_ext().execute_with(|| { + let netuid = NetUid::from(1); + let tempo: u16 = 13; + let coldkey_account_id = U256::from(0); + let non_root_account = U256::from(1); + + // Get initial delay value (should be non-zero) + let initial_delay = pallet_subtensor::StartCallDelay::::get(); + assert!(initial_delay > 0, "Initial delay should be greater than zero"); + + // Test 1: Non-root account should fail to set delay + assert_err!( + AdminUtils::sudo_set_start_call_delay( + <::RuntimeOrigin>::signed(non_root_account), + 0 + ), + DispatchError::BadOrigin + ); + assert_eq!( + pallet_subtensor::StartCallDelay::::get(), + initial_delay, + "Delay should not have changed" + ); + + // Test 2: Create a subnet + add_network(netuid, tempo); + assert_eq!( + pallet_subtensor::FirstEmissionBlockNumber::::get(netuid), + None, + "Emission block should not be set yet" + ); + assert_eq!( + pallet_subtensor::SubnetOwner::::get(netuid), + coldkey_account_id, + "Default owner should be account 0" + ); + + // Test 3: Try to start the subnet immediately - should FAIL (delay not passed) + assert_err!( + pallet_subtensor::Pallet::::start_call( + <::RuntimeOrigin>::signed(coldkey_account_id), + netuid + ), + pallet_subtensor::Error::::NeedWaitingMoreBlocksToStarCall + ); + + // Verify emission has not been set + assert_eq!( + pallet_subtensor::FirstEmissionBlockNumber::::get(netuid), + None, + "Emission should not be set yet" + ); + + // Test 4: Root sets delay to zero + assert_ok!(AdminUtils::sudo_set_start_call_delay( + <::RuntimeOrigin>::root(), + 0 + )); + assert_eq!( + pallet_subtensor::StartCallDelay::::get(), + 0, + "Delay should now be zero" + ); + + // Verify event was emitted + frame_system::Pallet::::assert_last_event( + RuntimeEvent::SubtensorModule(pallet_subtensor::Event::StartCallDelaySet(0)) + ); + + // Test 5: Try to start the subnet again - should SUCCEED (delay is now zero) + let current_block = frame_system::Pallet::::block_number(); + assert_ok!(pallet_subtensor::Pallet::::start_call( + <::RuntimeOrigin>::signed(coldkey_account_id), + netuid + )); + + assert_eq!( + pallet_subtensor::FirstEmissionBlockNumber::::get(netuid), + Some(current_block + 1), + "Emission should start at next block" + ); + + // Test 6: Try to start it a third time - should FAIL (already started) + assert_err!( + pallet_subtensor::Pallet::::start_call( + <::RuntimeOrigin>::signed(coldkey_account_id), + netuid + ), + pallet_subtensor::Error::::FirstEmissionBlockNumberAlreadySet + ); + }); +} From 93c2e4ef0af3fbe161f9424b805ec0d4f09a49e0 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Mon, 22 Dec 2025 03:48:00 +0200 Subject: [PATCH 12/70] cargo fmt --- pallets/admin-utils/src/lib.rs | 5 +---- pallets/admin-utils/src/tests/mod.rs | 11 +++++++---- pallets/subtensor/src/lib.rs | 3 +-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/pallets/admin-utils/src/lib.rs b/pallets/admin-utils/src/lib.rs index ebb239fff9..e717449887 100644 --- a/pallets/admin-utils/src/lib.rs +++ b/pallets/admin-utils/src/lib.rs @@ -2222,10 +2222,7 @@ pub mod pallet { DispatchClass::Operational, Pays::Yes ))] - pub fn sudo_set_start_call_delay( - origin: OriginFor, - delay: u64, - ) -> DispatchResult { + pub fn sudo_set_start_call_delay(origin: OriginFor, delay: u64) -> DispatchResult { ensure_root(origin)?; pallet_subtensor::Pallet::::set_start_call_delay(delay); log::debug!("StartCallDelay( delay: {delay:?} ) "); diff --git a/pallets/admin-utils/src/tests/mod.rs b/pallets/admin-utils/src/tests/mod.rs index 8e61e8c1ac..24932ef508 100644 --- a/pallets/admin-utils/src/tests/mod.rs +++ b/pallets/admin-utils/src/tests/mod.rs @@ -2876,7 +2876,10 @@ fn test_sudo_set_start_call_delay_permissions_and_zero_delay() { // Get initial delay value (should be non-zero) let initial_delay = pallet_subtensor::StartCallDelay::::get(); - assert!(initial_delay > 0, "Initial delay should be greater than zero"); + assert!( + initial_delay > 0, + "Initial delay should be greater than zero" + ); // Test 1: Non-root account should fail to set delay assert_err!( @@ -2933,9 +2936,9 @@ fn test_sudo_set_start_call_delay_permissions_and_zero_delay() { ); // Verify event was emitted - frame_system::Pallet::::assert_last_event( - RuntimeEvent::SubtensorModule(pallet_subtensor::Event::StartCallDelaySet(0)) - ); + frame_system::Pallet::::assert_last_event(RuntimeEvent::SubtensorModule( + pallet_subtensor::Event::StartCallDelaySet(0), + )); // Test 5: Try to start the subnet again - should SUCCEED (delay is now zero) let current_block = frame_system::Pallet::::block_number(); diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index 1b89354edf..b3eab3665a 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -1498,8 +1498,7 @@ pub mod pallet { /// ITEM( start_call_delay ) #[pallet::storage] - pub type StartCallDelay = - StorageValue<_, u64, ValueQuery, DefaultStartCallDelay>; + pub type StartCallDelay = StorageValue<_, u64, ValueQuery, DefaultStartCallDelay>; /// ITEM( min_network_lock_cost ) #[pallet::storage] From e3bdadccb49ac9e7e3e711c6541eaf95a7eb9646 Mon Sep 17 00:00:00 2001 From: open-junius Date: Mon, 22 Dec 2025 20:13:40 +0800 Subject: [PATCH 13/70] bump version --- pallets/subtensor/src/staking/remove_stake.rs | 6 +----- runtime/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/pallets/subtensor/src/staking/remove_stake.rs b/pallets/subtensor/src/staking/remove_stake.rs index 423cb97493..74a6bf34a6 100644 --- a/pallets/subtensor/src/staking/remove_stake.rs +++ b/pallets/subtensor/src/staking/remove_stake.rs @@ -480,7 +480,6 @@ impl Pallet { // - per (hot,cold) α VALUE (not shares) with fallback to raw share if pool uninitialized, // - track hotkeys to clear pool totals. let mut keys_to_remove: Vec<(T::AccountId, T::AccountId)> = Vec::new(); - let mut hotkeys_seen: Vec = Vec::new(); let mut stakers: Vec<(T::AccountId, T::AccountId, u128)> = Vec::new(); let mut total_alpha_value_u128: u128 = 0; @@ -495,9 +494,6 @@ impl Pallet { continue; } keys_to_remove.push((hot.clone(), cold.clone())); - if !hotkeys_seen.contains(hot) { - hotkeys_seen.push(hot.clone()); - } // Primary: actual α value via share pool. let pool = Self::get_alpha_share_pool(hot.clone(), netuid); @@ -579,7 +575,7 @@ impl Pallet { Alpha::::remove((hot, cold, netuid)); } // 7.b) Clear share‑pool totals for each hotkey on this subnet. - for hot in hotkeys_seen { + for hot in hotkeys_in_subnet { TotalHotkeyAlpha::::remove(&hot, netuid); TotalHotkeyShares::::remove(&hot, netuid); } diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 52746675f9..48e49b76c9 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -241,7 +241,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // `spec_version`, and `authoring_version` are the same between Wasm and native. // This value is set to 100 to notify Polkadot-JS App (https://polkadot.js.org/apps) to use // the compatible custom types. - spec_version: 365, + spec_version: 366, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, From 745db21dd37b23ccc9646988299b35f2b0cb6698 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Sat, 27 Dec 2025 19:28:48 +0000 Subject: [PATCH 14/70] Update localnet_patch.sh to use InitialStartCallDelay Replace all references to DurationOfStartCall with InitialStartCallDelay to match the renamed constant in the codebase. Improvements: - Updated variable names from DurationOfStartCall to InitialStartCallDelay - Updated grep checks to look for the new constant name - Updated perl replacements to modify the new constant name - Added clear error messages for all replacement failures - Added context messages explaining that codebase may have changed - Added progress indicator when applying patches - Enhanced final success message with checkmark --- scripts/localnet_patch.sh | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/scripts/localnet_patch.sh b/scripts/localnet_patch.sh index e3bee8c5b8..127d726f37 100755 --- a/scripts/localnet_patch.sh +++ b/scripts/localnet_patch.sh @@ -4,29 +4,45 @@ set -e -DurationOfStartCall="runtime/src/lib.rs" +InitialStartCallDelay="runtime/src/lib.rs" DefaultPendingCooldown="pallets/subtensor/src/lib.rs" SetChildren="pallets/subtensor/src/utils/rate_limiting.rs" # Checkers -if ! grep -q 'pub const DurationOfStartCall: u64' "$DurationOfStartCall"; then - echo "Error: Target string not found in $DurationOfStartCall" +if ! grep -q 'pub const InitialStartCallDelay: u64' "$InitialStartCallDelay"; then + echo "Error: Target string 'pub const InitialStartCallDelay: u64' not found in $InitialStartCallDelay" + echo "This may indicate the codebase has changed. Please verify the target code exists." exit 1 fi if ! grep -q 'pub fn DefaultPendingCooldown() -> u64 {' "$DefaultPendingCooldown"; then - echo "Error: Target function not found in $DefaultPendingCooldown" + echo "Error: Target function 'DefaultPendingCooldown' not found in $DefaultPendingCooldown" + echo "This may indicate the codebase has changed. Please verify the target code exists." exit 1 fi if ! grep -q 'Self::SetChildren => 150, // 30 minutes' "$SetChildren"; then - echo "Error: Target string not found in $SetChildren" + echo "Error: Target string 'Self::SetChildren => 150' not found in $SetChildren" + echo "This may indicate the codebase has changed. Please verify the target code exists." exit 1 fi -# replace -perl -0777 -i -pe 's|pub const DurationOfStartCall: u64 = prod_or_fast!\(7 \* 24 \* 60 \* 60 / 12, 10\);|pub const DurationOfStartCall: u64 = prod_or_fast!(5, 10);|' "$DurationOfStartCall" -perl -0777 -i -pe 's|pub fn DefaultPendingCooldown\(\) -> u64 \{\s*prod_or_fast!\(7_200, 15\)\s*\}|pub fn DefaultPendingCooldown() -> u64 {\n prod_or_fast!(15, 15)\n }|g' "$DefaultPendingCooldown" -perl -0777 -i -pe 's|Self::SetChildren => 150, // 30 minutes|Self::SetChildren => 15, // 3 min|' "$SetChildren" +# Replace - with error handling +echo "Applying patches..." -echo "Patch applied successfully." +if ! perl -0777 -i -pe 's|pub const InitialStartCallDelay: u64 = prod_or_fast!\(7 \* 24 \* 60 \* 60 / 12, 10\);|pub const InitialStartCallDelay: u64 = prod_or_fast!(5, 10);|' "$InitialStartCallDelay"; then + echo "Error: Failed to replace InitialStartCallDelay in $InitialStartCallDelay" + exit 1 +fi + +if ! perl -0777 -i -pe 's|pub fn DefaultPendingCooldown\(\) -> u64 \{\s*prod_or_fast!\(7_200, 15\)\s*\}|pub fn DefaultPendingCooldown() -> u64 {\n prod_or_fast!(15, 15)\n }|g' "$DefaultPendingCooldown"; then + echo "Error: Failed to replace DefaultPendingCooldown in $DefaultPendingCooldown" + exit 1 +fi + +if ! perl -0777 -i -pe 's|Self::SetChildren => 150, // 30 minutes|Self::SetChildren => 15, // 3 min|' "$SetChildren"; then + echo "Error: Failed to replace SetChildren rate limit in $SetChildren" + exit 1 +fi + +echo "✓ All patches applied successfully." From f81c5dbb664911fa663d3b0d55a45d37ff7b1d41 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Sat, 27 Dec 2025 19:52:46 +0000 Subject: [PATCH 15/70] Refactor localnet_patch.sh to use reusable patch_file function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eliminates code duplication by consolidating check and replace logic into a single function, improving maintainability and making it easier to add new patches. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- scripts/localnet_patch.sh | 82 +++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/scripts/localnet_patch.sh b/scripts/localnet_patch.sh index 127d726f37..f36c912512 100755 --- a/scripts/localnet_patch.sh +++ b/scripts/localnet_patch.sh @@ -4,45 +4,51 @@ set -e -InitialStartCallDelay="runtime/src/lib.rs" -DefaultPendingCooldown="pallets/subtensor/src/lib.rs" -SetChildren="pallets/subtensor/src/utils/rate_limiting.rs" - -# Checkers -if ! grep -q 'pub const InitialStartCallDelay: u64' "$InitialStartCallDelay"; then - echo "Error: Target string 'pub const InitialStartCallDelay: u64' not found in $InitialStartCallDelay" - echo "This may indicate the codebase has changed. Please verify the target code exists." - exit 1 -fi - -if ! grep -q 'pub fn DefaultPendingCooldown() -> u64 {' "$DefaultPendingCooldown"; then - echo "Error: Target function 'DefaultPendingCooldown' not found in $DefaultPendingCooldown" - echo "This may indicate the codebase has changed. Please verify the target code exists." - exit 1 -fi - -if ! grep -q 'Self::SetChildren => 150, // 30 minutes' "$SetChildren"; then - echo "Error: Target string 'Self::SetChildren => 150' not found in $SetChildren" - echo "This may indicate the codebase has changed. Please verify the target code exists." - exit 1 -fi - -# Replace - with error handling -echo "Applying patches..." - -if ! perl -0777 -i -pe 's|pub const InitialStartCallDelay: u64 = prod_or_fast!\(7 \* 24 \* 60 \* 60 / 12, 10\);|pub const InitialStartCallDelay: u64 = prod_or_fast!(5, 10);|' "$InitialStartCallDelay"; then - echo "Error: Failed to replace InitialStartCallDelay in $InitialStartCallDelay" - exit 1 -fi +# Function to check for a pattern and apply a replacement +# Args: file_path, search_pattern, replacement_pattern, description +patch_file() { + local file_path="$1" + local search_pattern="$2" + local replacement_pattern="$3" + local description="$4" + + # Check if the search pattern exists + if ! grep -qF "$search_pattern" "$file_path" 2>/dev/null && ! grep -qP "$search_pattern" "$file_path" 2>/dev/null; then + echo "Error: Target pattern '$search_pattern' not found in $file_path" + echo "Description: $description" + echo "This may indicate the codebase has changed. Please verify the target code exists." + exit 1 + fi + + # Apply the replacement + if ! perl -0777 -i -pe "$replacement_pattern" "$file_path"; then + echo "Error: Failed to apply replacement in $file_path" + echo "Description: $description" + exit 1 + fi +} -if ! perl -0777 -i -pe 's|pub fn DefaultPendingCooldown\(\) -> u64 \{\s*prod_or_fast!\(7_200, 15\)\s*\}|pub fn DefaultPendingCooldown() -> u64 {\n prod_or_fast!(15, 15)\n }|g' "$DefaultPendingCooldown"; then - echo "Error: Failed to replace DefaultPendingCooldown in $DefaultPendingCooldown" - exit 1 -fi +echo "Applying patches..." -if ! perl -0777 -i -pe 's|Self::SetChildren => 150, // 30 minutes|Self::SetChildren => 15, // 3 min|' "$SetChildren"; then - echo "Error: Failed to replace SetChildren rate limit in $SetChildren" - exit 1 -fi +# Patch 1: InitialStartCallDelay +patch_file \ + "runtime/src/lib.rs" \ + "pub const InitialStartCallDelay: u64" \ + 's|pub const InitialStartCallDelay: u64 = prod_or_fast!\(7 \* 24 \* 60 \* 60 / 12, 10\);|pub const InitialStartCallDelay: u64 = prod_or_fast!(5, 10);|' \ + "Reduce InitialStartCallDelay for local testing" + +# Patch 2: DefaultPendingCooldown +patch_file \ + "pallets/subtensor/src/lib.rs" \ + "pub fn DefaultPendingCooldown() -> u64 {" \ + 's|pub fn DefaultPendingCooldown\(\) -> u64 \{\s*prod_or_fast!\(7_200, 15\)\s*\}|pub fn DefaultPendingCooldown() -> u64 {\n prod_or_fast!(15, 15)\n }|g' \ + "Reduce DefaultPendingCooldown for local testing" + +# Patch 3: SetChildren rate limit +patch_file \ + "pallets/subtensor/src/utils/rate_limiting.rs" \ + "Self::SetChildren => 150, // 30 minutes" \ + 's|Self::SetChildren => 150, // 30 minutes|Self::SetChildren => 15, // 3 min|' \ + "Reduce SetChildren rate limit for local testing" echo "✓ All patches applied successfully." From 7473584436adf7c10e74974c111c4685863ff460 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Mon, 29 Dec 2025 02:14:48 +0000 Subject: [PATCH 16/70] Update contract tests to use InitialStartCallDelay constant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Renames DurationOfStartCall to InitialStartCallDelay in TypeScript contract tests to match the renamed runtime constant. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- contract-tests/src/subtensor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract-tests/src/subtensor.ts b/contract-tests/src/subtensor.ts index 12d652a9a3..fab9e8cc10 100644 --- a/contract-tests/src/subtensor.ts +++ b/contract-tests/src/subtensor.ts @@ -296,7 +296,7 @@ export async function setSubtokenEnable(api: TypedApi, netuid: nu export async function startCall(api: TypedApi, netuid: number, keypair: KeyPair) { const registerBlock = Number(await api.query.SubtensorModule.NetworkRegisteredAt.getValue(netuid)) let currentBlock = await api.query.System.Number.getValue() - const duration = Number(await api.constants.SubtensorModule.DurationOfStartCall) + const duration = Number(await api.constants.SubtensorModule.InitialStartCallDelay) while (currentBlock - registerBlock <= duration) { await new Promise((resolve) => setTimeout(resolve, 2000)); From 2df4cea137a976fdc30817611fa266e1c5799cf8 Mon Sep 17 00:00:00 2001 From: John Reed <87283488+JohnReedV@users.noreply.github.com> Date: Mon, 29 Dec 2025 10:14:48 -0800 Subject: [PATCH 17/70] bump spec --- runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 52746675f9..48e49b76c9 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -241,7 +241,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // `spec_version`, and `authoring_version` are the same between Wasm and native. // This value is set to 100 to notify Polkadot-JS App (https://polkadot.js.org/apps) to use // the compatible custom types. - spec_version: 365, + spec_version: 366, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, From 3eb616bd29a2a2bf2b86850c8965bdd453417139 Mon Sep 17 00:00:00 2001 From: Aliaksandr Tsurko Date: Mon, 29 Dec 2025 19:27:17 +0100 Subject: [PATCH 18/70] Incorporate subtensor transaction extension in contracts --- Cargo.lock | 1 + precompiles/Cargo.toml | 10 ++- precompiles/src/balance_transfer.rs | 39 +++++++++--- precompiles/src/crowdloan.rs | 37 +++++++++--- precompiles/src/extensions.rs | 94 +++++++++++++++++++++++------ precompiles/src/leasing.rs | 27 +++++++-- precompiles/src/lib.rs | 37 +++++++++--- precompiles/src/neuron.rs | 31 ++++++++-- precompiles/src/proxy.rs | 27 +++++++-- precompiles/src/staking.rs | 47 ++++++++++++--- precompiles/src/subnet.rs | 27 +++++++-- 11 files changed, 297 insertions(+), 80 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eeffdabd0f..c9ba8aede2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18109,6 +18109,7 @@ dependencies = [ "pallet-subtensor-proxy", "pallet-subtensor-swap", "precompile-utils", + "scale-info", "sp-core", "sp-io", "sp-runtime", diff --git a/precompiles/Cargo.toml b/precompiles/Cargo.toml index 12460dcfbb..400e1caa9f 100644 --- a/precompiles/Cargo.toml +++ b/precompiles/Cargo.toml @@ -11,6 +11,7 @@ repository = "https://github.com/opentensor/subtensor/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] +# codec.workspace = true ed25519-dalek = { workspace = true, features = ["alloc"] } fp-evm.workspace = true frame-support.workspace = true @@ -25,6 +26,7 @@ pallet-evm-precompile-simple.workspace = true pallet-evm-precompile-bn128.workspace = true pallet-subtensor-proxy.workspace = true precompile-utils.workspace = true +scale-info.workspace = true sp-core.workspace = true sp-io.workspace = true sp-runtime.workspace = true @@ -43,6 +45,7 @@ workspace = true [features] default = ["std"] std = [ + # "codec/std", "ed25519-dalek/std", "fp-evm/std", "frame-support/std", @@ -50,17 +53,18 @@ std = [ "log/std", "pallet-admin-utils/std", "pallet-balances/std", + "pallet-crowdloan/std", + "pallet-evm-precompile-bn128/std", "pallet-evm-precompile-dispatch/std", "pallet-evm-precompile-modexp/std", "pallet-evm-precompile-sha3fips/std", "pallet-evm-precompile-simple/std", - "pallet-evm-precompile-bn128/std", "pallet-evm/std", - "pallet-crowdloan/std", "pallet-subtensor-proxy/std", - "pallet-subtensor/std", "pallet-subtensor-swap/std", + "pallet-subtensor/std", "precompile-utils/std", + "scale-info/std", "sp-core/std", "sp-io/std", "sp-runtime/std", diff --git a/precompiles/src/balance_transfer.rs b/precompiles/src/balance_transfer.rs index b132125f22..c1cdab6ca5 100644 --- a/precompiles/src/balance_transfer.rs +++ b/precompiles/src/balance_transfer.rs @@ -1,11 +1,12 @@ use core::marker::PhantomData; -use frame_support::dispatch::{GetDispatchInfo, PostDispatchInfo}; +use frame_support::dispatch::{DispatchInfo, GetDispatchInfo, PostDispatchInfo}; +use frame_support::traits::IsSubType; use frame_system::RawOrigin; use pallet_evm::PrecompileHandle; use precompile_utils::EvmResult; use sp_core::{H256, U256}; -use sp_runtime::traits::{Dispatchable, StaticLookup, UniqueSaturatedInto}; +use sp_runtime::traits::{AsSystemOriginSigner, Dispatchable, StaticLookup, UniqueSaturatedInto}; use crate::{PrecompileExt, PrecompileHandleExt}; @@ -13,13 +14,22 @@ pub(crate) struct BalanceTransferPrecompile(PhantomData); impl PrecompileExt for BalanceTransferPrecompile where - R: frame_system::Config + pallet_balances::Config + pallet_evm::Config, + R: frame_system::Config + + pallet_balances::Config + + pallet_evm::Config + + pallet_subtensor::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]>, - ::RuntimeCall: - GetDispatchInfo + Dispatchable, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, + ::RuntimeCall: GetDispatchInfo + + Dispatchable + + IsSubType> + + IsSubType>, ::RuntimeCall: From> + GetDispatchInfo - + Dispatchable, + + Dispatchable, <::Lookup as StaticLookup>::Source: From, ::Balance: TryFrom, { @@ -29,13 +39,22 @@ where #[precompile_utils::precompile] impl BalanceTransferPrecompile where - R: frame_system::Config + pallet_balances::Config + pallet_evm::Config, + R: frame_system::Config + + pallet_balances::Config + + pallet_evm::Config + + pallet_subtensor::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]>, - ::RuntimeCall: - GetDispatchInfo + Dispatchable, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, + ::RuntimeCall: GetDispatchInfo + + Dispatchable + + IsSubType> + + IsSubType>, ::RuntimeCall: From> + GetDispatchInfo - + Dispatchable, + + Dispatchable, <::Lookup as StaticLookup>::Source: From, ::Balance: TryFrom, { diff --git a/precompiles/src/crowdloan.rs b/precompiles/src/crowdloan.rs index 246c65c70c..f0971015d9 100644 --- a/precompiles/src/crowdloan.rs +++ b/precompiles/src/crowdloan.rs @@ -2,7 +2,8 @@ use alloc::string::String; use core::marker::PhantomData; use fp_evm::{ExitError, PrecompileFailure}; -use frame_support::dispatch::{GetDispatchInfo, PostDispatchInfo}; +use frame_support::dispatch::{DispatchInfo, GetDispatchInfo, PostDispatchInfo}; +use frame_support::traits::IsSubType; use frame_system::RawOrigin; use pallet_evm::AddressMapping; use pallet_evm::PrecompileHandle; @@ -10,7 +11,7 @@ use pallet_subtensor_proxy as pallet_proxy; use precompile_utils::prelude::Address; use precompile_utils::{EvmResult, solidity::Codec}; use sp_core::{ByteArray, H256}; -use sp_runtime::traits::{Dispatchable, UniqueSaturatedInto}; +use sp_runtime::traits::{AsSystemOriginSigner, Dispatchable, UniqueSaturatedInto}; use crate::{PrecompileExt, PrecompileHandleExt}; @@ -18,11 +19,22 @@ pub struct CrowdloanPrecompile(PhantomData); impl PrecompileExt for CrowdloanPrecompile where - R: frame_system::Config + pallet_evm::Config + pallet_crowdloan::Config + pallet_proxy::Config, + R: frame_system::Config + + pallet_balances::Config + + pallet_crowdloan::Config + + pallet_evm::Config + + pallet_proxy::Config + + pallet_subtensor::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]> + ByteArray, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::RuntimeCall: From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, ::AddressMapping: AddressMapping, { const INDEX: u64 = 2057; @@ -31,14 +43,25 @@ where #[precompile_utils::precompile] impl CrowdloanPrecompile where - R: frame_system::Config + pallet_evm::Config + pallet_crowdloan::Config + pallet_proxy::Config, + R: frame_system::Config + + pallet_balances::Config + + pallet_crowdloan::Config + + pallet_evm::Config + + pallet_proxy::Config + + pallet_subtensor::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]> + ByteArray, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::RuntimeCall: From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, ::RuntimeCall: From> + GetDispatchInfo - + Dispatchable, + + Dispatchable, ::AddressMapping: AddressMapping, { #[precompile::public("getCrowdloan(uint32)")] diff --git a/precompiles/src/extensions.rs b/precompiles/src/extensions.rs index fab35a8b79..66c4233f95 100644 --- a/precompiles/src/extensions.rs +++ b/precompiles/src/extensions.rs @@ -3,15 +3,25 @@ extern crate alloc; use alloc::format; use frame_support::dispatch::{DispatchInfo, GetDispatchInfo, Pays, PostDispatchInfo}; +use frame_support::traits::IsSubType; use frame_system::RawOrigin; use pallet_admin_utils::{PrecompileEnable, PrecompileEnum}; use pallet_evm::{ AddressMapping, BalanceConverter, EvmBalance, ExitError, GasWeightMapping, Precompile, PrecompileFailure, PrecompileHandle, PrecompileResult, }; +use pallet_subtensor::transaction_extension::SubtensorTransactionExtension; use precompile_utils::EvmResult; +use scale_info::TypeInfo; use sp_core::{H160, U256, blake2_256}; -use sp_runtime::traits::Dispatchable; +use sp_runtime::{ + DispatchResult, + traits::{ + AsSystemOriginSigner, Dispatchable, ExtensionPostDispatchWeightHandler, + TransactionExtension, TxBaseImplication, + }, + transaction_validity::{TransactionSource, TransactionValidityError}, +}; use sp_std::vec::Vec; pub(crate) trait PrecompileHandleExt: PrecompileHandle { @@ -44,19 +54,33 @@ pub(crate) trait PrecompileHandleExt: PrecompileHandle { origin: RawOrigin, ) -> EvmResult<()> where - R: frame_system::Config + pallet_evm::Config, - R::RuntimeCall: From, - R::RuntimeCall: GetDispatchInfo + Dispatchable, - R::RuntimeOrigin: From>, + R: frame_system::Config + + pallet_balances::Config + + pallet_evm::Config + + pallet_subtensor::Config + + Send + + Sync + + TypeInfo, + ::RuntimeCall: From, + ::RuntimeCall: GetDispatchInfo + + Dispatchable + + IsSubType> + + IsSubType>, + ::RuntimeOrigin: + From> + AsSystemOriginSigner + Clone, { - let call = R::RuntimeCall::from(call); - let info = GetDispatchInfo::get_dispatch_info(&call); + let call = ::RuntimeCall::from(call); + let mut info = GetDispatchInfo::get_dispatch_info(&call); + let subtensor_extension = SubtensorTransactionExtension::::new(); + info.extension_weight = info + .extension_weight + .saturating_add(subtensor_extension.weight(&call)); let target_gas = self.gas_limit(); if let Some(gas) = target_gas { let valid_weight = ::GasWeightMapping::gas_to_weight(gas, false).ref_time(); - if info.call_weight.ref_time() > valid_weight { + if info.total_weight().ref_time() > valid_weight { return Err(PrecompileFailure::Error { exit_status: ExitError::OutOfGas, }); @@ -64,26 +88,56 @@ pub(crate) trait PrecompileHandleExt: PrecompileHandle { } self.record_external_cost( - Some(info.call_weight.ref_time()), - Some(info.call_weight.proof_size()), + Some(info.total_weight().ref_time()), + Some(info.total_weight().proof_size()), None, )?; - match call.dispatch(R::RuntimeOrigin::from(origin)) { - Ok(post_info) => { + let origin = ::RuntimeOrigin::from(origin); + let (_, val, origin) = subtensor_extension + .validate( + origin, + &call, + &info, + 0, + (), + &TxBaseImplication(()), + TransactionSource::External, + ) + .map_err(extension_error)?; + let subtensor_pre = subtensor_extension + .prepare(val, &origin, &call, &info, 0) + .map_err(extension_error)?; + + match call.dispatch(origin) { + Ok(mut post_info) => { + post_info.set_extension_weight(&info); + let result: DispatchResult = Ok(()); + as TransactionExtension< + ::RuntimeCall, + >>::post_dispatch(subtensor_pre, &info, &mut post_info, 0, &result) + .map_err(extension_error)?; log::debug!("Dispatch succeeded. Post info: {post_info:?}"); self.charge_and_refund_after_dispatch::(&info, &post_info)?; Ok(()) } Err(e) => { + let err_str: &'static str = e.into(); + let mut post_info = e.post_info; + post_info.set_extension_weight(&info); + let result: DispatchResult = Err(e.error); + as TransactionExtension< + ::RuntimeCall, + >>::post_dispatch(subtensor_pre, &info, &mut post_info, 0, &result) + .map_err(extension_error)?; log::error!("Dispatch failed. Error: {e:?}"); log::warn!("Returning error PrecompileFailure::Error"); - self.charge_and_refund_after_dispatch::(&info, &e.post_info)?; + self.charge_and_refund_after_dispatch::(&info, &post_info)?; Err(PrecompileFailure::Error { exit_status: ExitError::Other( - format!("dispatch execution failed: {}", <&'static str>::from(e)).into(), + format!("dispatch execution failed: {err_str}").into(), ), }) } @@ -99,18 +153,18 @@ pub(crate) trait PrecompileHandleExt: PrecompileHandle { R: frame_system::Config + pallet_evm::Config, { if post_info.pays_fee(info) == Pays::Yes { - let actual_weight = post_info.actual_weight.unwrap_or(info.call_weight); + let actual_weight = post_info.calc_actual_weight(info); let cost = ::GasWeightMapping::weight_to_gas(actual_weight); self.record_cost(cost)?; self.refund_external_cost( Some( - info.call_weight + info.total_weight() .ref_time() .saturating_sub(actual_weight.ref_time()), ), Some( - info.call_weight + info.total_weight() .proof_size() .saturating_sub(actual_weight.proof_size()), ), @@ -121,6 +175,12 @@ pub(crate) trait PrecompileHandleExt: PrecompileHandle { } } +fn extension_error(err: TransactionValidityError) -> PrecompileFailure { + PrecompileFailure::Error { + exit_status: ExitError::Other(format!("transaction extension rejected: {err:?}").into()), + } +} + impl PrecompileHandleExt for T where T: PrecompileHandle {} pub(crate) trait PrecompileExt>: Precompile { diff --git a/precompiles/src/leasing.rs b/precompiles/src/leasing.rs index c4d64f428a..01a8db4354 100644 --- a/precompiles/src/leasing.rs +++ b/precompiles/src/leasing.rs @@ -2,7 +2,8 @@ use alloc::{boxed::Box, string::String}; use core::marker::PhantomData; use fp_evm::{ExitError, PrecompileFailure}; -use frame_support::dispatch::{GetDispatchInfo, PostDispatchInfo}; +use frame_support::dispatch::{DispatchInfo, GetDispatchInfo, PostDispatchInfo}; +use frame_support::traits::IsSubType; use frame_system::RawOrigin; use pallet_evm::AddressMapping; use pallet_evm::PrecompileHandle; @@ -10,7 +11,7 @@ use precompile_utils::{EvmResult, solidity::Codec}; use sp_core::{ByteArray, H256}; use sp_runtime::{ Percent, - traits::{Dispatchable, UniqueSaturatedInto}, + traits::{AsSystemOriginSigner, Dispatchable, UniqueSaturatedInto}, }; use subtensor_runtime_common::NetUid; @@ -21,14 +22,21 @@ pub struct LeasingPrecompile(PhantomData); impl PrecompileExt for LeasingPrecompile where R: frame_system::Config + + pallet_balances::Config + pallet_evm::Config + pallet_subtensor::Config - + pallet_crowdloan::Config, + + pallet_crowdloan::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]> + ByteArray, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::RuntimeCall: From> + From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, ::AddressMapping: AddressMapping, { const INDEX: u64 = 2058; @@ -38,14 +46,21 @@ where impl LeasingPrecompile where R: frame_system::Config + + pallet_balances::Config + pallet_evm::Config + pallet_subtensor::Config - + pallet_crowdloan::Config, + + pallet_crowdloan::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]> + ByteArray, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::RuntimeCall: From> + From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, ::AddressMapping: AddressMapping, { #[precompile::public("getLease(uint32)")] diff --git a/precompiles/src/lib.rs b/precompiles/src/lib.rs index 8069a1eb92..dedeebe249 100644 --- a/precompiles/src/lib.rs +++ b/precompiles/src/lib.rs @@ -5,8 +5,9 @@ extern crate alloc; use core::marker::PhantomData; use fp_evm::{ExitError, PrecompileFailure}; +use frame_support::traits::IsSubType; use frame_support::{ - dispatch::{GetDispatchInfo, PostDispatchInfo}, + dispatch::{DispatchInfo, GetDispatchInfo, PostDispatchInfo}, pallet_prelude::Decode, }; use pallet_evm::{ @@ -20,8 +21,7 @@ use pallet_evm_precompile_sha3fips::Sha3FIPS256; use pallet_evm_precompile_simple::{ECRecover, ECRecoverPublicKey, Identity, Ripemd160, Sha256}; use pallet_subtensor_proxy as pallet_proxy; use sp_core::{H160, U256, crypto::ByteArray}; -use sp_runtime::traits::Dispatchable; -use sp_runtime::traits::StaticLookup; +use sp_runtime::traits::{AsSystemOriginSigner, Dispatchable, StaticLookup}; use subtensor_runtime_common::ProxyType; use pallet_admin_utils::PrecompileEnum; @@ -55,6 +55,7 @@ mod staking; mod storage_query; mod subnet; mod uid_lookup; + pub struct Precompiles(PhantomData); impl Default for Precompiles @@ -66,15 +67,21 @@ where + pallet_subtensor::Config + pallet_subtensor_swap::Config + pallet_proxy::Config - + pallet_crowdloan::Config, + + pallet_crowdloan::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]> + ByteArray + Into<[u8; 32]>, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::RuntimeCall: From> + From> + From> + From> + From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, ::AddressMapping: AddressMapping, ::Balance: TryFrom, <::Lookup as StaticLookup>::Source: From, @@ -93,15 +100,21 @@ where + pallet_subtensor::Config + pallet_subtensor_swap::Config + pallet_proxy::Config - + pallet_crowdloan::Config, + + pallet_crowdloan::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]> + ByteArray + Into<[u8; 32]>, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::RuntimeCall: From> + From> + From> + From> + From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, ::AddressMapping: AddressMapping, ::Balance: TryFrom, <::Lookup as StaticLookup>::Source: From, @@ -149,15 +162,21 @@ where + pallet_subtensor::Config + pallet_subtensor_swap::Config + pallet_proxy::Config - + pallet_crowdloan::Config, + + pallet_crowdloan::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]> + ByteArray + Into<[u8; 32]>, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::RuntimeCall: From> + From> + From> + From> + From> + GetDispatchInfo - + Dispatchable + + Dispatchable + + IsSubType> + + IsSubType> + Decode, <::RuntimeCall as Dispatchable>::RuntimeOrigin: From>>, diff --git a/precompiles/src/neuron.rs b/precompiles/src/neuron.rs index 3e49387bb3..0b998b3c07 100644 --- a/precompiles/src/neuron.rs +++ b/precompiles/src/neuron.rs @@ -1,11 +1,12 @@ use core::marker::PhantomData; -use frame_support::dispatch::{GetDispatchInfo, PostDispatchInfo}; +use frame_support::dispatch::{DispatchInfo, GetDispatchInfo, PostDispatchInfo}; +use frame_support::traits::IsSubType; use frame_system::RawOrigin; use pallet_evm::{AddressMapping, PrecompileHandle}; use precompile_utils::{EvmResult, prelude::UnboundedBytes}; use sp_core::H256; -use sp_runtime::traits::Dispatchable; +use sp_runtime::traits::{AsSystemOriginSigner, Dispatchable}; use sp_std::vec::Vec; use crate::{PrecompileExt, PrecompileHandleExt}; @@ -14,11 +15,20 @@ pub struct NeuronPrecompile(PhantomData); impl PrecompileExt for NeuronPrecompile where - R: frame_system::Config + pallet_evm::Config + pallet_subtensor::Config, + R: frame_system::Config + + pallet_balances::Config + + pallet_evm::Config + + pallet_subtensor::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]>, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::RuntimeCall: From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, ::AddressMapping: AddressMapping, { const INDEX: u64 = 2052; @@ -27,11 +37,20 @@ where #[precompile_utils::precompile] impl NeuronPrecompile where - R: frame_system::Config + pallet_evm::Config + pallet_subtensor::Config, + R: frame_system::Config + + pallet_balances::Config + + pallet_evm::Config + + pallet_subtensor::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]>, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::RuntimeCall: From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, ::AddressMapping: AddressMapping, { #[precompile::public("setWeights(uint16,uint16[],uint16[],uint64)")] diff --git a/precompiles/src/proxy.rs b/precompiles/src/proxy.rs index c8396be264..5139477f00 100644 --- a/precompiles/src/proxy.rs +++ b/precompiles/src/proxy.rs @@ -4,7 +4,8 @@ use crate::{PrecompileExt, PrecompileHandleExt}; use alloc::format; use fp_evm::{ExitError, PrecompileFailure}; -use frame_support::dispatch::{GetDispatchInfo, PostDispatchInfo}; +use frame_support::dispatch::{DispatchInfo, GetDispatchInfo, PostDispatchInfo}; +use frame_support::traits::IsSubType; use frame_system::RawOrigin; use pallet_evm::{AddressMapping, PrecompileHandle}; use pallet_subtensor_proxy as pallet_proxy; @@ -12,7 +13,7 @@ use precompile_utils::EvmResult; use sp_core::{H256, U256}; use sp_runtime::{ codec::DecodeLimit, - traits::{Dispatchable, StaticLookup}, + traits::{AsSystemOriginSigner, Dispatchable, StaticLookup}, }; use sp_std::boxed::Box; use sp_std::convert::{TryFrom, TryInto}; @@ -25,15 +26,22 @@ const MAX_DECODE_DEPTH: u32 = 8; impl PrecompileExt for ProxyPrecompile where R: frame_system::Config + + pallet_balances::Config + pallet_evm::Config + pallet_subtensor::Config - + pallet_proxy::Config, + + pallet_proxy::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]> + Into<[u8; 32]>, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::AddressMapping: AddressMapping, ::RuntimeCall: From> + From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, ::AddressMapping: AddressMapping, <::Lookup as StaticLookup>::Source: From, { @@ -44,15 +52,22 @@ where impl ProxyPrecompile where R: frame_system::Config + + pallet_balances::Config + pallet_evm::Config + pallet_subtensor::Config - + pallet_proxy::Config, + + pallet_proxy::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]> + Into<[u8; 32]>, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::AddressMapping: AddressMapping, ::RuntimeCall: From> + From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, <::Lookup as StaticLookup>::Source: From, { #[precompile::public("createPureProxy(uint8,uint32,uint16)")] diff --git a/precompiles/src/staking.rs b/precompiles/src/staking.rs index 35daaf4f47..862c59219c 100644 --- a/precompiles/src/staking.rs +++ b/precompiles/src/staking.rs @@ -27,7 +27,8 @@ use alloc::vec::Vec; use core::marker::PhantomData; -use frame_support::dispatch::{GetDispatchInfo, PostDispatchInfo}; +use frame_support::dispatch::{DispatchInfo, GetDispatchInfo, PostDispatchInfo}; +use frame_support::traits::IsSubType; use frame_system::RawOrigin; use pallet_evm::{ AddressMapping, BalanceConverter, EvmBalance, ExitError, PrecompileFailure, PrecompileHandle, @@ -36,7 +37,7 @@ use pallet_evm::{ use pallet_subtensor_proxy as pallet_proxy; use precompile_utils::EvmResult; use sp_core::{H256, U256}; -use sp_runtime::traits::{Dispatchable, StaticLookup, UniqueSaturatedInto}; +use sp_runtime::traits::{AsSystemOriginSigner, Dispatchable, StaticLookup, UniqueSaturatedInto}; use sp_std::vec; use subtensor_runtime_common::{Currency, NetUid, ProxyType}; @@ -52,14 +53,21 @@ pub(crate) struct StakingPrecompileV2(PhantomData); impl PrecompileExt for StakingPrecompileV2 where R: frame_system::Config + + pallet_balances::Config + pallet_evm::Config + pallet_subtensor::Config - + pallet_proxy::Config, + + pallet_proxy::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]> + Into<[u8; 32]>, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::RuntimeCall: From> + From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, ::AddressMapping: AddressMapping, <::Lookup as StaticLookup>::Source: From, { @@ -70,14 +78,21 @@ where impl StakingPrecompileV2 where R: frame_system::Config + + pallet_balances::Config + pallet_evm::Config + pallet_subtensor::Config - + pallet_proxy::Config, + + pallet_proxy::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]> + Into<[u8; 32]>, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::RuntimeCall: From> + From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, ::AddressMapping: AddressMapping, <::Lookup as StaticLookup>::Source: From, { @@ -418,13 +433,19 @@ where + pallet_evm::Config + pallet_subtensor::Config + pallet_proxy::Config - + pallet_balances::Config, + + pallet_balances::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]>, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::RuntimeCall: From> + From> + From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, ::AddressMapping: AddressMapping, ::Balance: TryFrom, <::Lookup as StaticLookup>::Source: From, @@ -439,13 +460,19 @@ where + pallet_evm::Config + pallet_subtensor::Config + pallet_proxy::Config - + pallet_balances::Config, + + pallet_balances::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]>, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::RuntimeCall: From> + From> + From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, ::AddressMapping: AddressMapping, ::Balance: TryFrom, <::Lookup as StaticLookup>::Source: From, diff --git a/precompiles/src/subnet.rs b/precompiles/src/subnet.rs index b7f5cdb098..4df373c116 100644 --- a/precompiles/src/subnet.rs +++ b/precompiles/src/subnet.rs @@ -1,12 +1,13 @@ use core::marker::PhantomData; -use frame_support::dispatch::{GetDispatchInfo, PostDispatchInfo}; +use frame_support::dispatch::{DispatchInfo, GetDispatchInfo, PostDispatchInfo}; use frame_support::traits::ConstU32; +use frame_support::traits::IsSubType; use frame_system::RawOrigin; use pallet_evm::{AddressMapping, PrecompileHandle}; use precompile_utils::{EvmResult, prelude::BoundedString}; use sp_core::H256; -use sp_runtime::traits::Dispatchable; +use sp_runtime::traits::{AsSystemOriginSigner, Dispatchable}; use sp_std::vec; use subtensor_runtime_common::{Currency, NetUid}; @@ -17,14 +18,21 @@ pub struct SubnetPrecompile(PhantomData); impl PrecompileExt for SubnetPrecompile where R: frame_system::Config + + pallet_balances::Config + pallet_evm::Config + pallet_subtensor::Config - + pallet_admin_utils::Config, + + pallet_admin_utils::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]>, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::RuntimeCall: From> + From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, ::AddressMapping: AddressMapping, { const INDEX: u64 = 2051; @@ -34,14 +42,21 @@ where impl SubnetPrecompile where R: frame_system::Config + + pallet_balances::Config + pallet_evm::Config + pallet_subtensor::Config - + pallet_admin_utils::Config, + + pallet_admin_utils::Config + + Send + + Sync + + scale_info::TypeInfo, R::AccountId: From<[u8; 32]>, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::RuntimeCall: From> + From> + GetDispatchInfo - + Dispatchable, + + Dispatchable + + IsSubType> + + IsSubType>, ::AddressMapping: AddressMapping, { #[precompile::public("registerNetwork(bytes32)")] From cd7db2cf022497f03fea9d17f2c322db714f23c7 Mon Sep 17 00:00:00 2001 From: Aliaksandr Tsurko Date: Mon, 29 Dec 2025 23:04:06 +0100 Subject: [PATCH 19/70] Add e2e contract tests for tx-extension --- contract-tests/package.json | 2 +- .../neuron.precompile.reveal-weights.test.ts | 73 ++++++++++++++++++- .../subnet.precompile.hyperparameter.test.ts | 39 +++++++++- 3 files changed, 108 insertions(+), 6 deletions(-) diff --git a/contract-tests/package.json b/contract-tests/package.json index 26136346bb..6af55b1d9e 100644 --- a/contract-tests/package.json +++ b/contract-tests/package.json @@ -1,6 +1,6 @@ { "scripts": { - "test": "mocha --timeout 999999 --retries 3 --file src/setup.ts --require ts-node/register test/*test.ts" + "test": "TS_NODE_PREFER_TS_EXTS=1 TS_NODE_TRANSPILE_ONLY=1 mocha --timeout 999999 --retries 3 --file src/setup.ts --require ts-node/register --extension ts \"test/**/*.ts\"" }, "keywords": [], "author": "", diff --git a/contract-tests/test/neuron.precompile.reveal-weights.test.ts b/contract-tests/test/neuron.precompile.reveal-weights.test.ts index 99d608585d..5d80183ec7 100644 --- a/contract-tests/test/neuron.precompile.reveal-weights.test.ts +++ b/contract-tests/test/neuron.precompile.reveal-weights.test.ts @@ -1,5 +1,5 @@ import * as assert from "assert"; -import { getAliceSigner, getDevnetApi, getRandomSubstrateKeypair } from "../src/substrate" +import { getAliceSigner, getDevnetApi, getRandomSubstrateKeypair, waitForTransactionWithRetry } from "../src/substrate" import { devnet } from "@polkadot-api/descriptors" import { PolkadotSigner, TypedApi } from "polkadot-api"; import { convertPublicKeyToSs58, convertH160ToSS58 } from "../src/address-utils" @@ -23,6 +23,16 @@ const values = [5]; const salt = [9]; const version_key = 0; +async function setStakeThreshold( + api: TypedApi, + alice: PolkadotSigner, + minStake: bigint, +) { + const internalCall = api.tx.AdminUtils.sudo_set_stake_threshold({ min_stake: minStake }) + const tx = api.tx.Sudo.sudo({ call: internalCall.decodedCall }) + await waitForTransactionWithRetry(api, tx, alice) +} + function getCommitHash(netuid: number, address: string) { const registry = new TypeRegistry(); let publicKey = convertH160ToPublicKey(address); @@ -53,7 +63,7 @@ describe("Test neuron precompile reveal weights", () => { const coldkey = getRandomSubstrateKeypair(); let api: TypedApi - let commitEpoch: number; + let commitEpoch: number | undefined; // sudo account alice as signer let alice: PolkadotSigner; @@ -86,11 +96,52 @@ describe("Test neuron precompile reveal weights", () => { assert.equal(uid, uids[0]) }) + async function ensureCommitEpoch(netuid: number, contract: ethers.Contract) { + if (commitEpoch !== undefined) { + return + } + + const ss58Address = convertH160ToSS58(wallet.address) + const existingCommits = await api.query.SubtensorModule.WeightCommits.getValue( + netuid, + ss58Address + ) + if (Array.isArray(existingCommits) && existingCommits.length > 0) { + const entry = existingCommits[0] + const commitBlockRaw = + Array.isArray(entry) && entry.length > 1 ? entry[1] : undefined + const commitBlock = + typeof commitBlockRaw === "bigint" + ? Number(commitBlockRaw) + : Number(commitBlockRaw ?? NaN) + if (Number.isFinite(commitBlock)) { + commitEpoch = Math.trunc(commitBlock / (100 + 1)) + return + } + } + + await setStakeThreshold(api, alice, BigInt(0)) + const commitHash = getCommitHash(netuid, wallet.address) + const tx = await contract.commitWeights(netuid, commitHash) + await tx.wait() + + const commitBlock = await api.query.System.Number.getValue() + commitEpoch = Math.trunc(commitBlock / (100 + 1)) + } + it("EVM neuron commit weights via call precompile", async () => { let totalNetworks = await api.query.SubtensorModule.TotalNetworks.getValue() const subnetId = totalNetworks - 1 const commitHash = getCommitHash(subnetId, wallet.address) const contract = new ethers.Contract(INEURON_ADDRESS, INeuronABI, wallet); + + await setStakeThreshold(api, alice, BigInt(1)) + await assert.rejects(async () => { + const tx = await contract.commitWeights(subnetId, commitHash) + await tx.wait() + }) + await setStakeThreshold(api, alice, BigInt(0)) + try { const tx = await contract.commitWeights(subnetId, commitHash) await tx.wait() @@ -120,6 +171,11 @@ describe("Test neuron precompile reveal weights", () => { // set interval epoch as 1, it is the minimum value now await setCommitRevealWeightsInterval(api, netuid, BigInt(1)) + await ensureCommitEpoch(netuid, contract) + if (commitEpoch === undefined) { + throw new Error("commitEpoch should be set before revealing weights") + } + while (true) { const currentBlock = await api.query.System.Number.getValue() const currentEpoch = Math.trunc(currentBlock / (100 + 1)) @@ -130,6 +186,19 @@ describe("Test neuron precompile reveal weights", () => { await new Promise(resolve => setTimeout(resolve, 1000)) } + await setStakeThreshold(api, alice, BigInt(1)) + await assert.rejects(async () => { + const tx = await contract.revealWeights( + netuid, + uids, + values, + salt, + version_key + ); + await tx.wait() + }) + await setStakeThreshold(api, alice, BigInt(0)) + const tx = await contract.revealWeights( netuid, uids, diff --git a/contract-tests/test/subnet.precompile.hyperparameter.test.ts b/contract-tests/test/subnet.precompile.hyperparameter.test.ts index 87968b6e9f..8598b45a81 100644 --- a/contract-tests/test/subnet.precompile.hyperparameter.test.ts +++ b/contract-tests/test/subnet.precompile.hyperparameter.test.ts @@ -1,9 +1,9 @@ import * as assert from "assert"; -import { getDevnetApi, getRandomSubstrateKeypair } from "../src/substrate" +import { getAliceSigner, getDevnetApi, getRandomSubstrateKeypair, waitForTransactionWithRetry } from "../src/substrate" import { devnet } from "@polkadot-api/descriptors" -import { TypedApi } from "polkadot-api"; -import { convertPublicKeyToSs58 } from "../src/address-utils" +import { Binary, TypedApi, getTypedCodecs } from "polkadot-api"; +import { convertH160ToSS58, convertPublicKeyToSs58 } from "../src/address-utils" import { generateRandomEthersWallet } from "../src/utils"; import { ISubnetABI, ISUBNET_ADDRESS } from "../src/contracts/subnet" import { ethers } from "ethers" @@ -545,4 +545,37 @@ describe("Test the Subnet precompile contract", () => { assert.equal(valueFromContract, newValue) assert.equal(valueFromContract, onchainValue); }) + + it("Rejects subnet precompile calls when coldkey swap is scheduled (tx extension)", async () => { + const totalNetwork = await api.query.SubtensorModule.TotalNetworks.getValue() + const contract = new ethers.Contract(ISUBNET_ADDRESS, ISubnetABI, wallet); + const netuid = totalNetwork - 1; + + const coldkeySs58 = convertH160ToSS58(wallet.address) + const newColdkeySs58 = convertPublicKeyToSs58(hotkey1.publicKey) + const currentBlock = await api.query.System.Number.getValue() + const executionBlock = currentBlock + 10 + + const codec = await getTypedCodecs(devnet); + const valueBytes = codec.query.SubtensorModule.ColdkeySwapScheduled.value.enc([ + executionBlock, + newColdkeySs58, + ]) + const key = await api.query.SubtensorModule.ColdkeySwapScheduled.getKey(coldkeySs58); + + // Use sudo + set_storage since the swap-scheduled check only exists in the tx extension. + const setStorageCall = api.tx.System.set_storage({ + items: [[Binary.fromHex(key), Binary.fromBytes(valueBytes)]], + }) + const sudoTx = api.tx.Sudo.sudo({ call: setStorageCall.decodedCall }) + await waitForTransactionWithRetry(api, sudoTx, getAliceSigner()) + + const storedValue = await api.query.SubtensorModule.ColdkeySwapScheduled.getValue(coldkeySs58) + assert.deepStrictEqual(storedValue, [executionBlock, newColdkeySs58]) + + await assert.rejects(async () => { + const tx = await contract.setServingRateLimit(netuid, 100); + await tx.wait(); + }) + }) }) From c6e34d11aff875d18d1ce509406cf1003c2c5f01 Mon Sep 17 00:00:00 2001 From: Aliaksandr Tsurko Date: Mon, 29 Dec 2025 23:25:25 +0100 Subject: [PATCH 20/70] Bump spec version --- runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 52746675f9..48e49b76c9 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -241,7 +241,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // `spec_version`, and `authoring_version` are the same between Wasm and native. // This value is set to 100 to notify Polkadot-JS App (https://polkadot.js.org/apps) to use // the compatible custom types. - spec_version: 365, + spec_version: 366, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, From dccdc71862778cfb6220effe779a8e62844425d2 Mon Sep 17 00:00:00 2001 From: Aliaksandr Tsurko Date: Tue, 30 Dec 2025 11:13:24 +0100 Subject: [PATCH 21/70] Fix lints --- precompiles/src/extensions.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/precompiles/src/extensions.rs b/precompiles/src/extensions.rs index 66c4233f95..df5ebf3fa2 100644 --- a/precompiles/src/extensions.rs +++ b/precompiles/src/extensions.rs @@ -105,7 +105,7 @@ pub(crate) trait PrecompileHandleExt: PrecompileHandle { TransactionSource::External, ) .map_err(extension_error)?; - let subtensor_pre = subtensor_extension + subtensor_extension .prepare(val, &origin, &call, &info, 0) .map_err(extension_error)?; @@ -115,7 +115,7 @@ pub(crate) trait PrecompileHandleExt: PrecompileHandle { let result: DispatchResult = Ok(()); as TransactionExtension< ::RuntimeCall, - >>::post_dispatch(subtensor_pre, &info, &mut post_info, 0, &result) + >>::post_dispatch((), &info, &mut post_info, 0, &result) .map_err(extension_error)?; log::debug!("Dispatch succeeded. Post info: {post_info:?}"); self.charge_and_refund_after_dispatch::(&info, &post_info)?; @@ -129,7 +129,7 @@ pub(crate) trait PrecompileHandleExt: PrecompileHandle { let result: DispatchResult = Err(e.error); as TransactionExtension< ::RuntimeCall, - >>::post_dispatch(subtensor_pre, &info, &mut post_info, 0, &result) + >>::post_dispatch((), &info, &mut post_info, 0, &result) .map_err(extension_error)?; log::error!("Dispatch failed. Error: {e:?}"); log::warn!("Returning error PrecompileFailure::Error"); From c57c7c9060471357c7cdf246dec3d6383df84531 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Wed, 31 Dec 2025 22:59:43 +0000 Subject: [PATCH 22/70] Set StartCallDelay to 10 blocks in localnet genesis config Configures the localnet chain spec to initialize StartCallDelay to 10 blocks at genesis, allowing subnets to be started quickly in local testing environments. --- node/src/chain_spec/localnet.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/node/src/chain_spec/localnet.rs b/node/src/chain_spec/localnet.rs index 02ea8896b5..b20372e4b9 100644 --- a/node/src/chain_spec/localnet.rs +++ b/node/src/chain_spec/localnet.rs @@ -124,5 +124,8 @@ fn localnet_genesis( "evmChainId": { "chainId": 42, }, + "subtensorModule": { + "startCallDelay": 10, + }, }) } From 0bd25dfa4a371372f8baa3219c70c197a42b58bb Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Thu, 8 Jan 2026 21:07:36 +0000 Subject: [PATCH 23/70] Remove get_start_call_delay getter function The getter function is redundant since StartCallDelay storage value can be accessed directly. Only the setter is needed for the sudo extrinsic. --- pallets/subtensor/src/coinbase/root.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/pallets/subtensor/src/coinbase/root.rs b/pallets/subtensor/src/coinbase/root.rs index a5c7296424..83567b6f57 100644 --- a/pallets/subtensor/src/coinbase/root.rs +++ b/pallets/subtensor/src/coinbase/root.rs @@ -542,9 +542,6 @@ impl Pallet { NetworkImmunityPeriod::::set(net_immunity_period); Self::deposit_event(Event::NetworkImmunityPeriodSet(net_immunity_period)); } - pub fn get_start_call_delay() -> u64 { - StartCallDelay::::get() - } pub fn set_start_call_delay(delay: u64) { StartCallDelay::::set(delay); Self::deposit_event(Event::StartCallDelaySet(delay)); From bb6495b820d5d266e031a7366965cdfd2f6bb6c6 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Thu, 8 Jan 2026 21:10:46 +0000 Subject: [PATCH 24/70] Replace DefaultStartCallDelay with T::InitialStartCallDelay Removes the wrapper type_value function and uses the config constant directly in the storage definition, simplifying the code. --- pallets/subtensor/src/lib.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index b08d8d8b0b..6762a78114 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -640,11 +640,6 @@ pub mod pallet { T::InitialSubnetOwnerCut::get() } - /// Default value for start call delay. - #[pallet::type_value] - pub fn DefaultStartCallDelay() -> u64 { - T::InitialStartCallDelay::get() - } /// Default value for recycle or burn. #[pallet::type_value] @@ -1522,7 +1517,7 @@ pub mod pallet { /// ITEM( start_call_delay ) #[pallet::storage] - pub type StartCallDelay = StorageValue<_, u64, ValueQuery, DefaultStartCallDelay>; + pub type StartCallDelay = StorageValue<_, u64, ValueQuery, T::InitialStartCallDelay>; /// ITEM( min_network_lock_cost ) #[pallet::storage] From 0cb4b8830e89849c5bd89d9f7e887eca0ed548ca Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Thu, 8 Jan 2026 21:16:40 +0000 Subject: [PATCH 25/70] Add start_call_delay field to GenesisConfig for benchmarks Adds start_call_delay as an optional field in the Subtensor pallet's GenesisConfig, allowing the localnet chain spec to set the initial StartCallDelay value at genesis. This fixes benchmarks that depend on the genesis configuration. --- pallets/subtensor/src/lib.rs | 3 +++ pallets/subtensor/src/macros/genesis.rs | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index 6762a78114..5b3816b53a 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -2381,6 +2381,8 @@ pub mod pallet { pub stakes: Vec<(T::AccountId, Vec<(T::AccountId, (u64, u16))>)>, /// The total issued balance in genesis pub balances_issuance: TaoCurrency, + /// The delay before a subnet can call start + pub start_call_delay: Option, } impl Default for GenesisConfig { @@ -2388,6 +2390,7 @@ pub mod pallet { Self { stakes: Default::default(), balances_issuance: TaoCurrency::ZERO, + start_call_delay: None, } } } diff --git a/pallets/subtensor/src/macros/genesis.rs b/pallets/subtensor/src/macros/genesis.rs index 7bf8ba2a53..0014b63540 100644 --- a/pallets/subtensor/src/macros/genesis.rs +++ b/pallets/subtensor/src/macros/genesis.rs @@ -30,6 +30,11 @@ mod genesis { // Set initial total issuance from balances TotalIssuance::::put(self.balances_issuance); + // Set start call delay if provided in genesis config + if let Some(delay) = self.start_call_delay { + StartCallDelay::::put(delay); + } + // Set the root network as added. NetworksAdded::::insert(NetUid::ROOT, true); From 6b3ac04ca56a86bf88041e2698130e31894bde7a Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Thu, 8 Jan 2026 21:24:37 +0000 Subject: [PATCH 26/70] apply review comments --- pallets/admin-utils/src/tests/mod.rs | 7 +------ pallets/subtensor/src/macros/config.rs | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/pallets/admin-utils/src/tests/mod.rs b/pallets/admin-utils/src/tests/mod.rs index 970c24498e..365ef63ad5 100644 --- a/pallets/admin-utils/src/tests/mod.rs +++ b/pallets/admin-utils/src/tests/mod.rs @@ -2904,18 +2904,13 @@ fn test_sudo_set_start_call_delay_permissions_and_zero_delay() { ); // Test 1: Non-root account should fail to set delay - assert_err!( + assert_noop!( AdminUtils::sudo_set_start_call_delay( <::RuntimeOrigin>::signed(non_root_account), 0 ), DispatchError::BadOrigin ); - assert_eq!( - pallet_subtensor::StartCallDelay::::get(), - initial_delay, - "Delay should not have changed" - ); // Test 2: Create a subnet add_network(netuid, tempo); diff --git a/pallets/subtensor/src/macros/config.rs b/pallets/subtensor/src/macros/config.rs index ce6dfd57c2..2124ec5f3f 100644 --- a/pallets/subtensor/src/macros/config.rs +++ b/pallets/subtensor/src/macros/config.rs @@ -233,7 +233,7 @@ mod config { /// Initial EMA price halving period #[pallet::constant] type InitialEmaPriceHalvingPeriod: Get; - /// Initial block number after a new subnet accept the start call extrinsic. + /// Delay after which a new subnet can dispatch start call extrinsic. #[pallet::constant] type InitialStartCallDelay: Get; /// Cost of swapping a hotkey in a subnet. From 3f985eb62678ea80a33fdb0296722670f8619dd0 Mon Sep 17 00:00:00 2001 From: konrad0960 Date: Mon, 1 Dec 2025 23:03:16 +0100 Subject: [PATCH 27/70] commit Cargo.lock --- contract-tests/src/contracts/votingPower.ts | 85 +++ .../test/votingPower.precompile.test.ts | 206 ++++++ pallets/admin-utils/src/lib.rs | 2 + pallets/subtensor/src/epoch/run_epoch.rs | 3 + pallets/subtensor/src/lib.rs | 49 +- pallets/subtensor/src/macros/dispatches.rs | 91 +++ pallets/subtensor/src/macros/errors.rs | 4 + pallets/subtensor/src/macros/events.rs | 29 + pallets/subtensor/src/swap/swap_hotkey.rs | 5 + pallets/subtensor/src/tests/mod.rs | 1 + pallets/subtensor/src/tests/voting_power.rs | 603 ++++++++++++++++++ pallets/subtensor/src/utils/mod.rs | 1 + pallets/subtensor/src/utils/voting_power.rs | 314 +++++++++ precompiles/src/lib.rs | 8 +- precompiles/src/voting_power.rs | 112 ++++ 15 files changed, 1511 insertions(+), 2 deletions(-) create mode 100644 contract-tests/src/contracts/votingPower.ts create mode 100644 contract-tests/test/votingPower.precompile.test.ts create mode 100644 pallets/subtensor/src/tests/voting_power.rs create mode 100644 pallets/subtensor/src/utils/voting_power.rs create mode 100644 precompiles/src/voting_power.rs diff --git a/contract-tests/src/contracts/votingPower.ts b/contract-tests/src/contracts/votingPower.ts new file mode 100644 index 0000000000..7cbc5b30d0 --- /dev/null +++ b/contract-tests/src/contracts/votingPower.ts @@ -0,0 +1,85 @@ +export const IVOTING_POWER_ADDRESS = "0x0000000000000000000000000000000000000806"; + +export const IVotingPowerABI = [ + { + "inputs": [ + { + "internalType": "uint16", + "name": "netuid", + "type": "uint16" + }, + { + "internalType": "bytes32", + "name": "hotkey", + "type": "bytes32" + } + ], + "name": "getVotingPower", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "netuid", + "type": "uint16" + } + ], + "name": "isVotingPowerTrackingEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "netuid", + "type": "uint16" + } + ], + "name": "getVotingPowerDisableAtBlock", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "netuid", + "type": "uint16" + } + ], + "name": "getVotingPowerEmaAlpha", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/contract-tests/test/votingPower.precompile.test.ts b/contract-tests/test/votingPower.precompile.test.ts new file mode 100644 index 0000000000..8337437c93 --- /dev/null +++ b/contract-tests/test/votingPower.precompile.test.ts @@ -0,0 +1,206 @@ +import * as assert from "assert"; + +import { getDevnetApi, getRandomSubstrateKeypair, getAliceSigner, getSignerFromKeypair, waitForTransactionWithRetry } from "../src/substrate" +import { getPublicClient } from "../src/utils"; +import { ETH_LOCAL_URL } from "../src/config"; +import { devnet } from "@polkadot-api/descriptors" +import { PublicClient } from "viem"; +import { PolkadotSigner, TypedApi } from "polkadot-api"; +import { toViemAddress, convertPublicKeyToSs58 } from "../src/address-utils" +import { IVotingPowerABI, IVOTING_POWER_ADDRESS } from "../src/contracts/votingPower" +import { forceSetBalanceToSs58Address, addNewSubnetwork, startCall } from "../src/subtensor"; + +describe("Test VotingPower Precompile", () => { + // init substrate part + const hotkey = getRandomSubstrateKeypair(); + const coldkey = getRandomSubstrateKeypair(); + let publicClient: PublicClient; + + let api: TypedApi; + + // sudo account alice as signer + let alice: PolkadotSigner; + + // init other variable + let subnetId = 0; + + before(async () => { + // init variables got from await and async + publicClient = await getPublicClient(ETH_LOCAL_URL) + api = await getDevnetApi() + alice = await getAliceSigner(); + + await forceSetBalanceToSs58Address(api, convertPublicKeyToSs58(hotkey.publicKey)) + await forceSetBalanceToSs58Address(api, convertPublicKeyToSs58(coldkey.publicKey)) + + let netuid = await addNewSubnetwork(api, hotkey, coldkey) + await startCall(api, netuid, coldkey) + subnetId = netuid + }) + + describe("VotingPower Tracking Status Functions", () => { + it("isVotingPowerTrackingEnabled returns false by default", async () => { + const isEnabled = await publicClient.readContract({ + abi: IVotingPowerABI, + address: toViemAddress(IVOTING_POWER_ADDRESS), + functionName: "isVotingPowerTrackingEnabled", + args: [subnetId] + }) + + assert.ok(isEnabled !== undefined, "isVotingPowerTrackingEnabled should return a value"); + assert.strictEqual(typeof isEnabled, 'boolean', "isVotingPowerTrackingEnabled should return a boolean"); + // By default, voting power tracking is disabled + assert.strictEqual(isEnabled, false, "Voting power tracking should be disabled by default"); + }); + + it("getVotingPowerDisableAtBlock returns 0 when not scheduled", async () => { + const disableAtBlock = await publicClient.readContract({ + abi: IVotingPowerABI, + address: toViemAddress(IVOTING_POWER_ADDRESS), + functionName: "getVotingPowerDisableAtBlock", + args: [subnetId] + }) + + assert.ok(disableAtBlock !== undefined, "getVotingPowerDisableAtBlock should return a value"); + assert.strictEqual(typeof disableAtBlock, 'bigint', "getVotingPowerDisableAtBlock should return a bigint"); + assert.strictEqual(disableAtBlock, BigInt(0), "Disable at block should be 0 when not scheduled"); + }); + + it("getVotingPowerEmaAlpha returns default alpha value", async () => { + const alpha = await publicClient.readContract({ + abi: IVotingPowerABI, + address: toViemAddress(IVOTING_POWER_ADDRESS), + functionName: "getVotingPowerEmaAlpha", + args: [subnetId] + }) + + assert.ok(alpha !== undefined, "getVotingPowerEmaAlpha should return a value"); + assert.strictEqual(typeof alpha, 'bigint', "getVotingPowerEmaAlpha should return a bigint"); + // Default alpha is 0.1 * 10^18 = 100_000_000_000_000_000 + assert.strictEqual(alpha, BigInt("100000000000000000"), "Default alpha should be 0.1 (100_000_000_000_000_000)"); + }); + }); + + describe("VotingPower Query Functions", () => { + it("getVotingPower returns 0 for hotkey without voting power", async () => { + // Convert hotkey public key to bytes32 format (0x prefixed hex string) + const hotkeyBytes32 = '0x' + Buffer.from(hotkey.publicKey).toString('hex'); + + const votingPower = await publicClient.readContract({ + abi: IVotingPowerABI, + address: toViemAddress(IVOTING_POWER_ADDRESS), + functionName: "getVotingPower", + args: [subnetId, hotkeyBytes32 as `0x${string}`] + }) + + assert.ok(votingPower !== undefined, "getVotingPower should return a value"); + assert.strictEqual(typeof votingPower, 'bigint', "getVotingPower should return a bigint"); + // Without voting power tracking enabled, voting power should be 0 + assert.strictEqual(votingPower, BigInt(0), "Voting power should be 0 when tracking is disabled"); + }); + + it("getVotingPower returns 0 for unknown hotkey", async () => { + // Generate a random hotkey that doesn't exist + const randomHotkey = getRandomSubstrateKeypair(); + const randomHotkeyBytes32 = '0x' + Buffer.from(randomHotkey.publicKey).toString('hex'); + + const votingPower = await publicClient.readContract({ + abi: IVotingPowerABI, + address: toViemAddress(IVOTING_POWER_ADDRESS), + functionName: "getVotingPower", + args: [subnetId, randomHotkeyBytes32 as `0x${string}`] + }) + + assert.ok(votingPower !== undefined, "getVotingPower should return a value"); + assert.strictEqual(votingPower, BigInt(0), "Voting power should be 0 for unknown hotkey"); + }); + }); + + describe("VotingPower with Tracking Enabled", () => { + let enabledSubnetId: number; + + before(async () => { + // Create a new subnet for this test + const hotkey2 = getRandomSubstrateKeypair(); + const coldkey2 = getRandomSubstrateKeypair(); + + await forceSetBalanceToSs58Address(api, convertPublicKeyToSs58(hotkey2.publicKey)) + await forceSetBalanceToSs58Address(api, convertPublicKeyToSs58(coldkey2.publicKey)) + + enabledSubnetId = await addNewSubnetwork(api, hotkey2, coldkey2) + await startCall(api, enabledSubnetId, coldkey2) + + // Enable voting power tracking via sudo + const internalCall = api.tx.SubtensorModule.enable_voting_power_tracking({ netuid: enabledSubnetId }) + const tx = api.tx.Sudo.sudo({ call: internalCall.decodedCall }) + await waitForTransactionWithRetry(api, tx, alice) + }); + + it("isVotingPowerTrackingEnabled returns true after enabling", async () => { + const isEnabled = await publicClient.readContract({ + abi: IVotingPowerABI, + address: toViemAddress(IVOTING_POWER_ADDRESS), + functionName: "isVotingPowerTrackingEnabled", + args: [enabledSubnetId] + }) + + assert.strictEqual(isEnabled, true, "Voting power tracking should be enabled"); + }); + + it("getVotingPowerDisableAtBlock still returns 0 when enabled but not scheduled for disable", async () => { + const disableAtBlock = await publicClient.readContract({ + abi: IVotingPowerABI, + address: toViemAddress(IVOTING_POWER_ADDRESS), + functionName: "getVotingPowerDisableAtBlock", + args: [enabledSubnetId] + }) + + assert.strictEqual(disableAtBlock, BigInt(0), "Disable at block should still be 0"); + }); + }); + + describe("All precompile functions are accessible", () => { + it("All VotingPower precompile functions can be called", async () => { + const hotkeyBytes32 = '0x' + Buffer.from(hotkey.publicKey).toString('hex'); + + // Test all four functions + const results = await Promise.all([ + publicClient.readContract({ + abi: IVotingPowerABI, + address: toViemAddress(IVOTING_POWER_ADDRESS), + functionName: "getVotingPower", + args: [subnetId, hotkeyBytes32 as `0x${string}`] + }), + publicClient.readContract({ + abi: IVotingPowerABI, + address: toViemAddress(IVOTING_POWER_ADDRESS), + functionName: "isVotingPowerTrackingEnabled", + args: [subnetId] + }), + publicClient.readContract({ + abi: IVotingPowerABI, + address: toViemAddress(IVOTING_POWER_ADDRESS), + functionName: "getVotingPowerDisableAtBlock", + args: [subnetId] + }), + publicClient.readContract({ + abi: IVotingPowerABI, + address: toViemAddress(IVOTING_POWER_ADDRESS), + functionName: "getVotingPowerEmaAlpha", + args: [subnetId] + }) + ]); + + // All functions should return defined values + results.forEach((result, index) => { + assert.ok(result !== undefined, `Function ${index} should return a value`); + }); + + // Verify types + assert.strictEqual(typeof results[0], 'bigint', "getVotingPower should return bigint"); + assert.strictEqual(typeof results[1], 'boolean', "isVotingPowerTrackingEnabled should return boolean"); + assert.strictEqual(typeof results[2], 'bigint', "getVotingPowerDisableAtBlock should return bigint"); + assert.strictEqual(typeof results[3], 'bigint', "getVotingPowerEmaAlpha should return bigint"); + }); + }); +}); diff --git a/pallets/admin-utils/src/lib.rs b/pallets/admin-utils/src/lib.rs index c3999312b3..4ee9d4ef8a 100644 --- a/pallets/admin-utils/src/lib.rs +++ b/pallets/admin-utils/src/lib.rs @@ -143,6 +143,8 @@ pub mod pallet { Proxy, /// Leasing precompile Leasing, + /// Voting power precompile + VotingPower, } #[pallet::type_value] diff --git a/pallets/subtensor/src/epoch/run_epoch.rs b/pallets/subtensor/src/epoch/run_epoch.rs index f56b8a89a4..ce010eaa96 100644 --- a/pallets/subtensor/src/epoch/run_epoch.rs +++ b/pallets/subtensor/src/epoch/run_epoch.rs @@ -138,6 +138,9 @@ impl Pallet { ValidatorTrust::::insert(netuid, validator_trust); ValidatorPermit::::insert(netuid, new_validator_permit); StakeWeight::::insert(netuid, stake_weight); + + // Update voting power EMA for all validators on this subnet + Self::update_voting_power_for_subnet(netuid); } /// Calculates reward consensus and returns the emissions for uids/hotkeys in a given `netuid`. diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index ef2d44e68b..537dcabb78 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -1890,8 +1890,55 @@ pub mod pallet { pub type SubtokenEnabled = StorageMap<_, Identity, NetUid, bool, ValueQuery, DefaultFalse>; - /// Default value for burn keys limit + // ======================================= + // ==== VotingPower Storage ==== + // ======================================= + #[pallet::type_value] + /// Default VotingPower EMA alpha value (0.1 represented as u64 with 18 decimals) + /// alpha = 0.1 means slow response, 10% weight to new values per epoch + pub fn DefaultVotingPowerEmaAlpha() -> u64 { + 100_000_000_000_000_000 // 0.1 * 10^18 + } + + #[pallet::storage] + /// --- DMAP ( netuid, hotkey ) --> voting_power | EMA of stake for voting + /// This tracks stake EMA updated every epoch when VotingPowerTrackingEnabled is true. + /// Used by smart contracts to determine validator voting power for subnet governance. + pub type VotingPower = StorageDoubleMap< + _, + Identity, + NetUid, + Blake2_128Concat, + T::AccountId, + u64, + ValueQuery, + >; + + #[pallet::storage] + /// --- MAP ( netuid ) --> bool | Whether voting power tracking is enabled for this subnet. + /// When enabled, VotingPower EMA is updated every epoch. Default is false. + /// When disabled with disable_at_block set, tracking continues until that block. + pub type VotingPowerTrackingEnabled = + StorageMap<_, Identity, NetUid, bool, ValueQuery, DefaultFalse>; + + #[pallet::storage] + /// --- MAP ( netuid ) --> block_number | Block at which voting power tracking will be disabled. + /// When set (non-zero), tracking continues until this block, then automatically disables + /// and clears VotingPower entries for the subnet. Provides a 14-day grace period. + pub type VotingPowerDisableAtBlock = + StorageMap<_, Identity, NetUid, u64, ValueQuery>; + + #[pallet::storage] + /// --- MAP ( netuid ) --> u64 | EMA alpha value for voting power calculation. + /// Higher alpha = faster response to stake changes. + /// Stored as u64 with 18 decimal precision (1.0 = 10^18). + /// Only settable by sudo/root. + pub type VotingPowerEmaAlpha = + StorageMap<_, Identity, NetUid, u64, ValueQuery, DefaultVotingPowerEmaAlpha>; + + #[pallet::type_value] + /// Default value for burn keys limit pub fn DefaultImmuneOwnerUidsLimit() -> u16 { 1 } diff --git a/pallets/subtensor/src/macros/dispatches.rs b/pallets/subtensor/src/macros/dispatches.rs index 8c0b2210ec..47998f0983 100644 --- a/pallets/subtensor/src/macros/dispatches.rs +++ b/pallets/subtensor/src/macros/dispatches.rs @@ -2432,5 +2432,96 @@ mod dispatches { Ok(()) } + + /// Enables voting power tracking for a subnet. + /// + /// This function can be called by the subnet owner or root. + /// When enabled, voting power EMA is updated every epoch for all validators. + /// Voting power starts at 0 and increases over epochs. + /// + /// # Arguments: + /// * `origin` - The origin of the call, must be subnet owner or root. + /// * `netuid` - The subnet to enable voting power tracking for. + /// + /// # Errors: + /// * `SubnetNotExist` - If the subnet does not exist. + /// * `NotSubnetOwner` - If the caller is not the subnet owner or root. + #[pallet::call_index(125)] + #[pallet::weight(( + Weight::from_parts(10_000, 0) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)), + DispatchClass::Operational, + Pays::Yes + ))] + pub fn enable_voting_power_tracking( + origin: OriginFor, + netuid: NetUid, + ) -> DispatchResult { + Self::ensure_subnet_owner_or_root(origin, netuid)?; + Self::do_enable_voting_power_tracking(netuid) + } + + /// Schedules disabling of voting power tracking for a subnet. + /// + /// This function can be called by the subnet owner or root. + /// Voting power tracking will continue for 14 days (grace period) after this call, + /// then automatically disable and clear all VotingPower entries for the subnet. + /// + /// # Arguments: + /// * `origin` - The origin of the call, must be subnet owner or root. + /// * `netuid` - The subnet to schedule disabling voting power tracking for. + /// + /// # Errors: + /// * `SubnetNotExist` - If the subnet does not exist. + /// * `NotSubnetOwner` - If the caller is not the subnet owner or root. + /// * `VotingPowerTrackingNotEnabled` - If voting power tracking is not enabled. + #[pallet::call_index(126)] + #[pallet::weight(( + Weight::from_parts(10_000, 0) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)), + DispatchClass::Operational, + Pays::Yes + ))] + pub fn disable_voting_power_tracking( + origin: OriginFor, + netuid: NetUid, + ) -> DispatchResult { + Self::ensure_subnet_owner_or_root(origin, netuid)?; + Self::do_disable_voting_power_tracking(netuid) + } + + /// Sets the EMA alpha value for voting power calculation on a subnet. + /// + /// This function can only be called by root (sudo). + /// Higher alpha = faster response to stake changes. + /// Alpha is stored as u64 with 18 decimal precision (1.0 = 10^18). + /// + /// # Arguments: + /// * `origin` - The origin of the call, must be root. + /// * `netuid` - The subnet to set the alpha for. + /// * `alpha` - The new alpha value (u64 with 18 decimal precision). + /// + /// # Errors: + /// * `BadOrigin` - If the origin is not root. + /// * `SubnetNotExist` - If the subnet does not exist. + /// * `InvalidVotingPowerEmaAlpha` - If alpha is greater than 10^18 (1.0). + #[pallet::call_index(127)] + #[pallet::weight(( + Weight::from_parts(6_000, 0) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)), + DispatchClass::Operational, + Pays::Yes + ))] + pub fn sudo_set_voting_power_ema_alpha( + origin: OriginFor, + netuid: NetUid, + alpha: u64, + ) -> DispatchResult { + ensure_root(origin)?; + Self::do_set_voting_power_ema_alpha(netuid, alpha) + } } } diff --git a/pallets/subtensor/src/macros/errors.rs b/pallets/subtensor/src/macros/errors.rs index 6c3d7a35df..995c9b5a31 100644 --- a/pallets/subtensor/src/macros/errors.rs +++ b/pallets/subtensor/src/macros/errors.rs @@ -266,6 +266,10 @@ mod errors { InvalidRootClaimThreshold, /// Exceeded subnet limit number or zero. InvalidSubnetNumber, + /// Voting power tracking is not enabled for this subnet. + VotingPowerTrackingNotEnabled, + /// Invalid voting power EMA alpha value (must be <= 10^18). + InvalidVotingPowerEmaAlpha, /// Unintended precision loss when unstaking alpha PrecisionLoss, } diff --git a/pallets/subtensor/src/macros/events.rs b/pallets/subtensor/src/macros/events.rs index a06e035d86..aca8bf09aa 100644 --- a/pallets/subtensor/src/macros/events.rs +++ b/pallets/subtensor/src/macros/events.rs @@ -470,6 +470,35 @@ mod events { root_claim_type: RootClaimTypeEnum, }, + /// Voting power tracking has been enabled for a subnet. + VotingPowerTrackingEnabled { + /// The subnet ID + netuid: NetUid, + }, + + /// Voting power tracking has been scheduled for disabling. + /// Tracking will continue until disable_at_block, then stop and clear entries. + VotingPowerTrackingDisableScheduled { + /// The subnet ID + netuid: NetUid, + /// Block at which tracking will be disabled + disable_at_block: u64, + }, + + /// Voting power tracking has been fully disabled and entries cleared. + VotingPowerTrackingDisabled { + /// The subnet ID + netuid: NetUid, + }, + + /// Voting power EMA alpha has been set for a subnet. + VotingPowerEmaAlphaSet { + /// The subnet ID + netuid: NetUid, + /// The new alpha value (u64 with 18 decimal precision) + alpha: u64, + }, + /// Subnet lease dividends have been distributed. SubnetLeaseDividendsDistributed { /// The lease ID diff --git a/pallets/subtensor/src/swap/swap_hotkey.rs b/pallets/subtensor/src/swap/swap_hotkey.rs index 4fdf87fb7b..a54a02a750 100644 --- a/pallets/subtensor/src/swap/swap_hotkey.rs +++ b/pallets/subtensor/src/swap/swap_hotkey.rs @@ -493,6 +493,11 @@ impl Pallet { // 8.3 Swap TaoDividendsPerSubnet // Tao dividends were removed + // 8.4 Swap VotingPower + // VotingPower( netuid, hotkey ) --> u64 -- the voting power EMA for the hotkey. + Self::swap_voting_power_for_hotkey(old_hotkey, new_hotkey, netuid); + weight.saturating_accrue(T::DbWeight::get().reads_writes(2, 2)); + // 9. Swap Alpha // Alpha( hotkey, coldkey, netuid ) -> alpha let old_alpha_values: Vec<((T::AccountId, NetUid), U64F64)> = diff --git a/pallets/subtensor/src/tests/mod.rs b/pallets/subtensor/src/tests/mod.rs index bbaf25af58..6ce0639516 100644 --- a/pallets/subtensor/src/tests/mod.rs +++ b/pallets/subtensor/src/tests/mod.rs @@ -30,4 +30,5 @@ mod swap_coldkey; mod swap_hotkey; mod swap_hotkey_with_subnet; mod uids; +mod voting_power; mod weights; diff --git a/pallets/subtensor/src/tests/voting_power.rs b/pallets/subtensor/src/tests/voting_power.rs new file mode 100644 index 0000000000..11b67064c0 --- /dev/null +++ b/pallets/subtensor/src/tests/voting_power.rs @@ -0,0 +1,603 @@ +#![allow(unused, clippy::indexing_slicing, clippy::panic, clippy::unwrap_used)] + +use frame_support::weights::Weight; +use frame_support::{assert_err, assert_noop, assert_ok}; +use frame_system::RawOrigin; +use sp_core::U256; +use subtensor_runtime_common::NetUid; + +use super::mock; +use super::mock::*; +use crate::utils::voting_power::{MAX_VOTING_POWER_EMA_ALPHA, VOTING_POWER_DISABLE_GRACE_PERIOD_BLOCKS}; +use crate::*; + +// ============================================ +// === Test Helpers === +// ============================================ + +const DEFAULT_STAKE_AMOUNT: u64 = 1_000_000_000_000; // 1 million RAO + +/// Test fixture containing common test setup data +struct VotingPowerTestFixture { + hotkey: U256, + coldkey: U256, + netuid: NetUid, +} + +impl VotingPowerTestFixture { + /// Create a basic fixture with a dynamic network + fn new() -> Self { + let hotkey = U256::from(1); + let coldkey = U256::from(2); + let netuid = add_dynamic_network(&hotkey, &coldkey); + Self { hotkey, coldkey, netuid } + } + + /// Setup reserves and add balance to coldkey for staking + fn setup_for_staking(&self) { + self.setup_for_staking_with_amount(DEFAULT_STAKE_AMOUNT); + } + + /// Setup reserves and add balance with custom amount + fn setup_for_staking_with_amount(&self, amount: u64) { + mock::setup_reserves(self.netuid, (amount * 100).into(), (amount * 100).into()); + SubtensorModule::add_balance_to_coldkey_account(&self.coldkey, amount * 10); + } + + /// Enable voting power tracking for the subnet + fn enable_tracking(&self) { + assert_ok!(SubtensorModule::enable_voting_power_tracking( + RuntimeOrigin::signed(self.coldkey), + self.netuid + )); + } + + /// Add stake from coldkey to hotkey + fn add_stake(&self, amount: u64) { + assert_ok!(SubtensorModule::add_stake( + RuntimeOrigin::signed(self.coldkey), + self.hotkey, + self.netuid, + amount.into() + )); + } + + /// Set validator permit for the hotkey (uid 0) + fn set_validator_permit(&self, has_permit: bool) { + ValidatorPermit::::insert(self.netuid, vec![has_permit]); + } + + /// Run voting power update for N epochs + fn run_epochs(&self, n: u32) { + for _ in 0..n { + SubtensorModule::update_voting_power_for_subnet(self.netuid); + } + } + + /// Get current voting power for the hotkey + fn get_voting_power(&self) -> u64 { + SubtensorModule::get_voting_power(self.netuid, &self.hotkey) + } + + /// Full setup: reserves, balance, tracking enabled, stake added, validator permit + fn setup_full(&self) { + self.setup_for_staking(); + self.enable_tracking(); + self.add_stake(DEFAULT_STAKE_AMOUNT); + self.set_validator_permit(true); + } +} + +// ============================================ +// === Test Enable/Disable Voting Power === +// ============================================ + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_enable_voting_power_tracking --exact --nocapture +#[test] +fn test_enable_voting_power_tracking() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + + // Initially disabled + assert!(!SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); + + // Enable tracking (subnet owner can do this) + f.enable_tracking(); + + // Now enabled + assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); + assert_eq!(SubtensorModule::get_voting_power_disable_at_block(f.netuid), 0); + }); +} + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_enable_voting_power_tracking_root_can_enable --exact --nocapture +#[test] +fn test_enable_voting_power_tracking_root_can_enable() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + + // Root can enable + assert_ok!(SubtensorModule::enable_voting_power_tracking( + RuntimeOrigin::root(), + f.netuid + )); + + assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); + }); +} + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_disable_voting_power_tracking_schedules_disable --exact --nocapture +#[test] +fn test_disable_voting_power_tracking_schedules_disable() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + f.enable_tracking(); + + let current_block = SubtensorModule::get_current_block_as_u64(); + + // Schedule disable + assert_ok!(SubtensorModule::disable_voting_power_tracking( + RuntimeOrigin::signed(f.coldkey), + f.netuid + )); + + // Still enabled, but scheduled for disable + assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); + let disable_at = SubtensorModule::get_voting_power_disable_at_block(f.netuid); + assert_eq!(disable_at, current_block + VOTING_POWER_DISABLE_GRACE_PERIOD_BLOCKS); + }); +} + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_disable_voting_power_tracking_fails_when_not_enabled --exact --nocapture +#[test] +fn test_disable_voting_power_tracking_fails_when_not_enabled() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + + // Try to disable when not enabled + assert_noop!( + SubtensorModule::disable_voting_power_tracking( + RuntimeOrigin::signed(f.coldkey), + f.netuid + ), + Error::::VotingPowerTrackingNotEnabled + ); + }); +} + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_enable_voting_power_tracking_non_owner_fails --exact --nocapture +#[test] +fn test_enable_voting_power_tracking_non_owner_fails() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + let random_account = U256::from(999); + + // Non-owner cannot enable (returns BadOrigin) + assert_noop!( + SubtensorModule::enable_voting_power_tracking( + RuntimeOrigin::signed(random_account), + f.netuid + ), + sp_runtime::DispatchError::BadOrigin + ); + + // Should still be disabled + assert!(!SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); + }); +} + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_disable_voting_power_tracking_non_owner_fails --exact --nocapture +#[test] +fn test_disable_voting_power_tracking_non_owner_fails() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + let random_account = U256::from(999); + f.enable_tracking(); + + // Non-owner cannot disable (returns BadOrigin) + assert_noop!( + SubtensorModule::disable_voting_power_tracking( + RuntimeOrigin::signed(random_account), + f.netuid + ), + sp_runtime::DispatchError::BadOrigin + ); + + // Should still be enabled with no disable scheduled + assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); + assert_eq!(SubtensorModule::get_voting_power_disable_at_block(f.netuid), 0); + }); +} + +// ============================================ +// === Test EMA Alpha === +// ============================================ + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_set_voting_power_ema_alpha --exact --nocapture +#[test] +fn test_set_voting_power_ema_alpha() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + + // Get default alpha + let default_alpha = SubtensorModule::get_voting_power_ema_alpha(f.netuid); + assert_eq!(default_alpha, 100_000_000_000_000_000); // 0.1 * 10^18 + + // Set new alpha (only root can do this) + let new_alpha: u64 = 500_000_000_000_000_000; // 0.5 * 10^18 + assert_ok!(SubtensorModule::sudo_set_voting_power_ema_alpha( + RuntimeOrigin::root(), + f.netuid, + new_alpha + )); + + assert_eq!(SubtensorModule::get_voting_power_ema_alpha(f.netuid), new_alpha); + }); +} + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_set_voting_power_ema_alpha_fails_above_one --exact --nocapture +#[test] +fn test_set_voting_power_ema_alpha_fails_above_one() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + + // Try to set alpha > 1.0 (> 10^18) + let invalid_alpha: u64 = MAX_VOTING_POWER_EMA_ALPHA + 1; + assert_noop!( + SubtensorModule::sudo_set_voting_power_ema_alpha( + RuntimeOrigin::root(), + f.netuid, + invalid_alpha + ), + Error::::InvalidVotingPowerEmaAlpha + ); + }); +} + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_set_voting_power_ema_alpha_non_root_fails --exact --nocapture +#[test] +fn test_set_voting_power_ema_alpha_non_root_fails() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + + // Non-root cannot set alpha + assert_noop!( + SubtensorModule::sudo_set_voting_power_ema_alpha( + RuntimeOrigin::signed(f.coldkey), + f.netuid, + 500_000_000_000_000_000 + ), + sp_runtime::DispatchError::BadOrigin + ); + }); +} + +// ============================================ +// === Test EMA Calculation === +// ============================================ + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_ema_calculation --exact --nocapture +#[test] +fn test_voting_power_ema_calculation() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + f.setup_full(); + + // Initially voting power is 0 + assert_eq!(f.get_voting_power(), 0); + + // Run epoch to update voting power + f.run_epochs(1); + + // Voting power should now be > 0 (but less than full stake due to EMA starting from 0) + let voting_power_after_first_epoch = f.get_voting_power(); + assert!(voting_power_after_first_epoch > 0); + + // Run more epochs - voting power should increase towards stake + f.run_epochs(10); + + let voting_power_after_many_epochs = f.get_voting_power(); + assert!(voting_power_after_many_epochs > voting_power_after_first_epoch); + }); +} + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_cleared_when_deregistered --exact --nocapture +#[test] +fn test_voting_power_cleared_when_deregistered() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + f.setup_full(); + + // Run epochs to build up voting power + f.run_epochs(10); + + let voting_power_before = f.get_voting_power(); + assert!(voting_power_before > 0, "Voting power should be built up"); + + // Deregister the hotkey (simulate by removing from IsNetworkMember) + IsNetworkMember::::remove(&f.hotkey, f.netuid); + + // Run epoch - voting power should be cleared for deregistered hotkey + f.run_epochs(1); + + // Should be removed from storage immediately when deregistered + assert_eq!(f.get_voting_power(), 0); + assert!(!VotingPower::::contains_key(f.netuid, &f.hotkey), + "Entry should be removed when hotkey is deregistered"); + }); +} + +// ============================================ +// === Test Validators Only === +// ============================================ + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_only_validators_get_voting_power --exact --nocapture +#[test] +fn test_only_validators_get_voting_power() { + new_test_ext(1).execute_with(|| { + let validator_hotkey = U256::from(1); + let miner_hotkey = U256::from(2); + let coldkey = U256::from(3); + + let netuid = add_dynamic_network(&validator_hotkey, &coldkey); + + mock::setup_reserves(netuid, (DEFAULT_STAKE_AMOUNT * 100).into(), (DEFAULT_STAKE_AMOUNT * 100).into()); + SubtensorModule::add_balance_to_coldkey_account(&coldkey, DEFAULT_STAKE_AMOUNT * 20); + + // Register miner + register_ok_neuron(netuid, miner_hotkey, coldkey, 0); + + // Enable voting power tracking + assert_ok!(SubtensorModule::enable_voting_power_tracking( + RuntimeOrigin::signed(coldkey), + netuid + )); + + // Add stake to both + assert_ok!(SubtensorModule::add_stake( + RuntimeOrigin::signed(coldkey), + validator_hotkey, + netuid, + DEFAULT_STAKE_AMOUNT.into() + )); + assert_ok!(SubtensorModule::add_stake( + RuntimeOrigin::signed(coldkey), + miner_hotkey, + netuid, + DEFAULT_STAKE_AMOUNT.into() + )); + + // Set validator permit: uid 0 (validator) has permit, uid 1 (miner) does not + ValidatorPermit::::insert(netuid, vec![true, false]); + + // Run epoch + SubtensorModule::update_voting_power_for_subnet(netuid); + + // Only validator should have voting power + assert!(SubtensorModule::get_voting_power(netuid, &validator_hotkey) > 0); + assert_eq!(SubtensorModule::get_voting_power(netuid, &miner_hotkey), 0); + }); +} + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_miner_voting_power_removed_when_loses_vpermit --exact --nocapture +#[test] +fn test_miner_voting_power_removed_when_loses_vpermit() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + f.setup_full(); + + // Run epochs to build voting power + f.run_epochs(10); + + let voting_power_before = f.get_voting_power(); + assert!(voting_power_before > 0); + + // Remove validator permit (now they're a miner) + f.set_validator_permit(false); + + // Run epoch - voting power should be removed + f.run_epochs(1); + + assert_eq!(f.get_voting_power(), 0); + }); +} + +// ============================================ +// === Test Hotkey Swap === +// ============================================ + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_transfers_on_hotkey_swap --exact --nocapture +#[test] +fn test_voting_power_transfers_on_hotkey_swap() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + let new_hotkey = U256::from(99); + let voting_power_value = 5_000_000_000_000_u64; + + // Set some voting power for the old hotkey + VotingPower::::insert(f.netuid, f.hotkey, voting_power_value); + + // Verify old hotkey has voting power + assert_eq!(f.get_voting_power(), voting_power_value); + assert_eq!(SubtensorModule::get_voting_power(f.netuid, &new_hotkey), 0); + + // Perform hotkey swap for this subnet + SubtensorModule::swap_voting_power_for_hotkey(&f.hotkey, &new_hotkey, f.netuid); + + // Old hotkey should have 0, new hotkey should have the voting power + assert_eq!(f.get_voting_power(), 0); + assert_eq!(SubtensorModule::get_voting_power(f.netuid, &new_hotkey), voting_power_value); + }); +} + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_swap_adds_to_existing --exact --nocapture +#[test] +fn test_voting_power_swap_adds_to_existing() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + let new_hotkey = U256::from(99); + let old_voting_power = 5_000_000_000_000_u64; + let new_existing_voting_power = 2_000_000_000_000_u64; + + // Set voting power for both hotkeys + VotingPower::::insert(f.netuid, f.hotkey, old_voting_power); + VotingPower::::insert(f.netuid, new_hotkey, new_existing_voting_power); + + // Perform swap + SubtensorModule::swap_voting_power_for_hotkey(&f.hotkey, &new_hotkey, f.netuid); + + // New hotkey should have combined voting power + assert_eq!(f.get_voting_power(), 0); + assert_eq!( + SubtensorModule::get_voting_power(f.netuid, &new_hotkey), + old_voting_power + new_existing_voting_power + ); + }); +} + +// ============================================ +// === Test Threshold Logic === +// ============================================ +// Tests the rule: Only remove voting power entry if it decayed FROM above threshold TO below. +// New validators building up from 0 should NOT be removed even if below threshold. + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_not_removed_if_never_above_threshold --exact --nocapture +#[test] +fn test_voting_power_not_removed_if_never_above_threshold() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + f.setup_full(); + + // Get the threshold + let min_stake = SubtensorModule::get_stake_threshold(); + + // Set voting power directly to a value below threshold (simulating building up) + // This is below threshold but was never above it + let below_threshold = min_stake.saturating_sub(1); + VotingPower::::insert(f.netuid, f.hotkey, below_threshold); + + // Run epoch + f.run_epochs(1); + + // Key assertion: Entry should NOT be removed because previous_ema was below threshold + // The removal rule only triggers when previous_ema >= threshold and new_ema < threshold + let voting_power = f.get_voting_power(); + assert!(voting_power > 0, "Voting power should still exist - it was never above threshold"); + assert!(VotingPower::::contains_key(f.netuid, &f.hotkey), + "Entry should exist - it was never above threshold so shouldn't be removed"); + }); +} + +// ============================================ +// === Test Tracking Not Active === +// ============================================ + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_not_updated_when_disabled --exact --nocapture +#[test] +fn test_voting_power_not_updated_when_disabled() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + f.setup_for_staking(); + // DON'T enable voting power tracking + f.add_stake(DEFAULT_STAKE_AMOUNT); + f.set_validator_permit(true); + + // Run epoch + f.run_epochs(1); + + // Voting power should still be 0 since tracking is disabled + assert_eq!(f.get_voting_power(), 0); + }); +} + +// ============================================ +// === Test Re-enable After Disable === +// ============================================ + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_reenable_voting_power_clears_disable_schedule --exact --nocapture +#[test] +fn test_reenable_voting_power_clears_disable_schedule() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + f.enable_tracking(); + + // Schedule disable + assert_ok!(SubtensorModule::disable_voting_power_tracking( + RuntimeOrigin::signed(f.coldkey), + f.netuid + )); + + assert!(SubtensorModule::get_voting_power_disable_at_block(f.netuid) > 0); + + // Re-enable should clear the disable schedule + f.enable_tracking(); + + assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); + assert_eq!(SubtensorModule::get_voting_power_disable_at_block(f.netuid), 0); + }); +} + +// ============================================ +// === Test Grace Period Finalization === +// ============================================ + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_finalized_after_grace_period --exact --nocapture +#[test] +fn test_voting_power_finalized_after_grace_period() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + f.setup_full(); + + // Build up voting power + f.run_epochs(10); + + let voting_power_before = f.get_voting_power(); + assert!(voting_power_before > 0); + + // Schedule disable + assert_ok!(SubtensorModule::disable_voting_power_tracking( + RuntimeOrigin::signed(f.coldkey), + f.netuid + )); + + let disable_at = SubtensorModule::get_voting_power_disable_at_block(f.netuid); + + // Advance block past grace period (time travel!) + System::set_block_number(disable_at + 1); + + // Run epoch - should finalize disable + f.run_epochs(1); + + // Tracking should be disabled and all entries cleared + assert!(!SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); + assert_eq!(SubtensorModule::get_voting_power_disable_at_block(f.netuid), 0); + assert_eq!(f.get_voting_power(), 0); + }); +} + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_continues_during_grace_period --exact --nocapture +#[test] +fn test_voting_power_continues_during_grace_period() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + f.setup_full(); + + // Schedule disable + assert_ok!(SubtensorModule::disable_voting_power_tracking( + RuntimeOrigin::signed(f.coldkey), + f.netuid + )); + + let disable_at = SubtensorModule::get_voting_power_disable_at_block(f.netuid); + + // Set block to middle of grace period (time travel!) + System::set_block_number(disable_at - 1000); + + // Run epoch - should still update voting power during grace period + f.run_epochs(1); + + // Tracking should still be enabled and voting power should exist + assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); + assert!(f.get_voting_power() > 0); + }); +} diff --git a/pallets/subtensor/src/utils/mod.rs b/pallets/subtensor/src/utils/mod.rs index 3eb8439959..0c11d52668 100644 --- a/pallets/subtensor/src/utils/mod.rs +++ b/pallets/subtensor/src/utils/mod.rs @@ -3,5 +3,6 @@ pub mod evm; pub mod identity; pub mod misc; pub mod rate_limiting; +pub mod voting_power; #[cfg(feature = "try-runtime")] pub mod try_state; diff --git a/pallets/subtensor/src/utils/voting_power.rs b/pallets/subtensor/src/utils/voting_power.rs new file mode 100644 index 0000000000..ebc5cd431e --- /dev/null +++ b/pallets/subtensor/src/utils/voting_power.rs @@ -0,0 +1,314 @@ +use super::*; +use subtensor_runtime_common::{Currency, NetUid}; + +/// 14 days in blocks (assuming ~12 second blocks) +/// 14 * 24 * 60 * 60 / 12 = 100800 blocks +pub const VOTING_POWER_DISABLE_GRACE_PERIOD_BLOCKS: u64 = 100800; + +/// Maximum alpha value (1.0 represented as u64 with 18 decimals) +pub const MAX_VOTING_POWER_EMA_ALPHA: u64 = 1_000_000_000_000_000_000; + +impl Pallet { + // ======================== + // === Getters === + // ======================== + + /// Get voting power for a hotkey on a subnet. + /// Returns 0 if not found or tracking disabled. + pub fn get_voting_power(netuid: NetUid, hotkey: &T::AccountId) -> u64 { + VotingPower::::get(netuid, hotkey) + } + + /// Check if voting power tracking is enabled for a subnet. + pub fn get_voting_power_tracking_enabled(netuid: NetUid) -> bool { + VotingPowerTrackingEnabled::::get(netuid) + } + + /// Get the block at which voting power tracking will be disabled. + /// Returns 0 if not scheduled for disabling. + pub fn get_voting_power_disable_at_block(netuid: NetUid) -> u64 { + VotingPowerDisableAtBlock::::get(netuid) + } + + /// Get the EMA alpha value for voting power calculation on a subnet. + pub fn get_voting_power_ema_alpha(netuid: NetUid) -> u64 { + VotingPowerEmaAlpha::::get(netuid) + } + + // ======================== + // === Extrinsic Handlers === + // ======================== + + /// Enable voting power tracking for a subnet. + pub fn do_enable_voting_power_tracking(netuid: NetUid) -> DispatchResult { + // Enable tracking + VotingPowerTrackingEnabled::::insert(netuid, true); + + // Clear any scheduled disable + VotingPowerDisableAtBlock::::remove(netuid); + + // Emit event + Self::deposit_event(Event::VotingPowerTrackingEnabled { netuid }); + + log::info!( + "VotingPower tracking enabled for netuid {:?}", + netuid + ); + + Ok(()) + } + + /// Schedule disabling of voting power tracking for a subnet. + /// Tracking will continue for 14 days, then automatically disable. + pub fn do_disable_voting_power_tracking(netuid: NetUid) -> DispatchResult { + // Check if tracking is enabled + ensure!( + Self::get_voting_power_tracking_enabled(netuid), + Error::::VotingPowerTrackingNotEnabled + ); + + // Calculate the block at which tracking will be disabled + let current_block = Self::get_current_block_as_u64(); + let disable_at_block = current_block.saturating_add(VOTING_POWER_DISABLE_GRACE_PERIOD_BLOCKS); + + // Schedule disable + VotingPowerDisableAtBlock::::insert(netuid, disable_at_block); + + // Emit event + Self::deposit_event(Event::VotingPowerTrackingDisableScheduled { + netuid, + disable_at_block, + }); + + log::info!( + "VotingPower tracking scheduled to disable at block {:?} for netuid {:?}", + disable_at_block, + netuid + ); + + Ok(()) + } + + /// Set the EMA alpha value for voting power calculation on a subnet. + pub fn do_set_voting_power_ema_alpha(netuid: NetUid, alpha: u64) -> DispatchResult { + // Validate alpha (must be <= 1.0, represented as 10^18) + ensure!( + alpha <= MAX_VOTING_POWER_EMA_ALPHA, + Error::::InvalidVotingPowerEmaAlpha + ); + + // Set the alpha + VotingPowerEmaAlpha::::insert(netuid, alpha); + + // Emit event + Self::deposit_event(Event::VotingPowerEmaAlphaSet { netuid, alpha }); + + log::info!( + "VotingPower EMA alpha set to {:?} for netuid {:?}", + alpha, + netuid + ); + + Ok(()) + } + + // ======================== + // === Epoch Processing === + // ======================== + + /// Update voting power for all validators on a subnet during epoch. + /// Called from persist_netuid_epoch_terms or similar epoch processing function. + pub fn update_voting_power_for_subnet(netuid: NetUid) { + // Early exit if tracking not enabled + if !Self::get_voting_power_tracking_enabled(netuid) { + return; + } + + // Check if past grace period and should finalize disable + let disable_at = Self::get_voting_power_disable_at_block(netuid); + if disable_at > 0 { + let current_block = Self::get_current_block_as_u64(); + if current_block >= disable_at { + Self::finalize_voting_power_disable(netuid); + return; + } + // Still in grace period - continue updating + } + + // Get the EMA alpha value for this subnet + let alpha = Self::get_voting_power_ema_alpha(netuid); + + // Get minimum stake threshold for validator permit + let min_stake = Self::get_stake_threshold(); + + // Get all hotkeys registered on this subnet + let n = Self::get_subnetwork_n(netuid); + + for uid in 0..n { + if let Ok(hotkey) = Self::get_hotkey_for_net_and_uid(netuid, uid) { + // Only validators (with vpermit) get voting power, not miners + if Self::get_validator_permit_for_uid(netuid, uid) { + Self::update_voting_power_for_hotkey(netuid, &hotkey, alpha, min_stake); + } else { + // Miner without vpermit - remove any existing voting power + VotingPower::::remove(netuid, &hotkey); + } + } + } + + // Remove voting power for any hotkeys that are no longer registered on this subnet + Self::clear_voting_power_for_deregistered_hotkeys(netuid); + + log::trace!( + "VotingPower updated for validators on netuid {:?}", + netuid + ); + } + + /// Clear voting power for hotkeys that are no longer registered on the subnet. + fn clear_voting_power_for_deregistered_hotkeys(netuid: NetUid) { + // Collect hotkeys to remove (can't mutate while iterating) + let hotkeys_to_remove: Vec = VotingPower::::iter_prefix(netuid) + .filter_map(|(hotkey, _)| { + // If the hotkey is not a network member, it's deregistered + if !IsNetworkMember::::get(&hotkey, netuid) { + Some(hotkey) + } else { + None + } + }) + .collect(); + + // Remove voting power for deregistered hotkeys + for hotkey in hotkeys_to_remove { + VotingPower::::remove(netuid, &hotkey); + log::trace!( + "VotingPower removed for deregistered hotkey {:?} on netuid {:?}", + hotkey, + netuid + ); + } + } + + /// Update voting power for a single hotkey. + fn update_voting_power_for_hotkey( + netuid: NetUid, + hotkey: &T::AccountId, + alpha: u64, + min_stake: u64, + ) { + // Get current stake for the hotkey on this subnet + // If deregistered (not in IsNetworkMember), stake is treated as 0 + let current_stake = if IsNetworkMember::::get(hotkey, netuid) { + Self::get_total_stake_for_hotkey(hotkey).to_u64() + } else { + 0 + }; + + // Get previous EMA value + let previous_ema = VotingPower::::get(netuid, hotkey); + + // Calculate new EMA value + // new_ema = alpha * current_stake + (1 - alpha) * previous_ema + // All values use 18 decimal precision for alpha (alpha is in range [0, 10^18]) + let new_ema = Self::calculate_voting_power_ema(current_stake, previous_ema, alpha); + + // Only remove if they previously had voting power ABOVE threshold and it decayed below. + // This allows new validators to build up voting power from 0 without being removed. + if new_ema < min_stake && previous_ema >= min_stake { + // Was above threshold, now decayed below - remove + VotingPower::::remove(netuid, hotkey); + log::trace!( + "VotingPower removed for hotkey {:?} on netuid {:?} (decayed below threshold: {:?} < {:?})", + hotkey, + netuid, + new_ema, + min_stake + ); + } else if new_ema > 0 { + // Update voting power (building up or maintaining) + VotingPower::::insert(netuid, hotkey, new_ema); + log::trace!( + "VotingPower updated for hotkey {:?} on netuid {:?}: {:?} -> {:?}", + hotkey, + netuid, + previous_ema, + new_ema + ); + } + // If new_ema == 0 do nothing + } + + /// Calculate EMA for voting power. + /// new_ema = alpha * current_stake + (1 - alpha) * previous_ema + /// Alpha is in 18 decimal precision (10^18 = 1.0) + fn calculate_voting_power_ema(current_stake: u64, previous_ema: u64, alpha: u64) -> u64 { + // Use u128 for intermediate calculations to avoid overflow + let alpha_128 = alpha as u128; + let one_minus_alpha = MAX_VOTING_POWER_EMA_ALPHA as u128 - alpha_128; + let current_128 = current_stake as u128; + let previous_128 = previous_ema as u128; + + // new_ema = (alpha * current_stake + (1 - alpha) * previous_ema) / 10^18 + let numerator = alpha_128 + .saturating_mul(current_128) + .saturating_add(one_minus_alpha.saturating_mul(previous_128)); + + let result = numerator + .checked_div(MAX_VOTING_POWER_EMA_ALPHA as u128) + .unwrap_or(0); + + // Safely convert back to u64, saturating at u64::MAX + result.min(u64::MAX as u128) as u64 + } + + /// Finalize the disabling of voting power tracking. + /// Clears all VotingPower entries for the subnet. + fn finalize_voting_power_disable(netuid: NetUid) { + // Clear all VotingPower entries for this subnet + let _ = VotingPower::::clear_prefix(netuid, u32::MAX, None); + + // Disable tracking + VotingPowerTrackingEnabled::::insert(netuid, false); + + // Clear disable schedule + VotingPowerDisableAtBlock::::remove(netuid); + + // Emit event + Self::deposit_event(Event::VotingPowerTrackingDisabled { netuid }); + + log::info!( + "VotingPower tracking disabled and entries cleared for netuid {:?}", + netuid + ); + } + + // ======================== + // === Hotkey Swap === + // ======================== + + /// Transfer voting power from old hotkey to new hotkey during swap. + pub fn swap_voting_power_for_hotkey( + old_hotkey: &T::AccountId, + new_hotkey: &T::AccountId, + netuid: NetUid, + ) { + // Get voting power from old hotkey + let voting_power = VotingPower::::take(netuid, old_hotkey); + + // Transfer to new hotkey if non-zero + if voting_power > 0 { + // Add to any existing voting power on new hotkey (in case new hotkey already has some) + let existing = VotingPower::::get(netuid, new_hotkey); + VotingPower::::insert(netuid, new_hotkey, voting_power.saturating_add(existing)); + + log::trace!( + "VotingPower transferred from {:?} to {:?} on netuid {:?}: {:?}", + old_hotkey, + new_hotkey, + netuid, + voting_power + ); + } + } +} diff --git a/precompiles/src/lib.rs b/precompiles/src/lib.rs index dedeebe249..d9f8222e23 100644 --- a/precompiles/src/lib.rs +++ b/precompiles/src/lib.rs @@ -40,6 +40,7 @@ use crate::staking::*; use crate::storage_query::*; use crate::subnet::*; use crate::uid_lookup::*; +use crate::voting_power::*; mod alpha; mod balance_transfer; @@ -55,6 +56,7 @@ mod staking; mod storage_query; mod subnet; mod uid_lookup; +mod voting_power; pub struct Precompiles(PhantomData); @@ -123,7 +125,7 @@ where Self(Default::default()) } - pub fn used_addresses() -> [H160; 25] { + pub fn used_addresses() -> [H160; 26] { [ hash(1), hash(2), @@ -149,6 +151,7 @@ where hash(AlphaPrecompile::::INDEX), hash(CrowdloanPrecompile::::INDEX), hash(LeasingPrecompile::::INDEX), + hash(VotingPowerPrecompile::::INDEX), hash(ProxyPrecompile::::INDEX), ] } @@ -242,6 +245,9 @@ where a if a == hash(LeasingPrecompile::::INDEX) => { LeasingPrecompile::::try_execute::(handle, PrecompileEnum::Leasing) } + a if a == hash(VotingPowerPrecompile::::INDEX) => { + VotingPowerPrecompile::::try_execute::(handle, PrecompileEnum::VotingPower) + } a if a == hash(ProxyPrecompile::::INDEX) => { ProxyPrecompile::::try_execute::(handle, PrecompileEnum::Proxy) } diff --git a/precompiles/src/voting_power.rs b/precompiles/src/voting_power.rs new file mode 100644 index 0000000000..9f59c6d886 --- /dev/null +++ b/precompiles/src/voting_power.rs @@ -0,0 +1,112 @@ +use core::marker::PhantomData; + +use fp_evm::PrecompileHandle; +use precompile_utils::EvmResult; +use sp_core::{ByteArray, H256, U256}; +use subtensor_runtime_common::NetUid; + +use crate::PrecompileExt; + +/// VotingPower precompile for smart contract access to validator voting power. +/// +/// This precompile allows smart contracts to query voting power for validators, +/// enabling on-chain governance decisions like slashing and spending. +pub struct VotingPowerPrecompile(PhantomData); + +impl PrecompileExt for VotingPowerPrecompile +where + R: frame_system::Config + pallet_subtensor::Config, + R::AccountId: From<[u8; 32]> + ByteArray, +{ + const INDEX: u64 = 2054; +} + +#[precompile_utils::precompile] +impl VotingPowerPrecompile +where + R: frame_system::Config + pallet_subtensor::Config, + R::AccountId: From<[u8; 32]> + ByteArray, +{ + /// Get voting power for a hotkey on a subnet. + /// + /// Returns the EMA of stake for the hotkey, which represents its voting power. + /// Returns 0 if: + /// - The hotkey has no voting power entry + /// - Voting power tracking is not enabled for the subnet + /// - The hotkey is not registered on the subnet + /// + /// # Arguments + /// * `netuid` - The subnet identifier (u16) + /// * `hotkey` - The hotkey account ID (bytes32) + /// + /// # Returns + /// * `u256` - The voting power value (in RAO, same precision as stake) + #[precompile::public("getVotingPower(uint16,bytes32)")] + #[precompile::view] + fn get_voting_power( + _: &mut impl PrecompileHandle, + netuid: u16, + hotkey: H256, + ) -> EvmResult { + let hotkey = R::AccountId::from(hotkey.0); + let voting_power = pallet_subtensor::VotingPower::::get(NetUid::from(netuid), &hotkey); + Ok(U256::from(voting_power)) + } + + /// Check if voting power tracking is enabled for a subnet. + /// + /// # Arguments + /// * `netuid` - The subnet identifier (u16) + /// + /// # Returns + /// * `bool` - True if voting power tracking is enabled + #[precompile::public("isVotingPowerTrackingEnabled(uint16)")] + #[precompile::view] + fn is_voting_power_tracking_enabled( + _: &mut impl PrecompileHandle, + netuid: u16, + ) -> EvmResult { + Ok(pallet_subtensor::VotingPowerTrackingEnabled::::get( + NetUid::from(netuid), + )) + } + + /// Get the block at which voting power tracking will be disabled. + /// + /// Returns 0 if not scheduled for disabling. + /// When non-zero, tracking continues until this block, then stops. + /// + /// # Arguments + /// * `netuid` - The subnet identifier (u16) + /// + /// # Returns + /// * `u64` - The block number at which tracking will be disabled (0 if not scheduled) + #[precompile::public("getVotingPowerDisableAtBlock(uint16)")] + #[precompile::view] + fn get_voting_power_disable_at_block( + _: &mut impl PrecompileHandle, + netuid: u16, + ) -> EvmResult { + Ok(pallet_subtensor::VotingPowerDisableAtBlock::::get( + NetUid::from(netuid), + )) + } + + /// Get the EMA alpha value for voting power calculation on a subnet. + /// + /// Alpha is stored with 18 decimal precision (1.0 = 10^18). + /// Higher alpha = faster response to stake changes. + /// + /// # Arguments + /// * `netuid` - The subnet identifier (u16) + /// + /// # Returns + /// * `u64` - The alpha value (with 18 decimal precision) + #[precompile::public("getVotingPowerEmaAlpha(uint16)")] + #[precompile::view] + fn get_voting_power_ema_alpha(_: &mut impl PrecompileHandle, netuid: u16) -> EvmResult { + Ok(pallet_subtensor::VotingPowerEmaAlpha::::get( + NetUid::from(netuid), + )) + } +} From 7c56e26b3022b95e0ddfb59810379032a1c2b570 Mon Sep 17 00:00:00 2001 From: konrad0960 Date: Tue, 2 Dec 2025 23:56:11 +0100 Subject: [PATCH 28/70] CI fixes --- pallets/subtensor/src/lib.rs | 11 +-- pallets/subtensor/src/tests/voting_power.rs | 80 ++++++++++++++++----- pallets/subtensor/src/utils/mod.rs | 2 +- pallets/subtensor/src/utils/voting_power.rs | 52 ++++---------- precompiles/src/voting_power.rs | 2 +- runtime/src/lib.rs | 2 +- 6 files changed, 79 insertions(+), 70 deletions(-) diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index 537dcabb78..599ec6342b 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -1905,15 +1905,8 @@ pub mod pallet { /// --- DMAP ( netuid, hotkey ) --> voting_power | EMA of stake for voting /// This tracks stake EMA updated every epoch when VotingPowerTrackingEnabled is true. /// Used by smart contracts to determine validator voting power for subnet governance. - pub type VotingPower = StorageDoubleMap< - _, - Identity, - NetUid, - Blake2_128Concat, - T::AccountId, - u64, - ValueQuery, - >; + pub type VotingPower = + StorageDoubleMap<_, Identity, NetUid, Blake2_128Concat, T::AccountId, u64, ValueQuery>; #[pallet::storage] /// --- MAP ( netuid ) --> bool | Whether voting power tracking is enabled for this subnet. diff --git a/pallets/subtensor/src/tests/voting_power.rs b/pallets/subtensor/src/tests/voting_power.rs index 11b67064c0..fa78e0b7a3 100644 --- a/pallets/subtensor/src/tests/voting_power.rs +++ b/pallets/subtensor/src/tests/voting_power.rs @@ -8,7 +8,9 @@ use subtensor_runtime_common::NetUid; use super::mock; use super::mock::*; -use crate::utils::voting_power::{MAX_VOTING_POWER_EMA_ALPHA, VOTING_POWER_DISABLE_GRACE_PERIOD_BLOCKS}; +use crate::utils::voting_power::{ + MAX_VOTING_POWER_EMA_ALPHA, VOTING_POWER_DISABLE_GRACE_PERIOD_BLOCKS, +}; use crate::*; // ============================================ @@ -30,7 +32,11 @@ impl VotingPowerTestFixture { let hotkey = U256::from(1); let coldkey = U256::from(2); let netuid = add_dynamic_network(&hotkey, &coldkey); - Self { hotkey, coldkey, netuid } + Self { + hotkey, + coldkey, + netuid, + } } /// Setup reserves and add balance to coldkey for staking @@ -99,14 +105,19 @@ fn test_enable_voting_power_tracking() { let f = VotingPowerTestFixture::new(); // Initially disabled - assert!(!SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); + assert!(!SubtensorModule::get_voting_power_tracking_enabled( + f.netuid + )); // Enable tracking (subnet owner can do this) f.enable_tracking(); // Now enabled assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); - assert_eq!(SubtensorModule::get_voting_power_disable_at_block(f.netuid), 0); + assert_eq!( + SubtensorModule::get_voting_power_disable_at_block(f.netuid), + 0 + ); }); } @@ -144,7 +155,10 @@ fn test_disable_voting_power_tracking_schedules_disable() { // Still enabled, but scheduled for disable assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); let disable_at = SubtensorModule::get_voting_power_disable_at_block(f.netuid); - assert_eq!(disable_at, current_block + VOTING_POWER_DISABLE_GRACE_PERIOD_BLOCKS); + assert_eq!( + disable_at, + current_block + VOTING_POWER_DISABLE_GRACE_PERIOD_BLOCKS + ); }); } @@ -182,7 +196,9 @@ fn test_enable_voting_power_tracking_non_owner_fails() { ); // Should still be disabled - assert!(!SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); + assert!(!SubtensorModule::get_voting_power_tracking_enabled( + f.netuid + )); }); } @@ -205,7 +221,10 @@ fn test_disable_voting_power_tracking_non_owner_fails() { // Should still be enabled with no disable scheduled assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); - assert_eq!(SubtensorModule::get_voting_power_disable_at_block(f.netuid), 0); + assert_eq!( + SubtensorModule::get_voting_power_disable_at_block(f.netuid), + 0 + ); }); } @@ -231,7 +250,10 @@ fn test_set_voting_power_ema_alpha() { new_alpha )); - assert_eq!(SubtensorModule::get_voting_power_ema_alpha(f.netuid), new_alpha); + assert_eq!( + SubtensorModule::get_voting_power_ema_alpha(f.netuid), + new_alpha + ); }); } @@ -322,8 +344,10 @@ fn test_voting_power_cleared_when_deregistered() { // Should be removed from storage immediately when deregistered assert_eq!(f.get_voting_power(), 0); - assert!(!VotingPower::::contains_key(f.netuid, &f.hotkey), - "Entry should be removed when hotkey is deregistered"); + assert!( + !VotingPower::::contains_key(f.netuid, &f.hotkey), + "Entry should be removed when hotkey is deregistered" + ); }); } @@ -341,7 +365,11 @@ fn test_only_validators_get_voting_power() { let netuid = add_dynamic_network(&validator_hotkey, &coldkey); - mock::setup_reserves(netuid, (DEFAULT_STAKE_AMOUNT * 100).into(), (DEFAULT_STAKE_AMOUNT * 100).into()); + mock::setup_reserves( + netuid, + (DEFAULT_STAKE_AMOUNT * 100).into(), + (DEFAULT_STAKE_AMOUNT * 100).into(), + ); SubtensorModule::add_balance_to_coldkey_account(&coldkey, DEFAULT_STAKE_AMOUNT * 20); // Register miner @@ -426,7 +454,10 @@ fn test_voting_power_transfers_on_hotkey_swap() { // Old hotkey should have 0, new hotkey should have the voting power assert_eq!(f.get_voting_power(), 0); - assert_eq!(SubtensorModule::get_voting_power(f.netuid, &new_hotkey), voting_power_value); + assert_eq!( + SubtensorModule::get_voting_power(f.netuid, &new_hotkey), + voting_power_value + ); }); } @@ -482,9 +513,14 @@ fn test_voting_power_not_removed_if_never_above_threshold() { // Key assertion: Entry should NOT be removed because previous_ema was below threshold // The removal rule only triggers when previous_ema >= threshold and new_ema < threshold let voting_power = f.get_voting_power(); - assert!(voting_power > 0, "Voting power should still exist - it was never above threshold"); - assert!(VotingPower::::contains_key(f.netuid, &f.hotkey), - "Entry should exist - it was never above threshold so shouldn't be removed"); + assert!( + voting_power > 0, + "Voting power should still exist - it was never above threshold" + ); + assert!( + VotingPower::::contains_key(f.netuid, &f.hotkey), + "Entry should exist - it was never above threshold so shouldn't be removed" + ); }); } @@ -533,7 +569,10 @@ fn test_reenable_voting_power_clears_disable_schedule() { f.enable_tracking(); assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); - assert_eq!(SubtensorModule::get_voting_power_disable_at_block(f.netuid), 0); + assert_eq!( + SubtensorModule::get_voting_power_disable_at_block(f.netuid), + 0 + ); }); } @@ -569,8 +608,13 @@ fn test_voting_power_finalized_after_grace_period() { f.run_epochs(1); // Tracking should be disabled and all entries cleared - assert!(!SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); - assert_eq!(SubtensorModule::get_voting_power_disable_at_block(f.netuid), 0); + assert!(!SubtensorModule::get_voting_power_tracking_enabled( + f.netuid + )); + assert_eq!( + SubtensorModule::get_voting_power_disable_at_block(f.netuid), + 0 + ); assert_eq!(f.get_voting_power(), 0); }); } diff --git a/pallets/subtensor/src/utils/mod.rs b/pallets/subtensor/src/utils/mod.rs index 0c11d52668..a91875da59 100644 --- a/pallets/subtensor/src/utils/mod.rs +++ b/pallets/subtensor/src/utils/mod.rs @@ -3,6 +3,6 @@ pub mod evm; pub mod identity; pub mod misc; pub mod rate_limiting; -pub mod voting_power; #[cfg(feature = "try-runtime")] pub mod try_state; +pub mod voting_power; diff --git a/pallets/subtensor/src/utils/voting_power.rs b/pallets/subtensor/src/utils/voting_power.rs index ebc5cd431e..61a944bf8a 100644 --- a/pallets/subtensor/src/utils/voting_power.rs +++ b/pallets/subtensor/src/utils/voting_power.rs @@ -50,10 +50,7 @@ impl Pallet { // Emit event Self::deposit_event(Event::VotingPowerTrackingEnabled { netuid }); - log::info!( - "VotingPower tracking enabled for netuid {:?}", - netuid - ); + log::info!("VotingPower tracking enabled for netuid {netuid:?}"); Ok(()) } @@ -69,7 +66,8 @@ impl Pallet { // Calculate the block at which tracking will be disabled let current_block = Self::get_current_block_as_u64(); - let disable_at_block = current_block.saturating_add(VOTING_POWER_DISABLE_GRACE_PERIOD_BLOCKS); + let disable_at_block = + current_block.saturating_add(VOTING_POWER_DISABLE_GRACE_PERIOD_BLOCKS); // Schedule disable VotingPowerDisableAtBlock::::insert(netuid, disable_at_block); @@ -81,9 +79,7 @@ impl Pallet { }); log::info!( - "VotingPower tracking scheduled to disable at block {:?} for netuid {:?}", - disable_at_block, - netuid + "VotingPower tracking scheduled to disable at block {disable_at_block:?} for netuid {netuid:?}" ); Ok(()) @@ -103,11 +99,7 @@ impl Pallet { // Emit event Self::deposit_event(Event::VotingPowerEmaAlphaSet { netuid, alpha }); - log::info!( - "VotingPower EMA alpha set to {:?} for netuid {:?}", - alpha, - netuid - ); + log::info!("VotingPower EMA alpha set to {alpha:?} for netuid {netuid:?}"); Ok(()) } @@ -159,10 +151,7 @@ impl Pallet { // Remove voting power for any hotkeys that are no longer registered on this subnet Self::clear_voting_power_for_deregistered_hotkeys(netuid); - log::trace!( - "VotingPower updated for validators on netuid {:?}", - netuid - ); + log::trace!("VotingPower updated for validators on netuid {netuid:?}"); } /// Clear voting power for hotkeys that are no longer registered on the subnet. @@ -183,9 +172,7 @@ impl Pallet { for hotkey in hotkeys_to_remove { VotingPower::::remove(netuid, &hotkey); log::trace!( - "VotingPower removed for deregistered hotkey {:?} on netuid {:?}", - hotkey, - netuid + "VotingPower removed for deregistered hotkey {hotkey:?} on netuid {netuid:?}" ); } } @@ -219,21 +206,13 @@ impl Pallet { // Was above threshold, now decayed below - remove VotingPower::::remove(netuid, hotkey); log::trace!( - "VotingPower removed for hotkey {:?} on netuid {:?} (decayed below threshold: {:?} < {:?})", - hotkey, - netuid, - new_ema, - min_stake + "VotingPower removed for hotkey {hotkey:?} on netuid {netuid:?} (decayed below threshold: {new_ema:?} < {min_stake:?})" ); } else if new_ema > 0 { // Update voting power (building up or maintaining) VotingPower::::insert(netuid, hotkey, new_ema); log::trace!( - "VotingPower updated for hotkey {:?} on netuid {:?}: {:?} -> {:?}", - hotkey, - netuid, - previous_ema, - new_ema + "VotingPower updated for hotkey {hotkey:?} on netuid {netuid:?}: {previous_ema:?} -> {new_ema:?}" ); } // If new_ema == 0 do nothing @@ -245,7 +224,7 @@ impl Pallet { fn calculate_voting_power_ema(current_stake: u64, previous_ema: u64, alpha: u64) -> u64 { // Use u128 for intermediate calculations to avoid overflow let alpha_128 = alpha as u128; - let one_minus_alpha = MAX_VOTING_POWER_EMA_ALPHA as u128 - alpha_128; + let one_minus_alpha = (MAX_VOTING_POWER_EMA_ALPHA as u128).saturating_sub(alpha_128); let current_128 = current_stake as u128; let previous_128 = previous_ema as u128; @@ -277,10 +256,7 @@ impl Pallet { // Emit event Self::deposit_event(Event::VotingPowerTrackingDisabled { netuid }); - log::info!( - "VotingPower tracking disabled and entries cleared for netuid {:?}", - netuid - ); + log::info!("VotingPower tracking disabled and entries cleared for netuid {netuid:?}"); } // ======================== @@ -303,11 +279,7 @@ impl Pallet { VotingPower::::insert(netuid, new_hotkey, voting_power.saturating_add(existing)); log::trace!( - "VotingPower transferred from {:?} to {:?} on netuid {:?}: {:?}", - old_hotkey, - new_hotkey, - netuid, - voting_power + "VotingPower transferred from {old_hotkey:?} to {new_hotkey:?} on netuid {netuid:?}: {voting_power:?}" ); } } diff --git a/precompiles/src/voting_power.rs b/precompiles/src/voting_power.rs index 9f59c6d886..23cdfbe69d 100644 --- a/precompiles/src/voting_power.rs +++ b/precompiles/src/voting_power.rs @@ -25,7 +25,7 @@ where impl VotingPowerPrecompile where R: frame_system::Config + pallet_subtensor::Config, - R::AccountId: From<[u8; 32]> + ByteArray, + R::AccountId: From<[u8; 32]>, { /// Get voting power for a hotkey on a subnet. /// diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 48e49b76c9..1af76d502b 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -241,7 +241,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // `spec_version`, and `authoring_version` are the same between Wasm and native. // This value is set to 100 to notify Polkadot-JS App (https://polkadot.js.org/apps) to use // the compatible custom types. - spec_version: 366, + spec_version: 367, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, From aa08aa68e9a84bb26e5ecd231a974065348c741f Mon Sep 17 00:00:00 2001 From: konrad0960 Date: Thu, 8 Jan 2026 22:23:55 +0100 Subject: [PATCH 29/70] refactor: pass epoch terms to voting power instead of re-reading state --- pallets/subtensor/src/epoch/run_epoch.rs | 8 +++- pallets/subtensor/src/subnets/mechanism.rs | 4 +- pallets/subtensor/src/tests/voting_power.rs | 32 ++++++++++++- pallets/subtensor/src/utils/voting_power.rs | 50 ++++++++++----------- 4 files changed, 65 insertions(+), 29 deletions(-) diff --git a/pallets/subtensor/src/epoch/run_epoch.rs b/pallets/subtensor/src/epoch/run_epoch.rs index ce010eaa96..33b774415d 100644 --- a/pallets/subtensor/src/epoch/run_epoch.rs +++ b/pallets/subtensor/src/epoch/run_epoch.rs @@ -22,6 +22,7 @@ pub struct EpochTerms { pub validator_trust: u16, pub new_validator_permit: bool, pub bond: Vec<(u16, u16)>, + pub stake: u64, } pub struct EpochOutput(pub BTreeMap); @@ -140,7 +141,7 @@ impl Pallet { StakeWeight::::insert(netuid, stake_weight); // Update voting power EMA for all validators on this subnet - Self::update_voting_power_for_subnet(netuid); + Self::update_voting_power_for_subnet(netuid, output); } /// Calculates reward consensus and returns the emissions for uids/hotkeys in a given `netuid`. @@ -991,6 +992,10 @@ impl Pallet { .iter() .map(|xi| fixed_proportion_to_u16(*xi)) .collect::>(); + let raw_stake: Vec = total_stake + .iter() + .map(|s| s.saturating_to_num::()) + .collect::>(); for (_hotkey, terms) in terms_map.iter_mut() { terms.dividend = cloned_dividends.get(terms.uid).copied().unwrap_or_default(); @@ -1015,6 +1020,7 @@ impl Pallet { .get(terms.uid) .copied() .unwrap_or_default(); + terms.stake = raw_stake.get(terms.uid).copied().unwrap_or_default(); let old_validator_permit = validator_permits .get(terms.uid) .copied() diff --git a/pallets/subtensor/src/subnets/mechanism.rs b/pallets/subtensor/src/subnets/mechanism.rs index 481974ef05..2ef68ae4be 100644 --- a/pallets/subtensor/src/subnets/mechanism.rs +++ b/pallets/subtensor/src/subnets/mechanism.rs @@ -322,6 +322,7 @@ impl Pallet { sub_weight, ); acc_terms.new_validator_permit |= terms.new_validator_permit; + acc_terms.stake = acc_terms.stake.saturating_add(terms.stake); }) .or_insert_with(|| { // weighted insert for the first sub-subnet seen for this hotkey @@ -349,7 +350,8 @@ impl Pallet { sub_weight, ), new_validator_permit: terms.new_validator_permit, - bond: Vec::new(), // aggregated map doesn’t use bonds; keep empty + bond: Vec::new(), // aggregated map doesn't use bonds; keep empty + stake: terms.stake, } }); acc diff --git a/pallets/subtensor/src/tests/voting_power.rs b/pallets/subtensor/src/tests/voting_power.rs index fa78e0b7a3..87a64bbcc1 100644 --- a/pallets/subtensor/src/tests/voting_power.rs +++ b/pallets/subtensor/src/tests/voting_power.rs @@ -1,5 +1,6 @@ #![allow(unused, clippy::indexing_slicing, clippy::panic, clippy::unwrap_used)] +use alloc::collections::BTreeMap; use frame_support::weights::Weight; use frame_support::{assert_err, assert_noop, assert_ok}; use frame_system::RawOrigin; @@ -8,6 +9,7 @@ use subtensor_runtime_common::NetUid; use super::mock; use super::mock::*; +use crate::epoch::run_epoch::EpochTerms; use crate::utils::voting_power::{ MAX_VOTING_POWER_EMA_ALPHA, VOTING_POWER_DISABLE_GRACE_PERIOD_BLOCKS, }; @@ -19,6 +21,30 @@ use crate::*; const DEFAULT_STAKE_AMOUNT: u64 = 1_000_000_000_000; // 1 million RAO +/// Build epoch output from current state for testing voting power updates. +fn build_mock_epoch_output(netuid: NetUid) -> BTreeMap { + let n = SubtensorModule::get_subnetwork_n(netuid); + let validator_permits = ValidatorPermit::::get(netuid); + + let mut output = BTreeMap::new(); + for uid in 0..n { + if let Ok(hotkey) = SubtensorModule::get_hotkey_for_net_and_uid(netuid, uid) { + let has_permit = validator_permits.get(uid as usize).copied().unwrap_or(false); + let stake = SubtensorModule::get_stake_for_hotkey_on_subnet(&hotkey, netuid).to_u64(); + output.insert( + hotkey, + EpochTerms { + uid: uid as usize, + new_validator_permit: has_permit, + stake, + ..Default::default() + }, + ); + } + } + output +} + /// Test fixture containing common test setup data struct VotingPowerTestFixture { hotkey: U256, @@ -76,7 +102,8 @@ impl VotingPowerTestFixture { /// Run voting power update for N epochs fn run_epochs(&self, n: u32) { for _ in 0..n { - SubtensorModule::update_voting_power_for_subnet(self.netuid); + let epoch_output = build_mock_epoch_output(self.netuid); + SubtensorModule::update_voting_power_for_subnet(self.netuid, &epoch_output); } } @@ -399,7 +426,8 @@ fn test_only_validators_get_voting_power() { ValidatorPermit::::insert(netuid, vec![true, false]); // Run epoch - SubtensorModule::update_voting_power_for_subnet(netuid); + let epoch_output = build_mock_epoch_output(netuid); + SubtensorModule::update_voting_power_for_subnet(netuid, &epoch_output); // Only validator should have voting power assert!(SubtensorModule::get_voting_power(netuid, &validator_hotkey) > 0); diff --git a/pallets/subtensor/src/utils/voting_power.rs b/pallets/subtensor/src/utils/voting_power.rs index 61a944bf8a..e58f383818 100644 --- a/pallets/subtensor/src/utils/voting_power.rs +++ b/pallets/subtensor/src/utils/voting_power.rs @@ -1,5 +1,7 @@ use super::*; -use subtensor_runtime_common::{Currency, NetUid}; +use crate::epoch::run_epoch::EpochTerms; +use alloc::collections::BTreeMap; +use subtensor_runtime_common::NetUid; /// 14 days in blocks (assuming ~12 second blocks) /// 14 * 24 * 60 * 60 / 12 = 100800 blocks @@ -108,9 +110,11 @@ impl Pallet { // === Epoch Processing === // ======================== - /// Update voting power for all validators on a subnet during epoch. - /// Called from persist_netuid_epoch_terms or similar epoch processing function. - pub fn update_voting_power_for_subnet(netuid: NetUid) { + /// Update voting power for all validators on a subnet using pre-calculated epoch terms. + pub fn update_voting_power_for_subnet( + netuid: NetUid, + epoch_output: &BTreeMap, + ) { // Early exit if tracking not enabled if !Self::get_voting_power_tracking_enabled(netuid) { return; @@ -133,18 +137,21 @@ impl Pallet { // Get minimum stake threshold for validator permit let min_stake = Self::get_stake_threshold(); - // Get all hotkeys registered on this subnet - let n = Self::get_subnetwork_n(netuid); - - for uid in 0..n { - if let Ok(hotkey) = Self::get_hotkey_for_net_and_uid(netuid, uid) { - // Only validators (with vpermit) get voting power, not miners - if Self::get_validator_permit_for_uid(netuid, uid) { - Self::update_voting_power_for_hotkey(netuid, &hotkey, alpha, min_stake); - } else { - // Miner without vpermit - remove any existing voting power - VotingPower::::remove(netuid, &hotkey); - } + // Iterate over epoch output using pre-calculated values + for (hotkey, terms) in epoch_output.iter() { + // Only validators (with vpermit) get voting power, not miners + if terms.new_validator_permit { + // Use the subnet-specific stake from epoch calculation + Self::update_voting_power_for_hotkey( + netuid, + hotkey, + terms.stake, + alpha, + min_stake, + ); + } else { + // Miner without vpermit - remove any existing voting power + VotingPower::::remove(netuid, hotkey); } } @@ -177,21 +184,14 @@ impl Pallet { } } - /// Update voting power for a single hotkey. + /// Update voting power EMA for a single hotkey using subnet-specific stake. fn update_voting_power_for_hotkey( netuid: NetUid, hotkey: &T::AccountId, + current_stake: u64, alpha: u64, min_stake: u64, ) { - // Get current stake for the hotkey on this subnet - // If deregistered (not in IsNetworkMember), stake is treated as 0 - let current_stake = if IsNetworkMember::::get(hotkey, netuid) { - Self::get_total_stake_for_hotkey(hotkey).to_u64() - } else { - 0 - }; - // Get previous EMA value let previous_ema = VotingPower::::get(netuid, hotkey); From e541d534dd668abbe3b88b9c638c875fead1bd99 Mon Sep 17 00:00:00 2001 From: konrad0960 Date: Thu, 8 Jan 2026 23:16:28 +0100 Subject: [PATCH 30/70] add removal hysteresis --- pallets/subtensor/src/tests/voting_power.rs | 81 +++++++++++++++++++++ pallets/subtensor/src/utils/voting_power.rs | 11 ++- 2 files changed, 88 insertions(+), 4 deletions(-) diff --git a/pallets/subtensor/src/tests/voting_power.rs b/pallets/subtensor/src/tests/voting_power.rs index 87a64bbcc1..df51ecc49b 100644 --- a/pallets/subtensor/src/tests/voting_power.rs +++ b/pallets/subtensor/src/tests/voting_power.rs @@ -552,6 +552,87 @@ fn test_voting_power_not_removed_if_never_above_threshold() { }); } +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_not_removed_with_small_dip_below_threshold --exact --nocapture +#[test] +fn test_voting_power_not_removed_with_small_dip_below_threshold() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + f.setup_for_staking(); + f.enable_tracking(); + f.set_validator_permit(true); + + let min_stake = SubtensorModule::get_stake_threshold(); + + // Set voting power above threshold (validator was established) + let above_threshold = min_stake + 100; + VotingPower::::insert(f.netuid, f.hotkey, above_threshold); + + // Simulate a small dip: new EMA drops to 95% of threshold (within 10% buffer) + // This is above the removal threshold (90%) so should NOT be removed + let small_dip = min_stake * 95 / 100; + VotingPower::::insert(f.netuid, f.hotkey, small_dip); + + // Manually trigger the removal check by setting previous to above threshold + // and running with stake that would produce EMA in the buffer zone + VotingPower::::insert(f.netuid, f.hotkey, above_threshold); + + // Build epoch output with stake that will produce EMA around 95% of threshold + let mut epoch_output = build_mock_epoch_output(f.netuid); + if let Some(terms) = epoch_output.get_mut(&f.hotkey) { + terms.stake = small_dip; // Stake drops but stays in buffer zone + } + + SubtensorModule::update_voting_power_for_subnet(f.netuid, &epoch_output); + + // Should NOT be removed - dip is within hysteresis buffer + assert!( + VotingPower::::contains_key(f.netuid, &f.hotkey), + "Entry should exist - small dip within 10% buffer should not trigger removal" + ); + }); +} + +// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_removed_with_significant_drop_below_threshold --exact --nocapture +#[test] +fn test_voting_power_removed_with_significant_drop_below_threshold() { + new_test_ext(1).execute_with(|| { + let f = VotingPowerTestFixture::new(); + f.enable_tracking(); + + // Use explicit values since get_stake_threshold() may return 0 in tests + let min_stake: u64 = 1_000_000_000; + StakeThreshold::::put(min_stake); + + // Set voting power above threshold (validator was established) + VotingPower::::insert(f.netuid, f.hotkey, min_stake); + + // Set alpha to 100% so new_ema = current_stake directly (for testing removal) + VotingPowerEmaAlpha::::insert(f.netuid, MAX_VOTING_POWER_EMA_ALPHA); + + // Build epoch output manually with stake = 0 and validator permit = true + let mut epoch_output = BTreeMap::new(); + epoch_output.insert( + f.hotkey, + EpochTerms { + uid: 0, + new_validator_permit: true, + stake: 0, // Complete unstake + ..Default::default() + }, + ); + + // With alpha = 1.0: new_ema = 1.0 * 0 + 0 * previous = 0 + // 0 < removal_threshold (90% of min_stake = 900M) AND previous (1B) >= min_stake (1B) + // Should trigger removal + SubtensorModule::update_voting_power_for_subnet(f.netuid, &epoch_output); + + assert!( + !VotingPower::::contains_key(f.netuid, &f.hotkey), + "Entry should be removed - stake dropped to 0 with alpha=1.0" + ); + }); +} + // ============================================ // === Test Tracking Not Active === // ============================================ diff --git a/pallets/subtensor/src/utils/voting_power.rs b/pallets/subtensor/src/utils/voting_power.rs index e58f383818..7c37616c34 100644 --- a/pallets/subtensor/src/utils/voting_power.rs +++ b/pallets/subtensor/src/utils/voting_power.rs @@ -200,13 +200,16 @@ impl Pallet { // All values use 18 decimal precision for alpha (alpha is in range [0, 10^18]) let new_ema = Self::calculate_voting_power_ema(current_stake, previous_ema, alpha); - // Only remove if they previously had voting power ABOVE threshold and it decayed below. + // Use 90% of min_stake as removal threshold (hysteresis to prevent noise-triggered removal) + let removal_threshold = min_stake.saturating_mul(9) / 10; + + // Only remove if they previously had voting power ABOVE threshold and decayed significantly below. // This allows new validators to build up voting power from 0 without being removed. - if new_ema < min_stake && previous_ema >= min_stake { - // Was above threshold, now decayed below - remove + if new_ema < removal_threshold && previous_ema >= min_stake { + // Was above threshold, now decayed significantly below - remove VotingPower::::remove(netuid, hotkey); log::trace!( - "VotingPower removed for hotkey {hotkey:?} on netuid {netuid:?} (decayed below threshold: {new_ema:?} < {min_stake:?})" + "VotingPower removed for hotkey {hotkey:?} on netuid {netuid:?} (decayed below removal threshold: {new_ema:?} < {removal_threshold:?})" ); } else if new_ema > 0 { // Update voting power (building up or maintaining) From 84cbad361162ac32238155e20f5b93cccfd2cbef Mon Sep 17 00:00:00 2001 From: John Reed <87283488+JohnReedV@users.noreply.github.com> Date: Fri, 9 Jan 2026 08:26:18 -0800 Subject: [PATCH 31/70] cargo fmt --- pallets/subtensor/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index 5b3816b53a..b87d44ac10 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -640,7 +640,6 @@ pub mod pallet { T::InitialSubnetOwnerCut::get() } - /// Default value for recycle or burn. #[pallet::type_value] pub fn DefaultRecycleOrBurn() -> RecycleOrBurnEnum { From 4af751d672b89e8d33454c1b84f0d9902e49d342 Mon Sep 17 00:00:00 2001 From: konrad0960 Date: Fri, 9 Jan 2026 22:19:50 +0100 Subject: [PATCH 32/70] move update_voting_power_for_subnet and fix formatting --- pallets/subtensor/src/epoch/run_epoch.rs | 3 --- pallets/subtensor/src/subnets/mechanism.rs | 3 +++ pallets/subtensor/src/tests/voting_power.rs | 5 ++++- pallets/subtensor/src/utils/voting_power.rs | 11 +++-------- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/pallets/subtensor/src/epoch/run_epoch.rs b/pallets/subtensor/src/epoch/run_epoch.rs index 33b774415d..f90175ce0c 100644 --- a/pallets/subtensor/src/epoch/run_epoch.rs +++ b/pallets/subtensor/src/epoch/run_epoch.rs @@ -139,9 +139,6 @@ impl Pallet { ValidatorTrust::::insert(netuid, validator_trust); ValidatorPermit::::insert(netuid, new_validator_permit); StakeWeight::::insert(netuid, stake_weight); - - // Update voting power EMA for all validators on this subnet - Self::update_voting_power_for_subnet(netuid, output); } /// Calculates reward consensus and returns the emissions for uids/hotkeys in a given `netuid`. diff --git a/pallets/subtensor/src/subnets/mechanism.rs b/pallets/subtensor/src/subnets/mechanism.rs index 2ef68ae4be..b5ed928930 100644 --- a/pallets/subtensor/src/subnets/mechanism.rs +++ b/pallets/subtensor/src/subnets/mechanism.rs @@ -360,6 +360,9 @@ impl Pallet { // State updates from epoch function Self::persist_netuid_epoch_terms(netuid, &aggregated); + // Update voting power EMA for all validators on this subnet + Self::update_voting_power_for_subnet(netuid, &aggregated); + // Remap BTreeMap back to Vec<(T::AccountId, AlphaCurrency, AlphaCurrency)> format // for processing emissions in run_coinbase // Emission tuples ( hotkeys, server_emission, validator_emission ) diff --git a/pallets/subtensor/src/tests/voting_power.rs b/pallets/subtensor/src/tests/voting_power.rs index df51ecc49b..51edcfd351 100644 --- a/pallets/subtensor/src/tests/voting_power.rs +++ b/pallets/subtensor/src/tests/voting_power.rs @@ -29,7 +29,10 @@ fn build_mock_epoch_output(netuid: NetUid) -> BTreeMap { let mut output = BTreeMap::new(); for uid in 0..n { if let Ok(hotkey) = SubtensorModule::get_hotkey_for_net_and_uid(netuid, uid) { - let has_permit = validator_permits.get(uid as usize).copied().unwrap_or(false); + let has_permit = validator_permits + .get(uid as usize) + .copied() + .unwrap_or(false); let stake = SubtensorModule::get_stake_for_hotkey_on_subnet(&hotkey, netuid).to_u64(); output.insert( hotkey, diff --git a/pallets/subtensor/src/utils/voting_power.rs b/pallets/subtensor/src/utils/voting_power.rs index 7c37616c34..5b66cfebb4 100644 --- a/pallets/subtensor/src/utils/voting_power.rs +++ b/pallets/subtensor/src/utils/voting_power.rs @@ -1,6 +1,7 @@ use super::*; use crate::epoch::run_epoch::EpochTerms; use alloc::collections::BTreeMap; +use safe_math::*; use subtensor_runtime_common::NetUid; /// 14 days in blocks (assuming ~12 second blocks) @@ -142,13 +143,7 @@ impl Pallet { // Only validators (with vpermit) get voting power, not miners if terms.new_validator_permit { // Use the subnet-specific stake from epoch calculation - Self::update_voting_power_for_hotkey( - netuid, - hotkey, - terms.stake, - alpha, - min_stake, - ); + Self::update_voting_power_for_hotkey(netuid, hotkey, terms.stake, alpha, min_stake); } else { // Miner without vpermit - remove any existing voting power VotingPower::::remove(netuid, hotkey); @@ -201,7 +196,7 @@ impl Pallet { let new_ema = Self::calculate_voting_power_ema(current_stake, previous_ema, alpha); // Use 90% of min_stake as removal threshold (hysteresis to prevent noise-triggered removal) - let removal_threshold = min_stake.saturating_mul(9) / 10; + let removal_threshold = min_stake.saturating_mul(9).safe_div(10); // Only remove if they previously had voting power ABOVE threshold and decayed significantly below. // This allows new validators to build up voting power from 0 without being removed. From 6144ef6c01400dfb2ba5d7a81aea645abc38b2bb Mon Sep 17 00:00:00 2001 From: konrad0960 Date: Fri, 9 Jan 2026 22:41:12 +0100 Subject: [PATCH 33/70] get total voting power precompile --- contract-tests/src/contracts/votingPower.ts | 19 +++++++++++++++ .../test/votingPower.precompile.test.ts | 24 +++++++++++++++++-- precompiles/src/voting_power.rs | 19 +++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/contract-tests/src/contracts/votingPower.ts b/contract-tests/src/contracts/votingPower.ts index 7cbc5b30d0..743b4ed1a6 100644 --- a/contract-tests/src/contracts/votingPower.ts +++ b/contract-tests/src/contracts/votingPower.ts @@ -81,5 +81,24 @@ export const IVotingPowerABI = [ ], "stateMutability": "view", "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "netuid", + "type": "uint16" + } + ], + "name": "getTotalVotingPower", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" } ] diff --git a/contract-tests/test/votingPower.precompile.test.ts b/contract-tests/test/votingPower.precompile.test.ts index 8337437c93..26b29e257c 100644 --- a/contract-tests/test/votingPower.precompile.test.ts +++ b/contract-tests/test/votingPower.precompile.test.ts @@ -114,6 +114,19 @@ describe("Test VotingPower Precompile", () => { assert.ok(votingPower !== undefined, "getVotingPower should return a value"); assert.strictEqual(votingPower, BigInt(0), "Voting power should be 0 for unknown hotkey"); }); + + it("getTotalVotingPower returns 0 when no voting power exists", async () => { + const totalVotingPower = await publicClient.readContract({ + abi: IVotingPowerABI, + address: toViemAddress(IVOTING_POWER_ADDRESS), + functionName: "getTotalVotingPower", + args: [subnetId] + }) + + assert.ok(totalVotingPower !== undefined, "getTotalVotingPower should return a value"); + assert.strictEqual(typeof totalVotingPower, 'bigint', "getTotalVotingPower should return a bigint"); + assert.strictEqual(totalVotingPower, BigInt(0), "Total voting power should be 0 when tracking is disabled"); + }); }); describe("VotingPower with Tracking Enabled", () => { @@ -163,7 +176,7 @@ describe("Test VotingPower Precompile", () => { it("All VotingPower precompile functions can be called", async () => { const hotkeyBytes32 = '0x' + Buffer.from(hotkey.publicKey).toString('hex'); - // Test all four functions + // Test all five functions const results = await Promise.all([ publicClient.readContract({ abi: IVotingPowerABI, @@ -188,11 +201,17 @@ describe("Test VotingPower Precompile", () => { address: toViemAddress(IVOTING_POWER_ADDRESS), functionName: "getVotingPowerEmaAlpha", args: [subnetId] + }), + publicClient.readContract({ + abi: IVotingPowerABI, + address: toViemAddress(IVOTING_POWER_ADDRESS), + functionName: "getTotalVotingPower", + args: [subnetId] }) ]); // All functions should return defined values - results.forEach((result, index) => { + results.forEach((result: unknown, index: number) => { assert.ok(result !== undefined, `Function ${index} should return a value`); }); @@ -201,6 +220,7 @@ describe("Test VotingPower Precompile", () => { assert.strictEqual(typeof results[1], 'boolean', "isVotingPowerTrackingEnabled should return boolean"); assert.strictEqual(typeof results[2], 'bigint', "getVotingPowerDisableAtBlock should return bigint"); assert.strictEqual(typeof results[3], 'bigint', "getVotingPowerEmaAlpha should return bigint"); + assert.strictEqual(typeof results[4], 'bigint', "getTotalVotingPower should return bigint"); }); }); }); diff --git a/precompiles/src/voting_power.rs b/precompiles/src/voting_power.rs index 23cdfbe69d..c558ce03b0 100644 --- a/precompiles/src/voting_power.rs +++ b/precompiles/src/voting_power.rs @@ -109,4 +109,23 @@ where NetUid::from(netuid), )) } + + /// Get total voting power for a subnet. + /// + /// Returns the sum of all voting power for all validators on the subnet. + /// Useful for calculating voting thresholds (e.g., 51% quorum). + /// + /// # Arguments + /// * `netuid` - The subnet identifier (u16) + /// + /// # Returns + /// * `u256` - The total voting power across all validators + #[precompile::public("getTotalVotingPower(uint16)")] + #[precompile::view] + fn get_total_voting_power(_: &mut impl PrecompileHandle, netuid: u16) -> EvmResult { + let total: u64 = pallet_subtensor::VotingPower::::iter_prefix(NetUid::from(netuid)) + .map(|(_, voting_power)| voting_power) + .fold(0u64, |acc, vp| acc.saturating_add(vp)); + Ok(U256::from(total)) + } } From e484cf1104df0510842568f1431bcb98bbd4cb68 Mon Sep 17 00:00:00 2001 From: open-junius Date: Mon, 12 Jan 2026 09:03:55 +0800 Subject: [PATCH 34/70] add coldkey stake on subnet --- Cargo.lock | 1 + contract-tests/src/contracts/staking.ts | 24 ++++++++++++ .../staking.precompile.add-remove.test.ts | 5 +++ pallets/subtensor/src/staking/helpers.rs | 37 +++++++++++++++++++ precompiles/src/staking.rs | 17 +++++++++ 5 files changed, 84 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index c9ba8aede2..aec9116f1f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9708,6 +9708,7 @@ dependencies = [ "fp-storage", "frame-support", "frame-system", + "log", "pallet-evm", "parity-scale-codec", "scale-info", diff --git a/contract-tests/src/contracts/staking.ts b/contract-tests/src/contracts/staking.ts index 4b48fd7d8d..32957342b4 100644 --- a/contract-tests/src/contracts/staking.ts +++ b/contract-tests/src/contracts/staking.ts @@ -233,6 +233,30 @@ export const IStakingV2ABI = [ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "coldkey", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "netuid", + "type": "uint256" + } + ], + "name": "getTotalColdkeyStakeOnSubnet", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { diff --git a/contract-tests/test/staking.precompile.add-remove.test.ts b/contract-tests/test/staking.precompile.add-remove.test.ts index 91bece4c0e..dd1aca35cd 100644 --- a/contract-tests/test/staking.precompile.add-remove.test.ts +++ b/contract-tests/test/staking.precompile.add-remove.test.ts @@ -162,6 +162,11 @@ describe("Test neuron precompile add remove stake", () => { assert.equal(stakeFromContractV1, tao(stakeFromContractV2)) + const totalColdkeyStakeOnSubnet = Number( + await contractV2.getTotalColdkeyStakeOnSubnet(convertH160ToPublicKey(wallet1.address), netuid) + ); + assert.equal(totalColdkeyStakeOnSubnet, stakeFromContractV2) + }) it("Can remove stake", async () => { diff --git a/pallets/subtensor/src/staking/helpers.rs b/pallets/subtensor/src/staking/helpers.rs index 1176064e36..099f8e26b6 100644 --- a/pallets/subtensor/src/staking/helpers.rs +++ b/pallets/subtensor/src/staking/helpers.rs @@ -91,6 +91,43 @@ impl Pallet { .into() } + // Returns the total amount of stake under a coldkey on a subnet + // + pub fn get_total_stake_for_coldkey_on_subnet( + coldkey: &T::AccountId, + netuid: NetUid, + ) -> TaoCurrency { + let hotkeys = StakingHotkeys::::get(coldkey); + hotkeys + .iter() + .map(|hotkey| { + Alpha::::iter_prefix((hotkey, coldkey)) + .map(|(netuid_on_storage, _)| { + if netuid_on_storage == netuid { + let alpha_stake = Self::get_stake_for_hotkey_and_coldkey_on_subnet( + hotkey, coldkey, netuid, + ); + let order = GetTaoForAlpha::::with_amount(alpha_stake); + T::SwapInterface::sim_swap(netuid.into(), order) + .map(|r| { + let fee: u64 = U96F32::saturating_from_num(r.fee_paid) + .saturating_mul(T::SwapInterface::current_alpha_price( + netuid.into(), + )) + .saturating_to_num(); + r.amount_paid_out.to_u64().saturating_add(fee) + }) + .unwrap_or_default() + } else { + 0 + } + }) + .sum::() + }) + .sum::() + .into() + } + // Creates a cold - hot pairing account if the hotkey is not already an active account. // pub fn create_account_if_non_existent(coldkey: &T::AccountId, hotkey: &T::AccountId) { diff --git a/precompiles/src/staking.rs b/precompiles/src/staking.rs index 862c59219c..9cc2a2aaa4 100644 --- a/precompiles/src/staking.rs +++ b/precompiles/src/staking.rs @@ -422,6 +422,23 @@ where handle.try_dispatch_runtime_call::(call, RawOrigin::Signed(account_id)) } + + #[precompile::public("getTotalColdkeyStakeOnSubnet(bytes32,uint256)")] + #[precompile::view] + fn get_total_coldkey_stake_on_subnet( + _handle: &mut impl PrecompileHandle, + coldkey: H256, + netuid: U256, + ) -> EvmResult { + let coldkey = R::AccountId::from(coldkey.0); + let netuid = try_u16_from_u256(netuid)?; + let stake = pallet_subtensor::Pallet::::get_total_stake_for_coldkey_on_subnet( + &coldkey, + netuid.into(), + ); + + Ok(stake.to_u64().into()) + } } // Deprecated, exists for backward compatibility. From 867502c79e5684e7a73f08c43f4c9df9b3502593 Mon Sep 17 00:00:00 2001 From: open-junius Date: Mon, 12 Jan 2026 10:19:58 +0800 Subject: [PATCH 35/70] add address mapping method --- .../src/contracts/addressMapping.ts | 23 +++++ .../test/addressMapping.precompile.test.ts | 83 +++++++++++++++++++ pallets/admin-utils/src/lib.rs | 2 + precompiles/src/address_mapping.rs | 77 +++++++++++++++++ precompiles/src/lib.rs | 11 ++- precompiles/src/solidity/addressMapping.abi | 21 +++++ precompiles/src/solidity/addressMapping.sol | 21 +++++ 7 files changed, 237 insertions(+), 1 deletion(-) create mode 100644 contract-tests/src/contracts/addressMapping.ts create mode 100644 contract-tests/test/addressMapping.precompile.test.ts create mode 100644 precompiles/src/address_mapping.rs create mode 100644 precompiles/src/solidity/addressMapping.abi create mode 100644 precompiles/src/solidity/addressMapping.sol diff --git a/contract-tests/src/contracts/addressMapping.ts b/contract-tests/src/contracts/addressMapping.ts new file mode 100644 index 0000000000..ddaf4fd75d --- /dev/null +++ b/contract-tests/src/contracts/addressMapping.ts @@ -0,0 +1,23 @@ +export const IADDRESS_MAPPING_ADDRESS = "0x000000000000000000000000000000000000080c"; + +export const IAddressMappingABI = [ + { + "inputs": [ + { + "internalType": "address", + "name": "target_address", + "type": "address" + } + ], + "name": "addressMapping", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + } +]; diff --git a/contract-tests/test/addressMapping.precompile.test.ts b/contract-tests/test/addressMapping.precompile.test.ts new file mode 100644 index 0000000000..6c5e101f33 --- /dev/null +++ b/contract-tests/test/addressMapping.precompile.test.ts @@ -0,0 +1,83 @@ +import * as assert from "assert"; +import { ethers } from "ethers"; +import { generateRandomEthersWallet } from "../src/utils"; +import { IADDRESS_MAPPING_ADDRESS, IAddressMappingABI } from "../src/contracts/addressMapping"; +import { convertH160ToPublicKey } from "../src/address-utils"; + +describe("Test address mapping precompile", () => { + const wallet1 = generateRandomEthersWallet(); + const wallet2 = generateRandomEthersWallet(); + + it("Address mapping converts H160 to AccountId32 correctly", async () => { + const contract = new ethers.Contract( + IADDRESS_MAPPING_ADDRESS, + IAddressMappingABI, + wallet1 + ); + + // Test with wallet1's address + const evmAddress = wallet1.address; + const accountId32 = await contract.addressMapping(evmAddress); + const expectedAcccountId32 = convertH160ToPublicKey(evmAddress); + + // Verify the result is a valid bytes32 (32 bytes) + assert.ok(accountId32.length === 66, "AccountId32 should be 32 bytes (66 hex chars with 0x)"); + assert.ok(accountId32.startsWith("0x"), "AccountId32 should start with 0x"); + + // Verify it's not all zeros + assert.notEqual( + accountId32, + "0x0000000000000000000000000000000000000000000000000000000000000000", + "AccountId32 should not be all zeros" + ); + + assert.equal(accountId32, expectedAcccountId32, "AccountId32 should be the same as the expected AccountId32"); + }); + + it("Address mapping works with different addresses", async () => { + const contract = new ethers.Contract( + IADDRESS_MAPPING_ADDRESS, + IAddressMappingABI, + wallet1 + ); + + // Test with wallet2's address + const evmAddress1 = wallet1.address; + const evmAddress2 = wallet2.address; + + const accountId1 = await contract.addressMapping(evmAddress1); + const accountId2 = await contract.addressMapping(evmAddress2); + + // Different addresses should map to different AccountIds + assert.notEqual( + accountId1, + accountId2, + "Different EVM addresses should map to different AccountIds" + ); + + // Both should be valid bytes32 + assert.ok(accountId1.length === 66, "AccountId1 should be 32 bytes"); + assert.ok(accountId2.length === 66, "AccountId2 should be 32 bytes"); + }); + + it("Address mapping is deterministic", async () => { + const contract = new ethers.Contract( + IADDRESS_MAPPING_ADDRESS, + IAddressMappingABI, + wallet1 + ); + + const evmAddress = wallet1.address; + + // Call multiple times with the same address + const accountId1 = await contract.addressMapping(evmAddress); + const accountId2 = await contract.addressMapping(evmAddress); + + // All calls should return the same result + assert.equal( + accountId1, + accountId2, + "First and second calls should return the same AccountId" + ); + }); +}); diff --git a/pallets/admin-utils/src/lib.rs b/pallets/admin-utils/src/lib.rs index c3999312b3..1289087679 100644 --- a/pallets/admin-utils/src/lib.rs +++ b/pallets/admin-utils/src/lib.rs @@ -143,6 +143,8 @@ pub mod pallet { Proxy, /// Leasing precompile Leasing, + /// Address mapping precompile + AddressMapping, } #[pallet::type_value] diff --git a/precompiles/src/address_mapping.rs b/precompiles/src/address_mapping.rs new file mode 100644 index 0000000000..e5f6d31b0f --- /dev/null +++ b/precompiles/src/address_mapping.rs @@ -0,0 +1,77 @@ +extern crate alloc; +use core::marker::PhantomData; +use pallet_evm::AddressMapping; + +use crate::PrecompileExt; +use sp_core::{ByteArray, H256}; + +use frame_support::dispatch::{DispatchInfo, GetDispatchInfo, PostDispatchInfo}; +use frame_support::traits::IsSubType; +use pallet_evm::PrecompileHandle; +use pallet_subtensor_proxy as pallet_proxy; +use precompile_utils::EvmResult; +use precompile_utils::prelude::Address; +use sp_runtime::traits::{AsSystemOriginSigner, Dispatchable}; + +pub struct AddressMappingPrecompile(PhantomData); + +impl PrecompileExt for AddressMappingPrecompile +where + R: frame_system::Config + + pallet_balances::Config + + pallet_crowdloan::Config + + pallet_evm::Config + + pallet_proxy::Config + + pallet_subtensor::Config + + Send + + Sync + + scale_info::TypeInfo, + R::AccountId: From<[u8; 32]> + ByteArray + Into<[u8; 32]>, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, + ::RuntimeCall: From> + + GetDispatchInfo + + Dispatchable + + IsSubType> + + IsSubType>, + ::RuntimeCall: From> + + GetDispatchInfo + + Dispatchable, + ::AddressMapping: AddressMapping, +{ + const INDEX: u64 = 2060; +} + +#[precompile_utils::precompile] +impl AddressMappingPrecompile +where + R: frame_system::Config + + pallet_balances::Config + + pallet_crowdloan::Config + + pallet_evm::Config + + pallet_proxy::Config + + pallet_subtensor::Config + + Send + + Sync + + scale_info::TypeInfo, + R::AccountId: From<[u8; 32]> + ByteArray + Into<[u8; 32]>, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, + ::RuntimeCall: From> + + GetDispatchInfo + + Dispatchable + + IsSubType> + + IsSubType>, + ::RuntimeCall: From> + + GetDispatchInfo + + Dispatchable, + ::AddressMapping: AddressMapping, +{ + #[precompile::public("addressMapping(address)")] + #[precompile::payable] + fn address_mapping( + _handle: &mut impl PrecompileHandle, + target_address: Address, + ) -> EvmResult { + let target_address: [u8; 32] = R::AddressMapping::into_account_id(target_address.0).into(); + Ok(target_address.into()) + } +} diff --git a/precompiles/src/lib.rs b/precompiles/src/lib.rs index dedeebe249..864119d89f 100644 --- a/precompiles/src/lib.rs +++ b/precompiles/src/lib.rs @@ -26,6 +26,7 @@ use subtensor_runtime_common::ProxyType; use pallet_admin_utils::PrecompileEnum; +use crate::address_mapping::*; use crate::alpha::*; use crate::balance_transfer::*; use crate::crowdloan::*; @@ -41,6 +42,7 @@ use crate::storage_query::*; use crate::subnet::*; use crate::uid_lookup::*; +mod address_mapping; mod alpha; mod balance_transfer; mod crowdloan; @@ -123,7 +125,7 @@ where Self(Default::default()) } - pub fn used_addresses() -> [H160; 25] { + pub fn used_addresses() -> [H160; 26] { [ hash(1), hash(2), @@ -150,6 +152,7 @@ where hash(CrowdloanPrecompile::::INDEX), hash(LeasingPrecompile::::INDEX), hash(ProxyPrecompile::::INDEX), + hash(AddressMappingPrecompile::::INDEX), ] } } @@ -245,6 +248,12 @@ where a if a == hash(ProxyPrecompile::::INDEX) => { ProxyPrecompile::::try_execute::(handle, PrecompileEnum::Proxy) } + a if a == hash(AddressMappingPrecompile::::INDEX) => { + AddressMappingPrecompile::::try_execute::( + handle, + PrecompileEnum::AddressMapping, + ) + } _ => None, } } diff --git a/precompiles/src/solidity/addressMapping.abi b/precompiles/src/solidity/addressMapping.abi new file mode 100644 index 0000000000..cddc0b30d7 --- /dev/null +++ b/precompiles/src/solidity/addressMapping.abi @@ -0,0 +1,21 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "target_address", + "type": "address" + } + ], + "name": "addressMapping", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + } +] diff --git a/precompiles/src/solidity/addressMapping.sol b/precompiles/src/solidity/addressMapping.sol new file mode 100644 index 0000000000..78f62adc32 --- /dev/null +++ b/precompiles/src/solidity/addressMapping.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +address constant IADDRESS_MAPPING_ADDRESS = 0x000000000000000000000000000000000000080C; + +interface IAddressMapping { + /** + * @dev Converts an Ethereum address (H160) to a Substrate AccountId32 (H256). + * + * This function uses the AddressMapping configured in the runtime to convert + * an Ethereum address to its corresponding Substrate account ID. The mapping + * is implemented using HashedAddressMapping with Blake2b hashing as configured + * in the runtime. + * + * @param target_address The Ethereum address (20 bytes) to convert. + * @return The corresponding Substrate AccountId32 (32 bytes). + */ + function addressMapping( + address target_address + ) external payable returns (bytes32); +} From b4e1ca9916a50eeab92b7d0180088a5530ba40dc Mon Sep 17 00:00:00 2001 From: open-junius Date: Mon, 12 Jan 2026 15:42:46 +0800 Subject: [PATCH 36/70] fix e2e tests --- Cargo.lock | 1 - contract-tests/package.json | 2 +- contract-tests/src/contracts/addressMapping.ts | 2 +- contract-tests/test/addressMapping.precompile.test.ts | 6 +++++- contract-tests/test/staking.precompile.add-remove.test.ts | 6 +++++- precompiles/src/address_mapping.rs | 2 +- precompiles/src/solidity/addressMapping.abi | 2 +- precompiles/src/solidity/addressMapping.sol | 2 +- 8 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aec9116f1f..c9ba8aede2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9708,7 +9708,6 @@ dependencies = [ "fp-storage", "frame-support", "frame-system", - "log", "pallet-evm", "parity-scale-codec", "scale-info", diff --git a/contract-tests/package.json b/contract-tests/package.json index 6af55b1d9e..e3d903d95d 100644 --- a/contract-tests/package.json +++ b/contract-tests/package.json @@ -1,6 +1,6 @@ { "scripts": { - "test": "TS_NODE_PREFER_TS_EXTS=1 TS_NODE_TRANSPILE_ONLY=1 mocha --timeout 999999 --retries 3 --file src/setup.ts --require ts-node/register --extension ts \"test/**/*.ts\"" + "test": "TS_NODE_PREFER_TS_EXTS=1 TS_NODE_TRANSPILE_ONLY=1 mocha --timeout 999999 --retries 3 --file src/setup.ts --require ts-node/register --extension ts \"test/addressMapping.precompile.test.ts\"" }, "keywords": [], "author": "", diff --git a/contract-tests/src/contracts/addressMapping.ts b/contract-tests/src/contracts/addressMapping.ts index ddaf4fd75d..114c111d1c 100644 --- a/contract-tests/src/contracts/addressMapping.ts +++ b/contract-tests/src/contracts/addressMapping.ts @@ -17,7 +17,7 @@ export const IAddressMappingABI = [ "type": "bytes32" } ], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" } ]; diff --git a/contract-tests/test/addressMapping.precompile.test.ts b/contract-tests/test/addressMapping.precompile.test.ts index 6c5e101f33..4f316fc57a 100644 --- a/contract-tests/test/addressMapping.precompile.test.ts +++ b/contract-tests/test/addressMapping.precompile.test.ts @@ -3,6 +3,7 @@ import { ethers } from "ethers"; import { generateRandomEthersWallet } from "../src/utils"; import { IADDRESS_MAPPING_ADDRESS, IAddressMappingABI } from "../src/contracts/addressMapping"; import { convertH160ToPublicKey } from "../src/address-utils"; +import { u8aToHex } from "@polkadot/util"; describe("Test address mapping precompile", () => { const wallet1 = generateRandomEthersWallet(); @@ -31,7 +32,10 @@ describe("Test address mapping precompile", () => { "AccountId32 should not be all zeros" ); - assert.equal(accountId32, expectedAcccountId32, "AccountId32 should be the same as the expected AccountId32"); + console.log("accountId32: {}", accountId32); + console.log("expectedAcccountId32: {}", expectedAcccountId32); + + assert.equal(accountId32, u8aToHex(expectedAcccountId32), "AccountId32 should be the same as the expected AccountId32"); }); it("Address mapping works with different addresses", async () => { diff --git a/contract-tests/test/staking.precompile.add-remove.test.ts b/contract-tests/test/staking.precompile.add-remove.test.ts index dd1aca35cd..d7dfcb0d3d 100644 --- a/contract-tests/test/staking.precompile.add-remove.test.ts +++ b/contract-tests/test/staking.precompile.add-remove.test.ts @@ -165,7 +165,11 @@ describe("Test neuron precompile add remove stake", () => { const totalColdkeyStakeOnSubnet = Number( await contractV2.getTotalColdkeyStakeOnSubnet(convertH160ToPublicKey(wallet1.address), netuid) ); - assert.equal(totalColdkeyStakeOnSubnet, stakeFromContractV2) + + // check the value is not undefined and is greater than or equal to the stake from contract V2 + assert.ok(totalColdkeyStakeOnSubnet != undefined) + // is greater than or equal to the stake from contract V2 because of emission + assert.ok(totalColdkeyStakeOnSubnet >= stakeFromContractV2) }) diff --git a/precompiles/src/address_mapping.rs b/precompiles/src/address_mapping.rs index e5f6d31b0f..fa34692657 100644 --- a/precompiles/src/address_mapping.rs +++ b/precompiles/src/address_mapping.rs @@ -66,7 +66,7 @@ where ::AddressMapping: AddressMapping, { #[precompile::public("addressMapping(address)")] - #[precompile::payable] + #[precompile::view] fn address_mapping( _handle: &mut impl PrecompileHandle, target_address: Address, diff --git a/precompiles/src/solidity/addressMapping.abi b/precompiles/src/solidity/addressMapping.abi index cddc0b30d7..40773e9d77 100644 --- a/precompiles/src/solidity/addressMapping.abi +++ b/precompiles/src/solidity/addressMapping.abi @@ -15,7 +15,7 @@ "type": "bytes32" } ], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" } ] diff --git a/precompiles/src/solidity/addressMapping.sol b/precompiles/src/solidity/addressMapping.sol index 78f62adc32..8c5decb6cc 100644 --- a/precompiles/src/solidity/addressMapping.sol +++ b/precompiles/src/solidity/addressMapping.sol @@ -17,5 +17,5 @@ interface IAddressMapping { */ function addressMapping( address target_address - ) external payable returns (bytes32); + ) external view returns (bytes32); } From 80a80e2526b83d4d6a19d52446f872001b3ac0f1 Mon Sep 17 00:00:00 2001 From: open-junius Date: Mon, 12 Jan 2026 19:12:07 +0800 Subject: [PATCH 37/70] revert to test all --- contract-tests/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract-tests/package.json b/contract-tests/package.json index e3d903d95d..6af55b1d9e 100644 --- a/contract-tests/package.json +++ b/contract-tests/package.json @@ -1,6 +1,6 @@ { "scripts": { - "test": "TS_NODE_PREFER_TS_EXTS=1 TS_NODE_TRANSPILE_ONLY=1 mocha --timeout 999999 --retries 3 --file src/setup.ts --require ts-node/register --extension ts \"test/addressMapping.precompile.test.ts\"" + "test": "TS_NODE_PREFER_TS_EXTS=1 TS_NODE_TRANSPILE_ONLY=1 mocha --timeout 999999 --retries 3 --file src/setup.ts --require ts-node/register --extension ts \"test/**/*.ts\"" }, "keywords": [], "author": "", From b2ffa20ed2c681b14f861dd0ff129bc66dfbacb7 Mon Sep 17 00:00:00 2001 From: John Reed <87283488+JohnReedV@users.noreply.github.com> Date: Mon, 12 Jan 2026 08:24:24 -0800 Subject: [PATCH 38/70] update read --- pallets/subtensor/src/macros/dispatches.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/subtensor/src/macros/dispatches.rs b/pallets/subtensor/src/macros/dispatches.rs index 8c0b2210ec..1aef08c299 100644 --- a/pallets/subtensor/src/macros/dispatches.rs +++ b/pallets/subtensor/src/macros/dispatches.rs @@ -1935,7 +1935,7 @@ mod dispatches { /// Emits a `FirstEmissionBlockNumberSet` event on success. #[pallet::call_index(92)] #[pallet::weight(( - Weight::from_parts(29_780_000, 0).saturating_add(T::DbWeight::get().reads_writes(4, 2)), + Weight::from_parts(29_780_000, 0).saturating_add(T::DbWeight::get().reads_writes(5, 2)), DispatchClass::Normal, Pays::Yes ))] From c17b982dce7e1bfa8c64a1582bbdf4ad50b788a9 Mon Sep 17 00:00:00 2001 From: John Reed <87283488+JohnReedV@users.noreply.github.com> Date: Mon, 12 Jan 2026 14:31:36 -0800 Subject: [PATCH 39/70] emit failure on pre-dispatch failures --- node/src/mev_shield/proposer.rs | 37 ++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/node/src/mev_shield/proposer.rs b/node/src/mev_shield/proposer.rs index 23dbfdbcb0..b2df125d09 100644 --- a/node/src/mev_shield/proposer.rs +++ b/node/src/mev_shield/proposer.rs @@ -13,6 +13,18 @@ use std::{ sync::{Arc, Mutex}, }; +/// Truncate a UTF-8 string to at most `max_bytes` bytes without splitting codepoints. +fn truncate_utf8_to_bytes(s: &str, max_bytes: usize) -> String { + if s.len() <= max_bytes { + return s.to_string(); + } + let mut end = max_bytes; + while end > 0 && !s.is_char_boundary(end) { + end = end.saturating_sub(1); + } + s[..end].to_string() +} + /// Helper to build a `mark_decryption_failed` runtime call with a bounded reason string. fn create_failed_call(id: H256, reason: &str) -> node_subtensor_runtime::RuntimeCall { use sp_runtime::BoundedVec; @@ -587,8 +599,7 @@ pub fn spawn_revealer( ss32.copy_from_slice(ss_bytes); let ss_hash = sp_core::hashing::blake2_256(&ss32); - let aead_key = - crate::mev_shield::author::derive_aead_key(&ss32); + let aead_key = crate::mev_shield::author::derive_aead_key(&ss32); let key_hash_dbg = sp_core::hashing::blake2_256(&aead_key); log::debug!( @@ -644,7 +655,6 @@ pub fn spawn_revealer( ); // Safely parse plaintext layout without panics. - if plaintext.is_empty() { let error_message = "plaintext too short"; log::debug!( @@ -731,22 +741,39 @@ pub fn spawn_revealer( ); } Err(e) => { + let err_dbg = format!("{e:?}"); + let reason = truncate_utf8_to_bytes( + &format!( + "inner extrinsic rejected by tx-pool (pre-dispatch): {err_dbg}" + ), + 240, + ); log::debug!( target: "mev-shield", - " id=0x{}: submit_one(...) FAILED: {:?}", + " id=0x{}: submit_one(...) FAILED (will mark_decryption_failed): {:?}", hex::encode(id.as_bytes()), e ); + failed_calls.push((id, create_failed_call(id, &reason))); } } } Err(e) => { + // Defensive: if we cannot even construct an OpaqueExtrinsic, mark it failed. + let err_dbg = format!("{e:?}"); + let reason = truncate_utf8_to_bytes( + &format!( + "invalid decrypted extrinsic bytes (OpaqueExtrinsic::from_bytes): {err_dbg}" + ), + 240, + ); log::debug!( target: "mev-shield", - " id=0x{}: OpaqueExtrinsic::from_bytes failed: {:?}", + " id=0x{}: OpaqueExtrinsic::from_bytes failed (will mark_decryption_failed): {:?}", hex::encode(id.as_bytes()), e ); + failed_calls.push((id, create_failed_call(id, &reason))); } } } From 91b3e70f245c4269dfb14c26dad5c9e3f884f5b0 Mon Sep 17 00:00:00 2001 From: John Reed <87283488+JohnReedV@users.noreply.github.com> Date: Mon, 12 Jan 2026 14:42:31 -0800 Subject: [PATCH 40/70] bump spec --- runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index f4a120cbbb..e2b1645515 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -241,7 +241,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // `spec_version`, and `authoring_version` are the same between Wasm and native. // This value is set to 100 to notify Polkadot-JS App (https://polkadot.js.org/apps) to use // the compatible custom types. - spec_version: 366, + spec_version: 368, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, From 8030e4be3bae117faaf30b43d0d07b2b9c3254d2 Mon Sep 17 00:00:00 2001 From: John Reed <87283488+JohnReedV@users.noreply.github.com> Date: Mon, 12 Jan 2026 14:43:58 -0800 Subject: [PATCH 41/70] bump spec --- runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index f4a120cbbb..e2b1645515 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -241,7 +241,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // `spec_version`, and `authoring_version` are the same between Wasm and native. // This value is set to 100 to notify Polkadot-JS App (https://polkadot.js.org/apps) to use // the compatible custom types. - spec_version: 366, + spec_version: 368, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, From efdece8ea248d7850ff9360377ddccc0c4c89c1a Mon Sep 17 00:00:00 2001 From: John Reed <87283488+JohnReedV@users.noreply.github.com> Date: Mon, 12 Jan 2026 15:02:03 -0800 Subject: [PATCH 42/70] replace direct indexing --- node/src/mev_shield/proposer.rs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/node/src/mev_shield/proposer.rs b/node/src/mev_shield/proposer.rs index b2df125d09..7a23a3fd08 100644 --- a/node/src/mev_shield/proposer.rs +++ b/node/src/mev_shield/proposer.rs @@ -18,11 +18,19 @@ fn truncate_utf8_to_bytes(s: &str, max_bytes: usize) -> String { if s.len() <= max_bytes { return s.to_string(); } - let mut end = max_bytes; - while end > 0 && !s.is_char_boundary(end) { + + let mut end = max_bytes.min(s.len()); + + // Decrement until we find a valid UTF-8 boundary. + while end > 0 { + if let Some(prefix) = s.get(..end) { + return prefix.to_string(); + } end = end.saturating_sub(1); } - s[..end].to_string() + + // If max_bytes was 0 or we couldn't find a boundary (extremely defensive), return empty. + String::new() } /// Helper to build a `mark_decryption_failed` runtime call with a bounded reason string. @@ -654,7 +662,6 @@ pub fn spawn_revealer( plaintext.len() ); - // Safely parse plaintext layout without panics. if plaintext.is_empty() { let error_message = "plaintext too short"; log::debug!( @@ -741,6 +748,8 @@ pub fn spawn_revealer( ); } Err(e) => { + // Emit an on-chain failure event even when the *inner* + // transaction fails pre-dispatch validation in the pool. let err_dbg = format!("{e:?}"); let reason = truncate_utf8_to_bytes( &format!( @@ -759,7 +768,6 @@ pub fn spawn_revealer( } } Err(e) => { - // Defensive: if we cannot even construct an OpaqueExtrinsic, mark it failed. let err_dbg = format!("{e:?}"); let reason = truncate_utf8_to_bytes( &format!( From b3ced53a398fe0409187134f9eb92b1f428f2c7b Mon Sep 17 00:00:00 2001 From: open-junius Date: Tue, 13 Jan 2026 10:18:53 +0800 Subject: [PATCH 43/70] init solution --- pallets/admin-utils/src/tests/mock.rs | 2 +- pallets/subtensor/src/tests/mock.rs | 2 +- pallets/transaction-fee/src/tests/mock.rs | 2 +- runtime/src/lib.rs | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pallets/admin-utils/src/tests/mock.rs b/pallets/admin-utils/src/tests/mock.rs index e1ab02d911..0117dff889 100644 --- a/pallets/admin-utils/src/tests/mock.rs +++ b/pallets/admin-utils/src/tests/mock.rs @@ -145,7 +145,7 @@ parameter_types! { pub const InitialDissolveNetworkScheduleDuration: u64 = 5 * 24 * 60 * 60 / 12; // 5 days pub const InitialTaoWeight: u64 = u64::MAX/10; // 10% global weight. pub const InitialEmaPriceHalvingPeriod: u64 = 201_600_u64; // 4 weeks - pub const InitialStartCallDelay: u64 = 7 * 24 * 60 * 60 / 12; // 7 days + pub const InitialStartCallDelay: u64 = 0; // 0 days pub const InitialKeySwapOnSubnetCost: u64 = 10_000_000; pub const HotkeySwapOnSubnetInterval: u64 = 7 * 24 * 60 * 60 / 12; // 7 days pub const LeaseDividendsDistributionInterval: u32 = 100; // 100 blocks diff --git a/pallets/subtensor/src/tests/mock.rs b/pallets/subtensor/src/tests/mock.rs index c33be9068c..b744c9b771 100644 --- a/pallets/subtensor/src/tests/mock.rs +++ b/pallets/subtensor/src/tests/mock.rs @@ -218,7 +218,7 @@ parameter_types! { pub const InitialDissolveNetworkScheduleDuration: u64 = 5 * 24 * 60 * 60 / 12; // Default as 5 days pub const InitialTaoWeight: u64 = 0; // 100% global weight. pub const InitialEmaPriceHalvingPeriod: u64 = 201_600_u64; // 4 weeks - pub const InitialStartCallDelay: u64 = 7 * 24 * 60 * 60 / 12; // Default as 7 days + pub const InitialStartCallDelay: u64 = 0; // 0 days pub const InitialKeySwapOnSubnetCost: u64 = 10_000_000; pub const HotkeySwapOnSubnetInterval: u64 = 15; // 15 block, should be bigger than subnet number, then trigger clean up for all subnets pub const MaxContributorsPerLeaseToRemove: u32 = 3; diff --git a/pallets/transaction-fee/src/tests/mock.rs b/pallets/transaction-fee/src/tests/mock.rs index 75e90346b4..3bad4a275f 100644 --- a/pallets/transaction-fee/src/tests/mock.rs +++ b/pallets/transaction-fee/src/tests/mock.rs @@ -210,7 +210,7 @@ parameter_types! { pub const InitialDissolveNetworkScheduleDuration: u64 = 5 * 24 * 60 * 60 / 12; // 5 days pub const InitialTaoWeight: u64 = u64::MAX/10; // 10% global weight. pub const InitialEmaPriceHalvingPeriod: u64 = 201_600_u64; // 4 weeks - pub const InitialStartCallDelay: u64 = 7 * 24 * 60 * 60 / 12; // 7 days + pub const InitialStartCallDelay: u64 = 0; // 0 days pub const InitialKeySwapOnSubnetCost: u64 = 10_000_000; pub const HotkeySwapOnSubnetInterval: u64 = 7 * 24 * 60 * 60 / 12; // 7 days pub const LeaseDividendsDistributionInterval: u32 = 100; // 100 blocks diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index f4a120cbbb..ab15c401a5 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -1057,8 +1057,8 @@ parameter_types! { pub const InitialDissolveNetworkScheduleDuration: BlockNumber = 5 * 24 * 60 * 60 / 12; // 5 days pub const SubtensorInitialTaoWeight: u64 = 971_718_665_099_567_868; // 0.05267697438728329% tao weight. pub const InitialEmaPriceHalvingPeriod: u64 = 201_600_u64; // 4 weeks - // 7 * 24 * 60 * 60 / 12 = 7 days - pub const InitialStartCallDelay: u64 = prod_or_fast!(7 * 24 * 60 * 60 / 12, 10); + // 0 days + pub const InitialStartCallDelay: u64 = prod_or_fast!(0, 0); pub const SubtensorInitialKeySwapOnSubnetCost: u64 = 1_000_000; // 0.001 TAO pub const HotkeySwapOnSubnetInterval : BlockNumber = 5 * 24 * 60 * 60 / 12; // 5 days pub const LeaseDividendsDistributionInterval: BlockNumber = 100; // 100 blocks From 97a9eca9f350f63d5edc0ce812920a674348be30 Mon Sep 17 00:00:00 2001 From: open-junius Date: Tue, 13 Jan 2026 10:41:51 +0800 Subject: [PATCH 44/70] fix unit test --- pallets/admin-utils/src/tests/mod.rs | 34 ++++++++++++---------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/pallets/admin-utils/src/tests/mod.rs b/pallets/admin-utils/src/tests/mod.rs index 365ef63ad5..e0a945da80 100644 --- a/pallets/admin-utils/src/tests/mod.rs +++ b/pallets/admin-utils/src/tests/mod.rs @@ -2898,10 +2898,7 @@ fn test_sudo_set_start_call_delay_permissions_and_zero_delay() { // Get initial delay value (should be non-zero) let initial_delay = pallet_subtensor::StartCallDelay::::get(); - assert!( - initial_delay > 0, - "Initial delay should be greater than zero" - ); + assert_eq!(initial_delay, 0); // Test 1: Non-root account should fail to set delay assert_noop!( @@ -2926,19 +2923,15 @@ fn test_sudo_set_start_call_delay_permissions_and_zero_delay() { ); // Test 3: Try to start the subnet immediately - should FAIL (delay not passed) - assert_err!( - pallet_subtensor::Pallet::::start_call( - <::RuntimeOrigin>::signed(coldkey_account_id), - netuid - ), - pallet_subtensor::Error::::NeedWaitingMoreBlocksToStarCall - ); + assert_ok!(pallet_subtensor::Pallet::::start_call( + <::RuntimeOrigin>::signed(coldkey_account_id), + netuid + )); // Verify emission has not been set - assert_eq!( - pallet_subtensor::FirstEmissionBlockNumber::::get(netuid), - None, - "Emission should not be set yet" + assert!( + pallet_subtensor::FirstEmissionBlockNumber::::get(netuid).is_some(), + "Emission should be set" ); // Test 4: Root sets delay to zero @@ -2959,10 +2952,13 @@ fn test_sudo_set_start_call_delay_permissions_and_zero_delay() { // Test 5: Try to start the subnet again - should SUCCEED (delay is now zero) let current_block = frame_system::Pallet::::block_number(); - assert_ok!(pallet_subtensor::Pallet::::start_call( - <::RuntimeOrigin>::signed(coldkey_account_id), - netuid - )); + assert_err!( + pallet_subtensor::Pallet::::start_call( + <::RuntimeOrigin>::signed(coldkey_account_id), + netuid + ), + pallet_subtensor::Error::::FirstEmissionBlockNumberAlreadySet + ); assert_eq!( pallet_subtensor::FirstEmissionBlockNumber::::get(netuid), From 33335a0be89c6dcd1dba7b786be89be9e1683dc1 Mon Sep 17 00:00:00 2001 From: open-junius Date: Tue, 13 Jan 2026 11:29:50 +0800 Subject: [PATCH 45/70] fix test --- pallets/subtensor/src/tests/subnet.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/pallets/subtensor/src/tests/subnet.rs b/pallets/subtensor/src/tests/subnet.rs index 456c33ce65..a547b30a14 100644 --- a/pallets/subtensor/src/tests/subnet.rs +++ b/pallets/subtensor/src/tests/subnet.rs @@ -89,7 +89,7 @@ fn test_do_start_call_fail_not_owner() { } #[test] -fn test_do_start_call_fail_with_cannot_start_call_now() { +fn test_do_start_call_can_start_now() { new_test_ext(0).execute_with(|| { let netuid = NetUid::from(1); let tempo: u16 = 13; @@ -106,13 +106,10 @@ fn test_do_start_call_fail_with_cannot_start_call_now() { assert_eq!(SubnetOwner::::get(netuid), coldkey_account_id); - assert_noop!( - SubtensorModule::start_call( - <::RuntimeOrigin>::signed(coldkey_account_id), - netuid - ), - Error::::NeedWaitingMoreBlocksToStarCall - ); + assert_ok!(SubtensorModule::start_call( + <::RuntimeOrigin>::signed(coldkey_account_id), + netuid + )); }); } From 1d225b3d0e119fd95f440a0302a24fda8344d2f2 Mon Sep 17 00:00:00 2001 From: open-junius Date: Tue, 13 Jan 2026 13:26:48 +0800 Subject: [PATCH 46/70] bump version --- runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index ab15c401a5..e8d8b595ba 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -241,7 +241,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // `spec_version`, and `authoring_version` are the same between Wasm and native. // This value is set to 100 to notify Polkadot-JS App (https://polkadot.js.org/apps) to use // the compatible custom types. - spec_version: 366, + spec_version: 367, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, From ebd486c6dfdfd9fd5d7f589362d41ff23e8f7b7b Mon Sep 17 00:00:00 2001 From: John Reed <87283488+JohnReedV@users.noreply.github.com> Date: Tue, 13 Jan 2026 08:51:10 -0800 Subject: [PATCH 47/70] bump spec --- runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index e2b1645515..99be2f09d3 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -241,7 +241,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // `spec_version`, and `authoring_version` are the same between Wasm and native. // This value is set to 100 to notify Polkadot-JS App (https://polkadot.js.org/apps) to use // the compatible custom types. - spec_version: 368, + spec_version: 369, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, From f668d9dc34d9cfb1a0ec7b5fd6ea88325d2e914b Mon Sep 17 00:00:00 2001 From: ibraheem-latent Date: Tue, 13 Jan 2026 14:03:15 -0800 Subject: [PATCH 48/70] use runtime default constant for start call --- node/src/chain_spec/localnet.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/node/src/chain_spec/localnet.rs b/node/src/chain_spec/localnet.rs index b20372e4b9..02ea8896b5 100644 --- a/node/src/chain_spec/localnet.rs +++ b/node/src/chain_spec/localnet.rs @@ -124,8 +124,5 @@ fn localnet_genesis( "evmChainId": { "chainId": 42, }, - "subtensorModule": { - "startCallDelay": 10, - }, }) } From 9b43431ba7eae29afdfcfdbbf1e2f98ceecb706d Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Tue, 13 Jan 2026 22:15:32 +0000 Subject: [PATCH 49/70] Simplify the formula for removal of VotingPower entry --- pallets/subtensor/src/utils/voting_power.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/pallets/subtensor/src/utils/voting_power.rs b/pallets/subtensor/src/utils/voting_power.rs index 5b66cfebb4..8950910074 100644 --- a/pallets/subtensor/src/utils/voting_power.rs +++ b/pallets/subtensor/src/utils/voting_power.rs @@ -195,16 +195,13 @@ impl Pallet { // All values use 18 decimal precision for alpha (alpha is in range [0, 10^18]) let new_ema = Self::calculate_voting_power_ema(current_stake, previous_ema, alpha); - // Use 90% of min_stake as removal threshold (hysteresis to prevent noise-triggered removal) - let removal_threshold = min_stake.saturating_mul(9).safe_div(10); - - // Only remove if they previously had voting power ABOVE threshold and decayed significantly below. + // Only remove if they previously had voting power ABOVE threshold and decayed below. // This allows new validators to build up voting power from 0 without being removed. - if new_ema < removal_threshold && previous_ema >= min_stake { - // Was above threshold, now decayed significantly below - remove + if new_ema < min_stake && previous_ema >= min_stake { + // Was above threshold, now decayed below - remove VotingPower::::remove(netuid, hotkey); log::trace!( - "VotingPower removed for hotkey {hotkey:?} on netuid {netuid:?} (decayed below removal threshold: {new_ema:?} < {removal_threshold:?})" + "VotingPower removed for hotkey {hotkey:?} on netuid {netuid:?} (decayed below removal threshold: {new_ema:?} < {min_stake:?})" ); } else if new_ema > 0 { // Update voting power (building up or maintaining) From cda6423f6cfe61fce0ed2c1fe770f10585531c34 Mon Sep 17 00:00:00 2001 From: open-junius Date: Wed, 14 Jan 2026 20:02:43 +0800 Subject: [PATCH 50/70] update test comments --- pallets/admin-utils/src/tests/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pallets/admin-utils/src/tests/mod.rs b/pallets/admin-utils/src/tests/mod.rs index e0a945da80..93d56ec343 100644 --- a/pallets/admin-utils/src/tests/mod.rs +++ b/pallets/admin-utils/src/tests/mod.rs @@ -2922,13 +2922,13 @@ fn test_sudo_set_start_call_delay_permissions_and_zero_delay() { "Default owner should be account 0" ); - // Test 3: Try to start the subnet immediately - should FAIL (delay not passed) + // Test 3: Can successfully start the subnet immediately assert_ok!(pallet_subtensor::Pallet::::start_call( <::RuntimeOrigin>::signed(coldkey_account_id), netuid )); - // Verify emission has not been set + // Verify emission has been set assert!( pallet_subtensor::FirstEmissionBlockNumber::::get(netuid).is_some(), "Emission should be set" @@ -2950,7 +2950,7 @@ fn test_sudo_set_start_call_delay_permissions_and_zero_delay() { pallet_subtensor::Event::StartCallDelaySet(0), )); - // Test 5: Try to start the subnet again - should SUCCEED (delay is now zero) + // Test 5: Try to start the subnet again - should be FAILED (first emission block already set) let current_block = frame_system::Pallet::::block_number(); assert_err!( pallet_subtensor::Pallet::::start_call( From 61968495f4dd9569bf2080eba7a0061658f8b5b9 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Wed, 14 Jan 2026 17:39:15 +0000 Subject: [PATCH 51/70] Adjust DefaultVotingPowerEmaAlpha to 2 weeks --- pallets/subtensor/src/lib.rs | 6 +++++- pallets/subtensor/src/utils/voting_power.rs | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index 5d7359d74b..a97c5ae521 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -1902,7 +1902,11 @@ pub mod pallet { /// Default VotingPower EMA alpha value (0.1 represented as u64 with 18 decimals) /// alpha = 0.1 means slow response, 10% weight to new values per epoch pub fn DefaultVotingPowerEmaAlpha() -> u64 { - 100_000_000_000_000_000 // 0.1 * 10^18 + 0_003_570_000_000_000_000 // 0.00357 * 10^18 = 2 weeks e-folding (time-constant) @ 361 + // blocks per tempo + // After 2 weeks -> EMA reaches 63.2% of a step change + // After ~4 weeks -> 86.5% + // After ~6 weeks -> 95% } #[pallet::storage] diff --git a/pallets/subtensor/src/utils/voting_power.rs b/pallets/subtensor/src/utils/voting_power.rs index 8950910074..380861bbf5 100644 --- a/pallets/subtensor/src/utils/voting_power.rs +++ b/pallets/subtensor/src/utils/voting_power.rs @@ -1,7 +1,6 @@ use super::*; use crate::epoch::run_epoch::EpochTerms; use alloc::collections::BTreeMap; -use safe_math::*; use subtensor_runtime_common::NetUid; /// 14 days in blocks (assuming ~12 second blocks) From bd3969aca1ee1c5f5670f24f592187ba48c59393 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Wed, 14 Jan 2026 19:00:31 +0000 Subject: [PATCH 52/70] cargo fmt --- pallets/subtensor/src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index a97c5ae521..ee3e8823cb 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -1903,10 +1903,10 @@ pub mod pallet { /// alpha = 0.1 means slow response, 10% weight to new values per epoch pub fn DefaultVotingPowerEmaAlpha() -> u64 { 0_003_570_000_000_000_000 // 0.00357 * 10^18 = 2 weeks e-folding (time-constant) @ 361 - // blocks per tempo - // After 2 weeks -> EMA reaches 63.2% of a step change - // After ~4 weeks -> 86.5% - // After ~6 weeks -> 95% + // blocks per tempo + // After 2 weeks -> EMA reaches 63.2% of a step change + // After ~4 weeks -> 86.5% + // After ~6 weeks -> 95% } #[pallet::storage] From c4b8ff98202429105f203d03965bcd29b0389875 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Wed, 14 Jan 2026 22:20:41 +0000 Subject: [PATCH 53/70] cargo clippy --- pallets/subtensor/src/tests/voting_power.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pallets/subtensor/src/tests/voting_power.rs b/pallets/subtensor/src/tests/voting_power.rs index 51edcfd351..4c9428c6b8 100644 --- a/pallets/subtensor/src/tests/voting_power.rs +++ b/pallets/subtensor/src/tests/voting_power.rs @@ -367,7 +367,7 @@ fn test_voting_power_cleared_when_deregistered() { assert!(voting_power_before > 0, "Voting power should be built up"); // Deregister the hotkey (simulate by removing from IsNetworkMember) - IsNetworkMember::::remove(&f.hotkey, f.netuid); + IsNetworkMember::::remove(f.hotkey, f.netuid); // Run epoch - voting power should be cleared for deregistered hotkey f.run_epochs(1); @@ -375,7 +375,7 @@ fn test_voting_power_cleared_when_deregistered() { // Should be removed from storage immediately when deregistered assert_eq!(f.get_voting_power(), 0); assert!( - !VotingPower::::contains_key(f.netuid, &f.hotkey), + !VotingPower::::contains_key(f.netuid, f.hotkey), "Entry should be removed when hotkey is deregistered" ); }); @@ -549,7 +549,7 @@ fn test_voting_power_not_removed_if_never_above_threshold() { "Voting power should still exist - it was never above threshold" ); assert!( - VotingPower::::contains_key(f.netuid, &f.hotkey), + VotingPower::::contains_key(f.netuid, f.hotkey), "Entry should exist - it was never above threshold so shouldn't be removed" ); }); @@ -589,7 +589,7 @@ fn test_voting_power_not_removed_with_small_dip_below_threshold() { // Should NOT be removed - dip is within hysteresis buffer assert!( - VotingPower::::contains_key(f.netuid, &f.hotkey), + VotingPower::::contains_key(f.netuid, f.hotkey), "Entry should exist - small dip within 10% buffer should not trigger removal" ); }); @@ -630,7 +630,7 @@ fn test_voting_power_removed_with_significant_drop_below_threshold() { SubtensorModule::update_voting_power_for_subnet(f.netuid, &epoch_output); assert!( - !VotingPower::::contains_key(f.netuid, &f.hotkey), + !VotingPower::::contains_key(f.netuid, f.hotkey), "Entry should be removed - stake dropped to 0 with alpha=1.0" ); }); From 3d65741b778c4b6e293329df6728bd9955ac2417 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Wed, 14 Jan 2026 22:54:34 +0000 Subject: [PATCH 54/70] Thank you clippy but I know what I'm doing --- pallets/subtensor/src/lib.rs | 1 + pallets/subtensor/src/tests/voting_power.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index ee3e8823cb..ac175b62ad 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -1901,6 +1901,7 @@ pub mod pallet { #[pallet::type_value] /// Default VotingPower EMA alpha value (0.1 represented as u64 with 18 decimals) /// alpha = 0.1 means slow response, 10% weight to new values per epoch + #[allow(clippy::zero_prefixed_literal)] pub fn DefaultVotingPowerEmaAlpha() -> u64 { 0_003_570_000_000_000_000 // 0.00357 * 10^18 = 2 weeks e-folding (time-constant) @ 361 // blocks per tempo diff --git a/pallets/subtensor/src/tests/voting_power.rs b/pallets/subtensor/src/tests/voting_power.rs index 4c9428c6b8..5306769770 100644 --- a/pallets/subtensor/src/tests/voting_power.rs +++ b/pallets/subtensor/src/tests/voting_power.rs @@ -74,6 +74,7 @@ impl VotingPowerTestFixture { } /// Setup reserves and add balance with custom amount + #[allow(clippy::arithmetic_side_effects)] fn setup_for_staking_with_amount(&self, amount: u64) { mock::setup_reserves(self.netuid, (amount * 100).into(), (amount * 100).into()); SubtensorModule::add_balance_to_coldkey_account(&self.coldkey, amount * 10); From 4ce1f5d6da9abee7eb0de57e879104e5f1868053 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Wed, 14 Jan 2026 23:59:17 +0000 Subject: [PATCH 55/70] Fix macro conflict --- pallets/subtensor/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index ac175b62ad..58e1c6de4b 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -1901,8 +1901,8 @@ pub mod pallet { #[pallet::type_value] /// Default VotingPower EMA alpha value (0.1 represented as u64 with 18 decimals) /// alpha = 0.1 means slow response, 10% weight to new values per epoch - #[allow(clippy::zero_prefixed_literal)] pub fn DefaultVotingPowerEmaAlpha() -> u64 { + #![allow(clippy::zero_prefixed_literal)] 0_003_570_000_000_000_000 // 0.00357 * 10^18 = 2 weeks e-folding (time-constant) @ 361 // blocks per tempo // After 2 weeks -> EMA reaches 63.2% of a step change From b0e344058323e0ddcc6604eb7f5b49a233ece381 Mon Sep 17 00:00:00 2001 From: open-junius Date: Thu, 15 Jan 2026 16:06:38 +0800 Subject: [PATCH 56/70] rebase code --- runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index df2d8638c9..a27a48f36c 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -1058,7 +1058,7 @@ parameter_types! { pub const SubtensorInitialTaoWeight: u64 = 971_718_665_099_567_868; // 0.05267697438728329% tao weight. pub const InitialEmaPriceHalvingPeriod: u64 = 201_600_u64; // 4 weeks // 0 days - pub const InitialStartCallDelay: u64 = prod_or_fast!(0, 0); + pub const InitialStartCallDelay: u64 = 0; pub const SubtensorInitialKeySwapOnSubnetCost: u64 = 1_000_000; // 0.001 TAO pub const HotkeySwapOnSubnetInterval : BlockNumber = 5 * 24 * 60 * 60 / 12; // 5 days pub const LeaseDividendsDistributionInterval: BlockNumber = 100; // 100 blocks From c94b2e7952f5c3ebf3f3472dedc6f3440f497fc8 Mon Sep 17 00:00:00 2001 From: open-junius Date: Thu, 15 Jan 2026 16:22:06 +0800 Subject: [PATCH 57/70] bump version --- runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index a27a48f36c..55e9b537c3 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -241,7 +241,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // `spec_version`, and `authoring_version` are the same between Wasm and native. // This value is set to 100 to notify Polkadot-JS App (https://polkadot.js.org/apps) to use // the compatible custom types. - spec_version: 369, + spec_version: 370, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, From 495a78f4389e98887e876fe957d4bc27755e83c1 Mon Sep 17 00:00:00 2001 From: open-junius Date: Thu, 15 Jan 2026 18:45:59 +0800 Subject: [PATCH 58/70] contract e2e ci in self-host --- .github/workflows/contract-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 2e74e408b3..1fdefb45ec 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -24,7 +24,7 @@ permissions: jobs: run: - runs-on: ubuntu-latest + runs-on: [self-hosted, type-ccx13] env: RUST_BACKTRACE: full steps: From 76850889bca608a803d2d1e8c7c1a39175ef022c Mon Sep 17 00:00:00 2001 From: open-junius Date: Thu, 15 Jan 2026 22:13:05 +0800 Subject: [PATCH 59/70] need more time to build --- .github/workflows/contract-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 1fdefb45ec..d524af0c64 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -52,7 +52,7 @@ jobs: - name: Run tests uses: nick-fields/retry@v3 with: - timeout_minutes: 90 + timeout_minutes: 120 max_attempts: 3 retry_wait_seconds: 60 command: | From eeb01f1c226e44ada1c753f140e6aac1a7362b44 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Thu, 15 Jan 2026 16:16:12 +0000 Subject: [PATCH 60/70] fix macro usage --- pallets/subtensor/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index 58e1c6de4b..9db212330e 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -1,6 +1,7 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "512"] #![allow(clippy::too_many_arguments)] +#![allow(clippy::zero_prefixed_literal)] // Edit this file to define custom logic or remove it if it is not needed. // Learn more about FRAME and the core library of Substrate FRAME pallets: // @@ -1902,7 +1903,6 @@ pub mod pallet { /// Default VotingPower EMA alpha value (0.1 represented as u64 with 18 decimals) /// alpha = 0.1 means slow response, 10% weight to new values per epoch pub fn DefaultVotingPowerEmaAlpha() -> u64 { - #![allow(clippy::zero_prefixed_literal)] 0_003_570_000_000_000_000 // 0.00357 * 10^18 = 2 weeks e-folding (time-constant) @ 361 // blocks per tempo // After 2 weeks -> EMA reaches 63.2% of a step change From 0e1bd21ea9b82319a75d87d2c0943a818dce2dcf Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Thu, 15 Jan 2026 22:14:17 +0000 Subject: [PATCH 61/70] Fix precompile to have unique id --- contract-tests/src/contracts/votingPower.ts | 2 +- precompiles/src/voting_power.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contract-tests/src/contracts/votingPower.ts b/contract-tests/src/contracts/votingPower.ts index 743b4ed1a6..af1ff4b55f 100644 --- a/contract-tests/src/contracts/votingPower.ts +++ b/contract-tests/src/contracts/votingPower.ts @@ -1,4 +1,4 @@ -export const IVOTING_POWER_ADDRESS = "0x0000000000000000000000000000000000000806"; +export const IVOTING_POWER_ADDRESS = "0x000000000000000000000000000000000000080c"; export const IVotingPowerABI = [ { diff --git a/precompiles/src/voting_power.rs b/precompiles/src/voting_power.rs index c558ce03b0..e9a572863b 100644 --- a/precompiles/src/voting_power.rs +++ b/precompiles/src/voting_power.rs @@ -18,7 +18,7 @@ where R: frame_system::Config + pallet_subtensor::Config, R::AccountId: From<[u8; 32]> + ByteArray, { - const INDEX: u64 = 2054; + const INDEX: u64 = 2060; } #[precompile_utils::precompile] From 1526f896e872eb6b6b8483669df084c003146816 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Fri, 16 Jan 2026 19:44:59 +0000 Subject: [PATCH 62/70] Change the precompile address again as after something else merged this one is no longer unique --- contract-tests/src/contracts/votingPower.ts | 2 +- precompiles/src/lib.rs | 2 +- precompiles/src/voting_power.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contract-tests/src/contracts/votingPower.ts b/contract-tests/src/contracts/votingPower.ts index af1ff4b55f..bbcc3ca6e6 100644 --- a/contract-tests/src/contracts/votingPower.ts +++ b/contract-tests/src/contracts/votingPower.ts @@ -1,4 +1,4 @@ -export const IVOTING_POWER_ADDRESS = "0x000000000000000000000000000000000000080c"; +export const IVOTING_POWER_ADDRESS = "0x000000000000000000000000000000000000080d"; export const IVotingPowerABI = [ { diff --git a/precompiles/src/lib.rs b/precompiles/src/lib.rs index 42de81d56e..abc5e744b2 100644 --- a/precompiles/src/lib.rs +++ b/precompiles/src/lib.rs @@ -127,7 +127,7 @@ where Self(Default::default()) } - pub fn used_addresses() -> [H160; 26] { + pub fn used_addresses() -> [H160; 27] { [ hash(1), hash(2), diff --git a/precompiles/src/voting_power.rs b/precompiles/src/voting_power.rs index e9a572863b..74e1731b6e 100644 --- a/precompiles/src/voting_power.rs +++ b/precompiles/src/voting_power.rs @@ -18,7 +18,7 @@ where R: frame_system::Config + pallet_subtensor::Config, R::AccountId: From<[u8; 32]> + ByteArray, { - const INDEX: u64 = 2060; + const INDEX: u64 = 2061; } #[precompile_utils::precompile] From c66f7823d91e456798bc249fe59244141e423982 Mon Sep 17 00:00:00 2001 From: Pawel Polewicz Date: Fri, 16 Jan 2026 20:15:53 +0000 Subject: [PATCH 63/70] update test --- pallets/subtensor/src/tests/voting_power.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/subtensor/src/tests/voting_power.rs b/pallets/subtensor/src/tests/voting_power.rs index 5306769770..7edc06fbab 100644 --- a/pallets/subtensor/src/tests/voting_power.rs +++ b/pallets/subtensor/src/tests/voting_power.rs @@ -271,7 +271,7 @@ fn test_set_voting_power_ema_alpha() { // Get default alpha let default_alpha = SubtensorModule::get_voting_power_ema_alpha(f.netuid); - assert_eq!(default_alpha, 100_000_000_000_000_000); // 0.1 * 10^18 + assert_eq!(default_alpha, 3_570_000_000_000_000); // 0.00357 * 10^18 = 2 weeks e-folding // Set new alpha (only root can do this) let new_alpha: u64 = 500_000_000_000_000_000; // 0.5 * 10^18 From 5d10274a0ebec6a6416d5600719bc7bbd1d8465f Mon Sep 17 00:00:00 2001 From: Loris Moulin Date: Fri, 16 Jan 2026 17:21:22 -0300 Subject: [PATCH 64/70] added workflow to check node compat during psdk upgrade --- .github/workflows/check-node-compat.yml | 88 + .github/workflows/check-node-compat/main.ts | 206 +++ .../check-node-compat/package-lock.json | 1437 +++++++++++++++++ .../workflows/check-node-compat/package.json | 21 + .../workflows/check-node-compat/tsconfig.json | 11 + 5 files changed, 1763 insertions(+) create mode 100644 .github/workflows/check-node-compat.yml create mode 100644 .github/workflows/check-node-compat/main.ts create mode 100644 .github/workflows/check-node-compat/package-lock.json create mode 100644 .github/workflows/check-node-compat/package.json create mode 100644 .github/workflows/check-node-compat/tsconfig.json diff --git a/.github/workflows/check-node-compat.yml b/.github/workflows/check-node-compat.yml new file mode 100644 index 0000000000..b52a7a88ba --- /dev/null +++ b/.github/workflows/check-node-compat.yml @@ -0,0 +1,88 @@ +name: Check Node Compat + +on: + pull_request: + types: [labeled] + branches: [devnet-ready] + +concurrency: + group: check-node-compat-${{ github.ref }} + cancel-in-progress: true + +env: + CARGO_TERM_COLOR: always + +jobs: + build: + name: build ${{ matrix.version.name }} + runs-on: [self-hosted, type-ccx33] + if: contains(github.event.pull_request.labels.*.name, 'check-node-compat') + env: + RUST_BACKTRACE: full + strategy: + matrix: + version: + - { name: old, ref: devnet-ready } + - { name: new, ref: ${{ github.head_ref }} } + + steps: + - name: Install dependencies + run: | + sudo DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a apt-get update + sudo DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a apt-get install -y --no-install-recommends -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" build-essential clang curl git make libssl-dev llvm libudev-dev protobuf-compiler pkg-config unzip + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: Utilize Shared Rust Cache + uses: Swatinem/rust-cache@v2 + with: + key: "check-node-compat-${{ matrix.version.name }}" + + - name: Checkout ${{ matrix.version.name }} + uses: actions/checkout@v4 + with: + ref: ${{ matrix.version.ref }} + path: ${{ matrix.version.name }} + + - name: Build ${{ matrix.version.name }} + working-directory: ${{ matrix.version.name }} + run: cargo build --release --locked + + - name: Upload ${{ matrix.version.name }} node binary + uses: actions/upload-artifact@v4 + with: + name: node-subtensor-${{ matrix.version.name }} + path: ${{ matrix.version.name }}/target/release/node-subtensor + retention-days: 1 + + test: + needs: [build] + runs-on: [self-hosted, type-ccx33] + steps: + - name: Download old node binary + uses: actions/download-artifact@v4 + with: + name: node-subtensor-old + path: /tmp/node-subtensor-old + + - name: Download new node binary + uses: actions/download-artifact@v4 + with: + name: node-subtensor-new + path: /tmp/node-subtensor-new + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "24" + + - name: Install npm dependencies + working-directory: ${{ github.workspace }}/.github/workflows/check-node-compat + run: npm install + + - name: Run test + working-directory: ${{ github.workspace }}/.github/workflows/check-node-compat + run: npm run test \ No newline at end of file diff --git a/.github/workflows/check-node-compat/main.ts b/.github/workflows/check-node-compat/main.ts new file mode 100644 index 0000000000..07b65adb26 --- /dev/null +++ b/.github/workflows/check-node-compat/main.ts @@ -0,0 +1,206 @@ +import { spawnSync, spawn, ChildProcess } from "node:child_process"; +import { writeFile } from "node:fs/promises"; + +const all = Promise.all.bind(Promise); + +const SECOND = 1000; +const MINUTE = 60 * SECOND; + +const OLD_BINARY_PATH = "/tmp/node-subtensor-old"; +const NEW_BINARY_PATH = "/tmp/node-subtensor-new"; +const CHAIN_SPEC_PATH = "/tmp/local.json"; + +const ONE_OPTIONS = { + binaryPath: OLD_BINARY_PATH, + basePath: "/tmp/one", + name: "one", + port: 30333, + rpcPort: 9933, + validator: true, +}; + +const TWO_OPTIONS = { + binaryPath: OLD_BINARY_PATH, + basePath: "/tmp/two", + name: "two", + port: 30334, + rpcPort: 9944, + validator: true, +}; + +const ALICE_OPTIONS = { + binaryPath: OLD_BINARY_PATH, + basePath: "/tmp/alice", + name: "alice", + port: 30335, + rpcPort: 9955, + validator: false, +}; + +type Node = { name: string; binaryPath: string; process: ChildProcess }; + +async function main() { + await generateChainSpec(); + + const one = startNode(ONE_OPTIONS); + await started(one); + + const two = startNode(TWO_OPTIONS); + await started(two); + + await all([peerCount(one, 1), peerCount(two, 1)]); + await all([finalizedBlocks(one, 5), finalizedBlocks(two, 5)]); + + const alice = startNode(ALICE_OPTIONS); + await started(alice); + + await all([peerCount(one, 2), peerCount(two, 2), peerCount(alice, 2)]); + await all([finalizedBlocks(one, 10), finalizedBlocks(two, 10), finalizedBlocks(alice, 10)]); + + // Swap 'alice' node with the new binary + await stop(alice); + const aliceNew = startNode({ ...ALICE_OPTIONS, binaryPath: NEW_BINARY_PATH }); + await started(aliceNew); + + await all([peerCount(one, 2), peerCount(two, 2), peerCount(aliceNew, 2)]); + await all([finalizedBlocks(one, 15), finalizedBlocks(two, 15), finalizedBlocks(aliceNew, 15)]); + + // Swap 'one' node with the new binary + await stop(one); + const oneNew = startNode({ ...ONE_OPTIONS, binaryPath: NEW_BINARY_PATH }); + await started(oneNew); + + await all([peerCount(two, 2), peerCount(aliceNew, 2), peerCount(oneNew, 2)]); + await all([finalizedBlocks(oneNew, 20), finalizedBlocks(two, 20), finalizedBlocks(aliceNew, 20)]); + + // Swap 'two' node with the new binary + await stop(two); + const twoNew = startNode({ ...TWO_OPTIONS, binaryPath: NEW_BINARY_PATH }); + await started(twoNew); + + await all([peerCount(oneNew, 2), peerCount(twoNew, 2), peerCount(aliceNew, 2)]); + await all([finalizedBlocks(oneNew, 50), finalizedBlocks(twoNew, 50), finalizedBlocks(aliceNew, 50)]); + + await all([stop(oneNew), stop(twoNew), stop(aliceNew)]); + + log("Test completed with success, binaries are compatible ✅"); +} + +// Generate the chain spec for the local network +const generateChainSpec = async () => { + const result = spawnSync( + OLD_BINARY_PATH, + ["build-spec", "--disable-default-bootnode", "--raw", "--chain", "local"], + { maxBuffer: 1024 * 1024 * 10 }, // 10MB + ); + + if (result.status !== 0) { + throw new Error(`Failed to generate chain spec: ${result.stderr.toString()}`); + } + + const stdout = result.stdout.toString(); + await writeFile(CHAIN_SPEC_PATH, stdout, { encoding: "utf-8" }); +}; + +// Start a node with the given options +const startNode = (opts: { + binaryPath: string; + basePath: string; + name: string; + port: number; + rpcPort: number; + validator: boolean; +}): Node => { + const process = spawn(opts.binaryPath, [ + `--${opts.name}`, + ...["--chain", CHAIN_SPEC_PATH], + ...["--base-path", opts.basePath], + ...["--port", opts.port.toString()], + ...["--rpc-port", opts.rpcPort.toString()], + ...(opts.validator ? ["--validator"] : []), + "--rpc-cors=all", + "--allow-private-ipv4", + "--discover-local", + "--unsafe-force-node-key-generation", + ]); + + process.on("error", (error) => console.error(`${opts.name} (error): ${error}`)); + process.on("close", (code) => log(`${opts.name}: process closed with code ${code}`)); + + return { name: opts.name, binaryPath: opts.binaryPath, process }; +}; + +const stop = (node: Node): Promise => { + return new Promise((resolve, reject) => { + node.process.on("close", resolve); + node.process.on("error", reject); + + if (!node.process.kill()) { + reject(new Error(`Failed to stop ${node.name}`)); + } + }); +}; + +// Ensure the node has correctly started +const started = (node: Node, timeout = 30 * SECOND) => { + const errorMessage = `Failed to start ${node.name} in time`; + + return innerEnsure(node, errorMessage, timeout, (data, ok) => { + if (data.includes("💤 Idle")) { + log(`${node.name}: started using ${node.binaryPath}`); + ok(); + } + }); +}; + +// Ensure the node has reached the expected number of peers +const peerCount = (node: Node, expectedPeers: number, timeout = 30 * SECOND) => { + const errorMessage = `Failed to reach ${expectedPeers} peers in time`; + + return innerEnsure(node, errorMessage, timeout, (data, ok) => { + const maybePeers = /Idle \((?\d+) peers\)/.exec(data)?.groups?.peers; + if (!maybePeers) return; + + const peers = parseInt(maybePeers); + if (peers >= expectedPeers) { + log(`${node.name}: reached ${expectedPeers} peers`); + ok(); + } + }); +}; + +// Ensure the node has reached the expected number of finalized blocks +const finalizedBlocks = (node: Node, expectedFinalized: number, timeout = 10 * MINUTE) => { + const errorMessage = `Failed to reach ${expectedFinalized} finalized blocks in time`; + + return innerEnsure(node, errorMessage, timeout, (data, ok) => { + const maybeFinalized = /finalized #(?\d+)/.exec(data)?.groups?.blocks; + if (!maybeFinalized) return; + + const finalized = parseInt(maybeFinalized); + if (finalized >= expectedFinalized) { + log(`${node.name}: reached ${expectedFinalized} finalized blocks`); + ok(); + } + }); +}; + +// Helper function to ensure a condition is met within a timeout +function innerEnsure(node: Node, errorMessage: string, timeout: number, f: (data: string, ok: () => void) => void) { + return new Promise((resolve, reject) => { + const id = setTimeout(() => reject(new Error(errorMessage)), timeout); + + const fn = (data: string) => + f(data, () => { + clearTimeout(id); + node.process.stderr?.off("data", fn); + resolve(); + }); + + node.process.stderr?.on("data", fn); + }); +} + +const log = (message: string) => console.log(`[${new Date().toISOString()}] ${message}`); + +main(); diff --git a/.github/workflows/check-node-compat/package-lock.json b/.github/workflows/check-node-compat/package-lock.json new file mode 100644 index 0000000000..aae37d9be3 --- /dev/null +++ b/.github/workflows/check-node-compat/package-lock.json @@ -0,0 +1,1437 @@ +{ + "name": "node-compat", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "node-compat", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@polkadot/api": "^16.5.4", + "tsx": "^4.21.0" + }, + "devDependencies": { + "@types/node": "^24" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@polkadot-api/json-rpc-provider": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@polkadot-api/json-rpc-provider/-/json-rpc-provider-0.0.1.tgz", + "integrity": "sha512-/SMC/l7foRjpykLTUTacIH05H3mr9ip8b5xxfwXlVezXrNVLp3Cv0GX6uItkKd+ZjzVPf3PFrDF2B2/HLSNESA==", + "license": "MIT", + "optional": true + }, + "node_modules/@polkadot-api/json-rpc-provider-proxy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/json-rpc-provider-proxy/-/json-rpc-provider-proxy-0.1.0.tgz", + "integrity": "sha512-8GSFE5+EF73MCuLQm8tjrbCqlgclcHBSRaswvXziJ0ZW7iw3UEMsKkkKvELayWyBuOPa2T5i1nj6gFOeIsqvrg==", + "license": "MIT", + "optional": true + }, + "node_modules/@polkadot-api/metadata-builders": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@polkadot-api/metadata-builders/-/metadata-builders-0.3.2.tgz", + "integrity": "sha512-TKpfoT6vTb+513KDzMBTfCb/ORdgRnsS3TDFpOhAhZ08ikvK+hjHMt5plPiAX/OWkm1Wc9I3+K6W0hX5Ab7MVg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@polkadot-api/substrate-bindings": "0.6.0", + "@polkadot-api/utils": "0.1.0" + } + }, + "node_modules/@polkadot-api/observable-client": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@polkadot-api/observable-client/-/observable-client-0.3.2.tgz", + "integrity": "sha512-HGgqWgEutVyOBXoGOPp4+IAq6CNdK/3MfQJmhCJb8YaJiaK4W6aRGrdQuQSTPHfERHCARt9BrOmEvTXAT257Ug==", + "license": "MIT", + "optional": true, + "dependencies": { + "@polkadot-api/metadata-builders": "0.3.2", + "@polkadot-api/substrate-bindings": "0.6.0", + "@polkadot-api/utils": "0.1.0" + }, + "peerDependencies": { + "@polkadot-api/substrate-client": "0.1.4", + "rxjs": ">=7.8.0" + } + }, + "node_modules/@polkadot-api/substrate-bindings": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/substrate-bindings/-/substrate-bindings-0.6.0.tgz", + "integrity": "sha512-lGuhE74NA1/PqdN7fKFdE5C1gNYX357j1tWzdlPXI0kQ7h3kN0zfxNOpPUN7dIrPcOFZ6C0tRRVrBylXkI6xPw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@noble/hashes": "^1.3.1", + "@polkadot-api/utils": "0.1.0", + "@scure/base": "^1.1.1", + "scale-ts": "^1.6.0" + } + }, + "node_modules/@polkadot-api/utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@polkadot-api/utils/-/utils-0.1.0.tgz", + "integrity": "sha512-MXzWZeuGxKizPx2Xf/47wx9sr/uxKw39bVJUptTJdsaQn/TGq+z310mHzf1RCGvC1diHM8f593KrnDgc9oNbJA==", + "license": "MIT", + "optional": true + }, + "node_modules/@polkadot/api": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-16.5.4.tgz", + "integrity": "sha512-mX1fwtXCBAHXEyZLSnSrMDGP+jfU2rr7GfDVQBz0cBY1nmY8N34RqPWGrZWj8o4DxVu1DQ91sGncOmlBwEl0Qg==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/api-augment": "16.5.4", + "@polkadot/api-base": "16.5.4", + "@polkadot/api-derive": "16.5.4", + "@polkadot/keyring": "^14.0.1", + "@polkadot/rpc-augment": "16.5.4", + "@polkadot/rpc-core": "16.5.4", + "@polkadot/rpc-provider": "16.5.4", + "@polkadot/types": "16.5.4", + "@polkadot/types-augment": "16.5.4", + "@polkadot/types-codec": "16.5.4", + "@polkadot/types-create": "16.5.4", + "@polkadot/types-known": "16.5.4", + "@polkadot/util": "^14.0.1", + "@polkadot/util-crypto": "^14.0.1", + "eventemitter3": "^5.0.1", + "rxjs": "^7.8.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/api-augment": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-16.5.4.tgz", + "integrity": "sha512-9FTohz13ih458V2JBFjRACKHPqfM6j4bmmTbcSaE7hXcIOYzm4ABFo7xq5osLyvItganjsICErL2vRn2zULycw==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/api-base": "16.5.4", + "@polkadot/rpc-augment": "16.5.4", + "@polkadot/types": "16.5.4", + "@polkadot/types-augment": "16.5.4", + "@polkadot/types-codec": "16.5.4", + "@polkadot/util": "^14.0.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/api-base": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/api-base/-/api-base-16.5.4.tgz", + "integrity": "sha512-V69v3ieg5+91yRUCG1vFRSLr7V7MvHPvo/QrzleIUu8tPXWldJ0kyXbWKHVNZEpVBA9LpjGvII+MHUW7EaKMNg==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/rpc-core": "16.5.4", + "@polkadot/types": "16.5.4", + "@polkadot/util": "^14.0.1", + "rxjs": "^7.8.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/api-derive": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-16.5.4.tgz", + "integrity": "sha512-0JP2a6CaqTviacHsmnUKF4VLRsKdYOzQCqdL9JpwY/QBz/ZLqIKKPiSRg285EVLf8n/hWdTfxbWqQCsRa5NL+Q==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/api": "16.5.4", + "@polkadot/api-augment": "16.5.4", + "@polkadot/api-base": "16.5.4", + "@polkadot/rpc-core": "16.5.4", + "@polkadot/types": "16.5.4", + "@polkadot/types-codec": "16.5.4", + "@polkadot/util": "^14.0.1", + "@polkadot/util-crypto": "^14.0.1", + "rxjs": "^7.8.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/keyring": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-14.0.1.tgz", + "integrity": "sha512-kHydQPCeTvJrMC9VQO8LPhAhTUxzxfNF1HEknhZDBPPsxP/XpkYsEy/Ln1QzJmQqD5VsgwzLDE6cExbJ2CT9CA==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/util": "14.0.1", + "@polkadot/util-crypto": "14.0.1", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "14.0.1", + "@polkadot/util-crypto": "14.0.1" + } + }, + "node_modules/@polkadot/networks": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-14.0.1.tgz", + "integrity": "sha512-wGlBtXDkusRAj4P7uxfPz80gLO1+j99MLBaQi3bEym2xrFrFhgIWVHOZlBit/1PfaBjhX2Z8XjRxaM2w1p7w2w==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/util": "14.0.1", + "@substrate/ss58-registry": "^1.51.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/rpc-augment": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-16.5.4.tgz", + "integrity": "sha512-j9v3Ttqv/EYGezHtVksGJAFZhE/4F7LUWooOazh/53ATowMby3lZUdwInrK6bpYmG2whmYMw/Fo283fwDroBtQ==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/rpc-core": "16.5.4", + "@polkadot/types": "16.5.4", + "@polkadot/types-codec": "16.5.4", + "@polkadot/util": "^14.0.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/rpc-core": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-16.5.4.tgz", + "integrity": "sha512-92LOSTWujPjtmKOPvfCPs8rAaPFU+18wTtkIzwPwKxvxkN/SWsYSGIxmsoags9ramyHB6jp7Lr59TEuGMxIZzQ==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/rpc-augment": "16.5.4", + "@polkadot/rpc-provider": "16.5.4", + "@polkadot/types": "16.5.4", + "@polkadot/util": "^14.0.1", + "rxjs": "^7.8.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/rpc-provider": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-16.5.4.tgz", + "integrity": "sha512-mNAIBRA3jMvpnHsuqAX4InHSIqBdgxFD6ayVUFFAzOX8Fh6Xpd4RdI1dqr6a1pCzjnPSby4nbg+VuadWwauVtg==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/keyring": "^14.0.1", + "@polkadot/types": "16.5.4", + "@polkadot/types-support": "16.5.4", + "@polkadot/util": "^14.0.1", + "@polkadot/util-crypto": "^14.0.1", + "@polkadot/x-fetch": "^14.0.1", + "@polkadot/x-global": "^14.0.1", + "@polkadot/x-ws": "^14.0.1", + "eventemitter3": "^5.0.1", + "mock-socket": "^9.3.1", + "nock": "^13.5.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@substrate/connect": "0.8.11" + } + }, + "node_modules/@polkadot/types": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-16.5.4.tgz", + "integrity": "sha512-8Oo1QWaL0DkIc/n2wKBIozPWug/0b2dPVhL+XrXHxJX7rIqS0x8sXDRbM9r166sI0nTqJiUho7pRIkt2PR/DMQ==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/keyring": "^14.0.1", + "@polkadot/types-augment": "16.5.4", + "@polkadot/types-codec": "16.5.4", + "@polkadot/types-create": "16.5.4", + "@polkadot/util": "^14.0.1", + "@polkadot/util-crypto": "^14.0.1", + "rxjs": "^7.8.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/types-augment": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-16.5.4.tgz", + "integrity": "sha512-AGjXR+Q9O9UtVkGw/HuOXlbRqVpvG6H8nr+taXP71wuC6RD9gznFBFBqoNkfWHD2w89esNVQLTvXHVxlLpTXqA==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/types": "16.5.4", + "@polkadot/types-codec": "16.5.4", + "@polkadot/util": "^14.0.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/types-codec": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-16.5.4.tgz", + "integrity": "sha512-OQtT1pmJu2F3/+Vh1OiXifKoeRy+CU1+Lu7dgTcdO705dnxU4447Zup5JVCJDnxBmMITts/38vbFN2pD225AnA==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/util": "^14.0.1", + "@polkadot/x-bigint": "^14.0.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/types-create": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/types-create/-/types-create-16.5.4.tgz", + "integrity": "sha512-URQnvr/sgvgIRSxIW3lmml6HMSTRRj2hTZIm6nhMTlYSVT4rLWx0ZbYUAjoPBbaJ+BmoqZ6Bbs+tA+5cQViv5Q==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/types-codec": "16.5.4", + "@polkadot/util": "^14.0.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/types-known": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-16.5.4.tgz", + "integrity": "sha512-Dd59y4e3AFCrH9xiqMU4xlG5+Zy0OTy7GQvqJVYXZFyAH+4HYDlxXjJGcSidGAmJcclSYfS3wyEkfw+j1EOVEw==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/networks": "^14.0.1", + "@polkadot/types": "16.5.4", + "@polkadot/types-codec": "16.5.4", + "@polkadot/types-create": "16.5.4", + "@polkadot/util": "^14.0.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/types-support": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/types-support/-/types-support-16.5.4.tgz", + "integrity": "sha512-Ra6keCaO73ibxN6MzA56jFq9EReje7jjE4JQfzV5IpyDZdXcmPyJiEfa2Yps/YSP13Gc2e38t9FFyVau0V+SFQ==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/util": "^14.0.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/util": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-14.0.1.tgz", + "integrity": "sha512-764HhxkPV3x5rM0/p6QdynC2dw26n+SaE+jisjx556ViCd4E28Ke4xSPef6C0Spy4aoXf2gt0PuLEcBvd6fVZg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@polkadot/x-bigint": "14.0.1", + "@polkadot/x-global": "14.0.1", + "@polkadot/x-textdecoder": "14.0.1", + "@polkadot/x-textencoder": "14.0.1", + "@types/bn.js": "^5.1.6", + "bn.js": "^5.2.1", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/util-crypto": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-14.0.1.tgz", + "integrity": "sha512-Cu7AKUzBTsUkbOtyuNzXcTpDjR9QW0fVR56o3gBmzfUCmvO1vlsuGzmmPzqpHymQQ3rrfqV78CPs62EGhw0R+A==", + "license": "Apache-2.0", + "dependencies": { + "@noble/curves": "^1.3.0", + "@noble/hashes": "^1.3.3", + "@polkadot/networks": "14.0.1", + "@polkadot/util": "14.0.1", + "@polkadot/wasm-crypto": "^7.5.3", + "@polkadot/wasm-util": "^7.5.3", + "@polkadot/x-bigint": "14.0.1", + "@polkadot/x-randomvalues": "14.0.1", + "@scure/base": "^1.1.7", + "@scure/sr25519": "^0.2.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "14.0.1" + } + }, + "node_modules/@polkadot/wasm-bridge": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-bridge/-/wasm-bridge-7.5.4.tgz", + "integrity": "sha512-6xaJVvoZbnbgpQYXNw9OHVNWjXmtcoPcWh7hlwx3NpfiLkkjljj99YS+XGZQlq7ks2fVCg7FbfknkNb8PldDaA==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/wasm-util": "7.5.4", + "tslib": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" + } + }, + "node_modules/@polkadot/wasm-crypto": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto/-/wasm-crypto-7.5.4.tgz", + "integrity": "sha512-1seyClxa7Jd7kQjfnCzTTTfYhTa/KUTDUaD3DMHBk5Q4ZUN1D1unJgX+v1aUeXSPxmzocdZETPJJRZjhVOqg9g==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/wasm-bridge": "7.5.4", + "@polkadot/wasm-crypto-asmjs": "7.5.4", + "@polkadot/wasm-crypto-init": "7.5.4", + "@polkadot/wasm-crypto-wasm": "7.5.4", + "@polkadot/wasm-util": "7.5.4", + "tslib": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" + } + }, + "node_modules/@polkadot/wasm-crypto-asmjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-7.5.4.tgz", + "integrity": "sha512-ZYwxQHAJ8pPt6kYk9XFmyuFuSS+yirJLonvP+DYbxOrARRUHfN4nzp4zcZNXUuaFhpbDobDSFn6gYzye6BUotA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*" + } + }, + "node_modules/@polkadot/wasm-crypto-init": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-init/-/wasm-crypto-init-7.5.4.tgz", + "integrity": "sha512-U6s4Eo2rHs2n1iR01vTz/sOQ7eOnRPjaCsGWhPV+ZC/20hkVzwPAhiizu/IqMEol4tO2yiSheD4D6bn0KxUJhg==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/wasm-bridge": "7.5.4", + "@polkadot/wasm-crypto-asmjs": "7.5.4", + "@polkadot/wasm-crypto-wasm": "7.5.4", + "@polkadot/wasm-util": "7.5.4", + "tslib": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" + } + }, + "node_modules/@polkadot/wasm-crypto-wasm": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-7.5.4.tgz", + "integrity": "sha512-PsHgLsVTu43eprwSvUGnxybtOEuHPES6AbApcs7y5ZbM2PiDMzYbAjNul098xJK/CPtrxZ0ePDFnaQBmIJyTFw==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/wasm-util": "7.5.4", + "tslib": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*" + } + }, + "node_modules/@polkadot/wasm-util": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-util/-/wasm-util-7.5.4.tgz", + "integrity": "sha512-hqPpfhCpRAqCIn/CYbBluhh0TXmwkJnDRjxrU9Bnqtw9nMNa97D8JuOjdd2pi0rxm+eeLQ/f1rQMp71RMM9t4w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*" + } + }, + "node_modules/@polkadot/x-bigint": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-14.0.1.tgz", + "integrity": "sha512-gfozjGnebr2rqURs31KtaWumbW4rRZpbiluhlmai6luCNrf5u8pB+oLA35kPEntrsLk9PnIG9OsC/n4hEtx4OQ==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/x-global": "14.0.1", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/x-fetch": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-14.0.1.tgz", + "integrity": "sha512-yFsnO0xfkp3bIcvH70ZvmeUINYH1YnjOIS1B430f3w6axkqKhAOWCgzzKGMSRgn4dtm3YgwMBKPQ4nyfIsGOJQ==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/x-global": "14.0.1", + "node-fetch": "^3.3.2", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/x-global": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-14.0.1.tgz", + "integrity": "sha512-aCI44DJU4fU0XXqrrSGIpi7JrZXK2kpe0jaQ2p6oDVXOOYEnZYXnMhTTmBE1lF/xtxzX50MnZrrU87jziU0qbA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/x-randomvalues": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-14.0.1.tgz", + "integrity": "sha512-/XkQcvshzJLHITuPrN3zmQKuFIPdKWoaiHhhVLD6rQWV60lTXA3ajw3ocju8ZN7xRxnweMS9Ce0kMPYa0NhRMg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@polkadot/x-global": "14.0.1", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "14.0.1", + "@polkadot/wasm-util": "*" + } + }, + "node_modules/@polkadot/x-textdecoder": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-14.0.1.tgz", + "integrity": "sha512-CcWiPCuPVJsNk4Vq43lgFHqLRBQHb4r9RD7ZIYgmwoebES8TNm4g2ew9ToCzakFKSpzKu6I07Ne9wv/dt5zLuw==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/x-global": "14.0.1", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/x-textencoder": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-14.0.1.tgz", + "integrity": "sha512-VY51SpQmF1ccmAGLfxhYnAe95Spfz049WZ/+kK4NfsGF9WejxVdU53Im5C80l45r8qHuYQsCWU3+t0FNunh2Kg==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/x-global": "14.0.1", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polkadot/x-ws": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-14.0.1.tgz", + "integrity": "sha512-Q18hoSuOl7F4aENNGNt9XYxkrjwZlC6xye9OQrPDeHam1SrvflGv9mSZHyo+mwJs0z1PCz2STpPEN9PKfZvHng==", + "license": "Apache-2.0", + "dependencies": { + "@polkadot/x-global": "14.0.1", + "tslib": "^2.8.0", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/sr25519": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@scure/sr25519/-/sr25519-0.2.0.tgz", + "integrity": "sha512-uUuLP7Z126XdSizKtrCGqYyR3b3hYtJ6Fg/XFUXmc2//k2aXHDLqZwFeXxL97gg4XydPROPVnuaHGF2+xriSKg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.2", + "@noble/hashes": "~1.8.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@substrate/connect": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@substrate/connect/-/connect-0.8.11.tgz", + "integrity": "sha512-ofLs1PAO9AtDdPbdyTYj217Pe+lBfTLltdHDs3ds8no0BseoLeAGxpz1mHfi7zB4IxI3YyAiLjH6U8cw4pj4Nw==", + "deprecated": "versions below 1.x are no longer maintained", + "license": "GPL-3.0-only", + "optional": true, + "dependencies": { + "@substrate/connect-extension-protocol": "^2.0.0", + "@substrate/connect-known-chains": "^1.1.5", + "@substrate/light-client-extension-helpers": "^1.0.0", + "smoldot": "2.0.26" + } + }, + "node_modules/@substrate/connect-extension-protocol": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@substrate/connect-extension-protocol/-/connect-extension-protocol-2.2.2.tgz", + "integrity": "sha512-t66jwrXA0s5Goq82ZtjagLNd7DPGCNjHeehRlE/gcJmJ+G56C0W+2plqOMRicJ8XGR1/YFnUSEqUFiSNbjGrAA==", + "license": "GPL-3.0-only", + "optional": true + }, + "node_modules/@substrate/connect-known-chains": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@substrate/connect-known-chains/-/connect-known-chains-1.10.3.tgz", + "integrity": "sha512-OJEZO1Pagtb6bNE3wCikc2wrmvEU5x7GxFFLqqbz1AJYYxSlrPCGu4N2og5YTExo4IcloNMQYFRkBGue0BKZ4w==", + "license": "GPL-3.0-only", + "optional": true + }, + "node_modules/@substrate/light-client-extension-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@substrate/light-client-extension-helpers/-/light-client-extension-helpers-1.0.0.tgz", + "integrity": "sha512-TdKlni1mBBZptOaeVrKnusMg/UBpWUORNDv5fdCaJklP4RJiFOzBCrzC+CyVI5kQzsXBisZ+2pXm+rIjS38kHg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@polkadot-api/json-rpc-provider": "^0.0.1", + "@polkadot-api/json-rpc-provider-proxy": "^0.1.0", + "@polkadot-api/observable-client": "^0.3.0", + "@polkadot-api/substrate-client": "^0.1.2", + "@substrate/connect-extension-protocol": "^2.0.0", + "@substrate/connect-known-chains": "^1.1.5", + "rxjs": "^7.8.1" + }, + "peerDependencies": { + "smoldot": "2.x" + } + }, + "node_modules/@substrate/ss58-registry": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.51.0.tgz", + "integrity": "sha512-TWDurLiPxndFgKjVavCniytBIw+t4ViOi7TYp9h/D0NMmkEc9klFTo+827eyEJ0lELpqO207Ey7uGxUa+BS1jQ==", + "license": "Apache-2.0" + }, + "node_modules/@types/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "24.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.9.tgz", + "integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/bn.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", + "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", + "license": "MIT" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, + "node_modules/mock-socket": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.3.1.tgz", + "integrity": "sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nock": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.6.tgz", + "integrity": "sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" + }, + "engines": { + "node": ">= 10.13" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/scale-ts": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/scale-ts/-/scale-ts-1.6.1.tgz", + "integrity": "sha512-PBMc2AWc6wSEqJYBDPcyCLUj9/tMKnLX70jLOSndMtcUoLQucP/DM0vnQo1wJAYjTrQiq8iG9rD0q6wFzgjH7g==", + "license": "MIT", + "optional": true + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/.github/workflows/check-node-compat/package.json b/.github/workflows/check-node-compat/package.json new file mode 100644 index 0000000000..5a78939bd8 --- /dev/null +++ b/.github/workflows/check-node-compat/package.json @@ -0,0 +1,21 @@ +{ + "name": "node-compat", + "version": "1.0.0", + "type": "commonjs", + "license": "ISC", + "scripts": { + "test": "tsx main.ts" + }, + "dependencies": { + "@polkadot/api": "^16.5.4", + "tsx": "^4.21.0" + }, + "devDependencies": { + "@types/node": "^24" + }, + "prettier": { + "singleQuote": false, + "trailingComma": "all", + "printWidth": 120 + } +} diff --git a/.github/workflows/check-node-compat/tsconfig.json b/.github/workflows/check-node-compat/tsconfig.json new file mode 100644 index 0000000000..b4cbbb843b --- /dev/null +++ b/.github/workflows/check-node-compat/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true, + "types": ["node"] + } +} From d9634ef831707f05a9e7af47eeeb48e7c39fd67c Mon Sep 17 00:00:00 2001 From: John Reed <87283488+JohnReedV@users.noreply.github.com> Date: Mon, 19 Jan 2026 10:41:49 -0800 Subject: [PATCH 65/70] update dependency for transaction replacement env --- Cargo.lock | 820 ++++++++++++++++++++++++++--------------------------- Cargo.toml | 428 ++++++++++++++-------------- 2 files changed, 624 insertions(+), 624 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c9ba8aede2..3e93e6db44 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1056,7 +1056,7 @@ checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" [[package]] name = "assets-common" version = "0.22.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-primitives-core", "ethereum-standards", @@ -1435,7 +1435,7 @@ checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "binary-merkle-tree" version = "16.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "hash-db", "log", @@ -1704,7 +1704,7 @@ dependencies = [ [[package]] name = "bp-header-chain" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bp-runtime", "finality-grandpa", @@ -1721,7 +1721,7 @@ dependencies = [ [[package]] name = "bp-messages" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bp-header-chain", "bp-runtime", @@ -1737,7 +1737,7 @@ dependencies = [ [[package]] name = "bp-parachains" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bp-header-chain", "bp-polkadot-core", @@ -1754,7 +1754,7 @@ dependencies = [ [[package]] name = "bp-polkadot-core" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bp-messages", "bp-runtime", @@ -1770,7 +1770,7 @@ dependencies = [ [[package]] name = "bp-relayers" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bp-header-chain", "bp-messages", @@ -1788,7 +1788,7 @@ dependencies = [ [[package]] name = "bp-runtime" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -1811,7 +1811,7 @@ dependencies = [ [[package]] name = "bp-test-utils" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bp-header-chain", "bp-parachains", @@ -1831,7 +1831,7 @@ dependencies = [ [[package]] name = "bp-xcm-bridge-hub" version = "0.7.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bp-messages", "bp-runtime", @@ -1848,7 +1848,7 @@ dependencies = [ [[package]] name = "bp-xcm-bridge-hub-router" version = "0.18.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "scale-info", @@ -1860,7 +1860,7 @@ dependencies = [ [[package]] name = "bridge-hub-common" version = "0.14.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -1879,7 +1879,7 @@ dependencies = [ [[package]] name = "bridge-runtime-common" version = "0.22.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bp-header-chain", "bp-messages", @@ -2711,7 +2711,7 @@ dependencies = [ [[package]] name = "cumulus-client-bootnodes" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "async-channel 1.9.0", @@ -2737,7 +2737,7 @@ dependencies = [ [[package]] name = "cumulus-client-cli" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "clap", "parity-scale-codec", @@ -2754,7 +2754,7 @@ dependencies = [ [[package]] name = "cumulus-client-collator" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-client-consensus-common", "cumulus-client-network", @@ -2777,7 +2777,7 @@ dependencies = [ [[package]] name = "cumulus-client-consensus-aura" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "cumulus-client-collator", @@ -2824,7 +2824,7 @@ dependencies = [ [[package]] name = "cumulus-client-consensus-common" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "cumulus-client-pov-recovery", @@ -2856,7 +2856,7 @@ dependencies = [ [[package]] name = "cumulus-client-consensus-proposer" version = "0.20.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "anyhow", "async-trait", @@ -2871,7 +2871,7 @@ dependencies = [ [[package]] name = "cumulus-client-consensus-relay-chain" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "cumulus-client-consensus-common", @@ -2894,7 +2894,7 @@ dependencies = [ [[package]] name = "cumulus-client-network" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "cumulus-relay-chain-interface", @@ -2921,7 +2921,7 @@ dependencies = [ [[package]] name = "cumulus-client-parachain-inherent" version = "0.18.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -2931,7 +2931,7 @@ dependencies = [ "parity-scale-codec", "sc-client-api", "sc-consensus-babe", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "sp-inherents", "sp-runtime", "sp-state-machine", @@ -2942,7 +2942,7 @@ dependencies = [ [[package]] name = "cumulus-client-pov-recovery" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -2970,7 +2970,7 @@ dependencies = [ [[package]] name = "cumulus-client-service" version = "0.25.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-channel 1.9.0", "cumulus-client-cli", @@ -3010,7 +3010,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-aura-ext" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-pallet-parachain-system", "frame-support", @@ -3027,7 +3027,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-dmp-queue" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-primitives-core", "frame-benchmarking", @@ -3044,7 +3044,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-parachain-system" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bytes", "cumulus-pallet-parachain-system-proc-macro", @@ -3081,7 +3081,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-parachain-system-proc-macro" version = "0.6.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", @@ -3092,7 +3092,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-session-benchmarking" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -3105,7 +3105,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-solo-to-para" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-pallet-parachain-system", "frame-support", @@ -3120,7 +3120,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-weight-reclaim" version = "0.3.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-primitives-storage-weight-reclaim", "derive-where", @@ -3139,7 +3139,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-xcm" version = "0.20.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -3154,7 +3154,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-xcmp-queue" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "approx", "bounded-collections 0.2.4", @@ -3179,7 +3179,7 @@ dependencies = [ [[package]] name = "cumulus-ping" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-pallet-xcm", "cumulus-primitives-core", @@ -3194,7 +3194,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-aura" version = "0.18.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "sp-api", "sp-consensus-aura", @@ -3203,7 +3203,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-core" version = "0.19.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "polkadot-core-primitives", @@ -3220,7 +3220,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-parachain-inherent" version = "0.19.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -3234,7 +3234,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-proof-size-hostfunction" version = "0.13.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "sp-externalities", "sp-runtime-interface", @@ -3244,7 +3244,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-storage-weight-reclaim" version = "12.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-primitives-core", "cumulus-primitives-proof-size-hostfunction", @@ -3261,7 +3261,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-utility" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -3278,7 +3278,7 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-inprocess-interface" version = "0.25.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-channel 1.9.0", "async-trait", @@ -3306,7 +3306,7 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-interface" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -3326,7 +3326,7 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-minimal-node" version = "0.25.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "async-channel 1.9.0", @@ -3362,7 +3362,7 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-rpc-interface" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-streams" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-relay-chain-interface", "futures", @@ -3417,7 +3417,7 @@ dependencies = [ [[package]] name = "cumulus-test-relay-sproof-builder" version = "0.20.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-primitives-core", "parity-scale-codec", @@ -4198,7 +4198,7 @@ dependencies = [ [[package]] name = "ethereum-standards" version = "0.1.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "alloy-core", ] @@ -4415,7 +4415,7 @@ dependencies = [ [[package]] name = "fc-api" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "async-trait", "fp-storage", @@ -4427,7 +4427,7 @@ dependencies = [ [[package]] name = "fc-aura" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "fc-rpc", "fp-storage", @@ -4443,7 +4443,7 @@ dependencies = [ [[package]] name = "fc-babe" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "fc-rpc", "sc-client-api", @@ -4459,7 +4459,7 @@ dependencies = [ [[package]] name = "fc-consensus" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "async-trait", "fp-consensus", @@ -4475,7 +4475,7 @@ dependencies = [ [[package]] name = "fc-db" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "async-trait", "ethereum", @@ -4505,7 +4505,7 @@ dependencies = [ [[package]] name = "fc-mapping-sync" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "fc-db", "fc-storage", @@ -4528,7 +4528,7 @@ dependencies = [ [[package]] name = "fc-rpc" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "ethereum", "ethereum-types", @@ -4579,7 +4579,7 @@ dependencies = [ [[package]] name = "fc-rpc-core" version = "1.1.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "ethereum", "ethereum-types", @@ -4588,13 +4588,13 @@ dependencies = [ "rustc-hex", "serde", "serde_json", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", ] [[package]] name = "fc-storage" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "ethereum", "ethereum-types", @@ -4759,7 +4759,7 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "fork-tree" version = "13.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", ] @@ -4786,7 +4786,7 @@ dependencies = [ [[package]] name = "fp-account" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "hex", "impl-serde", @@ -4804,7 +4804,7 @@ dependencies = [ [[package]] name = "fp-consensus" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "ethereum", "parity-scale-codec", @@ -4815,7 +4815,7 @@ dependencies = [ [[package]] name = "fp-ethereum" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "ethereum", "ethereum-types", @@ -4827,7 +4827,7 @@ dependencies = [ [[package]] name = "fp-evm" version = "3.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "environmental", "evm", @@ -4843,7 +4843,7 @@ dependencies = [ [[package]] name = "fp-rpc" version = "3.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "ethereum", "ethereum-types", @@ -4859,7 +4859,7 @@ dependencies = [ [[package]] name = "fp-self-contained" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "frame-support", "parity-scale-codec", @@ -4871,7 +4871,7 @@ dependencies = [ [[package]] name = "fp-storage" version = "2.0.0" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "parity-scale-codec", "serde", @@ -4886,7 +4886,7 @@ checksum = "28dd6caf6059519a65843af8fe2a3ae298b14b80179855aeb4adc2c1934ee619" [[package]] name = "frame-benchmarking" version = "41.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-support-procedural", @@ -4910,7 +4910,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "49.1.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "Inflector", "array-bytes 6.2.3", @@ -4975,7 +4975,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-pallet-pov" version = "31.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -5003,7 +5003,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "16.1.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", @@ -5014,7 +5014,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -5031,7 +5031,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "41.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "aquamarine", "frame-support", @@ -5084,7 +5084,7 @@ dependencies = [ [[package]] name = "frame-metadata-hash-extension" version = "0.9.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "const-hex", @@ -5100,7 +5100,7 @@ dependencies = [ [[package]] name = "frame-storage-access-test-runtime" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-pallet-parachain-system", "parity-scale-codec", @@ -5114,7 +5114,7 @@ dependencies = [ [[package]] name = "frame-support" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "aquamarine", "array-bytes 6.2.3", @@ -5155,7 +5155,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "34.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "Inflector", "cfg-expr", @@ -5168,7 +5168,7 @@ dependencies = [ "proc-macro-warning", "proc-macro2", "quote", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "syn 2.0.106", ] @@ -5188,7 +5188,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "13.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support-procedural-tools-derive 12.0.0", "proc-macro-crate 3.4.0", @@ -5211,7 +5211,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "12.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "proc-macro2", "quote", @@ -5221,7 +5221,7 @@ dependencies = [ [[package]] name = "frame-system" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cfg-if", "docify", @@ -5240,7 +5240,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -5254,7 +5254,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "parity-scale-codec", @@ -5264,7 +5264,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.47.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "parity-scale-codec", @@ -7821,7 +7821,7 @@ dependencies = [ [[package]] name = "mmr-gadget" version = "46.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "futures", "log", @@ -7840,7 +7840,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -8789,7 +8789,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "frame-benchmarking", @@ -8801,7 +8801,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "sp-io", "sp-runtime", ] @@ -8809,7 +8809,7 @@ dependencies = [ [[package]] name = "pallet-asset-conversion" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -8827,7 +8827,7 @@ dependencies = [ [[package]] name = "pallet-asset-conversion-ops" version = "0.9.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -8845,7 +8845,7 @@ dependencies = [ [[package]] name = "pallet-asset-conversion-tx-payment" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -8860,7 +8860,7 @@ dependencies = [ [[package]] name = "pallet-asset-rate" version = "20.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -8874,7 +8874,7 @@ dependencies = [ [[package]] name = "pallet-asset-rewards" version = "0.3.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -8892,7 +8892,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -8908,7 +8908,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "43.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "ethereum-standards", "frame-benchmarking", @@ -8926,7 +8926,7 @@ dependencies = [ [[package]] name = "pallet-assets-freezer" version = "0.8.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "log", "pallet-assets", @@ -8938,7 +8938,7 @@ dependencies = [ [[package]] name = "pallet-assets-holder" version = "0.3.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -8953,7 +8953,7 @@ dependencies = [ [[package]] name = "pallet-atomic-swap" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "polkadot-sdk-frame", @@ -8963,7 +8963,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -8979,7 +8979,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -8994,7 +8994,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -9007,7 +9007,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9030,7 +9030,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "aquamarine", "docify", @@ -9051,7 +9051,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "42.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "frame-benchmarking", @@ -9067,7 +9067,7 @@ dependencies = [ [[package]] name = "pallet-base-fee" version = "1.0.0" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "fp-evm", "frame-support", @@ -9081,7 +9081,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "42.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -9100,7 +9100,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "42.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "binary-merkle-tree", @@ -9125,7 +9125,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9142,7 +9142,7 @@ dependencies = [ [[package]] name = "pallet-bridge-grandpa" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bp-header-chain", "bp-runtime", @@ -9161,7 +9161,7 @@ dependencies = [ [[package]] name = "pallet-bridge-messages" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bp-header-chain", "bp-messages", @@ -9180,7 +9180,7 @@ dependencies = [ [[package]] name = "pallet-bridge-parachains" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bp-header-chain", "bp-parachains", @@ -9200,7 +9200,7 @@ dependencies = [ [[package]] name = "pallet-bridge-relayers" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bp-header-chain", "bp-messages", @@ -9223,7 +9223,7 @@ dependencies = [ [[package]] name = "pallet-broker" version = "0.20.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bitvec", "frame-benchmarking", @@ -9241,7 +9241,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9259,7 +9259,7 @@ dependencies = [ [[package]] name = "pallet-collator-selection" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9278,7 +9278,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "frame-benchmarking", @@ -9295,7 +9295,7 @@ dependencies = [ [[package]] name = "pallet-collective-content" version = "0.19.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9367,7 +9367,7 @@ dependencies = [ [[package]] name = "pallet-contracts" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "environmental", "frame-benchmarking", @@ -9376,8 +9376,8 @@ dependencies = [ "impl-trait-for-tuples", "log", "pallet-balances", - "pallet-contracts-proc-macro 23.0.3 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", - "pallet-contracts-uapi 14.0.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "pallet-contracts-proc-macro 23.0.3 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", + "pallet-contracts-uapi 14.0.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "parity-scale-codec", "paste", "rand 0.8.5", @@ -9398,14 +9398,14 @@ dependencies = [ [[package]] name = "pallet-contracts-mock-network" version = "18.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", "pallet-assets", "pallet-balances", "pallet-contracts 41.0.0", - "pallet-contracts-uapi 14.0.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "pallet-contracts-uapi 14.0.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "pallet-message-queue", "pallet-timestamp", "pallet-xcm", @@ -9439,7 +9439,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "23.0.3" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "proc-macro2", "quote", @@ -9460,7 +9460,7 @@ dependencies = [ [[package]] name = "pallet-contracts-uapi" version = "14.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -9471,7 +9471,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "assert_matches", "frame-benchmarking", @@ -9487,7 +9487,7 @@ dependencies = [ [[package]] name = "pallet-core-fellowship" version = "25.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9524,7 +9524,7 @@ dependencies = [ [[package]] name = "pallet-delegated-staking" version = "8.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -9539,7 +9539,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9556,7 +9556,7 @@ dependencies = [ [[package]] name = "pallet-dev-mode" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -9605,7 +9605,7 @@ dependencies = [ [[package]] name = "pallet-dummy-dim" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9623,7 +9623,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-block" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -9644,7 +9644,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -9665,7 +9665,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -9678,7 +9678,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "42.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9696,7 +9696,7 @@ dependencies = [ [[package]] name = "pallet-ethereum" version = "4.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "ethereum", "ethereum-types", @@ -9719,7 +9719,7 @@ dependencies = [ [[package]] name = "pallet-evm" version = "6.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "cumulus-primitives-storage-weight-reclaim", "environmental", @@ -9744,7 +9744,7 @@ dependencies = [ [[package]] name = "pallet-evm-chain-id" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "frame-support", "frame-system", @@ -9755,7 +9755,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-bn128" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "fp-evm", "sp-core", @@ -9765,7 +9765,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-dispatch" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "fp-evm", "frame-support", @@ -9777,7 +9777,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-modexp" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "fp-evm", "num", @@ -9786,7 +9786,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-sha3fips" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "fp-evm", "tiny-keccak", @@ -9795,7 +9795,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-simple" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "fp-evm", "ripemd", @@ -9805,7 +9805,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "frame-benchmarking", @@ -9823,7 +9823,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "27.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "blake2 0.10.6", "frame-benchmarking", @@ -9841,7 +9841,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9863,7 +9863,7 @@ dependencies = [ [[package]] name = "pallet-hotfix-sufficients" version = "1.0.0" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9878,7 +9878,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "enumflags2", "frame-benchmarking", @@ -9894,7 +9894,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9913,7 +9913,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9928,7 +9928,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "29.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "polkadot-sdk-frame", @@ -9939,7 +9939,7 @@ dependencies = [ [[package]] name = "pallet-lottery" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9952,7 +9952,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -9968,7 +9968,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "44.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "environmental", "frame-benchmarking", @@ -9987,7 +9987,7 @@ dependencies = [ [[package]] name = "pallet-meta-tx" version = "0.3.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "frame-benchmarking", @@ -10005,7 +10005,7 @@ dependencies = [ [[package]] name = "pallet-migrations" version = "11.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "frame-benchmarking", @@ -10024,7 +10024,7 @@ dependencies = [ [[package]] name = "pallet-mixnet" version = "0.17.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "log", "parity-scale-codec", @@ -10038,7 +10038,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "log", "parity-scale-codec", @@ -10050,7 +10050,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "log", "parity-scale-codec", @@ -10061,7 +10061,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "log", "pallet-assets", @@ -10074,7 +10074,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "35.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "enumflags2", "frame-benchmarking", @@ -10091,7 +10091,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "polkadot-sdk-frame", @@ -10101,7 +10101,7 @@ dependencies = [ [[package]] name = "pallet-node-authorization" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "log", "parity-scale-codec", @@ -10112,7 +10112,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "39.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -10130,7 +10130,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "39.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -10150,7 +10150,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -10160,7 +10160,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -10175,7 +10175,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -10198,7 +10198,7 @@ dependencies = [ [[package]] name = "pallet-origin-restriction" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -10216,7 +10216,7 @@ dependencies = [ [[package]] name = "pallet-paged-list" version = "0.19.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "parity-scale-codec", @@ -10227,7 +10227,7 @@ dependencies = [ [[package]] name = "pallet-parameters" version = "0.12.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "frame-benchmarking", @@ -10244,7 +10244,7 @@ dependencies = [ [[package]] name = "pallet-people" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -10262,7 +10262,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -10278,7 +10278,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "polkadot-sdk-frame", @@ -10288,7 +10288,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -10306,7 +10306,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "polkadot-sdk-frame", @@ -10316,7 +10316,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "assert_matches", "frame-benchmarking", @@ -10351,7 +10351,7 @@ dependencies = [ [[package]] name = "pallet-remark" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -10366,7 +10366,7 @@ dependencies = [ [[package]] name = "pallet-revive" version = "0.7.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "alloy-core", "derive_more 0.99.20", @@ -10412,7 +10412,7 @@ dependencies = [ [[package]] name = "pallet-revive-fixtures" version = "0.4.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "anyhow", "cargo_metadata", @@ -10426,7 +10426,7 @@ dependencies = [ [[package]] name = "pallet-revive-proc-macro" version = "0.3.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "proc-macro2", "quote", @@ -10436,7 +10436,7 @@ dependencies = [ [[package]] name = "pallet-revive-uapi" version = "0.5.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bitflags 1.3.2", "pallet-revive-proc-macro", @@ -10448,7 +10448,7 @@ dependencies = [ [[package]] name = "pallet-root-offences" version = "38.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -10464,7 +10464,7 @@ dependencies = [ [[package]] name = "pallet-root-testing" version = "17.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -10477,7 +10477,7 @@ dependencies = [ [[package]] name = "pallet-safe-mode" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "pallet-balances", @@ -10491,7 +10491,7 @@ dependencies = [ [[package]] name = "pallet-salary" version = "26.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "log", "pallet-ranked-collective", @@ -10503,7 +10503,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "42.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "frame-benchmarking", @@ -10520,7 +10520,7 @@ dependencies = [ [[package]] name = "pallet-scored-pool" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -10533,7 +10533,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -10554,7 +10554,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -10590,7 +10590,7 @@ dependencies = [ [[package]] name = "pallet-skip-feeless-payment" version = "16.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -10602,7 +10602,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -10619,7 +10619,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -10641,7 +10641,7 @@ dependencies = [ [[package]] name = "pallet-staking-async" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -10664,7 +10664,7 @@ dependencies = [ [[package]] name = "pallet-staking-async-ah-client" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -10683,7 +10683,7 @@ dependencies = [ [[package]] name = "pallet-staking-async-rc-client" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -10700,7 +10700,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "12.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", @@ -10711,7 +10711,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "log", "sp-arithmetic", @@ -10720,7 +10720,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "27.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "sp-api", @@ -10730,7 +10730,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "46.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -10746,7 +10746,7 @@ dependencies = [ [[package]] name = "pallet-statement" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", @@ -10901,7 +10901,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "frame-benchmarking", @@ -10916,7 +10916,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "frame-benchmarking", @@ -10934,7 +10934,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -10952,7 +10952,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -10967,7 +10967,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "44.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -10983,7 +10983,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -10995,7 +10995,7 @@ dependencies = [ [[package]] name = "pallet-transaction-storage" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "frame-benchmarking", @@ -11014,7 +11014,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "frame-benchmarking", @@ -11033,7 +11033,7 @@ dependencies = [ [[package]] name = "pallet-tx-pause" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "parity-scale-codec", @@ -11044,7 +11044,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -11058,7 +11058,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -11073,7 +11073,7 @@ dependencies = [ [[package]] name = "pallet-verify-signature" version = "0.4.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -11088,7 +11088,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -11102,7 +11102,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "polkadot-sdk-frame", @@ -11112,7 +11112,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "20.1.3" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bounded-collections 0.2.4", "frame-benchmarking", @@ -11138,7 +11138,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "21.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-benchmarking", "frame-support", @@ -11155,7 +11155,7 @@ dependencies = [ [[package]] name = "pallet-xcm-bridge-hub" version = "0.17.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bp-messages", "bp-runtime", @@ -11177,7 +11177,7 @@ dependencies = [ [[package]] name = "pallet-xcm-bridge-hub-router" version = "0.19.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bp-xcm-bridge-hub-router", "frame-benchmarking", @@ -11197,7 +11197,7 @@ dependencies = [ [[package]] name = "parachains-common" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-primitives-core", "cumulus-primitives-utility", @@ -11536,7 +11536,7 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "polkadot-approval-distribution" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "futures", "futures-timer", @@ -11554,7 +11554,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "futures", "futures-timer", @@ -11569,7 +11569,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "fatality", "futures", @@ -11592,7 +11592,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "fatality", @@ -11625,7 +11625,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "25.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "clap", "frame-benchmarking-cli", @@ -11649,7 +11649,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bitvec", "fatality", @@ -11672,7 +11672,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "18.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "scale-info", @@ -11683,7 +11683,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "fatality", "futures", @@ -11705,7 +11705,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "20.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -11719,7 +11719,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "24.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "futures", "futures-timer", @@ -11732,7 +11732,7 @@ dependencies = [ "sc-network", "sp-application-crypto", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "sp-keystore", "tracing-gum", ] @@ -11740,7 +11740,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "always-assert", "async-trait", @@ -11763,7 +11763,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "futures", "parity-scale-codec", @@ -11781,7 +11781,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "bitvec", @@ -11813,7 +11813,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting-parallel" version = "0.7.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "futures", @@ -11837,7 +11837,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bitvec", "futures", @@ -11856,7 +11856,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bitvec", "fatality", @@ -11877,7 +11877,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "futures", "polkadot-node-subsystem", @@ -11892,7 +11892,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "futures", @@ -11914,7 +11914,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "futures", "polkadot-node-metrics", @@ -11928,7 +11928,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "futures", "futures-timer", @@ -11944,7 +11944,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "fatality", "futures", @@ -11962,7 +11962,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "futures", @@ -11979,7 +11979,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-prospective-parachains" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "fatality", "futures", @@ -11993,7 +11993,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bitvec", "fatality", @@ -12010,7 +12010,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "always-assert", "array-bytes 6.2.3", @@ -12038,7 +12038,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "futures", "polkadot-node-subsystem", @@ -12051,7 +12051,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-common" version = "20.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cpu-time", "futures", @@ -12066,7 +12066,7 @@ dependencies = [ "sc-executor-wasmtime", "seccompiler", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "sp-externalities", "sp-io", "sp-tracing", @@ -12077,7 +12077,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "futures", "polkadot-node-metrics", @@ -12092,7 +12092,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bs58", "futures", @@ -12109,7 +12109,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-channel 1.9.0", "async-trait", @@ -12134,7 +12134,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "20.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bitvec", "bounded-vec", @@ -12158,7 +12158,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "polkadot-node-subsystem-types", "polkadot-overseer", @@ -12167,7 +12167,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "derive_more 0.99.20", @@ -12195,7 +12195,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "24.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "fatality", "futures", @@ -12226,7 +12226,7 @@ dependencies = [ [[package]] name = "polkadot-omni-node-lib" version = "0.7.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "clap", @@ -12312,7 +12312,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "futures", @@ -12332,7 +12332,7 @@ dependencies = [ [[package]] name = "polkadot-parachain-primitives" version = "17.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bounded-collections 0.2.4", "derive_more 0.99.20", @@ -12348,7 +12348,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "19.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bitvec", "bounded-collections 0.2.4", @@ -12377,7 +12377,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "25.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -12410,7 +12410,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "20.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bitvec", "frame-benchmarking", @@ -12460,7 +12460,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "21.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bs58", "frame-benchmarking", @@ -12472,7 +12472,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "20.0.2" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bitflags 1.3.2", "bitvec", @@ -12520,7 +12520,7 @@ dependencies = [ [[package]] name = "polkadot-sdk" version = "2506.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "assets-common", "bridge-hub-common", @@ -12678,7 +12678,7 @@ dependencies = [ [[package]] name = "polkadot-sdk-frame" version = "0.10.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "frame-benchmarking", @@ -12713,7 +12713,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "25.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "frame-benchmarking", @@ -12821,7 +12821,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bitvec", "fatality", @@ -12841,7 +12841,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "20.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -13114,7 +13114,7 @@ dependencies = [ [[package]] name = "precompile-utils" version = "0.1.0" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "environmental", "evm", @@ -13138,14 +13138,14 @@ dependencies = [ [[package]] name = "precompile-utils-macro" version = "0.1.0" -source = "git+https://github.com/opentensor/frontier?rev=e31d47f83a64c361ecf0fd02bf567de6db9bda43#e31d47f83a64c361ecf0fd02bf567de6db9bda43" +source = "git+https://github.com/opentensor/frontier?rev=7c93fd974ad70faec1c1c4b87ab23874f365f27a#7c93fd974ad70faec1c1c4b87ab23874f365f27a" dependencies = [ "case", "num_enum", "prettyplease", "proc-macro2", "quote", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "syn 2.0.106", ] @@ -13327,7 +13327,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "syn 2.0.106", ] @@ -13957,7 +13957,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "24.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "binary-merkle-tree", "bitvec", @@ -14055,7 +14055,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "21.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "polkadot-primitives", @@ -14451,7 +14451,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "32.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "log", "sp-core", @@ -14462,7 +14462,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.51.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "futures", @@ -14493,7 +14493,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "futures", "log", @@ -14514,7 +14514,7 @@ dependencies = [ [[package]] name = "sc-block-builder" version = "0.45.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "sp-api", @@ -14529,7 +14529,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "44.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "clap", @@ -14545,7 +14545,7 @@ dependencies = [ "serde_json", "sp-blockchain", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "sp-genesis-builder", "sp-io", "sp-runtime", @@ -14556,7 +14556,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "12.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", @@ -14567,7 +14567,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.53.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "chrono", @@ -14609,7 +14609,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "fnv", "futures", @@ -14635,7 +14635,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.47.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "hash-db", "kvdb", @@ -14663,7 +14663,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "futures", @@ -14686,7 +14686,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.51.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "futures", @@ -14715,7 +14715,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.51.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "fork-tree", @@ -14740,7 +14740,7 @@ dependencies = [ "sp-consensus-babe", "sp-consensus-slots", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "sp-inherents", "sp-keystore", "sp-runtime", @@ -14751,7 +14751,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.51.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "futures", "jsonrpsee", @@ -14773,7 +14773,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "30.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "async-channel 1.9.0", @@ -14807,7 +14807,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "30.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "futures", "jsonrpsee", @@ -14827,7 +14827,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "fork-tree", "parity-scale-codec", @@ -14840,7 +14840,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.36.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "ahash", "array-bytes 6.2.3", @@ -14874,7 +14874,7 @@ dependencies = [ "sp-consensus", "sp-consensus-grandpa", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "sp-keystore", "sp-runtime", "substrate-prometheus-endpoint", @@ -14884,7 +14884,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.36.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "finality-grandpa", "futures", @@ -14904,7 +14904,7 @@ dependencies = [ [[package]] name = "sc-consensus-manual-seal" version = "0.52.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "assert_matches", "async-trait", @@ -14939,7 +14939,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "futures", @@ -14962,7 +14962,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.43.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "parking_lot 0.12.5", @@ -14985,7 +14985,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.39.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "polkavm 0.24.0", "sc-allocator", @@ -14998,7 +14998,7 @@ dependencies = [ [[package]] name = "sc-executor-polkavm" version = "0.36.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "log", "polkavm 0.24.0", @@ -15009,7 +15009,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.39.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "anyhow", "log", @@ -15025,7 +15025,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "console", "futures", @@ -15041,7 +15041,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "36.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "parking_lot 0.12.5", @@ -15055,7 +15055,7 @@ dependencies = [ [[package]] name = "sc-mixnet" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "arrayvec 0.7.6", @@ -15083,7 +15083,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.51.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "async-channel 1.9.0", @@ -15133,7 +15133,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.49.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -15143,7 +15143,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.51.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "ahash", "futures", @@ -15162,7 +15162,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "async-channel 1.9.0", @@ -15183,7 +15183,7 @@ dependencies = [ [[package]] name = "sc-network-statement" version = "0.33.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "async-channel 1.9.0", @@ -15203,7 +15203,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "async-channel 1.9.0", @@ -15238,7 +15238,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "futures", @@ -15257,7 +15257,7 @@ dependencies = [ [[package]] name = "sc-network-types" version = "0.17.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bs58", "bytes", @@ -15278,7 +15278,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "46.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bytes", "fnv", @@ -15312,7 +15312,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.20.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -15321,7 +15321,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "46.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "futures", "jsonrpsee", @@ -15353,7 +15353,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -15373,7 +15373,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "dyn-clone", "forwarded-header-value", @@ -15397,7 +15397,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.51.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "futures", @@ -15430,13 +15430,13 @@ dependencies = [ [[package]] name = "sc-runtime-utilities" version = "0.3.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "sc-executor", "sc-executor-common", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "sp-state-machine", "sp-wasm-interface", "thiserror 1.0.69", @@ -15445,7 +15445,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.52.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "directories", @@ -15509,7 +15509,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.39.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "log", "parity-scale-codec", @@ -15520,7 +15520,7 @@ dependencies = [ [[package]] name = "sc-statement-store" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "log", "parity-db", @@ -15539,7 +15539,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.25.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "clap", "fs4", @@ -15552,7 +15552,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.51.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -15571,7 +15571,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "43.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "derive_more 0.99.20", "futures", @@ -15584,14 +15584,14 @@ dependencies = [ "serde", "serde_json", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "sp-io", ] [[package]] name = "sc-telemetry" version = "29.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "chrono", "futures", @@ -15610,7 +15610,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "chrono", "console", @@ -15638,7 +15638,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "11.1.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", @@ -15649,7 +15649,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "40.1.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "futures", @@ -15666,7 +15666,7 @@ dependencies = [ "sp-api", "sp-blockchain", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "sp-runtime", "sp-tracing", "sp-transaction-pool", @@ -15680,7 +15680,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "futures", @@ -15697,7 +15697,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "19.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-channel 1.9.0", "futures", @@ -16395,7 +16395,7 @@ checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" [[package]] name = "slot-range-helper" version = "18.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "enumn", "parity-scale-codec", @@ -16658,7 +16658,7 @@ dependencies = [ [[package]] name = "snowbridge-core" version = "0.14.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bp-relayers", "frame-support", @@ -16742,7 +16742,7 @@ dependencies = [ [[package]] name = "sp-api" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "hash-db", @@ -16764,7 +16764,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "Inflector", "blake2 0.10.6", @@ -16778,7 +16778,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "scale-info", @@ -16790,7 +16790,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "27.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "integer-sqrt", @@ -16804,7 +16804,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "scale-info", @@ -16816,7 +16816,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "sp-api", "sp-inherents", @@ -16826,7 +16826,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "futures", "parity-scale-codec", @@ -16845,7 +16845,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.43.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "futures", @@ -16859,7 +16859,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.43.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "parity-scale-codec", @@ -16875,7 +16875,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.43.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "parity-scale-codec", @@ -16893,7 +16893,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "25.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "scale-info", @@ -16901,7 +16901,7 @@ dependencies = [ "sp-api", "sp-application-crypto", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "sp-io", "sp-keystore", "sp-mmr-primitives", @@ -16913,7 +16913,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "finality-grandpa", "log", @@ -16930,7 +16930,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.43.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "scale-info", @@ -16941,7 +16941,7 @@ dependencies = [ [[package]] name = "sp-core" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "ark-vrf", "array-bytes 6.2.3", @@ -16972,7 +16972,7 @@ dependencies = [ "secrecy 0.8.0", "serde", "sha2 0.10.9", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "sp-debug-derive", "sp-externalities", "sp-runtime-interface", @@ -16989,7 +16989,7 @@ dependencies = [ [[package]] name = "sp-crypto-ec-utils" version = "0.16.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "ark-bls12-377", "ark-bls12-377-ext", @@ -17023,7 +17023,7 @@ dependencies = [ [[package]] name = "sp-crypto-hashing" version = "0.1.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "blake2b_simd", "byteorder", @@ -17036,17 +17036,17 @@ dependencies = [ [[package]] name = "sp-crypto-hashing-proc-macro" version = "0.1.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "quote", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "syn 2.0.106", ] [[package]] name = "sp-database" version = "10.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "kvdb", "parking_lot 0.12.5", @@ -17055,7 +17055,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "14.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "proc-macro2", "quote", @@ -17065,7 +17065,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.30.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "environmental", "parity-scale-codec", @@ -17075,7 +17075,7 @@ dependencies = [ [[package]] name = "sp-genesis-builder" version = "0.18.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "scale-info", @@ -17087,7 +17087,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -17100,7 +17100,7 @@ dependencies = [ [[package]] name = "sp-io" version = "41.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bytes", "docify", @@ -17112,7 +17112,7 @@ dependencies = [ "rustversion", "secp256k1 0.28.2", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "sp-externalities", "sp-keystore", "sp-runtime-interface", @@ -17126,7 +17126,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "42.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "sp-core", "sp-runtime", @@ -17136,7 +17136,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.43.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "parking_lot 0.12.5", @@ -17147,7 +17147,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "11.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "thiserror 1.0.69", "zstd 0.12.4", @@ -17156,7 +17156,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.11.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-metadata 23.0.0", "parity-scale-codec", @@ -17166,7 +17166,7 @@ dependencies = [ [[package]] name = "sp-mixnet" version = "0.15.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "scale-info", @@ -17177,7 +17177,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "log", "parity-scale-codec", @@ -17194,7 +17194,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "scale-info", @@ -17207,7 +17207,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "sp-api", "sp-core", @@ -17217,7 +17217,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "13.0.2" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "backtrace", "regex", @@ -17226,7 +17226,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "35.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "rustc-hash 1.1.0", "serde", @@ -17236,7 +17236,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "42.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "binary-merkle-tree", "docify", @@ -17265,7 +17265,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "30.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -17284,7 +17284,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "19.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "Inflector", "expander", @@ -17297,7 +17297,7 @@ dependencies = [ [[package]] name = "sp-session" version = "39.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "scale-info", @@ -17311,7 +17311,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "39.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -17324,7 +17324,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.46.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "hash-db", "log", @@ -17344,7 +17344,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "21.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "aes-gcm", "curve25519-dalek", @@ -17357,7 +17357,7 @@ dependencies = [ "sp-api", "sp-application-crypto", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a)", "sp-externalities", "sp-runtime", "sp-runtime-interface", @@ -17368,12 +17368,12 @@ dependencies = [ [[package]] name = "sp-std" version = "14.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" [[package]] name = "sp-storage" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "impl-serde", "parity-scale-codec", @@ -17385,7 +17385,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "parity-scale-codec", @@ -17397,7 +17397,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "17.1.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "tracing", @@ -17408,7 +17408,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "sp-api", "sp-runtime", @@ -17417,7 +17417,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "async-trait", "parity-scale-codec", @@ -17431,7 +17431,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "ahash", "foldhash 0.1.5", @@ -17456,7 +17456,7 @@ dependencies = [ [[package]] name = "sp-version" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "impl-serde", "parity-scale-codec", @@ -17473,7 +17473,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "15.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "parity-scale-codec", "proc-macro-warning", @@ -17485,7 +17485,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -17497,7 +17497,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "32.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "bounded-collections 0.2.4", "parity-scale-codec", @@ -17671,7 +17671,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "staging-chain-spec-builder" version = "12.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "clap", "docify", @@ -17684,7 +17684,7 @@ dependencies = [ [[package]] name = "staging-node-inspect" version = "0.29.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "clap", "parity-scale-codec", @@ -17702,7 +17702,7 @@ dependencies = [ [[package]] name = "staging-parachain-info" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -17715,7 +17715,7 @@ dependencies = [ [[package]] name = "staging-xcm" version = "17.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "bounded-collections 0.2.4", @@ -17736,7 +17736,7 @@ dependencies = [ [[package]] name = "staging-xcm-builder" version = "21.1.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "environmental", "frame-support", @@ -17760,7 +17760,7 @@ dependencies = [ [[package]] name = "staging-xcm-executor" version = "20.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "environmental", "frame-benchmarking", @@ -17872,7 +17872,7 @@ dependencies = [ [[package]] name = "substrate-bip39" version = "0.6.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "hmac 0.12.1", "pbkdf2", @@ -17897,7 +17897,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "11.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" [[package]] name = "substrate-fixed" @@ -17913,7 +17913,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "45.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "docify", "frame-system-rpc-runtime-api", @@ -17933,7 +17933,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.17.6" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "http-body-util", "hyper 1.7.0", @@ -17947,7 +17947,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "44.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -17974,7 +17974,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "27.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "array-bytes 6.2.3", "build-helper", @@ -19003,7 +19003,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "20.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "coarsetime", "polkadot-primitives", @@ -19014,7 +19014,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "5.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "expander", "proc-macro-crate 3.4.0", @@ -19965,7 +19965,7 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "westend-runtime" version = "24.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "binary-merkle-tree", "bitvec", @@ -20072,7 +20072,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "21.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "polkadot-primitives", @@ -20625,7 +20625,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "11.0.2" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "Inflector", "proc-macro2", @@ -20636,7 +20636,7 @@ dependencies = [ [[package]] name = "xcm-runtime-apis" version = "0.8.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "parity-scale-codec", @@ -20650,7 +20650,7 @@ dependencies = [ [[package]] name = "xcm-simulator" version = "21.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=81fa2c54e94f824eba7dabe9dffd063481cb2d80#81fa2c54e94f824eba7dabe9dffd063481cb2d80" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a#467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" dependencies = [ "frame-support", "frame-system", diff --git a/Cargo.toml b/Cargo.toml index 1d65a3cd5e..4a51bda878 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -234,35 +234,35 @@ polkadot-sdk = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = " runtime-common = { package = "polkadot-runtime-common", git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } # Frontier -fp-evm = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -fp-rpc = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -fp-self-contained = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -fp-account = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -fc-storage = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -fc-db = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -fc-consensus = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -fp-consensus = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -fp-dynamic-fee = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -fc-api = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -fc-rpc = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -fc-rpc-core = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -fc-aura = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -fc-babe = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -fc-mapping-sync = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -precompile-utils = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } +fp-evm = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +fp-rpc = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +fp-self-contained = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +fp-account = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +fc-storage = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +fc-db = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +fc-consensus = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +fp-consensus = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +fp-dynamic-fee = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +fc-api = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +fc-rpc = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +fc-rpc-core = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +fc-aura = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +fc-babe = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +fc-mapping-sync = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +precompile-utils = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } # Frontier FRAME -pallet-base-fee = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -pallet-dynamic-fee = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -pallet-ethereum = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -pallet-evm = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -pallet-evm-precompile-dispatch = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -pallet-evm-chain-id = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -pallet-evm-precompile-modexp = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -pallet-evm-precompile-sha3fips = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -pallet-evm-precompile-simple = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -pallet-evm-precompile-bn128 = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } -pallet-hotfix-sufficients = { git = "https://github.com/opentensor/frontier", rev = "e31d47f83a64c361ecf0fd02bf567de6db9bda43", default-features = false } +pallet-base-fee = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +pallet-dynamic-fee = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +pallet-ethereum = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +pallet-evm = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +pallet-evm-precompile-dispatch = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +pallet-evm-chain-id = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +pallet-evm-precompile-modexp = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +pallet-evm-precompile-sha3fips = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +pallet-evm-precompile-simple = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +pallet-evm-precompile-bn128 = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } +pallet-hotfix-sufficients = { git = "https://github.com/opentensor/frontier", rev = "7c93fd974ad70faec1c1c4b87ab23874f365f27a", default-features = false } #DRAND pallet-drand = { path = "pallets/drand", default-features = false } @@ -318,190 +318,190 @@ w3f-bls = { git = "https://github.com/opentensor/bls", branch = "fix-no-std" } # NOTE: The Diener will patch unnecesarry crates while this is waiting to be merged: . # You may install diener from `liamaharon:ignore-unused-flag` if you like in the meantime. [patch."https://github.com/paritytech/polkadot-sdk"] -frame-support = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -binary-merkle-tree = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-core = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-crypto-hashing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-crypto-hashing-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-debug-derive = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-externalities = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-storage = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-runtime-interface = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-runtime-interface-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-std = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-tracing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-wasm-interface = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-io = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-keystore = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-state-machine = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-panic-handler = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-trie = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-runtime = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-application-crypto = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-arithmetic = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-weights = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-api-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-metadata-ir = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-version = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-version-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-block-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-block-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-inherents = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-blockchain = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-consensus = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-database = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-client-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -substrate-prometheus-endpoint = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-executor = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-executor-common = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-allocator = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-maybe-compressed-blob = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-executor-polkavm = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-executor-wasmtime = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -substrate-wasm-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-tracing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-tracing-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -frame-executive = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -frame-system = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -frame-try-runtime = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-balances = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -frame-benchmarking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -frame-support-procedural = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -frame-support-procedural-tools = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -frame-support-procedural-tools-derive = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-client-db = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-state-db = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -polkadot-sdk-frame = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -frame-system-benchmarking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -frame-system-rpc-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-consensus-aura = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-consensus-slots = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-timestamp = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-consensus-grandpa = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-genesis-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-keyring = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-offchain = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-session = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-staking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-transaction-pool = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -polkadot-sdk = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -cumulus-primitives-core = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -polkadot-core-primitives = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -polkadot-parachain-primitives = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -polkadot-primitives = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-authority-discovery = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -staging-xcm = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -xcm-procedural = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -cumulus-primitives-parachain-inherent = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -cumulus-primitives-proof-size-hostfunction = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-message-queue = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -polkadot-runtime-parachains = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-authority-discovery = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-session = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-timestamp = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-authorship = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-babe = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-consensus-babe = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -frame-election-provider-support = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -frame-election-provider-solution-type = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-npos-elections = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-offences = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-staking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-bags-list = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-staking-reward-curve = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-broker = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-mmr = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-mmr-primitives = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -polkadot-runtime-metrics = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -staging-xcm-executor = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-keystore = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -staging-xcm-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-asset-conversion = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-transaction-payment = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-grandpa = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-sudo = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-vesting = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -polkadot-runtime-common = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-asset-rate = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-election-provider-multi-phase = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-election-provider-support-benchmarking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-fast-unstake = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-identity = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-staking-reward-fn = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-treasury = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-utility = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-root-testing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -slot-range-helper = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -cumulus-primitives-storage-weight-reclaim = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-aura = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -cumulus-test-relay-sproof-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-chain-spec = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-chain-spec-derive = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-network = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-network-common = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-network-types = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-utils = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-telemetry = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-cli = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-mixnet = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-transaction-pool-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-mixnet = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-service = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-consensus = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-informant = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-network-sync = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -fork-tree = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-network-light = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-network-transactions = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-rpc-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-statement-store = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-transaction-pool = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-rpc-server = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-rpc-spec-v2 = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-sysinfo = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-transaction-storage-proof = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -cumulus-relay-chain-interface = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -polkadot-overseer = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -tracing-gum = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -tracing-gum-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -polkadot-node-metrics = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -polkadot-node-primitives = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -polkadot-node-subsystem-types = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -polkadot-node-network-protocol = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-authority-discovery = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -polkadot-statement-table = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -frame-benchmarking-cli = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -cumulus-client-parachain-inherent = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-runtime-utilities = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -frame-metadata-hash-extension = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-nomination-pools = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-membership = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-multisig = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-nomination-pools-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-preimage = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-proxy = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-scheduler = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-staking-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-offchain = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-consensus-babe = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-consensus-epochs = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-consensus-slots = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-transaction-payment-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-consensus-babe-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-network-gossip = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-consensus-grandpa = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-consensus-grandpa-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -substrate-frame-rpc-system = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-basic-authorship = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-proposer-metrics = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -substrate-build-script-utils = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-consensus-aura = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-insecure-randomness-collective-flip = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -pallet-safe-mode = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sc-consensus-manual-seal = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -sp-crypto-ec-utils = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } -substrate-bip39 = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "81fa2c54e94f824eba7dabe9dffd063481cb2d80" } +frame-support = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +binary-merkle-tree = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-core = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-crypto-hashing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-crypto-hashing-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-debug-derive = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-externalities = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-storage = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-runtime-interface = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-runtime-interface-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-std = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-tracing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-wasm-interface = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-io = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-keystore = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-state-machine = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-panic-handler = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-trie = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-runtime = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-application-crypto = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-arithmetic = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-weights = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-api-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-metadata-ir = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-version = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-version-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-block-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-block-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-inherents = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-blockchain = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-consensus = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-database = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-client-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +substrate-prometheus-endpoint = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-executor = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-executor-common = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-allocator = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-maybe-compressed-blob = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-executor-polkavm = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-executor-wasmtime = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +substrate-wasm-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-tracing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-tracing-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +frame-executive = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +frame-system = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +frame-try-runtime = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-balances = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +frame-benchmarking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +frame-support-procedural = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +frame-support-procedural-tools = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +frame-support-procedural-tools-derive = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-client-db = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-state-db = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +polkadot-sdk-frame = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +frame-system-benchmarking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +frame-system-rpc-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-consensus-aura = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-consensus-slots = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-timestamp = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-consensus-grandpa = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-genesis-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-keyring = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-offchain = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-session = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-staking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-transaction-pool = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +polkadot-sdk = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +cumulus-primitives-core = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +polkadot-core-primitives = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +polkadot-parachain-primitives = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +polkadot-primitives = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-authority-discovery = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +staging-xcm = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +xcm-procedural = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +cumulus-primitives-parachain-inherent = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +cumulus-primitives-proof-size-hostfunction = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-message-queue = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +polkadot-runtime-parachains = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-authority-discovery = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-session = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-timestamp = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-authorship = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-babe = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-consensus-babe = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +frame-election-provider-support = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +frame-election-provider-solution-type = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-npos-elections = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-offences = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-staking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-bags-list = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-staking-reward-curve = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-broker = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-mmr = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-mmr-primitives = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +polkadot-runtime-metrics = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +staging-xcm-executor = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-keystore = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +staging-xcm-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-asset-conversion = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-transaction-payment = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-grandpa = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-sudo = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-vesting = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +polkadot-runtime-common = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-asset-rate = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-election-provider-multi-phase = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-election-provider-support-benchmarking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-fast-unstake = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-identity = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-staking-reward-fn = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-treasury = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-utility = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-root-testing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +slot-range-helper = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +cumulus-primitives-storage-weight-reclaim = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-aura = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +cumulus-test-relay-sproof-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-chain-spec = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-chain-spec-derive = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-network = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-network-common = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-network-types = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-utils = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-telemetry = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-cli = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-mixnet = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-transaction-pool-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-mixnet = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-service = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-consensus = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-informant = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-network-sync = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +fork-tree = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-network-light = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-network-transactions = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-rpc-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-statement-store = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-transaction-pool = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-rpc-server = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-rpc-spec-v2 = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-sysinfo = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-transaction-storage-proof = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +cumulus-relay-chain-interface = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +polkadot-overseer = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +tracing-gum = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +tracing-gum-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +polkadot-node-metrics = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +polkadot-node-primitives = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +polkadot-node-subsystem-types = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +polkadot-node-network-protocol = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-authority-discovery = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +polkadot-statement-table = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +frame-benchmarking-cli = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +cumulus-client-parachain-inherent = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-runtime-utilities = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +frame-metadata-hash-extension = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-nomination-pools = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-membership = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-multisig = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-nomination-pools-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-preimage = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-proxy = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-scheduler = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-staking-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-offchain = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-consensus-babe = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-consensus-epochs = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-consensus-slots = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-transaction-payment-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-consensus-babe-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-network-gossip = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-consensus-grandpa = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-consensus-grandpa-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +substrate-frame-rpc-system = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-basic-authorship = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-proposer-metrics = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +substrate-build-script-utils = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-consensus-aura = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-insecure-randomness-collective-flip = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +pallet-safe-mode = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sc-consensus-manual-seal = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +sp-crypto-ec-utils = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } +substrate-bip39 = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "467c6bf8cb1bc5ffb2f1a9f70a4bef63e12a012a" } From 8a1e018a87d9e296a57cbb10bff74b7166d7bfed Mon Sep 17 00:00:00 2001 From: Sam Johnson Date: Mon, 19 Jan 2026 15:51:35 -0500 Subject: [PATCH 66/70] Revert "Voting Power EMA" --- contract-tests/src/contracts/votingPower.ts | 104 --- .../test/votingPower.precompile.test.ts | 226 ------ pallets/admin-utils/src/lib.rs | 2 - pallets/subtensor/src/epoch/run_epoch.rs | 6 - pallets/subtensor/src/lib.rs | 47 +- pallets/subtensor/src/macros/dispatches.rs | 91 --- pallets/subtensor/src/macros/errors.rs | 4 - pallets/subtensor/src/macros/events.rs | 29 - pallets/subtensor/src/subnets/mechanism.rs | 7 +- pallets/subtensor/src/swap/swap_hotkey.rs | 5 - pallets/subtensor/src/tests/mod.rs | 1 - pallets/subtensor/src/tests/voting_power.rs | 760 ------------------ pallets/subtensor/src/utils/mod.rs | 1 - pallets/subtensor/src/utils/voting_power.rs | 280 ------- precompiles/src/lib.rs | 8 +- precompiles/src/voting_power.rs | 131 --- 16 files changed, 3 insertions(+), 1699 deletions(-) delete mode 100644 contract-tests/src/contracts/votingPower.ts delete mode 100644 contract-tests/test/votingPower.precompile.test.ts delete mode 100644 pallets/subtensor/src/tests/voting_power.rs delete mode 100644 pallets/subtensor/src/utils/voting_power.rs delete mode 100644 precompiles/src/voting_power.rs diff --git a/contract-tests/src/contracts/votingPower.ts b/contract-tests/src/contracts/votingPower.ts deleted file mode 100644 index bbcc3ca6e6..0000000000 --- a/contract-tests/src/contracts/votingPower.ts +++ /dev/null @@ -1,104 +0,0 @@ -export const IVOTING_POWER_ADDRESS = "0x000000000000000000000000000000000000080d"; - -export const IVotingPowerABI = [ - { - "inputs": [ - { - "internalType": "uint16", - "name": "netuid", - "type": "uint16" - }, - { - "internalType": "bytes32", - "name": "hotkey", - "type": "bytes32" - } - ], - "name": "getVotingPower", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint16", - "name": "netuid", - "type": "uint16" - } - ], - "name": "isVotingPowerTrackingEnabled", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint16", - "name": "netuid", - "type": "uint16" - } - ], - "name": "getVotingPowerDisableAtBlock", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint16", - "name": "netuid", - "type": "uint16" - } - ], - "name": "getVotingPowerEmaAlpha", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint16", - "name": "netuid", - "type": "uint16" - } - ], - "name": "getTotalVotingPower", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/contract-tests/test/votingPower.precompile.test.ts b/contract-tests/test/votingPower.precompile.test.ts deleted file mode 100644 index 26b29e257c..0000000000 --- a/contract-tests/test/votingPower.precompile.test.ts +++ /dev/null @@ -1,226 +0,0 @@ -import * as assert from "assert"; - -import { getDevnetApi, getRandomSubstrateKeypair, getAliceSigner, getSignerFromKeypair, waitForTransactionWithRetry } from "../src/substrate" -import { getPublicClient } from "../src/utils"; -import { ETH_LOCAL_URL } from "../src/config"; -import { devnet } from "@polkadot-api/descriptors" -import { PublicClient } from "viem"; -import { PolkadotSigner, TypedApi } from "polkadot-api"; -import { toViemAddress, convertPublicKeyToSs58 } from "../src/address-utils" -import { IVotingPowerABI, IVOTING_POWER_ADDRESS } from "../src/contracts/votingPower" -import { forceSetBalanceToSs58Address, addNewSubnetwork, startCall } from "../src/subtensor"; - -describe("Test VotingPower Precompile", () => { - // init substrate part - const hotkey = getRandomSubstrateKeypair(); - const coldkey = getRandomSubstrateKeypair(); - let publicClient: PublicClient; - - let api: TypedApi; - - // sudo account alice as signer - let alice: PolkadotSigner; - - // init other variable - let subnetId = 0; - - before(async () => { - // init variables got from await and async - publicClient = await getPublicClient(ETH_LOCAL_URL) - api = await getDevnetApi() - alice = await getAliceSigner(); - - await forceSetBalanceToSs58Address(api, convertPublicKeyToSs58(hotkey.publicKey)) - await forceSetBalanceToSs58Address(api, convertPublicKeyToSs58(coldkey.publicKey)) - - let netuid = await addNewSubnetwork(api, hotkey, coldkey) - await startCall(api, netuid, coldkey) - subnetId = netuid - }) - - describe("VotingPower Tracking Status Functions", () => { - it("isVotingPowerTrackingEnabled returns false by default", async () => { - const isEnabled = await publicClient.readContract({ - abi: IVotingPowerABI, - address: toViemAddress(IVOTING_POWER_ADDRESS), - functionName: "isVotingPowerTrackingEnabled", - args: [subnetId] - }) - - assert.ok(isEnabled !== undefined, "isVotingPowerTrackingEnabled should return a value"); - assert.strictEqual(typeof isEnabled, 'boolean', "isVotingPowerTrackingEnabled should return a boolean"); - // By default, voting power tracking is disabled - assert.strictEqual(isEnabled, false, "Voting power tracking should be disabled by default"); - }); - - it("getVotingPowerDisableAtBlock returns 0 when not scheduled", async () => { - const disableAtBlock = await publicClient.readContract({ - abi: IVotingPowerABI, - address: toViemAddress(IVOTING_POWER_ADDRESS), - functionName: "getVotingPowerDisableAtBlock", - args: [subnetId] - }) - - assert.ok(disableAtBlock !== undefined, "getVotingPowerDisableAtBlock should return a value"); - assert.strictEqual(typeof disableAtBlock, 'bigint', "getVotingPowerDisableAtBlock should return a bigint"); - assert.strictEqual(disableAtBlock, BigInt(0), "Disable at block should be 0 when not scheduled"); - }); - - it("getVotingPowerEmaAlpha returns default alpha value", async () => { - const alpha = await publicClient.readContract({ - abi: IVotingPowerABI, - address: toViemAddress(IVOTING_POWER_ADDRESS), - functionName: "getVotingPowerEmaAlpha", - args: [subnetId] - }) - - assert.ok(alpha !== undefined, "getVotingPowerEmaAlpha should return a value"); - assert.strictEqual(typeof alpha, 'bigint', "getVotingPowerEmaAlpha should return a bigint"); - // Default alpha is 0.1 * 10^18 = 100_000_000_000_000_000 - assert.strictEqual(alpha, BigInt("100000000000000000"), "Default alpha should be 0.1 (100_000_000_000_000_000)"); - }); - }); - - describe("VotingPower Query Functions", () => { - it("getVotingPower returns 0 for hotkey without voting power", async () => { - // Convert hotkey public key to bytes32 format (0x prefixed hex string) - const hotkeyBytes32 = '0x' + Buffer.from(hotkey.publicKey).toString('hex'); - - const votingPower = await publicClient.readContract({ - abi: IVotingPowerABI, - address: toViemAddress(IVOTING_POWER_ADDRESS), - functionName: "getVotingPower", - args: [subnetId, hotkeyBytes32 as `0x${string}`] - }) - - assert.ok(votingPower !== undefined, "getVotingPower should return a value"); - assert.strictEqual(typeof votingPower, 'bigint', "getVotingPower should return a bigint"); - // Without voting power tracking enabled, voting power should be 0 - assert.strictEqual(votingPower, BigInt(0), "Voting power should be 0 when tracking is disabled"); - }); - - it("getVotingPower returns 0 for unknown hotkey", async () => { - // Generate a random hotkey that doesn't exist - const randomHotkey = getRandomSubstrateKeypair(); - const randomHotkeyBytes32 = '0x' + Buffer.from(randomHotkey.publicKey).toString('hex'); - - const votingPower = await publicClient.readContract({ - abi: IVotingPowerABI, - address: toViemAddress(IVOTING_POWER_ADDRESS), - functionName: "getVotingPower", - args: [subnetId, randomHotkeyBytes32 as `0x${string}`] - }) - - assert.ok(votingPower !== undefined, "getVotingPower should return a value"); - assert.strictEqual(votingPower, BigInt(0), "Voting power should be 0 for unknown hotkey"); - }); - - it("getTotalVotingPower returns 0 when no voting power exists", async () => { - const totalVotingPower = await publicClient.readContract({ - abi: IVotingPowerABI, - address: toViemAddress(IVOTING_POWER_ADDRESS), - functionName: "getTotalVotingPower", - args: [subnetId] - }) - - assert.ok(totalVotingPower !== undefined, "getTotalVotingPower should return a value"); - assert.strictEqual(typeof totalVotingPower, 'bigint', "getTotalVotingPower should return a bigint"); - assert.strictEqual(totalVotingPower, BigInt(0), "Total voting power should be 0 when tracking is disabled"); - }); - }); - - describe("VotingPower with Tracking Enabled", () => { - let enabledSubnetId: number; - - before(async () => { - // Create a new subnet for this test - const hotkey2 = getRandomSubstrateKeypair(); - const coldkey2 = getRandomSubstrateKeypair(); - - await forceSetBalanceToSs58Address(api, convertPublicKeyToSs58(hotkey2.publicKey)) - await forceSetBalanceToSs58Address(api, convertPublicKeyToSs58(coldkey2.publicKey)) - - enabledSubnetId = await addNewSubnetwork(api, hotkey2, coldkey2) - await startCall(api, enabledSubnetId, coldkey2) - - // Enable voting power tracking via sudo - const internalCall = api.tx.SubtensorModule.enable_voting_power_tracking({ netuid: enabledSubnetId }) - const tx = api.tx.Sudo.sudo({ call: internalCall.decodedCall }) - await waitForTransactionWithRetry(api, tx, alice) - }); - - it("isVotingPowerTrackingEnabled returns true after enabling", async () => { - const isEnabled = await publicClient.readContract({ - abi: IVotingPowerABI, - address: toViemAddress(IVOTING_POWER_ADDRESS), - functionName: "isVotingPowerTrackingEnabled", - args: [enabledSubnetId] - }) - - assert.strictEqual(isEnabled, true, "Voting power tracking should be enabled"); - }); - - it("getVotingPowerDisableAtBlock still returns 0 when enabled but not scheduled for disable", async () => { - const disableAtBlock = await publicClient.readContract({ - abi: IVotingPowerABI, - address: toViemAddress(IVOTING_POWER_ADDRESS), - functionName: "getVotingPowerDisableAtBlock", - args: [enabledSubnetId] - }) - - assert.strictEqual(disableAtBlock, BigInt(0), "Disable at block should still be 0"); - }); - }); - - describe("All precompile functions are accessible", () => { - it("All VotingPower precompile functions can be called", async () => { - const hotkeyBytes32 = '0x' + Buffer.from(hotkey.publicKey).toString('hex'); - - // Test all five functions - const results = await Promise.all([ - publicClient.readContract({ - abi: IVotingPowerABI, - address: toViemAddress(IVOTING_POWER_ADDRESS), - functionName: "getVotingPower", - args: [subnetId, hotkeyBytes32 as `0x${string}`] - }), - publicClient.readContract({ - abi: IVotingPowerABI, - address: toViemAddress(IVOTING_POWER_ADDRESS), - functionName: "isVotingPowerTrackingEnabled", - args: [subnetId] - }), - publicClient.readContract({ - abi: IVotingPowerABI, - address: toViemAddress(IVOTING_POWER_ADDRESS), - functionName: "getVotingPowerDisableAtBlock", - args: [subnetId] - }), - publicClient.readContract({ - abi: IVotingPowerABI, - address: toViemAddress(IVOTING_POWER_ADDRESS), - functionName: "getVotingPowerEmaAlpha", - args: [subnetId] - }), - publicClient.readContract({ - abi: IVotingPowerABI, - address: toViemAddress(IVOTING_POWER_ADDRESS), - functionName: "getTotalVotingPower", - args: [subnetId] - }) - ]); - - // All functions should return defined values - results.forEach((result: unknown, index: number) => { - assert.ok(result !== undefined, `Function ${index} should return a value`); - }); - - // Verify types - assert.strictEqual(typeof results[0], 'bigint', "getVotingPower should return bigint"); - assert.strictEqual(typeof results[1], 'boolean', "isVotingPowerTrackingEnabled should return boolean"); - assert.strictEqual(typeof results[2], 'bigint', "getVotingPowerDisableAtBlock should return bigint"); - assert.strictEqual(typeof results[3], 'bigint', "getVotingPowerEmaAlpha should return bigint"); - assert.strictEqual(typeof results[4], 'bigint', "getTotalVotingPower should return bigint"); - }); - }); -}); diff --git a/pallets/admin-utils/src/lib.rs b/pallets/admin-utils/src/lib.rs index 5d7713df15..2a33262073 100644 --- a/pallets/admin-utils/src/lib.rs +++ b/pallets/admin-utils/src/lib.rs @@ -145,8 +145,6 @@ pub mod pallet { Leasing, /// Address mapping precompile AddressMapping, - /// Voting power precompile - VotingPower, } #[pallet::type_value] diff --git a/pallets/subtensor/src/epoch/run_epoch.rs b/pallets/subtensor/src/epoch/run_epoch.rs index f90175ce0c..f56b8a89a4 100644 --- a/pallets/subtensor/src/epoch/run_epoch.rs +++ b/pallets/subtensor/src/epoch/run_epoch.rs @@ -22,7 +22,6 @@ pub struct EpochTerms { pub validator_trust: u16, pub new_validator_permit: bool, pub bond: Vec<(u16, u16)>, - pub stake: u64, } pub struct EpochOutput(pub BTreeMap); @@ -989,10 +988,6 @@ impl Pallet { .iter() .map(|xi| fixed_proportion_to_u16(*xi)) .collect::>(); - let raw_stake: Vec = total_stake - .iter() - .map(|s| s.saturating_to_num::()) - .collect::>(); for (_hotkey, terms) in terms_map.iter_mut() { terms.dividend = cloned_dividends.get(terms.uid).copied().unwrap_or_default(); @@ -1017,7 +1012,6 @@ impl Pallet { .get(terms.uid) .copied() .unwrap_or_default(); - terms.stake = raw_stake.get(terms.uid).copied().unwrap_or_default(); let old_validator_permit = validator_permits .get(terms.uid) .copied() diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index 9db212330e..6ae43ac384 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -1,7 +1,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![recursion_limit = "512"] #![allow(clippy::too_many_arguments)] -#![allow(clippy::zero_prefixed_literal)] // Edit this file to define custom logic or remove it if it is not needed. // Learn more about FRAME and the core library of Substrate FRAME pallets: // @@ -1895,52 +1894,8 @@ pub mod pallet { pub type SubtokenEnabled = StorageMap<_, Identity, NetUid, bool, ValueQuery, DefaultFalse>; - // ======================================= - // ==== VotingPower Storage ==== - // ======================================= - - #[pallet::type_value] - /// Default VotingPower EMA alpha value (0.1 represented as u64 with 18 decimals) - /// alpha = 0.1 means slow response, 10% weight to new values per epoch - pub fn DefaultVotingPowerEmaAlpha() -> u64 { - 0_003_570_000_000_000_000 // 0.00357 * 10^18 = 2 weeks e-folding (time-constant) @ 361 - // blocks per tempo - // After 2 weeks -> EMA reaches 63.2% of a step change - // After ~4 weeks -> 86.5% - // After ~6 weeks -> 95% - } - - #[pallet::storage] - /// --- DMAP ( netuid, hotkey ) --> voting_power | EMA of stake for voting - /// This tracks stake EMA updated every epoch when VotingPowerTrackingEnabled is true. - /// Used by smart contracts to determine validator voting power for subnet governance. - pub type VotingPower = - StorageDoubleMap<_, Identity, NetUid, Blake2_128Concat, T::AccountId, u64, ValueQuery>; - - #[pallet::storage] - /// --- MAP ( netuid ) --> bool | Whether voting power tracking is enabled for this subnet. - /// When enabled, VotingPower EMA is updated every epoch. Default is false. - /// When disabled with disable_at_block set, tracking continues until that block. - pub type VotingPowerTrackingEnabled = - StorageMap<_, Identity, NetUid, bool, ValueQuery, DefaultFalse>; - - #[pallet::storage] - /// --- MAP ( netuid ) --> block_number | Block at which voting power tracking will be disabled. - /// When set (non-zero), tracking continues until this block, then automatically disables - /// and clears VotingPower entries for the subnet. Provides a 14-day grace period. - pub type VotingPowerDisableAtBlock = - StorageMap<_, Identity, NetUid, u64, ValueQuery>; - - #[pallet::storage] - /// --- MAP ( netuid ) --> u64 | EMA alpha value for voting power calculation. - /// Higher alpha = faster response to stake changes. - /// Stored as u64 with 18 decimal precision (1.0 = 10^18). - /// Only settable by sudo/root. - pub type VotingPowerEmaAlpha = - StorageMap<_, Identity, NetUid, u64, ValueQuery, DefaultVotingPowerEmaAlpha>; - - #[pallet::type_value] /// Default value for burn keys limit + #[pallet::type_value] pub fn DefaultImmuneOwnerUidsLimit() -> u16 { 1 } diff --git a/pallets/subtensor/src/macros/dispatches.rs b/pallets/subtensor/src/macros/dispatches.rs index 240864ae74..2a362783ef 100644 --- a/pallets/subtensor/src/macros/dispatches.rs +++ b/pallets/subtensor/src/macros/dispatches.rs @@ -2432,96 +2432,5 @@ mod dispatches { Ok(()) } - - /// Enables voting power tracking for a subnet. - /// - /// This function can be called by the subnet owner or root. - /// When enabled, voting power EMA is updated every epoch for all validators. - /// Voting power starts at 0 and increases over epochs. - /// - /// # Arguments: - /// * `origin` - The origin of the call, must be subnet owner or root. - /// * `netuid` - The subnet to enable voting power tracking for. - /// - /// # Errors: - /// * `SubnetNotExist` - If the subnet does not exist. - /// * `NotSubnetOwner` - If the caller is not the subnet owner or root. - #[pallet::call_index(125)] - #[pallet::weight(( - Weight::from_parts(10_000, 0) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)), - DispatchClass::Operational, - Pays::Yes - ))] - pub fn enable_voting_power_tracking( - origin: OriginFor, - netuid: NetUid, - ) -> DispatchResult { - Self::ensure_subnet_owner_or_root(origin, netuid)?; - Self::do_enable_voting_power_tracking(netuid) - } - - /// Schedules disabling of voting power tracking for a subnet. - /// - /// This function can be called by the subnet owner or root. - /// Voting power tracking will continue for 14 days (grace period) after this call, - /// then automatically disable and clear all VotingPower entries for the subnet. - /// - /// # Arguments: - /// * `origin` - The origin of the call, must be subnet owner or root. - /// * `netuid` - The subnet to schedule disabling voting power tracking for. - /// - /// # Errors: - /// * `SubnetNotExist` - If the subnet does not exist. - /// * `NotSubnetOwner` - If the caller is not the subnet owner or root. - /// * `VotingPowerTrackingNotEnabled` - If voting power tracking is not enabled. - #[pallet::call_index(126)] - #[pallet::weight(( - Weight::from_parts(10_000, 0) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)), - DispatchClass::Operational, - Pays::Yes - ))] - pub fn disable_voting_power_tracking( - origin: OriginFor, - netuid: NetUid, - ) -> DispatchResult { - Self::ensure_subnet_owner_or_root(origin, netuid)?; - Self::do_disable_voting_power_tracking(netuid) - } - - /// Sets the EMA alpha value for voting power calculation on a subnet. - /// - /// This function can only be called by root (sudo). - /// Higher alpha = faster response to stake changes. - /// Alpha is stored as u64 with 18 decimal precision (1.0 = 10^18). - /// - /// # Arguments: - /// * `origin` - The origin of the call, must be root. - /// * `netuid` - The subnet to set the alpha for. - /// * `alpha` - The new alpha value (u64 with 18 decimal precision). - /// - /// # Errors: - /// * `BadOrigin` - If the origin is not root. - /// * `SubnetNotExist` - If the subnet does not exist. - /// * `InvalidVotingPowerEmaAlpha` - If alpha is greater than 10^18 (1.0). - #[pallet::call_index(127)] - #[pallet::weight(( - Weight::from_parts(6_000, 0) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)), - DispatchClass::Operational, - Pays::Yes - ))] - pub fn sudo_set_voting_power_ema_alpha( - origin: OriginFor, - netuid: NetUid, - alpha: u64, - ) -> DispatchResult { - ensure_root(origin)?; - Self::do_set_voting_power_ema_alpha(netuid, alpha) - } } } diff --git a/pallets/subtensor/src/macros/errors.rs b/pallets/subtensor/src/macros/errors.rs index 995c9b5a31..6c3d7a35df 100644 --- a/pallets/subtensor/src/macros/errors.rs +++ b/pallets/subtensor/src/macros/errors.rs @@ -266,10 +266,6 @@ mod errors { InvalidRootClaimThreshold, /// Exceeded subnet limit number or zero. InvalidSubnetNumber, - /// Voting power tracking is not enabled for this subnet. - VotingPowerTrackingNotEnabled, - /// Invalid voting power EMA alpha value (must be <= 10^18). - InvalidVotingPowerEmaAlpha, /// Unintended precision loss when unstaking alpha PrecisionLoss, } diff --git a/pallets/subtensor/src/macros/events.rs b/pallets/subtensor/src/macros/events.rs index 457eacd7b1..c86cc1a1e5 100644 --- a/pallets/subtensor/src/macros/events.rs +++ b/pallets/subtensor/src/macros/events.rs @@ -472,35 +472,6 @@ mod events { root_claim_type: RootClaimTypeEnum, }, - /// Voting power tracking has been enabled for a subnet. - VotingPowerTrackingEnabled { - /// The subnet ID - netuid: NetUid, - }, - - /// Voting power tracking has been scheduled for disabling. - /// Tracking will continue until disable_at_block, then stop and clear entries. - VotingPowerTrackingDisableScheduled { - /// The subnet ID - netuid: NetUid, - /// Block at which tracking will be disabled - disable_at_block: u64, - }, - - /// Voting power tracking has been fully disabled and entries cleared. - VotingPowerTrackingDisabled { - /// The subnet ID - netuid: NetUid, - }, - - /// Voting power EMA alpha has been set for a subnet. - VotingPowerEmaAlphaSet { - /// The subnet ID - netuid: NetUid, - /// The new alpha value (u64 with 18 decimal precision) - alpha: u64, - }, - /// Subnet lease dividends have been distributed. SubnetLeaseDividendsDistributed { /// The lease ID diff --git a/pallets/subtensor/src/subnets/mechanism.rs b/pallets/subtensor/src/subnets/mechanism.rs index b5ed928930..481974ef05 100644 --- a/pallets/subtensor/src/subnets/mechanism.rs +++ b/pallets/subtensor/src/subnets/mechanism.rs @@ -322,7 +322,6 @@ impl Pallet { sub_weight, ); acc_terms.new_validator_permit |= terms.new_validator_permit; - acc_terms.stake = acc_terms.stake.saturating_add(terms.stake); }) .or_insert_with(|| { // weighted insert for the first sub-subnet seen for this hotkey @@ -350,8 +349,7 @@ impl Pallet { sub_weight, ), new_validator_permit: terms.new_validator_permit, - bond: Vec::new(), // aggregated map doesn't use bonds; keep empty - stake: terms.stake, + bond: Vec::new(), // aggregated map doesn’t use bonds; keep empty } }); acc @@ -360,9 +358,6 @@ impl Pallet { // State updates from epoch function Self::persist_netuid_epoch_terms(netuid, &aggregated); - // Update voting power EMA for all validators on this subnet - Self::update_voting_power_for_subnet(netuid, &aggregated); - // Remap BTreeMap back to Vec<(T::AccountId, AlphaCurrency, AlphaCurrency)> format // for processing emissions in run_coinbase // Emission tuples ( hotkeys, server_emission, validator_emission ) diff --git a/pallets/subtensor/src/swap/swap_hotkey.rs b/pallets/subtensor/src/swap/swap_hotkey.rs index a54a02a750..4fdf87fb7b 100644 --- a/pallets/subtensor/src/swap/swap_hotkey.rs +++ b/pallets/subtensor/src/swap/swap_hotkey.rs @@ -493,11 +493,6 @@ impl Pallet { // 8.3 Swap TaoDividendsPerSubnet // Tao dividends were removed - // 8.4 Swap VotingPower - // VotingPower( netuid, hotkey ) --> u64 -- the voting power EMA for the hotkey. - Self::swap_voting_power_for_hotkey(old_hotkey, new_hotkey, netuid); - weight.saturating_accrue(T::DbWeight::get().reads_writes(2, 2)); - // 9. Swap Alpha // Alpha( hotkey, coldkey, netuid ) -> alpha let old_alpha_values: Vec<((T::AccountId, NetUid), U64F64)> = diff --git a/pallets/subtensor/src/tests/mod.rs b/pallets/subtensor/src/tests/mod.rs index 6ce0639516..bbaf25af58 100644 --- a/pallets/subtensor/src/tests/mod.rs +++ b/pallets/subtensor/src/tests/mod.rs @@ -30,5 +30,4 @@ mod swap_coldkey; mod swap_hotkey; mod swap_hotkey_with_subnet; mod uids; -mod voting_power; mod weights; diff --git a/pallets/subtensor/src/tests/voting_power.rs b/pallets/subtensor/src/tests/voting_power.rs deleted file mode 100644 index 7edc06fbab..0000000000 --- a/pallets/subtensor/src/tests/voting_power.rs +++ /dev/null @@ -1,760 +0,0 @@ -#![allow(unused, clippy::indexing_slicing, clippy::panic, clippy::unwrap_used)] - -use alloc::collections::BTreeMap; -use frame_support::weights::Weight; -use frame_support::{assert_err, assert_noop, assert_ok}; -use frame_system::RawOrigin; -use sp_core::U256; -use subtensor_runtime_common::NetUid; - -use super::mock; -use super::mock::*; -use crate::epoch::run_epoch::EpochTerms; -use crate::utils::voting_power::{ - MAX_VOTING_POWER_EMA_ALPHA, VOTING_POWER_DISABLE_GRACE_PERIOD_BLOCKS, -}; -use crate::*; - -// ============================================ -// === Test Helpers === -// ============================================ - -const DEFAULT_STAKE_AMOUNT: u64 = 1_000_000_000_000; // 1 million RAO - -/// Build epoch output from current state for testing voting power updates. -fn build_mock_epoch_output(netuid: NetUid) -> BTreeMap { - let n = SubtensorModule::get_subnetwork_n(netuid); - let validator_permits = ValidatorPermit::::get(netuid); - - let mut output = BTreeMap::new(); - for uid in 0..n { - if let Ok(hotkey) = SubtensorModule::get_hotkey_for_net_and_uid(netuid, uid) { - let has_permit = validator_permits - .get(uid as usize) - .copied() - .unwrap_or(false); - let stake = SubtensorModule::get_stake_for_hotkey_on_subnet(&hotkey, netuid).to_u64(); - output.insert( - hotkey, - EpochTerms { - uid: uid as usize, - new_validator_permit: has_permit, - stake, - ..Default::default() - }, - ); - } - } - output -} - -/// Test fixture containing common test setup data -struct VotingPowerTestFixture { - hotkey: U256, - coldkey: U256, - netuid: NetUid, -} - -impl VotingPowerTestFixture { - /// Create a basic fixture with a dynamic network - fn new() -> Self { - let hotkey = U256::from(1); - let coldkey = U256::from(2); - let netuid = add_dynamic_network(&hotkey, &coldkey); - Self { - hotkey, - coldkey, - netuid, - } - } - - /// Setup reserves and add balance to coldkey for staking - fn setup_for_staking(&self) { - self.setup_for_staking_with_amount(DEFAULT_STAKE_AMOUNT); - } - - /// Setup reserves and add balance with custom amount - #[allow(clippy::arithmetic_side_effects)] - fn setup_for_staking_with_amount(&self, amount: u64) { - mock::setup_reserves(self.netuid, (amount * 100).into(), (amount * 100).into()); - SubtensorModule::add_balance_to_coldkey_account(&self.coldkey, amount * 10); - } - - /// Enable voting power tracking for the subnet - fn enable_tracking(&self) { - assert_ok!(SubtensorModule::enable_voting_power_tracking( - RuntimeOrigin::signed(self.coldkey), - self.netuid - )); - } - - /// Add stake from coldkey to hotkey - fn add_stake(&self, amount: u64) { - assert_ok!(SubtensorModule::add_stake( - RuntimeOrigin::signed(self.coldkey), - self.hotkey, - self.netuid, - amount.into() - )); - } - - /// Set validator permit for the hotkey (uid 0) - fn set_validator_permit(&self, has_permit: bool) { - ValidatorPermit::::insert(self.netuid, vec![has_permit]); - } - - /// Run voting power update for N epochs - fn run_epochs(&self, n: u32) { - for _ in 0..n { - let epoch_output = build_mock_epoch_output(self.netuid); - SubtensorModule::update_voting_power_for_subnet(self.netuid, &epoch_output); - } - } - - /// Get current voting power for the hotkey - fn get_voting_power(&self) -> u64 { - SubtensorModule::get_voting_power(self.netuid, &self.hotkey) - } - - /// Full setup: reserves, balance, tracking enabled, stake added, validator permit - fn setup_full(&self) { - self.setup_for_staking(); - self.enable_tracking(); - self.add_stake(DEFAULT_STAKE_AMOUNT); - self.set_validator_permit(true); - } -} - -// ============================================ -// === Test Enable/Disable Voting Power === -// ============================================ - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_enable_voting_power_tracking --exact --nocapture -#[test] -fn test_enable_voting_power_tracking() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - - // Initially disabled - assert!(!SubtensorModule::get_voting_power_tracking_enabled( - f.netuid - )); - - // Enable tracking (subnet owner can do this) - f.enable_tracking(); - - // Now enabled - assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); - assert_eq!( - SubtensorModule::get_voting_power_disable_at_block(f.netuid), - 0 - ); - }); -} - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_enable_voting_power_tracking_root_can_enable --exact --nocapture -#[test] -fn test_enable_voting_power_tracking_root_can_enable() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - - // Root can enable - assert_ok!(SubtensorModule::enable_voting_power_tracking( - RuntimeOrigin::root(), - f.netuid - )); - - assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); - }); -} - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_disable_voting_power_tracking_schedules_disable --exact --nocapture -#[test] -fn test_disable_voting_power_tracking_schedules_disable() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - f.enable_tracking(); - - let current_block = SubtensorModule::get_current_block_as_u64(); - - // Schedule disable - assert_ok!(SubtensorModule::disable_voting_power_tracking( - RuntimeOrigin::signed(f.coldkey), - f.netuid - )); - - // Still enabled, but scheduled for disable - assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); - let disable_at = SubtensorModule::get_voting_power_disable_at_block(f.netuid); - assert_eq!( - disable_at, - current_block + VOTING_POWER_DISABLE_GRACE_PERIOD_BLOCKS - ); - }); -} - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_disable_voting_power_tracking_fails_when_not_enabled --exact --nocapture -#[test] -fn test_disable_voting_power_tracking_fails_when_not_enabled() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - - // Try to disable when not enabled - assert_noop!( - SubtensorModule::disable_voting_power_tracking( - RuntimeOrigin::signed(f.coldkey), - f.netuid - ), - Error::::VotingPowerTrackingNotEnabled - ); - }); -} - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_enable_voting_power_tracking_non_owner_fails --exact --nocapture -#[test] -fn test_enable_voting_power_tracking_non_owner_fails() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - let random_account = U256::from(999); - - // Non-owner cannot enable (returns BadOrigin) - assert_noop!( - SubtensorModule::enable_voting_power_tracking( - RuntimeOrigin::signed(random_account), - f.netuid - ), - sp_runtime::DispatchError::BadOrigin - ); - - // Should still be disabled - assert!(!SubtensorModule::get_voting_power_tracking_enabled( - f.netuid - )); - }); -} - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_disable_voting_power_tracking_non_owner_fails --exact --nocapture -#[test] -fn test_disable_voting_power_tracking_non_owner_fails() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - let random_account = U256::from(999); - f.enable_tracking(); - - // Non-owner cannot disable (returns BadOrigin) - assert_noop!( - SubtensorModule::disable_voting_power_tracking( - RuntimeOrigin::signed(random_account), - f.netuid - ), - sp_runtime::DispatchError::BadOrigin - ); - - // Should still be enabled with no disable scheduled - assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); - assert_eq!( - SubtensorModule::get_voting_power_disable_at_block(f.netuid), - 0 - ); - }); -} - -// ============================================ -// === Test EMA Alpha === -// ============================================ - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_set_voting_power_ema_alpha --exact --nocapture -#[test] -fn test_set_voting_power_ema_alpha() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - - // Get default alpha - let default_alpha = SubtensorModule::get_voting_power_ema_alpha(f.netuid); - assert_eq!(default_alpha, 3_570_000_000_000_000); // 0.00357 * 10^18 = 2 weeks e-folding - - // Set new alpha (only root can do this) - let new_alpha: u64 = 500_000_000_000_000_000; // 0.5 * 10^18 - assert_ok!(SubtensorModule::sudo_set_voting_power_ema_alpha( - RuntimeOrigin::root(), - f.netuid, - new_alpha - )); - - assert_eq!( - SubtensorModule::get_voting_power_ema_alpha(f.netuid), - new_alpha - ); - }); -} - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_set_voting_power_ema_alpha_fails_above_one --exact --nocapture -#[test] -fn test_set_voting_power_ema_alpha_fails_above_one() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - - // Try to set alpha > 1.0 (> 10^18) - let invalid_alpha: u64 = MAX_VOTING_POWER_EMA_ALPHA + 1; - assert_noop!( - SubtensorModule::sudo_set_voting_power_ema_alpha( - RuntimeOrigin::root(), - f.netuid, - invalid_alpha - ), - Error::::InvalidVotingPowerEmaAlpha - ); - }); -} - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_set_voting_power_ema_alpha_non_root_fails --exact --nocapture -#[test] -fn test_set_voting_power_ema_alpha_non_root_fails() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - - // Non-root cannot set alpha - assert_noop!( - SubtensorModule::sudo_set_voting_power_ema_alpha( - RuntimeOrigin::signed(f.coldkey), - f.netuid, - 500_000_000_000_000_000 - ), - sp_runtime::DispatchError::BadOrigin - ); - }); -} - -// ============================================ -// === Test EMA Calculation === -// ============================================ - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_ema_calculation --exact --nocapture -#[test] -fn test_voting_power_ema_calculation() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - f.setup_full(); - - // Initially voting power is 0 - assert_eq!(f.get_voting_power(), 0); - - // Run epoch to update voting power - f.run_epochs(1); - - // Voting power should now be > 0 (but less than full stake due to EMA starting from 0) - let voting_power_after_first_epoch = f.get_voting_power(); - assert!(voting_power_after_first_epoch > 0); - - // Run more epochs - voting power should increase towards stake - f.run_epochs(10); - - let voting_power_after_many_epochs = f.get_voting_power(); - assert!(voting_power_after_many_epochs > voting_power_after_first_epoch); - }); -} - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_cleared_when_deregistered --exact --nocapture -#[test] -fn test_voting_power_cleared_when_deregistered() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - f.setup_full(); - - // Run epochs to build up voting power - f.run_epochs(10); - - let voting_power_before = f.get_voting_power(); - assert!(voting_power_before > 0, "Voting power should be built up"); - - // Deregister the hotkey (simulate by removing from IsNetworkMember) - IsNetworkMember::::remove(f.hotkey, f.netuid); - - // Run epoch - voting power should be cleared for deregistered hotkey - f.run_epochs(1); - - // Should be removed from storage immediately when deregistered - assert_eq!(f.get_voting_power(), 0); - assert!( - !VotingPower::::contains_key(f.netuid, f.hotkey), - "Entry should be removed when hotkey is deregistered" - ); - }); -} - -// ============================================ -// === Test Validators Only === -// ============================================ - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_only_validators_get_voting_power --exact --nocapture -#[test] -fn test_only_validators_get_voting_power() { - new_test_ext(1).execute_with(|| { - let validator_hotkey = U256::from(1); - let miner_hotkey = U256::from(2); - let coldkey = U256::from(3); - - let netuid = add_dynamic_network(&validator_hotkey, &coldkey); - - mock::setup_reserves( - netuid, - (DEFAULT_STAKE_AMOUNT * 100).into(), - (DEFAULT_STAKE_AMOUNT * 100).into(), - ); - SubtensorModule::add_balance_to_coldkey_account(&coldkey, DEFAULT_STAKE_AMOUNT * 20); - - // Register miner - register_ok_neuron(netuid, miner_hotkey, coldkey, 0); - - // Enable voting power tracking - assert_ok!(SubtensorModule::enable_voting_power_tracking( - RuntimeOrigin::signed(coldkey), - netuid - )); - - // Add stake to both - assert_ok!(SubtensorModule::add_stake( - RuntimeOrigin::signed(coldkey), - validator_hotkey, - netuid, - DEFAULT_STAKE_AMOUNT.into() - )); - assert_ok!(SubtensorModule::add_stake( - RuntimeOrigin::signed(coldkey), - miner_hotkey, - netuid, - DEFAULT_STAKE_AMOUNT.into() - )); - - // Set validator permit: uid 0 (validator) has permit, uid 1 (miner) does not - ValidatorPermit::::insert(netuid, vec![true, false]); - - // Run epoch - let epoch_output = build_mock_epoch_output(netuid); - SubtensorModule::update_voting_power_for_subnet(netuid, &epoch_output); - - // Only validator should have voting power - assert!(SubtensorModule::get_voting_power(netuid, &validator_hotkey) > 0); - assert_eq!(SubtensorModule::get_voting_power(netuid, &miner_hotkey), 0); - }); -} - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_miner_voting_power_removed_when_loses_vpermit --exact --nocapture -#[test] -fn test_miner_voting_power_removed_when_loses_vpermit() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - f.setup_full(); - - // Run epochs to build voting power - f.run_epochs(10); - - let voting_power_before = f.get_voting_power(); - assert!(voting_power_before > 0); - - // Remove validator permit (now they're a miner) - f.set_validator_permit(false); - - // Run epoch - voting power should be removed - f.run_epochs(1); - - assert_eq!(f.get_voting_power(), 0); - }); -} - -// ============================================ -// === Test Hotkey Swap === -// ============================================ - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_transfers_on_hotkey_swap --exact --nocapture -#[test] -fn test_voting_power_transfers_on_hotkey_swap() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - let new_hotkey = U256::from(99); - let voting_power_value = 5_000_000_000_000_u64; - - // Set some voting power for the old hotkey - VotingPower::::insert(f.netuid, f.hotkey, voting_power_value); - - // Verify old hotkey has voting power - assert_eq!(f.get_voting_power(), voting_power_value); - assert_eq!(SubtensorModule::get_voting_power(f.netuid, &new_hotkey), 0); - - // Perform hotkey swap for this subnet - SubtensorModule::swap_voting_power_for_hotkey(&f.hotkey, &new_hotkey, f.netuid); - - // Old hotkey should have 0, new hotkey should have the voting power - assert_eq!(f.get_voting_power(), 0); - assert_eq!( - SubtensorModule::get_voting_power(f.netuid, &new_hotkey), - voting_power_value - ); - }); -} - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_swap_adds_to_existing --exact --nocapture -#[test] -fn test_voting_power_swap_adds_to_existing() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - let new_hotkey = U256::from(99); - let old_voting_power = 5_000_000_000_000_u64; - let new_existing_voting_power = 2_000_000_000_000_u64; - - // Set voting power for both hotkeys - VotingPower::::insert(f.netuid, f.hotkey, old_voting_power); - VotingPower::::insert(f.netuid, new_hotkey, new_existing_voting_power); - - // Perform swap - SubtensorModule::swap_voting_power_for_hotkey(&f.hotkey, &new_hotkey, f.netuid); - - // New hotkey should have combined voting power - assert_eq!(f.get_voting_power(), 0); - assert_eq!( - SubtensorModule::get_voting_power(f.netuid, &new_hotkey), - old_voting_power + new_existing_voting_power - ); - }); -} - -// ============================================ -// === Test Threshold Logic === -// ============================================ -// Tests the rule: Only remove voting power entry if it decayed FROM above threshold TO below. -// New validators building up from 0 should NOT be removed even if below threshold. - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_not_removed_if_never_above_threshold --exact --nocapture -#[test] -fn test_voting_power_not_removed_if_never_above_threshold() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - f.setup_full(); - - // Get the threshold - let min_stake = SubtensorModule::get_stake_threshold(); - - // Set voting power directly to a value below threshold (simulating building up) - // This is below threshold but was never above it - let below_threshold = min_stake.saturating_sub(1); - VotingPower::::insert(f.netuid, f.hotkey, below_threshold); - - // Run epoch - f.run_epochs(1); - - // Key assertion: Entry should NOT be removed because previous_ema was below threshold - // The removal rule only triggers when previous_ema >= threshold and new_ema < threshold - let voting_power = f.get_voting_power(); - assert!( - voting_power > 0, - "Voting power should still exist - it was never above threshold" - ); - assert!( - VotingPower::::contains_key(f.netuid, f.hotkey), - "Entry should exist - it was never above threshold so shouldn't be removed" - ); - }); -} - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_not_removed_with_small_dip_below_threshold --exact --nocapture -#[test] -fn test_voting_power_not_removed_with_small_dip_below_threshold() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - f.setup_for_staking(); - f.enable_tracking(); - f.set_validator_permit(true); - - let min_stake = SubtensorModule::get_stake_threshold(); - - // Set voting power above threshold (validator was established) - let above_threshold = min_stake + 100; - VotingPower::::insert(f.netuid, f.hotkey, above_threshold); - - // Simulate a small dip: new EMA drops to 95% of threshold (within 10% buffer) - // This is above the removal threshold (90%) so should NOT be removed - let small_dip = min_stake * 95 / 100; - VotingPower::::insert(f.netuid, f.hotkey, small_dip); - - // Manually trigger the removal check by setting previous to above threshold - // and running with stake that would produce EMA in the buffer zone - VotingPower::::insert(f.netuid, f.hotkey, above_threshold); - - // Build epoch output with stake that will produce EMA around 95% of threshold - let mut epoch_output = build_mock_epoch_output(f.netuid); - if let Some(terms) = epoch_output.get_mut(&f.hotkey) { - terms.stake = small_dip; // Stake drops but stays in buffer zone - } - - SubtensorModule::update_voting_power_for_subnet(f.netuid, &epoch_output); - - // Should NOT be removed - dip is within hysteresis buffer - assert!( - VotingPower::::contains_key(f.netuid, f.hotkey), - "Entry should exist - small dip within 10% buffer should not trigger removal" - ); - }); -} - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_removed_with_significant_drop_below_threshold --exact --nocapture -#[test] -fn test_voting_power_removed_with_significant_drop_below_threshold() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - f.enable_tracking(); - - // Use explicit values since get_stake_threshold() may return 0 in tests - let min_stake: u64 = 1_000_000_000; - StakeThreshold::::put(min_stake); - - // Set voting power above threshold (validator was established) - VotingPower::::insert(f.netuid, f.hotkey, min_stake); - - // Set alpha to 100% so new_ema = current_stake directly (for testing removal) - VotingPowerEmaAlpha::::insert(f.netuid, MAX_VOTING_POWER_EMA_ALPHA); - - // Build epoch output manually with stake = 0 and validator permit = true - let mut epoch_output = BTreeMap::new(); - epoch_output.insert( - f.hotkey, - EpochTerms { - uid: 0, - new_validator_permit: true, - stake: 0, // Complete unstake - ..Default::default() - }, - ); - - // With alpha = 1.0: new_ema = 1.0 * 0 + 0 * previous = 0 - // 0 < removal_threshold (90% of min_stake = 900M) AND previous (1B) >= min_stake (1B) - // Should trigger removal - SubtensorModule::update_voting_power_for_subnet(f.netuid, &epoch_output); - - assert!( - !VotingPower::::contains_key(f.netuid, f.hotkey), - "Entry should be removed - stake dropped to 0 with alpha=1.0" - ); - }); -} - -// ============================================ -// === Test Tracking Not Active === -// ============================================ - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_not_updated_when_disabled --exact --nocapture -#[test] -fn test_voting_power_not_updated_when_disabled() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - f.setup_for_staking(); - // DON'T enable voting power tracking - f.add_stake(DEFAULT_STAKE_AMOUNT); - f.set_validator_permit(true); - - // Run epoch - f.run_epochs(1); - - // Voting power should still be 0 since tracking is disabled - assert_eq!(f.get_voting_power(), 0); - }); -} - -// ============================================ -// === Test Re-enable After Disable === -// ============================================ - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_reenable_voting_power_clears_disable_schedule --exact --nocapture -#[test] -fn test_reenable_voting_power_clears_disable_schedule() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - f.enable_tracking(); - - // Schedule disable - assert_ok!(SubtensorModule::disable_voting_power_tracking( - RuntimeOrigin::signed(f.coldkey), - f.netuid - )); - - assert!(SubtensorModule::get_voting_power_disable_at_block(f.netuid) > 0); - - // Re-enable should clear the disable schedule - f.enable_tracking(); - - assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); - assert_eq!( - SubtensorModule::get_voting_power_disable_at_block(f.netuid), - 0 - ); - }); -} - -// ============================================ -// === Test Grace Period Finalization === -// ============================================ - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_finalized_after_grace_period --exact --nocapture -#[test] -fn test_voting_power_finalized_after_grace_period() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - f.setup_full(); - - // Build up voting power - f.run_epochs(10); - - let voting_power_before = f.get_voting_power(); - assert!(voting_power_before > 0); - - // Schedule disable - assert_ok!(SubtensorModule::disable_voting_power_tracking( - RuntimeOrigin::signed(f.coldkey), - f.netuid - )); - - let disable_at = SubtensorModule::get_voting_power_disable_at_block(f.netuid); - - // Advance block past grace period (time travel!) - System::set_block_number(disable_at + 1); - - // Run epoch - should finalize disable - f.run_epochs(1); - - // Tracking should be disabled and all entries cleared - assert!(!SubtensorModule::get_voting_power_tracking_enabled( - f.netuid - )); - assert_eq!( - SubtensorModule::get_voting_power_disable_at_block(f.netuid), - 0 - ); - assert_eq!(f.get_voting_power(), 0); - }); -} - -// SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::voting_power::test_voting_power_continues_during_grace_period --exact --nocapture -#[test] -fn test_voting_power_continues_during_grace_period() { - new_test_ext(1).execute_with(|| { - let f = VotingPowerTestFixture::new(); - f.setup_full(); - - // Schedule disable - assert_ok!(SubtensorModule::disable_voting_power_tracking( - RuntimeOrigin::signed(f.coldkey), - f.netuid - )); - - let disable_at = SubtensorModule::get_voting_power_disable_at_block(f.netuid); - - // Set block to middle of grace period (time travel!) - System::set_block_number(disable_at - 1000); - - // Run epoch - should still update voting power during grace period - f.run_epochs(1); - - // Tracking should still be enabled and voting power should exist - assert!(SubtensorModule::get_voting_power_tracking_enabled(f.netuid)); - assert!(f.get_voting_power() > 0); - }); -} diff --git a/pallets/subtensor/src/utils/mod.rs b/pallets/subtensor/src/utils/mod.rs index a91875da59..3eb8439959 100644 --- a/pallets/subtensor/src/utils/mod.rs +++ b/pallets/subtensor/src/utils/mod.rs @@ -5,4 +5,3 @@ pub mod misc; pub mod rate_limiting; #[cfg(feature = "try-runtime")] pub mod try_state; -pub mod voting_power; diff --git a/pallets/subtensor/src/utils/voting_power.rs b/pallets/subtensor/src/utils/voting_power.rs deleted file mode 100644 index 380861bbf5..0000000000 --- a/pallets/subtensor/src/utils/voting_power.rs +++ /dev/null @@ -1,280 +0,0 @@ -use super::*; -use crate::epoch::run_epoch::EpochTerms; -use alloc::collections::BTreeMap; -use subtensor_runtime_common::NetUid; - -/// 14 days in blocks (assuming ~12 second blocks) -/// 14 * 24 * 60 * 60 / 12 = 100800 blocks -pub const VOTING_POWER_DISABLE_GRACE_PERIOD_BLOCKS: u64 = 100800; - -/// Maximum alpha value (1.0 represented as u64 with 18 decimals) -pub const MAX_VOTING_POWER_EMA_ALPHA: u64 = 1_000_000_000_000_000_000; - -impl Pallet { - // ======================== - // === Getters === - // ======================== - - /// Get voting power for a hotkey on a subnet. - /// Returns 0 if not found or tracking disabled. - pub fn get_voting_power(netuid: NetUid, hotkey: &T::AccountId) -> u64 { - VotingPower::::get(netuid, hotkey) - } - - /// Check if voting power tracking is enabled for a subnet. - pub fn get_voting_power_tracking_enabled(netuid: NetUid) -> bool { - VotingPowerTrackingEnabled::::get(netuid) - } - - /// Get the block at which voting power tracking will be disabled. - /// Returns 0 if not scheduled for disabling. - pub fn get_voting_power_disable_at_block(netuid: NetUid) -> u64 { - VotingPowerDisableAtBlock::::get(netuid) - } - - /// Get the EMA alpha value for voting power calculation on a subnet. - pub fn get_voting_power_ema_alpha(netuid: NetUid) -> u64 { - VotingPowerEmaAlpha::::get(netuid) - } - - // ======================== - // === Extrinsic Handlers === - // ======================== - - /// Enable voting power tracking for a subnet. - pub fn do_enable_voting_power_tracking(netuid: NetUid) -> DispatchResult { - // Enable tracking - VotingPowerTrackingEnabled::::insert(netuid, true); - - // Clear any scheduled disable - VotingPowerDisableAtBlock::::remove(netuid); - - // Emit event - Self::deposit_event(Event::VotingPowerTrackingEnabled { netuid }); - - log::info!("VotingPower tracking enabled for netuid {netuid:?}"); - - Ok(()) - } - - /// Schedule disabling of voting power tracking for a subnet. - /// Tracking will continue for 14 days, then automatically disable. - pub fn do_disable_voting_power_tracking(netuid: NetUid) -> DispatchResult { - // Check if tracking is enabled - ensure!( - Self::get_voting_power_tracking_enabled(netuid), - Error::::VotingPowerTrackingNotEnabled - ); - - // Calculate the block at which tracking will be disabled - let current_block = Self::get_current_block_as_u64(); - let disable_at_block = - current_block.saturating_add(VOTING_POWER_DISABLE_GRACE_PERIOD_BLOCKS); - - // Schedule disable - VotingPowerDisableAtBlock::::insert(netuid, disable_at_block); - - // Emit event - Self::deposit_event(Event::VotingPowerTrackingDisableScheduled { - netuid, - disable_at_block, - }); - - log::info!( - "VotingPower tracking scheduled to disable at block {disable_at_block:?} for netuid {netuid:?}" - ); - - Ok(()) - } - - /// Set the EMA alpha value for voting power calculation on a subnet. - pub fn do_set_voting_power_ema_alpha(netuid: NetUid, alpha: u64) -> DispatchResult { - // Validate alpha (must be <= 1.0, represented as 10^18) - ensure!( - alpha <= MAX_VOTING_POWER_EMA_ALPHA, - Error::::InvalidVotingPowerEmaAlpha - ); - - // Set the alpha - VotingPowerEmaAlpha::::insert(netuid, alpha); - - // Emit event - Self::deposit_event(Event::VotingPowerEmaAlphaSet { netuid, alpha }); - - log::info!("VotingPower EMA alpha set to {alpha:?} for netuid {netuid:?}"); - - Ok(()) - } - - // ======================== - // === Epoch Processing === - // ======================== - - /// Update voting power for all validators on a subnet using pre-calculated epoch terms. - pub fn update_voting_power_for_subnet( - netuid: NetUid, - epoch_output: &BTreeMap, - ) { - // Early exit if tracking not enabled - if !Self::get_voting_power_tracking_enabled(netuid) { - return; - } - - // Check if past grace period and should finalize disable - let disable_at = Self::get_voting_power_disable_at_block(netuid); - if disable_at > 0 { - let current_block = Self::get_current_block_as_u64(); - if current_block >= disable_at { - Self::finalize_voting_power_disable(netuid); - return; - } - // Still in grace period - continue updating - } - - // Get the EMA alpha value for this subnet - let alpha = Self::get_voting_power_ema_alpha(netuid); - - // Get minimum stake threshold for validator permit - let min_stake = Self::get_stake_threshold(); - - // Iterate over epoch output using pre-calculated values - for (hotkey, terms) in epoch_output.iter() { - // Only validators (with vpermit) get voting power, not miners - if terms.new_validator_permit { - // Use the subnet-specific stake from epoch calculation - Self::update_voting_power_for_hotkey(netuid, hotkey, terms.stake, alpha, min_stake); - } else { - // Miner without vpermit - remove any existing voting power - VotingPower::::remove(netuid, hotkey); - } - } - - // Remove voting power for any hotkeys that are no longer registered on this subnet - Self::clear_voting_power_for_deregistered_hotkeys(netuid); - - log::trace!("VotingPower updated for validators on netuid {netuid:?}"); - } - - /// Clear voting power for hotkeys that are no longer registered on the subnet. - fn clear_voting_power_for_deregistered_hotkeys(netuid: NetUid) { - // Collect hotkeys to remove (can't mutate while iterating) - let hotkeys_to_remove: Vec = VotingPower::::iter_prefix(netuid) - .filter_map(|(hotkey, _)| { - // If the hotkey is not a network member, it's deregistered - if !IsNetworkMember::::get(&hotkey, netuid) { - Some(hotkey) - } else { - None - } - }) - .collect(); - - // Remove voting power for deregistered hotkeys - for hotkey in hotkeys_to_remove { - VotingPower::::remove(netuid, &hotkey); - log::trace!( - "VotingPower removed for deregistered hotkey {hotkey:?} on netuid {netuid:?}" - ); - } - } - - /// Update voting power EMA for a single hotkey using subnet-specific stake. - fn update_voting_power_for_hotkey( - netuid: NetUid, - hotkey: &T::AccountId, - current_stake: u64, - alpha: u64, - min_stake: u64, - ) { - // Get previous EMA value - let previous_ema = VotingPower::::get(netuid, hotkey); - - // Calculate new EMA value - // new_ema = alpha * current_stake + (1 - alpha) * previous_ema - // All values use 18 decimal precision for alpha (alpha is in range [0, 10^18]) - let new_ema = Self::calculate_voting_power_ema(current_stake, previous_ema, alpha); - - // Only remove if they previously had voting power ABOVE threshold and decayed below. - // This allows new validators to build up voting power from 0 without being removed. - if new_ema < min_stake && previous_ema >= min_stake { - // Was above threshold, now decayed below - remove - VotingPower::::remove(netuid, hotkey); - log::trace!( - "VotingPower removed for hotkey {hotkey:?} on netuid {netuid:?} (decayed below removal threshold: {new_ema:?} < {min_stake:?})" - ); - } else if new_ema > 0 { - // Update voting power (building up or maintaining) - VotingPower::::insert(netuid, hotkey, new_ema); - log::trace!( - "VotingPower updated for hotkey {hotkey:?} on netuid {netuid:?}: {previous_ema:?} -> {new_ema:?}" - ); - } - // If new_ema == 0 do nothing - } - - /// Calculate EMA for voting power. - /// new_ema = alpha * current_stake + (1 - alpha) * previous_ema - /// Alpha is in 18 decimal precision (10^18 = 1.0) - fn calculate_voting_power_ema(current_stake: u64, previous_ema: u64, alpha: u64) -> u64 { - // Use u128 for intermediate calculations to avoid overflow - let alpha_128 = alpha as u128; - let one_minus_alpha = (MAX_VOTING_POWER_EMA_ALPHA as u128).saturating_sub(alpha_128); - let current_128 = current_stake as u128; - let previous_128 = previous_ema as u128; - - // new_ema = (alpha * current_stake + (1 - alpha) * previous_ema) / 10^18 - let numerator = alpha_128 - .saturating_mul(current_128) - .saturating_add(one_minus_alpha.saturating_mul(previous_128)); - - let result = numerator - .checked_div(MAX_VOTING_POWER_EMA_ALPHA as u128) - .unwrap_or(0); - - // Safely convert back to u64, saturating at u64::MAX - result.min(u64::MAX as u128) as u64 - } - - /// Finalize the disabling of voting power tracking. - /// Clears all VotingPower entries for the subnet. - fn finalize_voting_power_disable(netuid: NetUid) { - // Clear all VotingPower entries for this subnet - let _ = VotingPower::::clear_prefix(netuid, u32::MAX, None); - - // Disable tracking - VotingPowerTrackingEnabled::::insert(netuid, false); - - // Clear disable schedule - VotingPowerDisableAtBlock::::remove(netuid); - - // Emit event - Self::deposit_event(Event::VotingPowerTrackingDisabled { netuid }); - - log::info!("VotingPower tracking disabled and entries cleared for netuid {netuid:?}"); - } - - // ======================== - // === Hotkey Swap === - // ======================== - - /// Transfer voting power from old hotkey to new hotkey during swap. - pub fn swap_voting_power_for_hotkey( - old_hotkey: &T::AccountId, - new_hotkey: &T::AccountId, - netuid: NetUid, - ) { - // Get voting power from old hotkey - let voting_power = VotingPower::::take(netuid, old_hotkey); - - // Transfer to new hotkey if non-zero - if voting_power > 0 { - // Add to any existing voting power on new hotkey (in case new hotkey already has some) - let existing = VotingPower::::get(netuid, new_hotkey); - VotingPower::::insert(netuid, new_hotkey, voting_power.saturating_add(existing)); - - log::trace!( - "VotingPower transferred from {old_hotkey:?} to {new_hotkey:?} on netuid {netuid:?}: {voting_power:?}" - ); - } - } -} diff --git a/precompiles/src/lib.rs b/precompiles/src/lib.rs index abc5e744b2..864119d89f 100644 --- a/precompiles/src/lib.rs +++ b/precompiles/src/lib.rs @@ -41,7 +41,6 @@ use crate::staking::*; use crate::storage_query::*; use crate::subnet::*; use crate::uid_lookup::*; -use crate::voting_power::*; mod address_mapping; mod alpha; @@ -58,7 +57,6 @@ mod staking; mod storage_query; mod subnet; mod uid_lookup; -mod voting_power; pub struct Precompiles(PhantomData); @@ -127,7 +125,7 @@ where Self(Default::default()) } - pub fn used_addresses() -> [H160; 27] { + pub fn used_addresses() -> [H160; 26] { [ hash(1), hash(2), @@ -153,7 +151,6 @@ where hash(AlphaPrecompile::::INDEX), hash(CrowdloanPrecompile::::INDEX), hash(LeasingPrecompile::::INDEX), - hash(VotingPowerPrecompile::::INDEX), hash(ProxyPrecompile::::INDEX), hash(AddressMappingPrecompile::::INDEX), ] @@ -248,9 +245,6 @@ where a if a == hash(LeasingPrecompile::::INDEX) => { LeasingPrecompile::::try_execute::(handle, PrecompileEnum::Leasing) } - a if a == hash(VotingPowerPrecompile::::INDEX) => { - VotingPowerPrecompile::::try_execute::(handle, PrecompileEnum::VotingPower) - } a if a == hash(ProxyPrecompile::::INDEX) => { ProxyPrecompile::::try_execute::(handle, PrecompileEnum::Proxy) } diff --git a/precompiles/src/voting_power.rs b/precompiles/src/voting_power.rs deleted file mode 100644 index 74e1731b6e..0000000000 --- a/precompiles/src/voting_power.rs +++ /dev/null @@ -1,131 +0,0 @@ -use core::marker::PhantomData; - -use fp_evm::PrecompileHandle; -use precompile_utils::EvmResult; -use sp_core::{ByteArray, H256, U256}; -use subtensor_runtime_common::NetUid; - -use crate::PrecompileExt; - -/// VotingPower precompile for smart contract access to validator voting power. -/// -/// This precompile allows smart contracts to query voting power for validators, -/// enabling on-chain governance decisions like slashing and spending. -pub struct VotingPowerPrecompile(PhantomData); - -impl PrecompileExt for VotingPowerPrecompile -where - R: frame_system::Config + pallet_subtensor::Config, - R::AccountId: From<[u8; 32]> + ByteArray, -{ - const INDEX: u64 = 2061; -} - -#[precompile_utils::precompile] -impl VotingPowerPrecompile -where - R: frame_system::Config + pallet_subtensor::Config, - R::AccountId: From<[u8; 32]>, -{ - /// Get voting power for a hotkey on a subnet. - /// - /// Returns the EMA of stake for the hotkey, which represents its voting power. - /// Returns 0 if: - /// - The hotkey has no voting power entry - /// - Voting power tracking is not enabled for the subnet - /// - The hotkey is not registered on the subnet - /// - /// # Arguments - /// * `netuid` - The subnet identifier (u16) - /// * `hotkey` - The hotkey account ID (bytes32) - /// - /// # Returns - /// * `u256` - The voting power value (in RAO, same precision as stake) - #[precompile::public("getVotingPower(uint16,bytes32)")] - #[precompile::view] - fn get_voting_power( - _: &mut impl PrecompileHandle, - netuid: u16, - hotkey: H256, - ) -> EvmResult { - let hotkey = R::AccountId::from(hotkey.0); - let voting_power = pallet_subtensor::VotingPower::::get(NetUid::from(netuid), &hotkey); - Ok(U256::from(voting_power)) - } - - /// Check if voting power tracking is enabled for a subnet. - /// - /// # Arguments - /// * `netuid` - The subnet identifier (u16) - /// - /// # Returns - /// * `bool` - True if voting power tracking is enabled - #[precompile::public("isVotingPowerTrackingEnabled(uint16)")] - #[precompile::view] - fn is_voting_power_tracking_enabled( - _: &mut impl PrecompileHandle, - netuid: u16, - ) -> EvmResult { - Ok(pallet_subtensor::VotingPowerTrackingEnabled::::get( - NetUid::from(netuid), - )) - } - - /// Get the block at which voting power tracking will be disabled. - /// - /// Returns 0 if not scheduled for disabling. - /// When non-zero, tracking continues until this block, then stops. - /// - /// # Arguments - /// * `netuid` - The subnet identifier (u16) - /// - /// # Returns - /// * `u64` - The block number at which tracking will be disabled (0 if not scheduled) - #[precompile::public("getVotingPowerDisableAtBlock(uint16)")] - #[precompile::view] - fn get_voting_power_disable_at_block( - _: &mut impl PrecompileHandle, - netuid: u16, - ) -> EvmResult { - Ok(pallet_subtensor::VotingPowerDisableAtBlock::::get( - NetUid::from(netuid), - )) - } - - /// Get the EMA alpha value for voting power calculation on a subnet. - /// - /// Alpha is stored with 18 decimal precision (1.0 = 10^18). - /// Higher alpha = faster response to stake changes. - /// - /// # Arguments - /// * `netuid` - The subnet identifier (u16) - /// - /// # Returns - /// * `u64` - The alpha value (with 18 decimal precision) - #[precompile::public("getVotingPowerEmaAlpha(uint16)")] - #[precompile::view] - fn get_voting_power_ema_alpha(_: &mut impl PrecompileHandle, netuid: u16) -> EvmResult { - Ok(pallet_subtensor::VotingPowerEmaAlpha::::get( - NetUid::from(netuid), - )) - } - - /// Get total voting power for a subnet. - /// - /// Returns the sum of all voting power for all validators on the subnet. - /// Useful for calculating voting thresholds (e.g., 51% quorum). - /// - /// # Arguments - /// * `netuid` - The subnet identifier (u16) - /// - /// # Returns - /// * `u256` - The total voting power across all validators - #[precompile::public("getTotalVotingPower(uint16)")] - #[precompile::view] - fn get_total_voting_power(_: &mut impl PrecompileHandle, netuid: u16) -> EvmResult { - let total: u64 = pallet_subtensor::VotingPower::::iter_prefix(NetUid::from(netuid)) - .map(|(_, voting_power)| voting_power) - .fold(0u64, |acc, vp| acc.saturating_add(vp)); - Ok(U256::from(total)) - } -} From a120a52f6c65f71639fb5e6dc8e096030fe64584 Mon Sep 17 00:00:00 2001 From: John Reed <87283488+JohnReedV@users.noreply.github.com> Date: Tue, 20 Jan 2026 12:04:53 -0800 Subject: [PATCH 67/70] Update proposer.rs --- node/src/mev_shield/proposer.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/node/src/mev_shield/proposer.rs b/node/src/mev_shield/proposer.rs index 7a23a3fd08..fb459cd6db 100644 --- a/node/src/mev_shield/proposer.rs +++ b/node/src/mev_shield/proposer.rs @@ -167,9 +167,6 @@ pub fn spawn_revealer( let mut import_stream = client.import_notification_stream(); while let Some(notif) = import_stream.next().await { - if notif.origin != BlockOrigin::Own { - continue; - } let at_hash = notif.hash; let block_number_u64: u64 = (*notif.header.number()).saturated_into(); From bf6e6513171ff0ea6e3e0865febd7a4897e0e169 Mon Sep 17 00:00:00 2001 From: John Reed <87283488+JohnReedV@users.noreply.github.com> Date: Tue, 20 Jan 2026 12:18:16 -0800 Subject: [PATCH 68/70] bump spec --- runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index e5491e1eea..225c2e2706 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -241,7 +241,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // `spec_version`, and `authoring_version` are the same between Wasm and native. // This value is set to 100 to notify Polkadot-JS App (https://polkadot.js.org/apps) to use // the compatible custom types. - spec_version: 370, + spec_version: 371, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, From b9e7f9637107ce2d2e6c23b652a5facc858a1034 Mon Sep 17 00:00:00 2001 From: John Reed <87283488+JohnReedV@users.noreply.github.com> Date: Tue, 20 Jan 2026 13:44:00 -0800 Subject: [PATCH 69/70] remove error --- node/src/mev_shield/proposer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/src/mev_shield/proposer.rs b/node/src/mev_shield/proposer.rs index fb459cd6db..849d78c330 100644 --- a/node/src/mev_shield/proposer.rs +++ b/node/src/mev_shield/proposer.rs @@ -647,7 +647,7 @@ pub fn spawn_revealer( error_message, hex::encode(aead_body_hash), ); - failed_calls.push((id, create_failed_call(id, error_message))); + //failed_calls.push((id, create_failed_call(id, error_message))); continue; } }; From f9cb60d9eefb33eaf5d93307cef0cced7e51e0f0 Mon Sep 17 00:00:00 2001 From: John Reed <87283488+JohnReedV@users.noreply.github.com> Date: Tue, 20 Jan 2026 13:44:39 -0800 Subject: [PATCH 70/70] clippy --- node/src/mev_shield/proposer.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/node/src/mev_shield/proposer.rs b/node/src/mev_shield/proposer.rs index 849d78c330..a9a854e362 100644 --- a/node/src/mev_shield/proposer.rs +++ b/node/src/mev_shield/proposer.rs @@ -4,7 +4,6 @@ use ml_kem::kem::{Decapsulate, DecapsulationKey}; use ml_kem::{Ciphertext, Encoded, EncodedSizeUser, MlKem768, MlKem768Params}; use sc_service::SpawnTaskHandle; use sc_transaction_pool_api::{TransactionPool, TransactionSource}; -use sp_consensus::BlockOrigin; use sp_core::H256; use sp_runtime::traits::{Header, SaturatedConversion}; use sp_runtime::{AccountId32, OpaqueExtrinsic};