Skip to content

Commit 7f8437b

Browse files
authored
Merge pull request #368 from opentensor/chore/merge-sam-devnet-tmp
merge `sam-devnet-tmp` to `main`
2 parents e61f70b + da9d55d commit 7f8437b

File tree

18 files changed

+1521
-86
lines changed

18 files changed

+1521
-86
lines changed

.github/workflows/check-rust.yml

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,12 @@ on:
99
##
1010
# Run automatically for any push that changes Rust file(s)
1111
push:
12-
branches:
13-
- main
14-
- $default-branch
15-
16-
paths:
17-
- "**.rs"
18-
- "**/Cargo.toml"
19-
- "**/Cargo.lock"
12+
branches: [main, development, staging]
2013

2114
##
2215
# Run automatically for PRs against default/main branch if Rust files change
2316
pull_request:
24-
branches:
25-
- main
26-
- $default-branch
27-
28-
paths:
29-
- "**.rs"
30-
- "**/Cargo.toml"
31-
- "**/Cargo.lock"
17+
branches: [main, development, staging]
3218

3319
## Allow running workflow manually from the Actions tab
3420
workflow_dispatch:

pallets/admin-utils/src/lib.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ pub mod pallet {
5353
}
5454

5555
#[pallet::event]
56-
#[pallet::generate_deposit(pub(super) fn deposit_event)]
5756
pub enum Event<T: Config> {}
5857

5958
// Errors inform users that something went wrong.
@@ -765,6 +764,27 @@ pub mod pallet {
765764
T::Subtensor::set_weights_min_stake(min_stake);
766765
Ok(())
767766
}
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+
}
768788
}
769789
}
770790

@@ -853,4 +873,7 @@ pub trait SubtensorInterface<AccountId, Balance, RuntimeOrigin> {
853873
fn set_weights_set_rate_limit(netuid: u16, weights_set_rate_limit: u64);
854874
fn init_new_network(netuid: u16, tempo: u16);
855875
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();
856879
}

pallets/admin-utils/tests/mock.rs

Lines changed: 55 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, StorageMapShim},
44
weights,
55
};
@@ -110,6 +110,8 @@ parameter_types! {
110110
pub const InitialNetworkLockReductionInterval: u64 = 2; // 2 blocks.
111111
pub const InitialSubnetLimit: u16 = 10; // Max 10 subnets.
112112
pub const InitialNetworkRateLimit: u64 = 0;
113+
pub const InitialTargetStakesPerInterval: u16 = 1;
114+
113115
}
114116

115117
impl pallet_subtensor::Config for Test {
@@ -158,6 +160,7 @@ impl pallet_subtensor::Config for Test {
158160
type InitialNetworkLockReductionInterval = InitialNetworkLockReductionInterval;
159161
type InitialSubnetLimit = InitialSubnetLimit;
160162
type InitialNetworkRateLimit = InitialNetworkRateLimit;
163+
type InitialTargetStakesPerInterval = InitialTargetStakesPerInterval;
161164
}
162165

163166
impl system::Config for Test {
@@ -433,6 +436,18 @@ impl pallet_admin_utils::SubtensorInterface<AccountId, Balance, RuntimeOrigin> f
433436
fn set_weights_min_stake(min_stake: u64) {
434437
SubtensorModule::set_weights_min_stake(min_stake);
435438
}
439+
440+
fn set_nominator_min_required_stake(min_stake: u64) {
441+
SubtensorModule::set_nominator_min_required_stake(min_stake);
442+
}
443+
444+
fn get_nominator_min_required_stake() -> u64 {
445+
SubtensorModule::get_nominator_min_required_stake()
446+
}
447+
448+
fn clear_small_nominations() {
449+
SubtensorModule::clear_small_nominations();
450+
}
436451
}
437452

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

pallets/admin-utils/tests/tests.rs

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

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

0 commit comments

Comments
 (0)