Skip to content

Commit a224692

Browse files
authored
Merge pull request #366 from opentensor/feat/merge-testnet-changes
feat: merge testnet changes
2 parents 97a207a + b53c33e commit a224692

File tree

10 files changed

+768
-170
lines changed

10 files changed

+768
-170
lines changed

pallets/admin-utils/src/lib.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,27 @@ pub mod pallet {
764764
T::Subtensor::set_weights_min_stake(min_stake);
765765
Ok(())
766766
}
767+
768+
/// Sets the minimum stake required for nominators, and clears small nominations
769+
/// that are below the minimum required stake.
770+
#[pallet::call_index(43)]
771+
#[pallet::weight((0, DispatchClass::Operational, Pays::No))]
772+
pub fn sudo_set_nominator_min_required_stake(
773+
origin: OriginFor<T>,
774+
// The minimum stake required for nominators.
775+
min_stake: u64,
776+
) -> DispatchResult {
777+
ensure_root(origin)?;
778+
let prev_min_stake = T::Subtensor::get_nominator_min_required_stake();
779+
log::trace!("Setting minimum stake to: {}", min_stake);
780+
T::Subtensor::set_nominator_min_required_stake(min_stake);
781+
if min_stake > prev_min_stake {
782+
log::trace!("Clearing small nominations");
783+
T::Subtensor::clear_small_nominations();
784+
log::trace!("Small nominations cleared");
785+
}
786+
Ok(())
787+
}
767788
}
768789
}
769790

@@ -852,4 +873,7 @@ pub trait SubtensorInterface<AccountId, Balance, RuntimeOrigin> {
852873
fn set_weights_set_rate_limit(netuid: u16, weights_set_rate_limit: u64);
853874
fn init_new_network(netuid: u16, tempo: u16);
854875
fn set_weights_min_stake(min_stake: u64);
876+
fn get_nominator_min_required_stake() -> u64;
877+
fn set_nominator_min_required_stake(min_stake: u64);
878+
fn clear_small_nominations();
855879
}

pallets/admin-utils/tests/mock.rs

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use frame_support::{
2-
parameter_types,
2+
assert_ok, parameter_types,
33
traits::{Everything, Hooks},
44
weights,
55
};
@@ -429,6 +429,18 @@ impl pallet_admin_utils::SubtensorInterface<AccountId, Balance, RuntimeOrigin> f
429429
fn set_weights_min_stake(min_stake: u64) {
430430
SubtensorModule::set_weights_min_stake(min_stake);
431431
}
432+
433+
fn set_nominator_min_required_stake(min_stake: u64) {
434+
SubtensorModule::set_nominator_min_required_stake(min_stake);
435+
}
436+
437+
fn get_nominator_min_required_stake() -> u64 {
438+
SubtensorModule::get_nominator_min_required_stake()
439+
}
440+
441+
fn clear_small_nominations() {
442+
SubtensorModule::clear_small_nominations();
443+
}
432444
}
433445

434446
impl pallet_admin_utils::Config for Test {
@@ -462,3 +474,42 @@ pub(crate) fn run_to_block(n: u64) {
462474
SubtensorModule::on_initialize(System::block_number());
463475
}
464476
}
477+
478+
#[allow(dead_code)]
479+
pub fn register_ok_neuron(
480+
netuid: u16,
481+
hotkey_account_id: U256,
482+
coldkey_account_id: U256,
483+
start_nonce: u64,
484+
) {
485+
let block_number: u64 = SubtensorModule::get_current_block_as_u64();
486+
let (nonce, work): (u64, Vec<u8>) = SubtensorModule::create_work_for_block_number(
487+
netuid,
488+
block_number,
489+
start_nonce,
490+
&hotkey_account_id,
491+
);
492+
let result = SubtensorModule::register(
493+
<<Test as frame_system::Config>::RuntimeOrigin>::signed(hotkey_account_id),
494+
netuid,
495+
block_number,
496+
nonce,
497+
work,
498+
hotkey_account_id,
499+
coldkey_account_id,
500+
);
501+
assert_ok!(result);
502+
log::info!(
503+
"Register ok neuron: netuid: {:?}, coldkey: {:?}, hotkey: {:?}",
504+
netuid,
505+
hotkey_account_id,
506+
coldkey_account_id
507+
);
508+
}
509+
510+
#[allow(dead_code)]
511+
pub fn add_network(netuid: u16, tempo: u16) {
512+
SubtensorModule::init_new_network(netuid, tempo);
513+
SubtensorModule::set_network_registration_allowed(netuid, true);
514+
SubtensorModule::set_network_pow_registration_allowed(netuid, true);
515+
}

pallets/admin-utils/tests/tests.rs

Lines changed: 186 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,6 @@ use sp_core::U256;
88
mod mock;
99
use mock::*;
1010

11-
pub fn add_network(netuid: u16, tempo: u16) {
12-
SubtensorModule::init_new_network(netuid, tempo);
13-
SubtensorModule::set_network_registration_allowed(netuid, true);
14-
SubtensorModule::set_network_pow_registration_allowed(netuid, true);
15-
}
16-
1711
#[test]
1812
fn test_sudo_set_default_take() {
1913
new_test_ext().execute_with(|| {
@@ -880,3 +874,189 @@ fn test_sudo_set_network_pow_registration_allowed() {
880874
);
881875
});
882876
}
877+
878+
mod sudo_set_nominator_min_required_stake {
879+
use super::*;
880+
881+
#[test]
882+
fn can_only_be_called_by_admin() {
883+
new_test_ext().execute_with(|| {
884+
let to_be_set: u64 = SubtensorModule::get_nominator_min_required_stake() + 5 as u64;
885+
assert_eq!(
886+
AdminUtils::sudo_set_nominator_min_required_stake(
887+
<<Test as Config>::RuntimeOrigin>::signed(U256::from(0)),
888+
to_be_set
889+
),
890+
Err(DispatchError::BadOrigin.into())
891+
);
892+
});
893+
}
894+
895+
#[test]
896+
fn sets_a_lower_value() {
897+
new_test_ext().execute_with(|| {
898+
assert_ok!(AdminUtils::sudo_set_nominator_min_required_stake(
899+
<<Test as Config>::RuntimeOrigin>::root(),
900+
10u64
901+
));
902+
assert_eq!(SubtensorModule::get_nominator_min_required_stake(), 10u64);
903+
904+
assert_ok!(AdminUtils::sudo_set_nominator_min_required_stake(
905+
<<Test as Config>::RuntimeOrigin>::root(),
906+
5u64
907+
));
908+
assert_eq!(SubtensorModule::get_nominator_min_required_stake(), 5u64);
909+
});
910+
}
911+
912+
#[test]
913+
fn sets_a_higher_value() {
914+
new_test_ext().execute_with(|| {
915+
let to_be_set: u64 = SubtensorModule::get_nominator_min_required_stake() + 5 as u64;
916+
assert_ok!(AdminUtils::sudo_set_nominator_min_required_stake(
917+
<<Test as Config>::RuntimeOrigin>::root(),
918+
to_be_set
919+
));
920+
assert_eq!(
921+
SubtensorModule::get_nominator_min_required_stake(),
922+
to_be_set
923+
);
924+
});
925+
}
926+
927+
#[test]
928+
fn clears_staker_nominations_below_min() {
929+
new_test_ext().execute_with(|| {
930+
System::set_block_number(1);
931+
932+
// Create accounts.
933+
let netuid = 1;
934+
let hot1 = U256::from(1);
935+
let hot2 = U256::from(2);
936+
let cold1 = U256::from(3);
937+
let cold2 = U256::from(4);
938+
939+
SubtensorModule::set_target_stakes_per_interval(10);
940+
// Register network.
941+
add_network(netuid, 0);
942+
943+
// Register hot1.
944+
register_ok_neuron(netuid, hot1, cold1, 0);
945+
assert_ok!(SubtensorModule::do_become_delegate(
946+
<<Test as Config>::RuntimeOrigin>::signed(cold1),
947+
hot1,
948+
0
949+
));
950+
assert_eq!(SubtensorModule::get_owning_coldkey_for_hotkey(&hot1), cold1);
951+
952+
// Register hot2.
953+
register_ok_neuron(netuid, hot2, cold2, 0);
954+
assert_ok!(SubtensorModule::do_become_delegate(
955+
<<Test as Config>::RuntimeOrigin>::signed(cold2),
956+
hot2,
957+
0
958+
));
959+
assert_eq!(SubtensorModule::get_owning_coldkey_for_hotkey(&hot2), cold2);
960+
961+
// Add stake cold1 --> hot1 (non delegation.)
962+
SubtensorModule::add_balance_to_coldkey_account(&cold1, 5);
963+
assert_ok!(SubtensorModule::add_stake(
964+
<<Test as Config>::RuntimeOrigin>::signed(cold1),
965+
hot1,
966+
1
967+
));
968+
assert_eq!(
969+
SubtensorModule::get_stake_for_coldkey_and_hotkey(&cold1, &hot1),
970+
1
971+
);
972+
assert_eq!(Balances::free_balance(cold1), 4);
973+
974+
// Add stake cold2 --> hot1 (is delegation.)
975+
SubtensorModule::add_balance_to_coldkey_account(&cold2, 5);
976+
assert_ok!(SubtensorModule::add_stake(
977+
<<Test as Config>::RuntimeOrigin>::signed(cold2),
978+
hot1,
979+
1
980+
));
981+
assert_eq!(
982+
SubtensorModule::get_stake_for_coldkey_and_hotkey(&cold2, &hot1),
983+
1
984+
);
985+
assert_eq!(Balances::free_balance(cold2), 4);
986+
987+
// Add stake cold1 --> hot2 (non delegation.)
988+
SubtensorModule::add_balance_to_coldkey_account(&cold1, 5);
989+
assert_ok!(SubtensorModule::add_stake(
990+
<<Test as Config>::RuntimeOrigin>::signed(cold1),
991+
hot2,
992+
1
993+
));
994+
assert_eq!(
995+
SubtensorModule::get_stake_for_coldkey_and_hotkey(&cold1, &hot2),
996+
1
997+
);
998+
assert_eq!(Balances::free_balance(cold1), 8);
999+
1000+
// Add stake cold2 --> hot2 (is delegation.)
1001+
SubtensorModule::add_balance_to_coldkey_account(&cold2, 5);
1002+
assert_ok!(SubtensorModule::add_stake(
1003+
<<Test as Config>::RuntimeOrigin>::signed(cold2),
1004+
hot2,
1005+
1
1006+
));
1007+
assert_eq!(
1008+
SubtensorModule::get_stake_for_coldkey_and_hotkey(&cold2, &hot2),
1009+
1
1010+
);
1011+
assert_eq!(Balances::free_balance(cold2), 8);
1012+
1013+
// Set min stake to 0 (noop)
1014+
assert_ok!(AdminUtils::sudo_set_nominator_min_required_stake(
1015+
<<Test as Config>::RuntimeOrigin>::root(),
1016+
0u64
1017+
));
1018+
assert_eq!(
1019+
SubtensorModule::get_stake_for_coldkey_and_hotkey(&cold1, &hot1),
1020+
1
1021+
);
1022+
assert_eq!(
1023+
SubtensorModule::get_stake_for_coldkey_and_hotkey(&cold1, &hot2),
1024+
1
1025+
);
1026+
assert_eq!(
1027+
SubtensorModule::get_stake_for_coldkey_and_hotkey(&cold2, &hot1),
1028+
1
1029+
);
1030+
assert_eq!(
1031+
SubtensorModule::get_stake_for_coldkey_and_hotkey(&cold2, &hot2),
1032+
1
1033+
);
1034+
1035+
// Set min nomination to 10: should clear (cold2, hot1) and (cold1, hot2).
1036+
assert_ok!(AdminUtils::sudo_set_nominator_min_required_stake(
1037+
<<Test as Config>::RuntimeOrigin>::root(),
1038+
10u64
1039+
));
1040+
assert_eq!(
1041+
SubtensorModule::get_stake_for_coldkey_and_hotkey(&cold1, &hot1),
1042+
1
1043+
);
1044+
assert_eq!(
1045+
SubtensorModule::get_stake_for_coldkey_and_hotkey(&cold1, &hot2),
1046+
0
1047+
);
1048+
assert_eq!(
1049+
SubtensorModule::get_stake_for_coldkey_and_hotkey(&cold2, &hot1),
1050+
0
1051+
);
1052+
assert_eq!(
1053+
SubtensorModule::get_stake_for_coldkey_and_hotkey(&cold2, &hot2),
1054+
1
1055+
);
1056+
1057+
// Balances have been added back into accounts.
1058+
assert_eq!(Balances::free_balance(cold1), 9);
1059+
assert_eq!(Balances::free_balance(cold2), 9);
1060+
});
1061+
}
1062+
}

0 commit comments

Comments
 (0)