Skip to content

Commit 4e8d9ca

Browse files
committed
Add minimum take boundary
1 parent b733877 commit 4e8d9ca

File tree

10 files changed

+118
-19
lines changed

10 files changed

+118
-19
lines changed

pallets/admin-utils/src/lib.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ pub mod pallet {
8888
#[pallet::weight(T::WeightInfo::sudo_set_default_take())]
8989
pub fn sudo_set_default_take(origin: OriginFor<T>, default_take: u16) -> DispatchResult {
9090
ensure_root(origin)?;
91-
T::Subtensor::set_default_take(default_take);
91+
T::Subtensor::set_max_delegate_take(default_take);
9292
log::info!("DefaultTakeSet( default_take: {:?} ) ", default_take);
9393
Ok(())
9494
}
@@ -800,6 +800,15 @@ pub mod pallet {
800800
);
801801
Ok(())
802802
}
803+
804+
#[pallet::call_index(46)]
805+
#[pallet::weight((0, DispatchClass::Operational, Pays::No))]
806+
pub fn sudo_set_min_delegate_take(origin: OriginFor<T>, take: u16) -> DispatchResult {
807+
ensure_root(origin)?;
808+
T::Subtensor::set_min_delegate_take(take);
809+
log::info!("TxMinDelegateTakeSet( tx_min_delegate_take: {:?} ) ", take);
810+
Ok(())
811+
}
803812
}
804813
}
805814

@@ -821,7 +830,8 @@ impl<A, M> AuraInterface<A, M> for () {
821830
///////////////////////////////////////////
822831

823832
pub trait SubtensorInterface<AccountId, Balance, RuntimeOrigin> {
824-
fn set_default_take(default_take: u16);
833+
fn set_min_delegate_take(take: u16);
834+
fn set_max_delegate_take(take: u16);
825835
fn set_tx_rate_limit(rate_limit: u64);
826836
fn set_tx_delegate_take_rate_limit(rate_limit: u64);
827837

pallets/admin-utils/src/weights.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ use core::marker::PhantomData;
3434
/// Weight functions needed for `pallet_admin_utils`.
3535
pub trait WeightInfo {
3636
fn swap_authorities(a: u32, ) -> Weight;
37-
fn sudo_set_default_take() -> Weight;
37+
fn sudo_set_min_delegate_take() -> Weight;
38+
fn sudo_set_default_take() -> Weight;
3839
fn sudo_set_serving_rate_limit() -> Weight;
3940
fn sudo_set_max_difficulty() -> Weight;
4041
fn sudo_set_min_difficulty() -> Weight;
@@ -90,6 +91,16 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
9091
Weight::from_parts(27_199_000, 655)
9192
.saturating_add(T::DbWeight::get().writes(1_u64))
9293
}
94+
/// Storage: SubtensorModule DefaultTake (r:0 w:1)
95+
/// Proof Skipped: SubtensorModule DefaultTake (max_values: Some(1), max_size: None, mode: Measured)
96+
fn sudo_set_min_delegate_take() -> Weight {
97+
// Proof Size summary in bytes:
98+
// Measured: `655`
99+
// Estimated: `655`
100+
// Minimum execution time: 26_770_000 picoseconds.
101+
Weight::from_parts(27_199_000, 655)
102+
.saturating_add(T::DbWeight::get().writes(1_u64))
103+
}
93104
/// Storage: SubtensorModule ServingRateLimit (r:0 w:1)
94105
/// Proof Skipped: SubtensorModule ServingRateLimit (max_values: None, max_size: None, mode: Measured)
95106
fn sudo_set_serving_rate_limit() -> Weight {
@@ -430,6 +441,16 @@ impl WeightInfo for () {
430441
Weight::from_parts(27_199_000, 655)
431442
.saturating_add(RocksDbWeight::get().writes(1_u64))
432443
}
444+
/// Storage: SubtensorModule DefaultTake (r:0 w:1)
445+
/// Proof Skipped: SubtensorModule DefaultTake (max_values: Some(1), max_size: None, mode: Measured)
446+
fn sudo_set_min_delegate_take() -> Weight {
447+
// Proof Size summary in bytes:
448+
// Measured: `655`
449+
// Estimated: `655`
450+
// Minimum execution time: 26_770_000 picoseconds.
451+
Weight::from_parts(27_199_000, 655)
452+
.saturating_add(RocksDbWeight::get().writes(1_u64))
453+
}
433454
/// Storage: SubtensorModule ServingRateLimit (r:0 w:1)
434455
/// Proof Skipped: SubtensorModule ServingRateLimit (max_values: None, max_size: None, mode: Measured)
435456
fn sudo_set_serving_rate_limit() -> Weight {

pallets/admin-utils/tests/mock.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ parameter_types! {
7676
pub const InitialStakePruningMin: u16 = 0;
7777
pub const InitialFoundationDistribution: u64 = 0;
7878
pub const InitialDefaultTake: u16 = 11_796; // 18% honest number.
79+
pub const InitialMinTake: u16 = 0;
7980
pub const InitialWeightsVersionKey: u16 = 0;
8081
pub const InitialServingRateLimit: u64 = 0; // No limit.
8182
pub const InitialTxRateLimit: u64 = 0; // Disable rate limit for testing
@@ -139,6 +140,7 @@ impl pallet_subtensor::Config for Test {
139140
type InitialBondsMovingAverage = InitialBondsMovingAverage;
140141
type InitialMaxAllowedValidators = InitialMaxAllowedValidators;
141142
type InitialDefaultTake = InitialDefaultTake;
143+
type InitialMinTake = InitialMinTake;
142144
type InitialWeightsVersionKey = InitialWeightsVersionKey;
143145
type InitialMaxDifficulty = InitialMaxDifficulty;
144146
type InitialMinDifficulty = InitialMinDifficulty;
@@ -205,8 +207,12 @@ impl pallet_balances::Config for Test {
205207
pub struct SubtensorIntrf;
206208

207209
impl pallet_admin_utils::SubtensorInterface<AccountId, Balance, RuntimeOrigin> for SubtensorIntrf {
208-
fn set_default_take(default_take: u16) {
209-
SubtensorModule::set_default_take(default_take);
210+
fn set_max_delegate_take(default_take: u16) {
211+
SubtensorModule::set_max_delegate_take(default_take);
212+
}
213+
214+
fn set_min_delegate_take(default_take: u16) {
215+
SubtensorModule::set_min_delegate_take(default_take);
210216
}
211217

212218
fn set_tx_rate_limit(rate_limit: u64) {

pallets/admin-utils/tests/tests.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,3 +1087,24 @@ fn test_sudo_set_tx_delegate_take_rate_limit() {
10871087
);
10881088
});
10891089
}
1090+
1091+
#[test]
1092+
fn test_sudo_set_min_delegate_take() {
1093+
new_test_ext().execute_with(|| {
1094+
let to_be_set = u16::MAX / 100;
1095+
let init_value = SubtensorModule::get_min_delegate_take();
1096+
assert_eq!(
1097+
AdminUtils::sudo_set_min_delegate_take(
1098+
<<Test as Config>::RuntimeOrigin>::signed(U256::from(1)),
1099+
to_be_set
1100+
),
1101+
Err(DispatchError::BadOrigin.into())
1102+
);
1103+
assert_eq!(SubtensorModule::get_min_delegate_take(), init_value);
1104+
assert_ok!(AdminUtils::sudo_set_min_delegate_take(
1105+
<<Test as Config>::RuntimeOrigin>::root(),
1106+
to_be_set
1107+
));
1108+
assert_eq!(SubtensorModule::get_min_delegate_take(), to_be_set);
1109+
});
1110+
}

pallets/subtensor/src/lib.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ use codec::{Decode, Encode};
1919
use frame_support::sp_runtime::transaction_validity::InvalidTransaction;
2020
use frame_support::sp_runtime::transaction_validity::ValidTransaction;
2121
use scale_info::TypeInfo;
22-
use sp_core::Get;
2322
use sp_runtime::{
2423
traits::{DispatchInfoOf, Dispatchable, PostDispatchInfoOf, SignedExtension},
2524
transaction_validity::{TransactionValidity, TransactionValidityError},
@@ -160,6 +159,8 @@ pub mod pallet {
160159
type InitialMaxAllowedValidators: Get<u16>;
161160
#[pallet::constant] // Initial default delegation take.
162161
type InitialDefaultTake: Get<u16>;
162+
#[pallet::constant] // Initial minimum delegation take.
163+
type InitialMinTake: Get<u16>;
163164
#[pallet::constant] // Initial weights version key.
164165
type InitialWeightsVersionKey: Get<u64>;
165166
#[pallet::constant] // Initial serving rate limit.
@@ -214,6 +215,10 @@ pub mod pallet {
214215
T::InitialDefaultTake::get()
215216
}
216217
#[pallet::type_value]
218+
pub fn DefaultMinTake<T: Config>() -> u16 {
219+
T::InitialMinTake::get()
220+
}
221+
#[pallet::type_value]
217222
pub fn DefaultAccountTake<T: Config>() -> u64 {
218223
0
219224
}
@@ -249,7 +254,9 @@ pub mod pallet {
249254
#[pallet::storage] // --- ITEM ( total_stake )
250255
pub type TotalStake<T> = StorageValue<_, u64, ValueQuery>;
251256
#[pallet::storage] // --- ITEM ( default_take )
252-
pub type DefaultTake<T> = StorageValue<_, u16, ValueQuery, DefaultDefaultTake<T>>;
257+
pub type MaxTake<T> = StorageValue<_, u16, ValueQuery, DefaultDefaultTake<T>>;
258+
#[pallet::storage] // --- ITEM ( min_take )
259+
pub type MinTake<T> = StorageValue<_, u16, ValueQuery, DefaultMinTake<T>>;
253260
#[pallet::storage] // --- ITEM ( global_block_emission )
254261
pub type BlockEmission<T> = StorageValue<_, u64, ValueQuery, DefaultBlockEmission<T>>;
255262
#[pallet::storage] // --- ITEM ( total_issuance )
@@ -935,6 +942,8 @@ pub mod pallet {
935942
old_hotkey: T::AccountId,
936943
new_hotkey: T::AccountId,
937944
}, // Event created when a hotkey is swapped
945+
MaxDelegateTakeSet(u16), // Event emitted when maximum delegate take is set by sudo/admin transaction
946+
MinDelegateTakeSet(u16), // Event emitted when minimum delegate take is set by sudo/admin transaction
938947
}
939948

940949
// Errors inform users that something went wrong.

pallets/subtensor/src/staking.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,10 @@ impl<T: Config> Pallet<T> {
6868
Error::<T>::TxRateLimitExceeded
6969
);
7070

71-
// --- 5.1 Ensure take is within the 0 ..= InitialDefaultTake (18%) range
72-
let max_take = T::InitialDefaultTake::get();
71+
// --- 5.1 Ensure take is within the min ..= InitialDefaultTake (18%) range
72+
let min_take = MinTake::<T>::get();
73+
let max_take = MaxTake::<T>::get();
74+
ensure!(take >= min_take, Error::<T>::InvalidTake);
7375
ensure!(take <= max_take, Error::<T>::InvalidTake);
7476

7577
// --- 6. Delegate the key.
@@ -138,6 +140,10 @@ impl<T: Config> Pallet<T> {
138140
ensure!(take < current_take, Error::<T>::InvalidTake);
139141
}
140142

143+
// --- 3.1 Ensure take is within the min ..= InitialDefaultTake (18%) range
144+
let min_take = MinTake::<T>::get();
145+
ensure!(take >= min_take, Error::<T>::InvalidTake);
146+
141147
// --- 4. Set the new take value.
142148
Delegates::<T>::insert(hotkey.clone(), take);
143149

@@ -203,8 +209,8 @@ impl<T: Config> Pallet<T> {
203209
ensure!(take > current_take, Error::<T>::InvalidTake);
204210
}
205211

206-
// --- 4. Ensure take is within the 0 ..= InitialDefaultTake (18%) range
207-
let max_take = T::InitialDefaultTake::get();
212+
// --- 4. Ensure take is within the min ..= InitialDefaultTake (18%) range
213+
let max_take = MaxTake::<T>::get();
208214
ensure!(take <= max_take, Error::<T>::InvalidTake);
209215

210216
// --- 5. Enforce the rate limit (independently on do_add_stake rate limits)

pallets/subtensor/src/utils.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -346,12 +346,16 @@ impl<T: Config> Pallet<T> {
346346
TotalIssuance::<T>::put(TotalIssuance::<T>::get().saturating_add(amount));
347347
}
348348
pub fn get_default_take() -> u16 {
349-
DefaultTake::<T>::get()
349+
// Default to maximum
350+
MaxTake::<T>::get()
350351
}
351-
pub fn set_default_take(default_take: u16) {
352-
DefaultTake::<T>::put(default_take);
352+
pub fn set_max_take(default_take: u16) {
353+
MaxTake::<T>::put(default_take);
353354
Self::deposit_event(Event::DefaultTakeSet(default_take));
354355
}
356+
pub fn get_min_take() -> u16 {
357+
MinTake::<T>::get()
358+
}
355359

356360
pub fn set_subnet_locked_balance(netuid: u16, amount: u64) {
357361
SubnetLocked::<T>::insert(netuid, amount);
@@ -380,6 +384,20 @@ impl<T: Config> Pallet<T> {
380384
TxDelegateTakeRateLimit::<T>::put(tx_rate_limit);
381385
Self::deposit_event(Event::TxDelegateTakeRateLimitSet(tx_rate_limit));
382386
}
387+
pub fn set_min_delegate_take(take: u16) {
388+
MinTake::<T>::put(take);
389+
Self::deposit_event(Event::MinDelegateTakeSet(take));
390+
}
391+
pub fn set_max_delegate_take(take: u16) {
392+
MaxTake::<T>::put(take);
393+
Self::deposit_event(Event::MaxDelegateTakeSet(take));
394+
}
395+
pub fn get_min_delegate_take() -> u16 {
396+
MinTake::<T>::get()
397+
}
398+
pub fn get_max_delegate_take() -> u16 {
399+
MaxTake::<T>::get()
400+
}
383401

384402
pub fn get_serving_rate_limit(netuid: u16) -> u64 {
385403
ServingRateLimit::<T>::get(netuid)

pallets/subtensor/tests/mock.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ parameter_types! {
124124
pub const InitialStakePruningMin: u16 = 0;
125125
pub const InitialFoundationDistribution: u64 = 0;
126126
pub const InitialDefaultTake: u16 = 11_796; // 18%, same as in production
127+
pub const InitialMinTake: u16 = 0;
127128
pub const InitialWeightsVersionKey: u16 = 0;
128129
pub const InitialServingRateLimit: u64 = 0; // No limit.
129130
pub const InitialTxRateLimit: u64 = 0; // Disable rate limit for testing
@@ -335,6 +336,7 @@ impl pallet_subtensor::Config for Test {
335336
type InitialBondsMovingAverage = InitialBondsMovingAverage;
336337
type InitialMaxAllowedValidators = InitialMaxAllowedValidators;
337338
type InitialDefaultTake = InitialDefaultTake;
339+
type InitialMinTake = InitialMinTake;
338340
type InitialWeightsVersionKey = InitialWeightsVersionKey;
339341
type InitialMaxDifficulty = InitialMaxDifficulty;
340342
type InitialMinDifficulty = InitialMinDifficulty;

pallets/subtensor/tests/staking.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2737,7 +2737,7 @@ fn test_delegate_take_can_be_decreased() {
27372737

27382738
// Verify delegate take can be decreased
27392739
#[test]
2740-
fn test_can_set_zero_take_ok() {
2740+
fn test_can_set_min_take_ok() {
27412741
new_test_ext(1).execute_with(|| {
27422742
// Make account
27432743
let hotkey0 = U256::from(1);
@@ -2758,11 +2758,11 @@ fn test_can_set_zero_take_ok() {
27582758
u16::MAX / 10
27592759
));
27602760

2761-
// Coldkey / hotkey 0 decreases take to 0%
2761+
// Coldkey / hotkey 0 decreases take to min
27622762
assert_ok!(SubtensorModule::do_decrease_take(
27632763
<<Test as Config>::RuntimeOrigin>::signed(coldkey0),
27642764
hotkey0,
2765-
0
2765+
SubtensorModule::get_min_take()
27662766
));
27672767
assert_eq!(SubtensorModule::get_hotkey_take(&hotkey0), 0);
27682768
});

runtime/src/lib.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,7 @@ parameter_types! {
778778
pub const SubtensorInitialPruningScore : u16 = u16::MAX;
779779
pub const SubtensorInitialBondsMovingAverage: u64 = 900_000;
780780
pub const SubtensorInitialDefaultTake: u16 = 11_796; // 18% honest number.
781+
pub const SubtensorInitialMinTake: u16 = 0;
781782
pub const SubtensorInitialWeightsVersionKey: u64 = 0;
782783
pub const SubtensorInitialMinDifficulty: u64 = 10_000_000;
783784
pub const SubtensorInitialMaxDifficulty: u64 = u64::MAX / 4;
@@ -828,6 +829,7 @@ impl pallet_subtensor::Config for Runtime {
828829
type InitialPruningScore = SubtensorInitialPruningScore;
829830
type InitialMaxAllowedValidators = SubtensorInitialMaxAllowedValidators;
830831
type InitialDefaultTake = SubtensorInitialDefaultTake;
832+
type InitialMinTake = SubtensorInitialMinTake;
831833
type InitialWeightsVersionKey = SubtensorInitialWeightsVersionKey;
832834
type InitialMaxDifficulty = SubtensorInitialMaxDifficulty;
833835
type InitialMinDifficulty = SubtensorInitialMinDifficulty;
@@ -867,8 +869,12 @@ impl
867869
RuntimeOrigin,
868870
> for SubtensorInterface
869871
{
870-
fn set_default_take(default_take: u16) {
871-
SubtensorModule::set_default_take(default_take);
872+
fn set_max_delegate_take(max_take: u16) {
873+
SubtensorModule::set_max_delegate_take(max_take);
874+
}
875+
876+
fn set_min_delegate_take(max_take: u16) {
877+
SubtensorModule::set_min_delegate_take(max_take);
872878
}
873879

874880
fn set_tx_rate_limit(rate_limit: u64) {

0 commit comments

Comments
 (0)