diff --git a/pallets/subtensor/src/benchmarks.rs b/pallets/subtensor/src/benchmarks.rs index 1e7d6991c1..223c086419 100644 --- a/pallets/subtensor/src/benchmarks.rs +++ b/pallets/subtensor/src/benchmarks.rs @@ -1619,6 +1619,7 @@ mod pallet_benchmarks { netuid, AlphaCurrency::ZERO, pending_root_alpha.into(), + pending_root_alpha.into(), AlphaCurrency::ZERO, ); diff --git a/pallets/subtensor/src/coinbase/root.rs b/pallets/subtensor/src/coinbase/root.rs index 80965f0bbb..893f855f3e 100644 --- a/pallets/subtensor/src/coinbase/root.rs +++ b/pallets/subtensor/src/coinbase/root.rs @@ -314,7 +314,8 @@ impl Pallet { // --- 15. Mechanism step / emissions bookkeeping. FirstEmissionBlockNumber::::remove(netuid); - PendingEmission::::remove(netuid); + PendingValidatorEmission::::remove(netuid); + PendingServerEmission::::remove(netuid); PendingRootAlphaDivs::::remove(netuid); PendingOwnerCut::::remove(netuid); BlocksSinceLastStep::::remove(netuid); diff --git a/pallets/subtensor/src/coinbase/run_coinbase.rs b/pallets/subtensor/src/coinbase/run_coinbase.rs index d998ad1f7d..33f05b68a4 100644 --- a/pallets/subtensor/src/coinbase/run_coinbase.rs +++ b/pallets/subtensor/src/coinbase/run_coinbase.rs @@ -195,37 +195,48 @@ impl Pallet { let alpha_out_i: U96F32 = *alpha_out.get(netuid_i).unwrap_or(&asfloat!(0.0)); log::debug!("alpha_out_i: {alpha_out_i:?}"); - // Get root proportion of alpha_out dividends. - let mut root_alpha: U96F32 = asfloat!(0.0); + // Get ALPHA issuance. + let alpha_issuance: U96F32 = asfloat!(Self::get_alpha_issuance(*netuid_i)); + log::debug!("alpha_issuance: {alpha_issuance:?}"); + + // Get root proportional dividends. + let root_proportion: U96F32 = tao_weight + .checked_div(tao_weight.saturating_add(alpha_issuance)) + .unwrap_or(asfloat!(0.0)); + log::debug!("root_proportion: {root_proportion:?}"); + + // Get root alpha from root prop. + let root_alpha: U96F32 = root_proportion + .saturating_mul(alpha_out_i) // Total alpha emission per block remaining. + .saturating_mul(asfloat!(0.5)); // 50% to validators. + log::debug!("root_alpha: {root_alpha:?}"); + if root_sell_flag { - // Get ALPHA issuance. - let alpha_issuance: U96F32 = asfloat!(Self::get_alpha_issuance(*netuid_i)); - log::debug!("alpha_issuance: {alpha_issuance:?}"); - - // Get root proportional dividends. - let root_proportion: U96F32 = tao_weight - .checked_div(tao_weight.saturating_add(alpha_issuance)) - .unwrap_or(asfloat!(0.0)); - log::debug!("root_proportion: {root_proportion:?}"); - - // Get root alpha from root prop. - root_alpha = root_proportion - .saturating_mul(alpha_out_i) // Total alpha emission per block remaining. - .saturating_mul(asfloat!(0.5)); // 50% to validators. + // Only accumulate root alpha divs if root sell is allowed. PendingRootAlphaDivs::::mutate(*netuid_i, |total| { *total = total.saturating_add(tou64!(root_alpha).into()); }); + } else { + // If we are not selling the root alpha, we should recycle it. + Self::recycle_subnet_alpha(*netuid_i, AlphaCurrency::from(tou64!(root_alpha))); } - // Remove root alpha from alpha_out. - log::debug!("root_alpha: {root_alpha:?}"); - // Get pending alpha as original alpha_out - root_alpha. - let pending_alpha: U96F32 = alpha_out_i.saturating_sub(root_alpha); - log::debug!("pending_alpha: {pending_alpha:?}"); + // Get pending server alpha, which is the miner cut of the alpha out. + // Currently miner cut is 50% of the alpha out. + let pending_server_alpha = alpha_out_i.saturating_mul(asfloat!(0.5)); + // The total validator alpha is the remaining alpha out minus the server alpha. + let total_validator_alpha = alpha_out_i.saturating_sub(pending_server_alpha); - // Accumulate alpha emission in pending. - PendingEmission::::mutate(*netuid_i, |total| { - *total = total.saturating_add(tou64!(pending_alpha).into()); + // The alpha validators don't get the root alpha. + let pending_validator_alpha = total_validator_alpha.saturating_sub(root_alpha); + + // Accumulate the server alpha emission. + PendingServerEmission::::mutate(*netuid_i, |total| { + *total = total.saturating_add(tou64!(pending_server_alpha).into()); + }); + // Accumulate the validator alpha emission. + PendingValidatorEmission::::mutate(*netuid_i, |total| { + *total = total.saturating_add(tou64!(pending_validator_alpha).into()); }); } @@ -252,8 +263,11 @@ impl Pallet { LastMechansimStepBlock::::insert(netuid, current_block); // Get and drain the subnet pending emission. - let pending_alpha = PendingEmission::::get(netuid); - PendingEmission::::insert(netuid, AlphaCurrency::ZERO); + let pending_server_alpha = PendingServerEmission::::get(netuid); + PendingServerEmission::::insert(netuid, AlphaCurrency::ZERO); + + let pending_validator_alpha = PendingValidatorEmission::::get(netuid); + PendingValidatorEmission::::insert(netuid, AlphaCurrency::ZERO); // Get and drain the subnet pending root alpha divs. let pending_root_alpha = PendingRootAlphaDivs::::get(netuid); @@ -264,7 +278,13 @@ impl Pallet { PendingOwnerCut::::insert(netuid, AlphaCurrency::ZERO); // Distribute the emission. - Self::distribute_emission(netuid, pending_alpha, pending_root_alpha, owner_cut); + Self::distribute_emission( + netuid, + pending_server_alpha, + pending_validator_alpha, + pending_root_alpha, + owner_cut, + ); } else { // Increment BlocksSinceLastStep::::mutate(netuid, |total| *total = total.saturating_add(1)); @@ -633,20 +653,23 @@ impl Pallet { pub fn distribute_emission( netuid: NetUid, - pending_alpha: AlphaCurrency, + pending_server_alpha: AlphaCurrency, + pending_validator_alpha: AlphaCurrency, pending_root_alpha: AlphaCurrency, - owner_cut: AlphaCurrency, + pending_owner_cut: AlphaCurrency, ) { log::debug!( - "Draining pending alpha emission for netuid {netuid:?}, pending_alpha: {pending_alpha:?}, pending_root_alpha: {pending_root_alpha:?}, owner_cut: {owner_cut:?}" + "Draining pending alpha emission for netuid {netuid:?}, pending_server_alpha: {pending_server_alpha:?}, pending_validator_alpha: {pending_validator_alpha:?}, pending_root_alpha: {pending_root_alpha:?}, pending_owner_cut: {pending_owner_cut:?}" ); let tao_weight = Self::get_tao_weight(); - let total_alpha = pending_alpha.saturating_add(pending_root_alpha); + let total_alpha_minus_owner_cut = pending_server_alpha + .saturating_add(pending_validator_alpha) + .saturating_add(pending_root_alpha); - // Run the epoch. + // Run the epoch, using the alpha going to both the servers and the validators. let hotkey_emission: Vec<(T::AccountId, AlphaCurrency, AlphaCurrency)> = - Self::epoch_with_mechanisms(netuid, total_alpha); + Self::epoch_with_mechanisms(netuid, total_alpha_minus_owner_cut); log::debug!("hotkey_emission: {hotkey_emission:?}"); // Compute the pending validator alpha. @@ -661,20 +684,20 @@ impl Pallet { }); log::debug!("incentive_sum: {incentive_sum:?}"); - let pending_validator_alpha = if !incentive_sum.is_zero() { - total_alpha - .saturating_div(2.into()) - .saturating_sub(pending_root_alpha) + let validator_alpha = if !incentive_sum.is_zero() { + pending_validator_alpha } else { - // If the incentive is 0, then Validators get 100% of the alpha. - pending_alpha + // If the incentive is 0, then Alpha Validators get both the server and validator alpha. + pending_validator_alpha.saturating_add(pending_server_alpha) }; + let root_alpha = pending_root_alpha; + let owner_cut = pending_owner_cut; let (incentives, (alpha_dividends, root_alpha_dividends)) = Self::calculate_dividend_and_incentive_distribution( netuid, - pending_root_alpha, - pending_validator_alpha, + root_alpha, + validator_alpha, hotkey_emission, tao_weight, ); diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index 5df8a9c429..6c3ee1d84e 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -1430,9 +1430,13 @@ pub mod pallet { pub type NetworkRegisteredAt = StorageMap<_, Identity, NetUid, u64, ValueQuery, DefaultNetworkRegisteredAt>; #[pallet::storage] - /// --- MAP ( netuid ) --> pending_emission - pub type PendingEmission = - StorageMap<_, Identity, NetUid, AlphaCurrency, ValueQuery, DefaultPendingEmission>; + /// --- MAP ( netuid ) --> pending_server_emission + pub type PendingServerEmission = + StorageMap<_, Identity, NetUid, AlphaCurrency, ValueQuery, DefaultZeroAlpha>; + /// --- MAP ( netuid ) --> pending_validator_emission + #[pallet::storage] + pub type PendingValidatorEmission = + StorageMap<_, Identity, NetUid, AlphaCurrency, ValueQuery, DefaultZeroAlpha>; /// --- MAP ( netuid ) --> pending_root_alpha_emission #[pallet::storage] pub type PendingRootAlphaDivs = diff --git a/pallets/subtensor/src/macros/hooks.rs b/pallets/subtensor/src/macros/hooks.rs index 7095ce8ecb..692de0e3fa 100644 --- a/pallets/subtensor/src/macros/hooks.rs +++ b/pallets/subtensor/src/macros/hooks.rs @@ -161,7 +161,9 @@ mod hooks { // Remove obsolete map entries .saturating_add(migrations::migrate_remove_tao_dividends::migrate_remove_tao_dividends::()) // Re-init tao flows - .saturating_add(migrations::migrate_init_tao_flow::migrate_init_tao_flow::()); + .saturating_add(migrations::migrate_init_tao_flow::migrate_init_tao_flow::()) + // Migrate pending emissions + .saturating_add(migrations::migrate_pending_emissions::migrate_pending_emissions::()); weight } diff --git a/pallets/subtensor/src/migrations/migrate_pending_emissions.rs b/pallets/subtensor/src/migrations/migrate_pending_emissions.rs new file mode 100644 index 0000000000..416080f5b2 --- /dev/null +++ b/pallets/subtensor/src/migrations/migrate_pending_emissions.rs @@ -0,0 +1,73 @@ +use super::*; +use frame_support::{storage_alias, traits::Get, weights::Weight}; +use substrate_fixed::types::U96F32; + +pub mod deprecated_pending_emission_format { + use super::*; + + #[storage_alias] + pub(super) type PendingEmission = + StorageMap, Identity, NetUid, AlphaCurrency, ValueQuery>; +} + +pub fn migrate_pending_emissions() -> Weight { + let migration_name = b"migrate_pending_emissions".to_vec(); + let mut weight: 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; + } + log::info!( + "Running migration '{}'", + String::from_utf8_lossy(&migration_name) + ); + + // Pull from PendingEmission and distribute to PendingValidatorEmission and PendingServerEmission + for (netuid, pending_emission) in + deprecated_pending_emission_format::PendingEmission::::iter() + { + // Split up the pending emission into server and validator emission + // Server emission is pending+root_alpha times the 50% miner cut. + let root_alpha: U96F32 = + U96F32::saturating_from_num(PendingRootAlphaDivs::::get(netuid).to_u64()); + let server_emission_float: U96F32 = U96F32::saturating_from_num(pending_emission.to_u64()) + .saturating_add(root_alpha) + .saturating_div(U96F32::saturating_from_num(2)); + let server_emission: AlphaCurrency = + server_emission_float.saturating_to_num::().into(); + let validator_emission = pending_emission.saturating_sub(server_emission); + + PendingValidatorEmission::::mutate(netuid, |total| { + *total = total.saturating_add(validator_emission) + }); + PendingServerEmission::::mutate(netuid, |total| { + *total = total.saturating_add(server_emission) + }); + + weight = weight.saturating_add(T::DbWeight::get().reads_writes(1, 2)); + } + + // Kill the map + let removal_result = + deprecated_pending_emission_format::PendingEmission::::clear(u32::MAX, None); + weight = weight.saturating_add( + T::DbWeight::get().reads_writes(removal_result.loops as u64, removal_result.backend as u64), + ); + + // Mark Migration as Completed + HasMigrationRun::::insert(&migration_name, true); + weight = weight.saturating_add(T::DbWeight::get().writes(1)); + + log::info!( + "Migration '{:?}' completed successfully.", + String::from_utf8_lossy(&migration_name) + ); + + weight +} diff --git a/pallets/subtensor/src/migrations/mod.rs b/pallets/subtensor/src/migrations/mod.rs index 7fe37617fd..b6aac3d7d8 100644 --- a/pallets/subtensor/src/migrations/mod.rs +++ b/pallets/subtensor/src/migrations/mod.rs @@ -27,6 +27,7 @@ pub mod migrate_network_immunity_period; pub mod migrate_network_lock_cost_2500; pub mod migrate_network_lock_reduction_interval; pub mod migrate_orphaned_storage_items; +pub mod migrate_pending_emissions; pub mod migrate_populate_owned_hotkeys; pub mod migrate_rao; pub mod migrate_rate_limit_keys; diff --git a/pallets/subtensor/src/rpc_info/dynamic_info.rs b/pallets/subtensor/src/rpc_info/dynamic_info.rs index 3bfbda8676..d4f99176ac 100644 --- a/pallets/subtensor/src/rpc_info/dynamic_info.rs +++ b/pallets/subtensor/src/rpc_info/dynamic_info.rs @@ -62,7 +62,9 @@ impl Pallet { alpha_out_emission: SubnetAlphaOutEmission::::get(netuid).into(), alpha_in_emission: SubnetAlphaInEmission::::get(netuid).into(), tao_in_emission: SubnetTaoInEmission::::get(netuid).into(), - pending_alpha_emission: PendingEmission::::get(netuid).into(), + pending_alpha_emission: PendingValidatorEmission::::get(netuid) + .saturating_add(PendingServerEmission::::get(netuid)) + .into(), pending_root_emission: TaoCurrency::from(0u64).into(), subnet_volume: SubnetVolume::::get(netuid).into(), network_registered_at: NetworkRegisteredAt::::get(netuid).into(), diff --git a/pallets/subtensor/src/rpc_info/metagraph.rs b/pallets/subtensor/src/rpc_info/metagraph.rs index df0c8023b0..ea24657aeb 100644 --- a/pallets/subtensor/src/rpc_info/metagraph.rs +++ b/pallets/subtensor/src/rpc_info/metagraph.rs @@ -694,7 +694,9 @@ impl Pallet { alpha_out_emission: SubnetAlphaOutEmission::::get(netuid).into(), // amount injected in alpha reserves per block alpha_in_emission: SubnetAlphaInEmission::::get(netuid).into(), // amount injected outstanding per block tao_in_emission: SubnetTaoInEmission::::get(netuid).into(), // amount of tao injected per block - pending_alpha_emission: PendingEmission::::get(netuid).into(), // pending alpha to be distributed + pending_alpha_emission: PendingValidatorEmission::::get(netuid) + .saturating_add(PendingServerEmission::::get(netuid)) + .into(), // pending alpha to be distributed pending_root_emission: TaoCurrency::from(0u64).into(), // panding tao for root divs to be distributed subnet_volume: subnet_volume.into(), moving_price: SubnetMovingPrice::::get(netuid), @@ -1000,7 +1002,11 @@ impl Pallet { }, Some(SelectiveMetagraphIndex::PendingAlphaEmission) => SelectiveMetagraph { netuid: netuid.into(), - pending_alpha_emission: Some(PendingEmission::::get(netuid).into()), + pending_alpha_emission: Some( + PendingValidatorEmission::::get(netuid) + .saturating_add(PendingServerEmission::::get(netuid)) + .into(), + ), ..Default::default() }, Some(SelectiveMetagraphIndex::PendingRootEmission) => SelectiveMetagraph { diff --git a/pallets/subtensor/src/tests/children.rs b/pallets/subtensor/src/tests/children.rs index 14b7a0b29d..e8be57f021 100644 --- a/pallets/subtensor/src/tests/children.rs +++ b/pallets/subtensor/src/tests/children.rs @@ -3095,7 +3095,8 @@ fn test_parent_child_chain_emission() { ); // Set pending emission to 0 - PendingEmission::::insert(netuid, AlphaCurrency::ZERO); + PendingValidatorEmission::::insert(netuid, AlphaCurrency::ZERO); + PendingServerEmission::::insert(netuid, AlphaCurrency::ZERO); // Run epoch with emission value SubtensorModule::run_coinbase(emission); diff --git a/pallets/subtensor/src/tests/claim_root.rs b/pallets/subtensor/src/tests/claim_root.rs index 951dfa0ae1..c11d88033f 100644 --- a/pallets/subtensor/src/tests/claim_root.rs +++ b/pallets/subtensor/src/tests/claim_root.rs @@ -75,6 +75,7 @@ fn test_claim_root_with_drain_emissions() { SubtensorModule::distribute_emission( netuid, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, pending_root_alpha.into(), AlphaCurrency::ZERO, ); @@ -143,6 +144,7 @@ fn test_claim_root_with_drain_emissions() { SubtensorModule::distribute_emission( netuid, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, pending_root_alpha.into(), AlphaCurrency::ZERO, ); @@ -244,6 +246,7 @@ fn test_claim_root_adding_stake_proportionally_for_two_stakers() { SubtensorModule::distribute_emission( netuid, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, pending_root_alpha.into(), AlphaCurrency::ZERO, ); @@ -345,6 +348,7 @@ fn test_claim_root_adding_stake_disproportionally_for_two_stakers() { SubtensorModule::distribute_emission( netuid, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, pending_root_alpha.into(), AlphaCurrency::ZERO, ); @@ -436,6 +440,7 @@ fn test_claim_root_with_changed_stake() { SubtensorModule::distribute_emission( netuid, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, pending_root_alpha.into(), AlphaCurrency::ZERO, ); @@ -488,6 +493,7 @@ fn test_claim_root_with_changed_stake() { SubtensorModule::distribute_emission( netuid, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, pending_root_alpha.into(), AlphaCurrency::ZERO, ); @@ -541,6 +547,7 @@ fn test_claim_root_with_changed_stake() { SubtensorModule::distribute_emission( netuid, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, pending_root_alpha.into(), AlphaCurrency::ZERO, ); @@ -633,6 +640,7 @@ fn test_claim_root_with_drain_emissions_and_swap_claim_type() { SubtensorModule::distribute_emission( netuid, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, pending_root_alpha.into(), AlphaCurrency::ZERO, ); @@ -677,6 +685,7 @@ fn test_claim_root_with_drain_emissions_and_swap_claim_type() { SubtensorModule::distribute_emission( netuid, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, pending_root_alpha.into(), AlphaCurrency::ZERO, ); @@ -713,6 +722,7 @@ fn test_claim_root_with_drain_emissions_and_swap_claim_type() { SubtensorModule::distribute_emission( netuid, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, pending_root_alpha.into(), AlphaCurrency::ZERO, ); @@ -1138,6 +1148,7 @@ fn test_claim_root_with_swap_coldkey() { SubtensorModule::distribute_emission( netuid, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, pending_root_alpha.into(), AlphaCurrency::ZERO, ); @@ -1228,6 +1239,7 @@ fn test_claim_root_with_swap_hotkey() { SubtensorModule::distribute_emission( netuid, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, pending_root_alpha.into(), AlphaCurrency::ZERO, ); @@ -1344,6 +1356,7 @@ fn test_claim_root_on_network_deregistration() { SubtensorModule::distribute_emission( netuid, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, pending_root_alpha.into(), AlphaCurrency::ZERO, ); @@ -1484,6 +1497,7 @@ fn test_claim_root_with_unrelated_subnets() { SubtensorModule::distribute_emission( netuid, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, pending_root_alpha.into(), AlphaCurrency::ZERO, ); diff --git a/pallets/subtensor/src/tests/coinbase.rs b/pallets/subtensor/src/tests/coinbase.rs index 5d03afa973..5366b3310b 100644 --- a/pallets/subtensor/src/tests/coinbase.rs +++ b/pallets/subtensor/src/tests/coinbase.rs @@ -686,16 +686,22 @@ fn test_pending_emission() { // 1 TAO / ( 1 + 3 ) = 0.25 * 1 / 2 = 125000000 assert_abs_diff_eq!( - u64::from(PendingEmission::::get(netuid)), - 1_000_000_000 - 125000000, + u64::from(PendingServerEmission::::get(netuid)), + 500_000_000, epsilon = 1 - ); // 1 - swapped. + ); // 1 / 2. + + assert_abs_diff_eq!( + u64::from(PendingValidatorEmission::::get(netuid)), + 500_000_000 - 125000000, + epsilon = 1 + ); // 1 / 2 - swapped. assert_abs_diff_eq!( u64::from(PendingRootAlphaDivs::::get(netuid)), 125000000, epsilon = 1 - ); // 1 / 2 = 125000000 + ); // 1 / 2 * 0.25 --> (from root_prop) }); } @@ -708,6 +714,7 @@ fn test_drain_base() { AlphaCurrency::ZERO, AlphaCurrency::ZERO, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, ) }); } @@ -723,6 +730,7 @@ fn test_drain_base_with_subnet() { AlphaCurrency::ZERO, AlphaCurrency::ZERO, AlphaCurrency::ZERO, + AlphaCurrency::ZERO, ) }); } @@ -745,7 +753,8 @@ fn test_drain_base_with_subnet_with_single_staker_not_registered() { let pending_alpha = AlphaCurrency::from(1_000_000_000); SubtensorModule::distribute_emission( netuid, - pending_alpha.into(), + pending_alpha.saturating_div(2.into()).into(), + pending_alpha.saturating_div(2.into()).into(), AlphaCurrency::ZERO, AlphaCurrency::ZERO, ); @@ -774,7 +783,8 @@ fn test_drain_base_with_subnet_with_single_staker_registered() { let pending_alpha = AlphaCurrency::from(1_000_000_000); SubtensorModule::distribute_emission( netuid, - pending_alpha, + pending_alpha.saturating_div(2.into()).into(), + pending_alpha.saturating_div(2.into()).into(), AlphaCurrency::ZERO, AlphaCurrency::ZERO, ); @@ -818,7 +828,8 @@ fn test_drain_base_with_subnet_with_single_staker_registered_root_weight() { assert_eq!(SubnetTAO::::get(NetUid::ROOT), TaoCurrency::ZERO); SubtensorModule::distribute_emission( netuid, - pending_alpha, + pending_alpha.saturating_div(2.into()).into(), + pending_alpha.saturating_div(2.into()).into(), pending_root_alpha, AlphaCurrency::ZERO, ); @@ -865,7 +876,8 @@ fn test_drain_base_with_subnet_with_two_stakers_registered() { let pending_alpha = AlphaCurrency::from(1_000_000_000); SubtensorModule::distribute_emission( netuid, - pending_alpha, + pending_alpha.saturating_div(2.into()).into(), + pending_alpha.saturating_div(2.into()).into(), AlphaCurrency::ZERO, AlphaCurrency::ZERO, ); @@ -930,7 +942,8 @@ fn test_drain_base_with_subnet_with_two_stakers_registered_and_root() { assert_eq!(SubnetTAO::::get(NetUid::ROOT), TaoCurrency::ZERO); SubtensorModule::distribute_emission( netuid, - pending_alpha, + pending_alpha.saturating_div(2.into()).into(), + pending_alpha.saturating_div(2.into()).into(), AlphaCurrency::ZERO, AlphaCurrency::ZERO, ); @@ -1003,7 +1016,13 @@ fn test_drain_base_with_subnet_with_two_stakers_registered_and_root_different_am let pending_tao = TaoCurrency::from(1_000_000_000); let pending_alpha = AlphaCurrency::from(1_000_000_000); assert_eq!(SubnetTAO::::get(NetUid::ROOT), TaoCurrency::ZERO); - SubtensorModule::distribute_emission(netuid, pending_alpha, AlphaCurrency::ZERO, 0.into()); + SubtensorModule::distribute_emission( + netuid, + pending_alpha.saturating_div(2.into()).into(), + pending_alpha.saturating_div(2.into()).into(), + AlphaCurrency::ZERO, + AlphaCurrency::ZERO, + ); let stake_after1 = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet(&hotkey1, &coldkey, netuid); let root_after1 = SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet( @@ -1080,7 +1099,8 @@ fn test_drain_base_with_subnet_with_two_stakers_registered_and_root_different_am assert_eq!(SubnetTAO::::get(NetUid::ROOT), TaoCurrency::ZERO); SubtensorModule::distribute_emission( netuid, - pending_alpha, + pending_alpha.saturating_div(2.into()).into(), + pending_alpha.saturating_div(2.into()).into(), AlphaCurrency::ZERO, AlphaCurrency::ZERO, ); @@ -1141,7 +1161,8 @@ fn test_drain_alpha_childkey_parentkey() { let pending_alpha = AlphaCurrency::from(1_000_000_000); SubtensorModule::distribute_emission( netuid, - pending_alpha, + pending_alpha.saturating_div(2.into()).into(), + pending_alpha.saturating_div(2.into()).into(), AlphaCurrency::ZERO, AlphaCurrency::ZERO, ); @@ -1366,7 +1387,8 @@ fn test_get_root_children_drain() { let pending_alpha = AlphaCurrency::from(1_000_000_000); SubtensorModule::distribute_emission( alpha, - pending_alpha, + pending_alpha.saturating_div(2.into()).into(), + pending_alpha.saturating_div(2.into()).into(), AlphaCurrency::ZERO, AlphaCurrency::ZERO, ); @@ -1389,8 +1411,8 @@ fn test_get_root_children_drain() { let pending_root1 = TaoCurrency::from(1_000_000_000); SubtensorModule::distribute_emission( alpha, - pending_alpha, - // pending_root1, + pending_alpha.saturating_div(2.into()).into(), + pending_alpha.saturating_div(2.into()).into(), AlphaCurrency::ZERO, AlphaCurrency::ZERO, ); @@ -1413,7 +1435,8 @@ fn test_get_root_children_drain() { let pending_root2 = TaoCurrency::from(1_000_000_000); SubtensorModule::distribute_emission( alpha, - pending_alpha, + pending_alpha.saturating_div(2.into()).into(), + pending_alpha.saturating_div(2.into()).into(), AlphaCurrency::ZERO, AlphaCurrency::ZERO, ); @@ -1501,7 +1524,8 @@ fn test_get_root_children_drain_half_proportion() { let pending_alpha = AlphaCurrency::from(1_000_000_000); SubtensorModule::distribute_emission( alpha, - pending_alpha, + pending_alpha.saturating_div(2.into()).into(), + pending_alpha.saturating_div(2.into()).into(), AlphaCurrency::ZERO, AlphaCurrency::ZERO, ); @@ -1587,7 +1611,8 @@ fn test_get_root_children_drain_with_take() { let pending_alpha = AlphaCurrency::from(1_000_000_000); SubtensorModule::distribute_emission( alpha, - pending_alpha, + pending_alpha.saturating_div(2.into()).into(), + pending_alpha.saturating_div(2.into()).into(), AlphaCurrency::ZERO, AlphaCurrency::ZERO, ); @@ -1674,7 +1699,8 @@ fn test_get_root_children_drain_with_half_take() { let pending_alpha = AlphaCurrency::from(1_000_000_000); SubtensorModule::distribute_emission( alpha, - pending_alpha, + pending_alpha.saturating_div(2.into()).into(), + pending_alpha.saturating_div(2.into()).into(), AlphaCurrency::ZERO, AlphaCurrency::ZERO, ); @@ -2389,7 +2415,8 @@ fn test_distribute_emission_no_miners_all_drained() { // Run drain pending without any miners. SubtensorModule::distribute_emission( netuid, - emission, + emission.saturating_div(2.into()).into(), + emission.saturating_div(2.into()).into(), AlphaCurrency::ZERO, AlphaCurrency::ZERO, ); @@ -2461,7 +2488,8 @@ fn test_distribute_emission_zero_emission() { // Set the emission to be ZERO. SubtensorModule::distribute_emission( netuid, - 0.into(), + AlphaCurrency::ZERO, + AlphaCurrency::ZERO, AlphaCurrency::ZERO, AlphaCurrency::ZERO, ); @@ -2754,7 +2782,8 @@ fn test_drain_alpha_childkey_parentkey_with_burn() { let pending_alpha = AlphaCurrency::from(1_000_000_000); SubtensorModule::distribute_emission( netuid, - pending_alpha, + pending_alpha.saturating_div(2.into()).into(), + pending_alpha.saturating_div(2.into()).into(), AlphaCurrency::ZERO, AlphaCurrency::ZERO, ); @@ -3058,9 +3087,10 @@ fn test_mining_emission_distribution_with_no_root_sell() { // Run again but with some root stake step_block(subnet_tempo - 2); assert_abs_diff_eq!( - PendingEmission::::get(netuid).to_u64(), + PendingServerEmission::::get(netuid).to_u64(), U96F32::saturating_from_num(per_block_emission) .saturating_mul(U96F32::saturating_from_num(subnet_tempo as u64)) + .saturating_mul(U96F32::saturating_from_num(0.5)) // miner cut .saturating_mul(U96F32::saturating_from_num(0.90)) .saturating_to_num::(), epsilon = 100_000_u64.into() diff --git a/pallets/subtensor/src/tests/networks.rs b/pallets/subtensor/src/tests/networks.rs index 3706878bb6..0fa27a99d6 100644 --- a/pallets/subtensor/src/tests/networks.rs +++ b/pallets/subtensor/src/tests/networks.rs @@ -374,7 +374,8 @@ fn dissolve_clears_all_per_subnet_storages() { SubnetMechanism::::insert(net, 1u16); NetworkRegistrationAllowed::::insert(net, true); NetworkPowRegistrationAllowed::::insert(net, true); - PendingEmission::::insert(net, AlphaCurrency::from(1)); + PendingServerEmission::::insert(net, AlphaCurrency::from(1)); + PendingValidatorEmission::::insert(net, AlphaCurrency::from(1)); PendingRootAlphaDivs::::insert(net, AlphaCurrency::from(1)); PendingOwnerCut::::insert(net, AlphaCurrency::from(1)); BlocksSinceLastStep::::insert(net, 1u64); @@ -529,7 +530,8 @@ fn dissolve_clears_all_per_subnet_storages() { assert!(!SubnetMechanism::::contains_key(net)); assert!(!NetworkRegistrationAllowed::::contains_key(net)); assert!(!NetworkPowRegistrationAllowed::::contains_key(net)); - assert!(!PendingEmission::::contains_key(net)); + assert!(!PendingServerEmission::::contains_key(net)); + assert!(!PendingValidatorEmission::::contains_key(net)); assert!(!PendingRootAlphaDivs::::contains_key(net)); assert!(!PendingOwnerCut::::contains_key(net)); assert!(!BlocksSinceLastStep::::contains_key(net)); diff --git a/pallets/subtensor/src/utils/misc.rs b/pallets/subtensor/src/utils/misc.rs index 0ba3df1103..46dc8e42c2 100644 --- a/pallets/subtensor/src/utils/misc.rs +++ b/pallets/subtensor/src/utils/misc.rs @@ -334,9 +334,6 @@ impl Pallet { pub fn get_tempo(netuid: NetUid) -> u16 { Tempo::::get(netuid) } - pub fn get_pending_emission(netuid: NetUid) -> AlphaCurrency { - PendingEmission::::get(netuid) - } pub fn get_last_adjustment_block(netuid: NetUid) -> u64 { LastAdjustmentBlock::::get(netuid) } diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index fe9bda8b6c..45e470be80 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -220,7 +220,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: 342, + spec_version: 343, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1,