Skip to content

Commit a4261ae

Browse files
committed
fix: clear RootAlphaDividendsPerSubnet on network removal
RootAlphaDividendsPerSubnet is not cleaned up when a subnet is dissolved. Since netuids are recycled (subnet.rs:178-186), stale root dividend entries from the old subnet persist and become visible to the new subnet, potentially affecting run_coinbase dividend calculations. Add clear_prefix for RootAlphaDividendsPerSubnet alongside the existing AlphaDividendsPerSubnet cleanup in remove_network. Closes #1867
1 parent 1ce8574 commit a4261ae

2 files changed

Lines changed: 76 additions & 0 deletions

File tree

pallets/subtensor/src/coinbase/root.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,9 @@ impl<T: Config> Pallet<T> {
368368
let _ = NeuronCertificates::<T>::clear_prefix(netuid, u32::MAX, None);
369369
let _ = Prometheus::<T>::clear_prefix(netuid, u32::MAX, None);
370370
let _ = AlphaDividendsPerSubnet::<T>::clear_prefix(netuid, u32::MAX, None);
371+
let _ = RootAlphaDividendsPerSubnet::<T>::clear_prefix(netuid, u32::MAX, None);
372+
let _ = VotingPower::<T>::clear_prefix(netuid, u32::MAX, None);
373+
let _ = RootClaimed::<T>::clear_prefix((netuid,), u32::MAX, None);
371374
let _ = PendingChildKeys::<T>::clear_prefix(netuid, u32::MAX, None);
372375
let _ = AssociatedEvmAddress::<T>::clear_prefix(netuid, u32::MAX, None);
373376

pallets/subtensor/src/tests/networks.rs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2632,3 +2632,76 @@ fn register_network_non_associated_hotkey_does_not_withdraw_or_write_owner_alpha
26322632
);
26332633
});
26342634
}
2635+
2636+
#[test]
2637+
fn dissolve_network_clears_root_alpha_dividends() {
2638+
new_test_ext(0).execute_with(|| {
2639+
let cold = U256::from(1);
2640+
let hot = U256::from(2);
2641+
let net = add_dynamic_network(&hot, &cold);
2642+
2643+
// Insert some root alpha dividend data for this subnet.
2644+
RootAlphaDividendsPerSubnet::<Test>::insert(net, hot, AlphaBalance::from(1000));
2645+
assert!(RootAlphaDividendsPerSubnet::<Test>::contains_key(net, hot));
2646+
2647+
// Dissolve the network.
2648+
SubtensorModule::set_subnet_locked_balance(net, TaoBalance::from(0));
2649+
SubnetTAO::<Test>::insert(net, TaoBalance::from(0));
2650+
Emission::<Test>::insert(net, Vec::<AlphaBalance>::new());
2651+
assert_ok!(SubtensorModule::do_dissolve_network(net));
2652+
2653+
// RootAlphaDividendsPerSubnet should be cleared.
2654+
assert!(
2655+
!RootAlphaDividendsPerSubnet::<Test>::contains_key(net, hot),
2656+
"RootAlphaDividendsPerSubnet not cleaned up after network removal"
2657+
);
2658+
});
2659+
}
2660+
2661+
#[test]
2662+
fn dissolve_network_clears_voting_power() {
2663+
new_test_ext(0).execute_with(|| {
2664+
let cold = U256::from(1);
2665+
let hot = U256::from(2);
2666+
let net = add_dynamic_network(&hot, &cold);
2667+
2668+
// Insert voting power for a validator on this subnet.
2669+
VotingPower::<Test>::insert(net, hot, 9999u64);
2670+
assert!(VotingPower::<Test>::contains_key(net, hot));
2671+
2672+
// Dissolve the network.
2673+
SubtensorModule::set_subnet_locked_balance(net, TaoBalance::from(0));
2674+
SubnetTAO::<Test>::insert(net, TaoBalance::from(0));
2675+
Emission::<Test>::insert(net, Vec::<AlphaBalance>::new());
2676+
assert_ok!(SubtensorModule::do_dissolve_network(net));
2677+
2678+
assert!(
2679+
!VotingPower::<Test>::contains_key(net, hot),
2680+
"VotingPower not cleaned up after network removal"
2681+
);
2682+
});
2683+
}
2684+
2685+
#[test]
2686+
fn dissolve_network_clears_root_claimed() {
2687+
new_test_ext(0).execute_with(|| {
2688+
let cold = U256::from(1);
2689+
let hot = U256::from(2);
2690+
let net = add_dynamic_network(&hot, &cold);
2691+
2692+
// Simulate a recorded root claim for this subnet.
2693+
RootClaimed::<Test>::insert((net, hot, cold), 500u128);
2694+
assert!(RootClaimed::<Test>::contains_key((net, hot, cold)));
2695+
2696+
// Dissolve the network.
2697+
SubtensorModule::set_subnet_locked_balance(net, TaoBalance::from(0));
2698+
SubnetTAO::<Test>::insert(net, TaoBalance::from(0));
2699+
Emission::<Test>::insert(net, Vec::<AlphaBalance>::new());
2700+
assert_ok!(SubtensorModule::do_dissolve_network(net));
2701+
2702+
assert!(
2703+
!RootClaimed::<Test>::contains_key((net, hot, cold)),
2704+
"RootClaimed not cleaned up after network removal"
2705+
);
2706+
});
2707+
}

0 commit comments

Comments
 (0)