From dd9b75aa4b5646bcd6cea8a47e2628dfc4ffb151 Mon Sep 17 00:00:00 2001 From: 0xcacti <0xcacti@gmail.com> Date: Thu, 2 Oct 2025 01:12:16 -0400 Subject: [PATCH 1/8] fix: make alpha_in halve with block_emission, fix subsidy condition --- .../subtensor/src/coinbase/run_coinbase.rs | 64 ++++++++++++------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/pallets/subtensor/src/coinbase/run_coinbase.rs b/pallets/subtensor/src/coinbase/run_coinbase.rs index 9d6d44de8..b03320b46 100644 --- a/pallets/subtensor/src/coinbase/run_coinbase.rs +++ b/pallets/subtensor/src/coinbase/run_coinbase.rs @@ -55,6 +55,8 @@ impl Pallet { let mut alpha_in: BTreeMap = BTreeMap::new(); let mut alpha_out: BTreeMap = BTreeMap::new(); let mut is_subsidized: BTreeMap = BTreeMap::new(); + let mut tao_to_stake = U96F32::saturating_from_num(0.0); + // Only calculate for subnets that we are emitting to. for netuid_i in subnets_to_emit_to.iter() { // Get subnet price. @@ -69,6 +71,11 @@ impl Pallet { .checked_div(total_moving_prices) .unwrap_or(asfloat!(0.0)); log::debug!("default_tao_in_i: {default_tao_in_i:?}"); + + let default_alpha_in_i: U96F32 = + default_tao_in_i.safe_div_or(price_i, U96F32::saturating_from_num(0.0)); + log::debug!("default_alpha_in_i: {default_alpha_in_i:?}"); + // Get alpha_emission total let alpha_emission_i: U96F32 = asfloat!( Self::get_block_emission_for_issuance(Self::get_alpha_issuance(*netuid_i).into()) @@ -76,36 +83,18 @@ impl Pallet { ); log::debug!("alpha_emission_i: {alpha_emission_i:?}"); - // Get initial alpha_in let mut alpha_in_i: U96F32; let mut tao_in_i: U96F32; - let tao_in_ratio: U96F32 = default_tao_in_i.safe_div_or( - U96F32::saturating_from_num(block_emission), - U96F32::saturating_from_num(0.0), - ); - if price_i < tao_in_ratio { - tao_in_i = price_i.saturating_mul(U96F32::saturating_from_num(block_emission)); - alpha_in_i = block_emission; + if default_alpha_in_i > alpha_emission_i { + alpha_in_i = alpha_emission_i; + tao_in_i = alpha_in_i.saturating_mul(price_i); let difference_tao: U96F32 = default_tao_in_i.saturating_sub(tao_in_i); - // Difference becomes buy. - let buy_swap_result = Self::swap_tao_for_alpha( - *netuid_i, - tou64!(difference_tao).into(), - T::SwapInterface::max_price(), - true, - ); - if let Ok(buy_swap_result_ok) = buy_swap_result { - let bought_alpha = AlphaCurrency::from(buy_swap_result_ok.amount_paid_out); - SubnetAlphaOut::::mutate(*netuid_i, |total| { - *total = total.saturating_sub(bought_alpha); - }); - } - is_subsidized.insert(*netuid_i, true); + tao_to_stake = tao_to_stake.saturating_add(difference_tao); } else { + alpha_in_i = default_alpha_in_i; tao_in_i = default_tao_in_i; - alpha_in_i = tao_in_i.safe_div_or(price_i, alpha_emission_i); - is_subsidized.insert(*netuid_i, false); } + log::debug!("tao_in_i: {tao_in_i:?}"); log::debug!("alpha_in_i: {alpha_in_i:?}"); // Get alpha_out. @@ -123,6 +112,29 @@ impl Pallet { alpha_in.insert(*netuid_i, alpha_in_i); alpha_out.insert(*netuid_i, alpha_out_i); } + + let amount_per_subnet: U96F32 = tao_to_stake.safe_div_or( + U96F32::saturating_from_num(subnets_to_emit_to.len()), + U96F32::saturating_from_num(0.0), + ); + + for netuid_i in subnets_to_emit_to.iter() { + let buy_swap_result = Self::swap_tao_for_alpha( + *netuid_i, + tou64!(amount_per_subnet).into(), + T::SwapInterface::max_price().into(), + true, + ); + if let Ok(buy_swap_result_ok) = buy_swap_result { + let bought_alpha = AlphaCurrency::from(buy_swap_result_ok.amount_paid_out); + SubnetAlphaOut::::mutate(*netuid_i, |total| { + *total = total.saturating_sub(bought_alpha); + }); + } + is_subsidized.insert(*netuid_i, true); + } + + log::debug!("tao_to_stake: {tao_to_stake:?}"); log::debug!("tao_in: {tao_in:?}"); log::debug!("alpha_in: {alpha_in:?}"); log::debug!("alpha_out: {alpha_out:?}"); @@ -151,12 +163,16 @@ impl Pallet { SubnetTaoInEmission::::insert(*netuid_i, TaoCurrency::from(tao_in_i)); SubnetTAO::::mutate(*netuid_i, |total| { *total = total.saturating_add(tao_in_i.into()); + *total = total.saturating_add(amount_per_subnet.into()); }); + TotalStake::::mutate(|total| { *total = total.saturating_add(tao_in_i.into()); + *total = total.saturating_add(amount_per_subnet.into()); }); TotalIssuance::::mutate(|total| { *total = total.saturating_add(tao_in_i.into()); + *total = total.saturating_add(amount_per_subnet.into()); }); // Adjust protocol liquidity based on new reserves T::SwapInterface::adjust_protocol_liquidity(*netuid_i, tao_in_i, alpha_in_i); From cbf927ff9428cb5b99763ead8f3307c791ce32e1 Mon Sep 17 00:00:00 2001 From: 0xcacti <0xcacti@gmail.com> Date: Thu, 2 Oct 2025 01:30:16 -0400 Subject: [PATCH 2/8] fix: typecheck --- pallets/subtensor/src/coinbase/run_coinbase.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pallets/subtensor/src/coinbase/run_coinbase.rs b/pallets/subtensor/src/coinbase/run_coinbase.rs index b03320b46..821f04b28 100644 --- a/pallets/subtensor/src/coinbase/run_coinbase.rs +++ b/pallets/subtensor/src/coinbase/run_coinbase.rs @@ -77,10 +77,10 @@ impl Pallet { log::debug!("default_alpha_in_i: {default_alpha_in_i:?}"); // Get alpha_emission total - let alpha_emission_i: U96F32 = asfloat!( - Self::get_block_emission_for_issuance(Self::get_alpha_issuance(*netuid_i).into()) - .unwrap_or(0) - ); + let alpha_emission_i: U96F32 = asfloat!(Self::get_block_emission_for_issuance( + Self::get_alpha_issuance(*netuid_i).into() + ) + .unwrap_or(0)); log::debug!("alpha_emission_i: {alpha_emission_i:?}"); let mut alpha_in_i: U96F32; @@ -163,16 +163,16 @@ impl Pallet { SubnetTaoInEmission::::insert(*netuid_i, TaoCurrency::from(tao_in_i)); SubnetTAO::::mutate(*netuid_i, |total| { *total = total.saturating_add(tao_in_i.into()); - *total = total.saturating_add(amount_per_subnet.into()); + *total = total.saturating_add(tou64!(amount_per_subnet).into()); }); TotalStake::::mutate(|total| { *total = total.saturating_add(tao_in_i.into()); - *total = total.saturating_add(amount_per_subnet.into()); + *total = total.saturating_add(tou64!(amount_per_subnet).into()); }); TotalIssuance::::mutate(|total| { *total = total.saturating_add(tao_in_i.into()); - *total = total.saturating_add(amount_per_subnet.into()); + *total = total.saturating_add(tou64!(amount_per_subnet).into()); }); // Adjust protocol liquidity based on new reserves T::SwapInterface::adjust_protocol_liquidity(*netuid_i, tao_in_i, alpha_in_i); @@ -225,7 +225,7 @@ impl Pallet { 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. - // Remove root alpha from alpha_out. + // 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); From 7601c911f7165eacc0ddde9fe44a6b7b05da545e Mon Sep 17 00:00:00 2001 From: 0xcacti <0xcacti@gmail.com> Date: Thu, 2 Oct 2025 01:50:33 -0400 Subject: [PATCH 3/8] fix: fmt --- pallets/subtensor/src/coinbase/run_coinbase.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pallets/subtensor/src/coinbase/run_coinbase.rs b/pallets/subtensor/src/coinbase/run_coinbase.rs index 821f04b28..7a3dcc312 100644 --- a/pallets/subtensor/src/coinbase/run_coinbase.rs +++ b/pallets/subtensor/src/coinbase/run_coinbase.rs @@ -77,10 +77,10 @@ impl Pallet { log::debug!("default_alpha_in_i: {default_alpha_in_i:?}"); // Get alpha_emission total - let alpha_emission_i: U96F32 = asfloat!(Self::get_block_emission_for_issuance( - Self::get_alpha_issuance(*netuid_i).into() - ) - .unwrap_or(0)); + let alpha_emission_i: U96F32 = asfloat!( + Self::get_block_emission_for_issuance(Self::get_alpha_issuance(*netuid_i).into()) + .unwrap_or(0) + ); log::debug!("alpha_emission_i: {alpha_emission_i:?}"); let mut alpha_in_i: U96F32; @@ -225,7 +225,7 @@ impl Pallet { 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. - // Remove root alpha from alpha_out. + // 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); From a5fc4ffa1a42c521e9ff1e0fba7ad28ed93aa1f6 Mon Sep 17 00:00:00 2001 From: 0xcacti <0xcacti@gmail.com> Date: Mon, 6 Oct 2025 23:43:56 -0400 Subject: [PATCH 4/8] remove is_subsidized --- .../subtensor/src/coinbase/run_coinbase.rs | 62 +++++++++---------- pallets/subtensor/src/tests/coinbase.rs | 8 +-- 2 files changed, 33 insertions(+), 37 deletions(-) diff --git a/pallets/subtensor/src/coinbase/run_coinbase.rs b/pallets/subtensor/src/coinbase/run_coinbase.rs index 7a3dcc312..bae9fbc44 100644 --- a/pallets/subtensor/src/coinbase/run_coinbase.rs +++ b/pallets/subtensor/src/coinbase/run_coinbase.rs @@ -54,7 +54,6 @@ impl Pallet { let mut tao_in: BTreeMap = BTreeMap::new(); let mut alpha_in: BTreeMap = BTreeMap::new(); let mut alpha_out: BTreeMap = BTreeMap::new(); - let mut is_subsidized: BTreeMap = BTreeMap::new(); let mut tao_to_stake = U96F32::saturating_from_num(0.0); // Only calculate for subnets that we are emitting to. @@ -85,8 +84,9 @@ impl Pallet { let mut alpha_in_i: U96F32; let mut tao_in_i: U96F32; - if default_alpha_in_i > alpha_emission_i { - alpha_in_i = alpha_emission_i; + let min_alpha_emission = alpha_emission_i.min(block_emission); + if default_alpha_in_i > min_alpha_emission { + alpha_in_i = min_alpha_emission; tao_in_i = alpha_in_i.saturating_mul(price_i); let difference_tao: U96F32 = default_tao_in_i.saturating_sub(tao_in_i); tao_to_stake = tao_to_stake.saturating_add(difference_tao); @@ -118,20 +118,21 @@ impl Pallet { U96F32::saturating_from_num(0.0), ); - for netuid_i in subnets_to_emit_to.iter() { - let buy_swap_result = Self::swap_tao_for_alpha( - *netuid_i, - tou64!(amount_per_subnet).into(), - T::SwapInterface::max_price().into(), - true, - ); - if let Ok(buy_swap_result_ok) = buy_swap_result { - let bought_alpha = AlphaCurrency::from(buy_swap_result_ok.amount_paid_out); - SubnetAlphaOut::::mutate(*netuid_i, |total| { - *total = total.saturating_sub(bought_alpha); - }); + if amount_per_subnet > asfloat!(0.0) { + for netuid_i in subnets_to_emit_to.iter() { + let buy_swap_result = Self::swap_tao_for_alpha( + *netuid_i, + tou64!(amount_per_subnet).into(), + T::SwapInterface::max_price().into(), + true, + ); + if let Ok(buy_swap_result_ok) = buy_swap_result { + let bought_alpha = AlphaCurrency::from(buy_swap_result_ok.amount_paid_out); + SubnetAlphaOut::::mutate(*netuid_i, |total| { + *total = total.saturating_sub(bought_alpha); + }); + } } - is_subsidized.insert(*netuid_i, true); } log::debug!("tao_to_stake: {tao_to_stake:?}"); @@ -163,12 +164,10 @@ impl Pallet { SubnetTaoInEmission::::insert(*netuid_i, TaoCurrency::from(tao_in_i)); SubnetTAO::::mutate(*netuid_i, |total| { *total = total.saturating_add(tao_in_i.into()); - *total = total.saturating_add(tou64!(amount_per_subnet).into()); }); TotalStake::::mutate(|total| { *total = total.saturating_add(tao_in_i.into()); - *total = total.saturating_add(tou64!(amount_per_subnet).into()); }); TotalIssuance::::mutate(|total| { *total = total.saturating_add(tao_in_i.into()); @@ -231,21 +230,18 @@ impl Pallet { let pending_alpha: U96F32 = alpha_out_i.saturating_sub(root_alpha); log::debug!("pending_alpha: {pending_alpha:?}"); // Sell root emission through the pool (do not pay fees) - let subsidized: bool = *is_subsidized.get(netuid_i).unwrap_or(&false); - if !subsidized { - let swap_result = Self::swap_alpha_for_tao( - *netuid_i, - tou64!(root_alpha).into(), - T::SwapInterface::min_price(), - true, - ); - if let Ok(ok_result) = swap_result { - let root_tao = ok_result.amount_paid_out; - // Accumulate root divs for subnet. - PendingRootDivs::::mutate(*netuid_i, |total| { - *total = total.saturating_add(root_tao); - }); - } + let swap_result = Self::swap_alpha_for_tao( + *netuid_i, + tou64!(root_alpha).into(), + T::SwapInterface::min_price().into(), + true, + ); + if let Ok(ok_result) = swap_result { + let root_tao: u64 = ok_result.amount_paid_out; + // Accumulate root divs for subnet. + PendingRootDivs::::mutate(*netuid_i, |total| { + *total = total.saturating_add(root_tao.into()); + }); } // Accumulate alpha emission in pending. PendingAlphaSwapped::::mutate(*netuid_i, |total| { diff --git a/pallets/subtensor/src/tests/coinbase.rs b/pallets/subtensor/src/tests/coinbase.rs index 39a964a06..31e55502c 100644 --- a/pallets/subtensor/src/tests/coinbase.rs +++ b/pallets/subtensor/src/tests/coinbase.rs @@ -153,7 +153,7 @@ fn test_coinbase_tao_issuance_different_prices() { new_test_ext(1).execute_with(|| { let netuid1 = NetUid::from(1); let netuid2 = NetUid::from(2); - let emission = 100_000_000; + let emission = 1_000_000_000; add_network(netuid1, 1, 0); add_network(netuid2, 1, 0); @@ -198,17 +198,17 @@ fn test_coinbase_tao_issuance_different_prices() { // Assert tao emission is split evenly. assert_abs_diff_eq!( SubnetTAO::::get(netuid1), - TaoCurrency::from(initial_tao + emission / 3), + TaoCurrency::from(initial_tao + 45 * emission / 100), epsilon = 1.into(), ); assert_abs_diff_eq!( SubnetTAO::::get(netuid2), - TaoCurrency::from(initial_tao + 2 * emission / 3), + TaoCurrency::from(initial_tao + 55 * emission / 100), epsilon = 1.into(), ); // Prices are low => we limit tao issued (buy alpha with it) - let tao_issued = TaoCurrency::from(((0.1 + 0.2) * emission as f64) as u64); + let tao_issued = TaoCurrency::from((emission as f64) as u64); assert_abs_diff_eq!( TotalIssuance::::get(), tao_issued, From c57624f5cc62ac611e56c58e6665d29c48637fdd Mon Sep 17 00:00:00 2001 From: 0xcacti <0xcacti@gmail.com> Date: Mon, 13 Oct 2025 01:01:57 -0400 Subject: [PATCH 5/8] only subsidize when sum of prices < 1 --- .../subtensor/src/coinbase/run_coinbase.rs | 96 ++++++++++--------- pallets/subtensor/src/tests/coinbase.rs | 17 ++-- 2 files changed, 59 insertions(+), 54 deletions(-) diff --git a/pallets/subtensor/src/coinbase/run_coinbase.rs b/pallets/subtensor/src/coinbase/run_coinbase.rs index bae9fbc44..5217160e9 100644 --- a/pallets/subtensor/src/coinbase/run_coinbase.rs +++ b/pallets/subtensor/src/coinbase/run_coinbase.rs @@ -38,11 +38,10 @@ impl Pallet { .collect(); log::debug!("Subnets to emit to: {subnets_to_emit_to:?}"); - // --- 2. Get sum of tao reserves ( in a later version we will switch to prices. ) + // --- 2. Get sum of moving alpha prices let mut acc_total_moving_prices = U96F32::saturating_from_num(0.0); // Only get price EMA for subnets that we emit to. for netuid_i in subnets_to_emit_to.iter() { - // Get and update the moving price of each subnet adding the total together. acc_total_moving_prices = acc_total_moving_prices.saturating_add(Self::get_moving_alpha_price(*netuid_i)); } @@ -54,7 +53,8 @@ impl Pallet { let mut tao_in: BTreeMap = BTreeMap::new(); let mut alpha_in: BTreeMap = BTreeMap::new(); let mut alpha_out: BTreeMap = BTreeMap::new(); - let mut tao_to_stake = U96F32::saturating_from_num(0.0); + let mut is_subsidized: BTreeMap = BTreeMap::new(); + let mut subsidy_amount: BTreeMap = BTreeMap::new(); // Only calculate for subnets that we are emitting to. for netuid_i in subnets_to_emit_to.iter() { @@ -84,15 +84,37 @@ impl Pallet { let mut alpha_in_i: U96F32; let mut tao_in_i: U96F32; - let min_alpha_emission = alpha_emission_i.min(block_emission); - if default_alpha_in_i > min_alpha_emission { + if default_alpha_in_i > alpha_emission_i + || total_moving_prices < U96F32::saturating_from_num(1.0) + { + let min_alpha_emission = + default_alpha_in_i.min(alpha_emission_i).min(block_emission); alpha_in_i = min_alpha_emission; tao_in_i = alpha_in_i.saturating_mul(price_i); - let difference_tao: U96F32 = default_tao_in_i.saturating_sub(tao_in_i); - tao_to_stake = tao_to_stake.saturating_add(difference_tao); + + if total_moving_prices < U96F32::saturating_from_num(1.0) { + let difference_tao: U96F32 = default_tao_in_i.saturating_sub(tao_in_i); + // Difference becomes buy. + let buy_swap_result = Self::swap_tao_for_alpha( + *netuid_i, + tou64!(difference_tao).into(), + T::SwapInterface::max_price(), + true, + ); + if let Ok(buy_swap_result_ok) = buy_swap_result { + let bought_alpha = AlphaCurrency::from(buy_swap_result_ok.amount_paid_out); + SubnetAlphaOut::::mutate(*netuid_i, |total| { + *total = total.saturating_sub(bought_alpha); + }); + } + is_subsidized.insert(*netuid_i, true); + subsidy_amount.insert(*netuid_i, difference_tao); + } } else { alpha_in_i = default_alpha_in_i; tao_in_i = default_tao_in_i; + is_subsidized.insert(*netuid_i, false); + subsidy_amount.insert(*netuid_i, asfloat!(0.0)); } log::debug!("tao_in_i: {tao_in_i:?}"); log::debug!("alpha_in_i: {alpha_in_i:?}"); @@ -113,29 +135,6 @@ impl Pallet { alpha_out.insert(*netuid_i, alpha_out_i); } - let amount_per_subnet: U96F32 = tao_to_stake.safe_div_or( - U96F32::saturating_from_num(subnets_to_emit_to.len()), - U96F32::saturating_from_num(0.0), - ); - - if amount_per_subnet > asfloat!(0.0) { - for netuid_i in subnets_to_emit_to.iter() { - let buy_swap_result = Self::swap_tao_for_alpha( - *netuid_i, - tou64!(amount_per_subnet).into(), - T::SwapInterface::max_price().into(), - true, - ); - if let Ok(buy_swap_result_ok) = buy_swap_result { - let bought_alpha = AlphaCurrency::from(buy_swap_result_ok.amount_paid_out); - SubnetAlphaOut::::mutate(*netuid_i, |total| { - *total = total.saturating_sub(bought_alpha); - }); - } - } - } - - log::debug!("tao_to_stake: {tao_to_stake:?}"); log::debug!("tao_in: {tao_in:?}"); log::debug!("alpha_in: {alpha_in:?}"); log::debug!("alpha_out: {alpha_out:?}"); @@ -158,20 +157,25 @@ impl Pallet { SubnetAlphaOut::::mutate(*netuid_i, |total| { *total = total.saturating_add(alpha_out_i); }); + // Inject TAO in. let tao_in_i: TaoCurrency = tou64!(*tao_in.get(netuid_i).unwrap_or(&asfloat!(0))).into(); + let subsidy_tao: TaoCurrency = + tou64!(*subsidy_amount.get(netuid_i).unwrap_or(&asfloat!(0))).into(); SubnetTaoInEmission::::insert(*netuid_i, TaoCurrency::from(tao_in_i)); + + // No need to add subsidy_tao here as it is captured from the swap result above. SubnetTAO::::mutate(*netuid_i, |total| { *total = total.saturating_add(tao_in_i.into()); }); - TotalStake::::mutate(|total| { *total = total.saturating_add(tao_in_i.into()); }); + // Here we add subsidy tao as it is technically as issuance TotalIssuance::::mutate(|total| { *total = total.saturating_add(tao_in_i.into()); - *total = total.saturating_add(tou64!(amount_per_subnet).into()); + *total = total.saturating_add(subsidy_tao.into()); }); // Adjust protocol liquidity based on new reserves T::SwapInterface::adjust_protocol_liquidity(*netuid_i, tao_in_i, alpha_in_i); @@ -229,19 +233,21 @@ impl Pallet { // 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:?}"); - // Sell root emission through the pool (do not pay fees) - let swap_result = Self::swap_alpha_for_tao( - *netuid_i, - tou64!(root_alpha).into(), - T::SwapInterface::min_price().into(), - true, - ); - if let Ok(ok_result) = swap_result { - let root_tao: u64 = ok_result.amount_paid_out; - // Accumulate root divs for subnet. - PendingRootDivs::::mutate(*netuid_i, |total| { - *total = total.saturating_add(root_tao.into()); - }); + let subsidized: bool = *is_subsidized.get(netuid_i).unwrap_or(&false); + if !subsidized { + let swap_result = Self::swap_alpha_for_tao( + *netuid_i, + tou64!(root_alpha).into(), + T::SwapInterface::min_price(), + true, + ); + if let Ok(ok_result) = swap_result { + let root_tao = ok_result.amount_paid_out; + // Accumulate root divs for subnet. + PendingRootDivs::::mutate(*netuid_i, |total| { + *total = total.saturating_add(root_tao); + }); + } } // Accumulate alpha emission in pending. PendingAlphaSwapped::::mutate(*netuid_i, |total| { diff --git a/pallets/subtensor/src/tests/coinbase.rs b/pallets/subtensor/src/tests/coinbase.rs index 31e55502c..a67d6b5fb 100644 --- a/pallets/subtensor/src/tests/coinbase.rs +++ b/pallets/subtensor/src/tests/coinbase.rs @@ -194,16 +194,15 @@ fn test_coinbase_tao_issuance_different_prices() { // Run the coinbase with the emission amount. SubtensorModule::run_coinbase(U96F32::from_num(emission)); - // Assert tao emission is split evenly. assert_abs_diff_eq!( SubnetTAO::::get(netuid1), - TaoCurrency::from(initial_tao + 45 * emission / 100), + TaoCurrency::from(initial_tao + emission / 3), epsilon = 1.into(), ); assert_abs_diff_eq!( SubnetTAO::::get(netuid2), - TaoCurrency::from(initial_tao + 55 * emission / 100), + TaoCurrency::from(initial_tao + 2 * emission / 3), epsilon = 1.into(), ); @@ -429,7 +428,7 @@ fn test_coinbase_alpha_issuance_with_cap_trigger() { SubnetAlphaIn::::insert(netuid1, AlphaCurrency::from(initial_alpha)); // Make price extremely low. SubnetTAO::::insert(netuid2, TaoCurrency::from(initial)); SubnetAlphaIn::::insert(netuid2, AlphaCurrency::from(initial_alpha)); // Make price extremely low. - // Set subnet prices. + // Set subnet prices. SubnetMovingPrice::::insert(netuid1, I96F32::from_num(1)); SubnetMovingPrice::::insert(netuid2, I96F32::from_num(2)); // Run coinbase @@ -957,8 +956,8 @@ fn test_drain_base_with_subnet_with_two_stakers_registered_and_root_different_am // SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::coinbase::test_drain_base_with_subnet_with_two_stakers_registered_and_root_different_amounts_half_tao_weight --exact --show-output --nocapture #[test] -fn test_drain_base_with_subnet_with_two_stakers_registered_and_root_different_amounts_half_tao_weight() - { +fn test_drain_base_with_subnet_with_two_stakers_registered_and_root_different_amounts_half_tao_weight( +) { new_test_ext(1).execute_with(|| { let netuid = NetUid::from(1); add_network(netuid, 1, 0); @@ -1242,7 +1241,7 @@ fn test_get_root_children_drain() { SubtensorModule::set_ck_burn(0); // Set TAO weight to 1. SubtensorModule::set_tao_weight(u64::MAX); // Set TAO weight to 1. - // Create keys. + // Create keys. let cold_alice = U256::from(0); let cold_bob = U256::from(1); let alice = U256::from(2); @@ -1404,7 +1403,7 @@ fn test_get_root_children_drain_half_proportion() { SubtensorModule::set_ck_burn(0); // Set TAO weight to 1. SubtensorModule::set_tao_weight(u64::MAX); // Set TAO weight to 1. - // Create keys. + // Create keys. let cold_alice = U256::from(0); let cold_bob = U256::from(1); let alice = U256::from(2); @@ -1492,7 +1491,7 @@ fn test_get_root_children_drain_with_take() { add_network(alpha, 1, 0); // Set TAO weight to 1. SubtensorModule::set_tao_weight(u64::MAX); // Set TAO weight to 1. - // Create keys. + // Create keys. let cold_alice = U256::from(0); let cold_bob = U256::from(1); let alice = U256::from(2); From 02d33b69ba468e9d980929ad289b74a8e6465e24 Mon Sep 17 00:00:00 2001 From: 0xcacti <0xcacti@gmail.com> Date: Mon, 13 Oct 2025 01:02:11 -0400 Subject: [PATCH 6/8] fix: fmt --- pallets/subtensor/src/tests/coinbase.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pallets/subtensor/src/tests/coinbase.rs b/pallets/subtensor/src/tests/coinbase.rs index a67d6b5fb..7fd4dab5c 100644 --- a/pallets/subtensor/src/tests/coinbase.rs +++ b/pallets/subtensor/src/tests/coinbase.rs @@ -428,7 +428,7 @@ fn test_coinbase_alpha_issuance_with_cap_trigger() { SubnetAlphaIn::::insert(netuid1, AlphaCurrency::from(initial_alpha)); // Make price extremely low. SubnetTAO::::insert(netuid2, TaoCurrency::from(initial)); SubnetAlphaIn::::insert(netuid2, AlphaCurrency::from(initial_alpha)); // Make price extremely low. - // Set subnet prices. + // Set subnet prices. SubnetMovingPrice::::insert(netuid1, I96F32::from_num(1)); SubnetMovingPrice::::insert(netuid2, I96F32::from_num(2)); // Run coinbase @@ -956,8 +956,8 @@ fn test_drain_base_with_subnet_with_two_stakers_registered_and_root_different_am // SKIP_WASM_BUILD=1 RUST_LOG=debug cargo test --package pallet-subtensor --lib -- tests::coinbase::test_drain_base_with_subnet_with_two_stakers_registered_and_root_different_amounts_half_tao_weight --exact --show-output --nocapture #[test] -fn test_drain_base_with_subnet_with_two_stakers_registered_and_root_different_amounts_half_tao_weight( -) { +fn test_drain_base_with_subnet_with_two_stakers_registered_and_root_different_amounts_half_tao_weight() + { new_test_ext(1).execute_with(|| { let netuid = NetUid::from(1); add_network(netuid, 1, 0); @@ -1241,7 +1241,7 @@ fn test_get_root_children_drain() { SubtensorModule::set_ck_burn(0); // Set TAO weight to 1. SubtensorModule::set_tao_weight(u64::MAX); // Set TAO weight to 1. - // Create keys. + // Create keys. let cold_alice = U256::from(0); let cold_bob = U256::from(1); let alice = U256::from(2); @@ -1403,7 +1403,7 @@ fn test_get_root_children_drain_half_proportion() { SubtensorModule::set_ck_burn(0); // Set TAO weight to 1. SubtensorModule::set_tao_weight(u64::MAX); // Set TAO weight to 1. - // Create keys. + // Create keys. let cold_alice = U256::from(0); let cold_bob = U256::from(1); let alice = U256::from(2); @@ -1491,7 +1491,7 @@ fn test_get_root_children_drain_with_take() { add_network(alpha, 1, 0); // Set TAO weight to 1. SubtensorModule::set_tao_weight(u64::MAX); // Set TAO weight to 1. - // Create keys. + // Create keys. let cold_alice = U256::from(0); let cold_bob = U256::from(1); let alice = U256::from(2); From dcd5efe592b1d728dc8b24e8861b27a33981558d Mon Sep 17 00:00:00 2001 From: 0xcacti <0xcacti@gmail.com> Date: Mon, 13 Oct 2025 01:22:29 -0400 Subject: [PATCH 7/8] fix: test test_coinbase_tao_issuance_different_prices --- pallets/subtensor/src/coinbase/run_coinbase.rs | 14 +++++++++----- pallets/subtensor/src/tests/coinbase.rs | 12 ++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pallets/subtensor/src/coinbase/run_coinbase.rs b/pallets/subtensor/src/coinbase/run_coinbase.rs index 5217160e9..a227fc59b 100644 --- a/pallets/subtensor/src/coinbase/run_coinbase.rs +++ b/pallets/subtensor/src/coinbase/run_coinbase.rs @@ -76,10 +76,10 @@ impl Pallet { log::debug!("default_alpha_in_i: {default_alpha_in_i:?}"); // Get alpha_emission total - let alpha_emission_i: U96F32 = asfloat!( - Self::get_block_emission_for_issuance(Self::get_alpha_issuance(*netuid_i).into()) - .unwrap_or(0) - ); + let alpha_emission_i: U96F32 = asfloat!(Self::get_block_emission_for_issuance( + Self::get_alpha_issuance(*netuid_i).into() + ) + .unwrap_or(0)); log::debug!("alpha_emission_i: {alpha_emission_i:?}"); let mut alpha_in_i: U96F32; @@ -92,7 +92,11 @@ impl Pallet { alpha_in_i = min_alpha_emission; tao_in_i = alpha_in_i.saturating_mul(price_i); + println!("are we in this block?"); + println!("total_moving_prices: {total_moving_prices:?}"); + if total_moving_prices < U96F32::saturating_from_num(1.0) { + println!("my favorite bar is če"); let difference_tao: U96F32 = default_tao_in_i.saturating_sub(tao_in_i); // Difference becomes buy. let buy_swap_result = Self::swap_tao_for_alpha( @@ -228,7 +232,7 @@ impl Pallet { 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. - // Remove root alpha from alpha_out. + // 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); diff --git a/pallets/subtensor/src/tests/coinbase.rs b/pallets/subtensor/src/tests/coinbase.rs index 7fd4dab5c..1a3e18f66 100644 --- a/pallets/subtensor/src/tests/coinbase.rs +++ b/pallets/subtensor/src/tests/coinbase.rs @@ -197,27 +197,23 @@ fn test_coinbase_tao_issuance_different_prices() { // Assert tao emission is split evenly. assert_abs_diff_eq!( SubnetTAO::::get(netuid1), - TaoCurrency::from(initial_tao + emission / 3), + TaoCurrency::from(initial_tao + emission / 10), epsilon = 1.into(), ); assert_abs_diff_eq!( SubnetTAO::::get(netuid2), - TaoCurrency::from(initial_tao + 2 * emission / 3), + TaoCurrency::from(initial_tao + 2 * emission / 10), epsilon = 1.into(), ); // Prices are low => we limit tao issued (buy alpha with it) - let tao_issued = TaoCurrency::from((emission as f64) as u64); + let tao_issued = TaoCurrency::from(((0.1 + 0.2) * emission as f64) as u64); assert_abs_diff_eq!( TotalIssuance::::get(), tao_issued, epsilon = 10.into() ); - assert_abs_diff_eq!( - TotalStake::::get(), - emission.into(), - epsilon = 10.into() - ); + assert_abs_diff_eq!(TotalStake::::get(), tao_issued, epsilon = 10.into()); }); } From 9944da2b72328d7f7ebbf54ec5aa920eb691e8e5 Mon Sep 17 00:00:00 2001 From: 0xcacti <0xcacti@gmail.com> Date: Mon, 13 Oct 2025 01:30:26 -0400 Subject: [PATCH 8/8] fix: test no longer triggers subsidy so test logic was wrong --- pallets/subtensor/src/coinbase/run_coinbase.rs | 14 +++++--------- pallets/subtensor/src/tests/coinbase.rs | 6 +++--- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/pallets/subtensor/src/coinbase/run_coinbase.rs b/pallets/subtensor/src/coinbase/run_coinbase.rs index a227fc59b..5217160e9 100644 --- a/pallets/subtensor/src/coinbase/run_coinbase.rs +++ b/pallets/subtensor/src/coinbase/run_coinbase.rs @@ -76,10 +76,10 @@ impl Pallet { log::debug!("default_alpha_in_i: {default_alpha_in_i:?}"); // Get alpha_emission total - let alpha_emission_i: U96F32 = asfloat!(Self::get_block_emission_for_issuance( - Self::get_alpha_issuance(*netuid_i).into() - ) - .unwrap_or(0)); + let alpha_emission_i: U96F32 = asfloat!( + Self::get_block_emission_for_issuance(Self::get_alpha_issuance(*netuid_i).into()) + .unwrap_or(0) + ); log::debug!("alpha_emission_i: {alpha_emission_i:?}"); let mut alpha_in_i: U96F32; @@ -92,11 +92,7 @@ impl Pallet { alpha_in_i = min_alpha_emission; tao_in_i = alpha_in_i.saturating_mul(price_i); - println!("are we in this block?"); - println!("total_moving_prices: {total_moving_prices:?}"); - if total_moving_prices < U96F32::saturating_from_num(1.0) { - println!("my favorite bar is če"); let difference_tao: U96F32 = default_tao_in_i.saturating_sub(tao_in_i); // Difference becomes buy. let buy_swap_result = Self::swap_tao_for_alpha( @@ -232,7 +228,7 @@ impl Pallet { 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. - // Remove root alpha from alpha_out. + // 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); diff --git a/pallets/subtensor/src/tests/coinbase.rs b/pallets/subtensor/src/tests/coinbase.rs index 1a3e18f66..ab9381b0e 100644 --- a/pallets/subtensor/src/tests/coinbase.rs +++ b/pallets/subtensor/src/tests/coinbase.rs @@ -463,8 +463,8 @@ fn test_coinbase_alpha_issuance_with_cap_trigger_and_block_emission() { // Enable emission FirstEmissionBlockNumber::::insert(netuid1, 0); FirstEmissionBlockNumber::::insert(netuid2, 0); - SubnetMovingPrice::::insert(netuid1, I96F32::from_num(1)); - SubnetMovingPrice::::insert(netuid2, I96F32::from_num(2)); + SubnetMovingPrice::::insert(netuid1, I96F32::from_num(0.1)); + SubnetMovingPrice::::insert(netuid2, I96F32::from_num(0.2)); // Force the swap to initialize SubtensorModule::swap_tao_for_alpha( @@ -498,7 +498,7 @@ fn test_coinbase_alpha_issuance_with_cap_trigger_and_block_emission() { let price_2_after = ::SwapInterface::current_alpha_price(netuid2); // AlphaIn gets decreased beacuse of a buy - assert!(u64::from(SubnetAlphaIn::::get(netuid1)) < initial_alpha); + assert!(u64::from(SubnetAlphaIn::::get(netuid1)) < initial_alpha); // HERE assert_eq!( u64::from(SubnetAlphaOut::::get(netuid2)), 21_000_000_000_000_000_u64