Skip to content

Commit e927d1a

Browse files
authored
Merge pull request #1336 from opentensor/fix/rate-limit-for-delegate-take-by-hotkey
Fix/rate limit for delegate take by hotkey
2 parents a3ae938 + a7e1aff commit e927d1a

File tree

3 files changed

+71
-3
lines changed

3 files changed

+71
-3
lines changed

pallets/subtensor/src/staking/decrease_take.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ impl<T: Config> Pallet<T> {
5757
// --- 4. Set the new take value.
5858
Delegates::<T>::insert(hotkey.clone(), take);
5959

60-
// --- 5. Emit the take value.
60+
// --- 5. Set last block for rate limiting
61+
let block: u64 = Self::get_current_block_as_u64();
62+
Self::set_last_tx_block_delegate_take(&hotkey, block);
63+
64+
// --- 6. Emit the take value.
6165
log::debug!(
6266
"TakeDecreased( coldkey:{:?}, hotkey:{:?}, take:{:?} )",
6367
coldkey,

pallets/subtensor/src/staking/increase_take.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,14 @@ impl<T: Config> Pallet<T> {
6161
let block: u64 = Self::get_current_block_as_u64();
6262
ensure!(
6363
!Self::exceeds_tx_delegate_take_rate_limit(
64-
Self::get_last_tx_block_delegate_take(&coldkey),
64+
Self::get_last_tx_block_delegate_take(&hotkey),
6565
block
6666
),
6767
Error::<T>::DelegateTxRateLimitExceeded
6868
);
6969

7070
// Set last block for rate limiting
71-
Self::set_last_tx_block_delegate_take(&coldkey, block);
71+
Self::set_last_tx_block_delegate_take(&hotkey, block);
7272

7373
// --- 6. Set the new take value.
7474
Delegates::<T>::insert(hotkey.clone(), take);

pallets/subtensor/src/tests/staking.rs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1671,6 +1671,70 @@ fn test_rate_limits_enforced_on_increase_take() {
16711671
});
16721672
}
16731673

1674+
// Test rate-limiting on an increase take just after a decrease take
1675+
// Prevents a Validator from decreasing take and then increasing it immediately after.
1676+
#[test]
1677+
fn test_rate_limits_enforced_on_decrease_before_increase_take() {
1678+
new_test_ext(1).execute_with(|| {
1679+
// Make account
1680+
let hotkey0 = U256::from(1);
1681+
let coldkey0 = U256::from(3);
1682+
1683+
// Add balance
1684+
SubtensorModule::add_balance_to_coldkey_account(&coldkey0, 100000);
1685+
1686+
// Register the neuron to a new network
1687+
let netuid = 1;
1688+
add_network(netuid, 1, 0);
1689+
register_ok_neuron(netuid, hotkey0, coldkey0, 124124);
1690+
1691+
// Coldkey / hotkey 0 become delegates with 9% take
1692+
Delegates::<Test>::insert(hotkey0, SubtensorModule::get_min_delegate_take() + 1);
1693+
assert_eq!(
1694+
SubtensorModule::get_hotkey_take(&hotkey0),
1695+
SubtensorModule::get_min_delegate_take() + 1
1696+
);
1697+
1698+
// Decrease take
1699+
assert_ok!(SubtensorModule::do_decrease_take(
1700+
RuntimeOrigin::signed(coldkey0),
1701+
hotkey0,
1702+
SubtensorModule::get_min_delegate_take()
1703+
)); // Verify decrease
1704+
assert_eq!(
1705+
SubtensorModule::get_hotkey_take(&hotkey0),
1706+
SubtensorModule::get_min_delegate_take()
1707+
);
1708+
1709+
// Increase take immediately after
1710+
assert_eq!(
1711+
SubtensorModule::do_increase_take(
1712+
RuntimeOrigin::signed(coldkey0),
1713+
hotkey0,
1714+
SubtensorModule::get_min_delegate_take() + 1
1715+
),
1716+
Err(Error::<Test>::DelegateTxRateLimitExceeded.into())
1717+
); // Verify no change
1718+
assert_eq!(
1719+
SubtensorModule::get_hotkey_take(&hotkey0),
1720+
SubtensorModule::get_min_delegate_take()
1721+
);
1722+
1723+
step_block(1 + InitialTxDelegateTakeRateLimit::get() as u16);
1724+
1725+
// Can increase after waiting
1726+
assert_ok!(SubtensorModule::do_increase_take(
1727+
RuntimeOrigin::signed(coldkey0),
1728+
hotkey0,
1729+
SubtensorModule::get_min_delegate_take() + 1
1730+
)); // Verify increase
1731+
assert_eq!(
1732+
SubtensorModule::get_hotkey_take(&hotkey0),
1733+
SubtensorModule::get_min_delegate_take() + 1
1734+
);
1735+
});
1736+
}
1737+
16741738
#[test]
16751739
fn test_get_total_delegated_stake_after_unstaking() {
16761740
new_test_ext(1).execute_with(|| {

0 commit comments

Comments
 (0)