diff --git a/pallets/subtensor/src/epoch/run_epoch.rs b/pallets/subtensor/src/epoch/run_epoch.rs index 962c5bbbb4..bd4fccb389 100644 --- a/pallets/subtensor/src/epoch/run_epoch.rs +++ b/pallets/subtensor/src/epoch/run_epoch.rs @@ -1569,10 +1569,10 @@ impl Pallet { netuid_index, i, bonds_vec - .clone() .iter() .filter(|(j, _)| *j != uid) - .collect::>(), + .copied() + .collect::>(), ); } log::debug!("Reset bonds for {account_id:?}, netuid {netuid:?}"); diff --git a/pallets/subtensor/src/tests/epoch.rs b/pallets/subtensor/src/tests/epoch.rs index 5c516f9f30..1ef655bd29 100644 --- a/pallets/subtensor/src/tests/epoch.rs +++ b/pallets/subtensor/src/tests/epoch.rs @@ -3573,6 +3573,64 @@ fn test_yuma_3_bonds_reset() { }) } +#[test] +fn test_do_reset_bonds_removes_target_uid_from_all_bond_vecs() { + new_test_ext(1).execute_with(|| { + let netuid = NetUid::from(1); + let idx = NetUidStorageIndex::from(netuid); + add_network(netuid, 1, 0); + SubtensorModule::set_bonds_reset(netuid, true); + + let hk0 = U256::from(10); + let hk1 = U256::from(11); + let hk2 = U256::from(12); + let ck = U256::from(100); + register_ok_neuron(netuid, hk0, ck, 0); + register_ok_neuron(netuid, hk1, ck, 0); + register_ok_neuron(netuid, hk2, ck, 0); + + // Seed bonds so every peer has an entry pointing to uid 1 (the target) + // alongside entries we expect to survive the reset. + Bonds::::insert(idx, 0u16, vec![(1u16, 100u16), (2u16, 200u16)]); + Bonds::::insert(idx, 1u16, vec![(0u16, 300u16), (2u16, 400u16)]); + Bonds::::insert(idx, 2u16, vec![(0u16, 500u16), (1u16, 600u16)]); + + assert_ok!(SubtensorModule::do_reset_bonds(idx, &hk1)); + + // Every entry referring to uid 1 is gone; all other entries preserved. + assert_eq!(Bonds::::get(idx, 0u16), vec![(2u16, 200u16)]); + assert_eq!( + Bonds::::get(idx, 1u16), + vec![(0u16, 300u16), (2u16, 400u16)] + ); + assert_eq!(Bonds::::get(idx, 2u16), vec![(0u16, 500u16)]); + }); +} + +#[test] +fn test_do_reset_bonds_noop_when_disabled() { + new_test_ext(1).execute_with(|| { + let netuid = NetUid::from(1); + let idx = NetUidStorageIndex::from(netuid); + add_network(netuid, 1, 0); + SubtensorModule::set_bonds_reset(netuid, false); + + let hk0 = U256::from(10); + let hk1 = U256::from(11); + let ck = U256::from(100); + register_ok_neuron(netuid, hk0, ck, 0); + register_ok_neuron(netuid, hk1, ck, 0); + + let original = vec![(1u16, 100u16)]; + Bonds::::insert(idx, 0u16, original.clone()); + + assert_ok!(SubtensorModule::do_reset_bonds(idx, &hk1)); + + // Reset disabled: bonds untouched. + assert_eq!(Bonds::::get(idx, 0u16), original); + }); +} + #[test] fn test_liquid_alpha_equal_values_against_itself() { new_test_ext(1).execute_with(|| { diff --git a/runtime/tests/precompiles.rs b/runtime/tests/precompiles.rs index 519e434533..83ee5cce63 100644 --- a/runtime/tests/precompiles.rs +++ b/runtime/tests/precompiles.rs @@ -1,5 +1,6 @@ #![allow(clippy::unwrap_used)] #![allow(clippy::expect_used)] +#![allow(clippy::arithmetic_side_effects)] use fp_evm::{Context, ExitError, PrecompileFailure, PrecompileResult}; use node_subtensor_runtime::{BuildStorage, Runtime, RuntimeGenesisConfig, System};