Skip to content

Commit 7645958

Browse files
Change root claim data maps and add an event.
1 parent 4e63012 commit 7645958

File tree

5 files changed

+153
-34
lines changed

5 files changed

+153
-34
lines changed

pallets/subtensor/src/lib.rs

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,20 @@ pub mod pallet {
324324
/// ==== Staking + Accounts ====
325325
/// ============================
326326
327+
#[crate::freeze_struct("e453805be107a384")]
328+
#[derive(
329+
Encode, Decode, Default, TypeInfo, Clone, PartialEq, Eq, Debug, DecodeWithMemTracking,
330+
)]
331+
/// Accounting root claim data per subnet per block.
332+
pub struct PendingRootClaimedData {
333+
/// Total alpha kept this block
334+
pub alpha_kept: AlphaCurrency,
335+
/// Total alpha swapped this block
336+
pub alpha_swapped: AlphaCurrency,
337+
/// Total TAO swapped this block
338+
pub tao_swapped: TaoCurrency,
339+
}
340+
327341
#[derive(
328342
Encode, Decode, Default, TypeInfo, Clone, PartialEq, Eq, Debug, DecodeWithMemTracking,
329343
)]
@@ -357,6 +371,12 @@ pub mod pallet {
357371
RootClaimTypeEnum::default()
358372
}
359373

374+
/// Default root claim accounting data.
375+
#[pallet::type_value]
376+
pub fn DefaultRootClaimedData<T: Config>() -> PendingRootClaimedData {
377+
PendingRootClaimedData::default()
378+
}
379+
360380
/// Default number of root claims per claim call.
361381
/// Ideally this is calculated using the number of staking coldkey
362382
/// and the block time.
@@ -2254,15 +2274,16 @@ pub mod pallet {
22542274
#[pallet::storage] // --- Value --> num_root_claim | Number of coldkeys to claim each auto-claim.
22552275
pub type NumRootClaim<T: Config> = StorageValue<_, u64, ValueQuery, DefaultNumRootClaim<T>>;
22562276

2257-
/// --- MAP ( subnet ) --> claimed root alpha (kept)
2277+
/// --- MAP ( subnet ) --> pending accounting root claimed data. In-block storage only - to be cleaned each block.
22582278
#[pallet::storage]
2259-
pub type SubnetRootClaimKeep<T: Config> =
2260-
StorageMap<_, Blake2_128Concat, NetUid, AlphaCurrency, ValueQuery, DefaultZeroAlpha<T>>;
2261-
2262-
/// --- MAP ( subnet ) --> claimed root alpha (swapped)
2263-
#[pallet::storage]
2264-
pub type SubnetRootClaimSwap<T: Config> =
2265-
StorageMap<_, Blake2_128Concat, NetUid, AlphaCurrency, ValueQuery, DefaultZeroAlpha<T>>;
2279+
pub type PendingSubnetRootClaimData<T: Config> = StorageMap<
2280+
_,
2281+
Blake2_128Concat,
2282+
NetUid,
2283+
PendingRootClaimedData,
2284+
ValueQuery,
2285+
DefaultRootClaimedData<T>,
2286+
>;
22662287

22672288
/// =============================
22682289
/// ==== EVM related storage ====

pallets/subtensor/src/macros/events.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,5 +479,11 @@ mod events {
479479
/// The amount of alpha distributed
480480
alpha: AlphaCurrency,
481481
},
482+
483+
/// Root claimed data for this block.
484+
RootClaimedData {
485+
/// Root claim data for this block
486+
data: BTreeMap<NetUid, PendingRootClaimedData>,
487+
},
482488
}
483489
}

pallets/subtensor/src/macros/hooks.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ mod hooks {
4747
for _ in StakingOperationRateLimiter::<T>::drain() {
4848
// Clear all entries each block
4949
}
50+
51+
Self::deposit_root_claim_accounting_event();
5052
}
5153

5254
fn on_runtime_upgrade() -> frame_support::weights::Weight {

pallets/subtensor/src/staking/claim_root.rs

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use super::*;
22
use frame_support::weights::Weight;
33
use sp_core::Get;
4+
use sp_std::collections::btree_map::BTreeMap;
45
use sp_std::collections::btree_set::BTreeSet;
56
use substrate_fixed::types::I96F32;
67
use subtensor_swap_interface::SwapHandler;
@@ -192,9 +193,11 @@ impl<T: Config> Pallet<T> {
192193
owed_tao.amount_paid_out.into(),
193194
);
194195

195-
SubnetRootClaimSwap::<T>::mutate(netuid, |alpha| {
196-
*alpha = alpha.saturating_add(owed_u64.into());
197-
});
196+
Self::register_root_claim_swapped_alpha(
197+
netuid,
198+
owed_u64.into(),
199+
owed_tao.amount_paid_out,
200+
);
198201
} else
199202
/* Keep */
200203
{
@@ -205,15 +208,25 @@ impl<T: Config> Pallet<T> {
205208
netuid,
206209
owed_u64.into(),
207210
);
211+
212+
Self::register_root_claim_kept_alpha(netuid, owed_u64.into());
208213
}
209214

210215
// Increase root claimed by owed amount.
211216
RootClaimed::<T>::mutate((netuid, hotkey, coldkey), |root_claimed| {
212217
*root_claimed = root_claimed.saturating_add(owed_u64.into());
213218
});
219+
}
214220

215-
SubnetRootClaimKeep::<T>::mutate(netuid, |alpha| {
216-
*alpha = alpha.saturating_add(owed_u64.into());
221+
fn register_root_claim_swapped_alpha(netuid: NetUid, alpha: AlphaCurrency, tao: TaoCurrency) {
222+
PendingSubnetRootClaimData::<T>::mutate(netuid, |data| {
223+
data.alpha_swapped = data.alpha_swapped.saturating_add(alpha);
224+
data.tao_swapped = data.tao_swapped.saturating_add(tao);
225+
});
226+
}
227+
fn register_root_claim_kept_alpha(netuid: NetUid, alpha: AlphaCurrency) {
228+
PendingSubnetRootClaimData::<T>::mutate(netuid, |data| {
229+
data.alpha_kept = data.alpha_kept.saturating_add(alpha);
217230
});
218231
}
219232

@@ -355,6 +368,17 @@ impl<T: Config> Pallet<T> {
355368
weight
356369
}
357370

371+
pub fn deposit_root_claim_accounting_event() {
372+
let root_claim_data = PendingSubnetRootClaimData::<T>::iter().collect::<BTreeMap<_, _>>();
373+
374+
Self::deposit_event(Event::RootClaimedData {
375+
data: root_claim_data,
376+
});
377+
378+
// Subnet Number = 100+
379+
let _ = PendingSubnetRootClaimData::<T>::clear(u32::MAX, None);
380+
}
381+
358382
pub fn change_root_claim_type(coldkey: &T::AccountId, new_type: RootClaimTypeEnum) {
359383
RootClaimType::<T>::insert(coldkey.clone(), new_type.clone());
360384

@@ -407,8 +431,5 @@ impl<T: Config> Pallet<T> {
407431
}
408432

409433
let _ = RootClaimed::<T>::clear_prefix((netuid,), u32::MAX, None);
410-
411-
SubnetRootClaimKeep::<T>::remove(&netuid);
412-
SubnetRootClaimSwap::<T>::remove(&netuid);
413434
}
414435
}

pallets/subtensor/src/tests/claim_root.rs

Lines changed: 87 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
#![allow(clippy::expect_used)]
22

33
use crate::tests::mock::{
4-
RuntimeOrigin, SubtensorModule, Test, add_dynamic_network, new_test_ext, run_to_block,
4+
RuntimeEvent, RuntimeOrigin, SubtensorModule, System, Test, add_dynamic_network, new_test_ext,
5+
run_to_block, step_block,
56
};
67
use crate::{
7-
DefaultMinRootClaimAmount, Error, MAX_NUM_ROOT_CLAIMS, MAX_ROOT_CLAIM_THRESHOLD, NetworksAdded,
8-
NumRootClaim, NumStakingColdkeys, PendingRootAlphaDivs, RootClaimable, RootClaimableThreshold,
9-
StakingColdkeys, StakingColdkeysByIndex, SubnetAlphaIn, SubnetMechanism, SubnetMovingPrice,
10-
SubnetTAO, SubnetTaoFlow, SubtokenEnabled, Tempo, pallet,
8+
DefaultMinRootClaimAmount, Error, Event, MAX_NUM_ROOT_CLAIMS, MAX_ROOT_CLAIM_THRESHOLD,
9+
NetworksAdded, NumRootClaim, NumStakingColdkeys, PendingRootAlphaDivs, PendingRootClaimedData,
10+
RootClaimable, RootClaimableThreshold, StakingColdkeys, StakingColdkeysByIndex, SubnetAlphaIn,
11+
SubnetMechanism, SubnetMovingPrice, SubnetTAO, SubnetTaoFlow, SubtokenEnabled, Tempo, pallet,
1112
};
12-
use crate::{RootAlphaDividendsPerSubnet, SubnetRootClaimKeep, SubnetRootClaimSwap};
13+
use crate::{PendingSubnetRootClaimData, RootAlphaDividendsPerSubnet};
1314
use crate::{RootClaimType, RootClaimTypeEnum, RootClaimed};
1415
use approx::assert_abs_diff_eq;
1516
use frame_support::dispatch::RawOrigin;
@@ -18,7 +19,7 @@ use frame_support::traits::Get;
1819
use frame_support::{assert_err, assert_noop, assert_ok};
1920
use sp_core::{H256, U256};
2021
use sp_runtime::DispatchError;
21-
use std::collections::BTreeSet;
22+
use std::collections::{BTreeMap, BTreeSet};
2223
use substrate_fixed::types::{I96F32, U64F64, U96F32};
2324
use subtensor_runtime_common::{AlphaCurrency, Currency, NetUid, TaoCurrency};
2425
use subtensor_swap_interface::SwapHandler;
@@ -1861,7 +1862,7 @@ fn test_claim_root_subnet_root_claim_map_keep() {
18611862
RootClaimTypeEnum::Keep
18621863
),);
18631864
assert_eq!(RootClaimType::<Test>::get(coldkey), RootClaimTypeEnum::Keep);
1864-
assert!(!SubnetRootClaimKeep::<Test>::contains_key(netuid));
1865+
assert!(!PendingSubnetRootClaimData::<Test>::contains_key(netuid));
18651866

18661867
assert_ok!(SubtensorModule::claim_root(
18671868
RuntimeOrigin::signed(coldkey),
@@ -1873,12 +1874,46 @@ fn test_claim_root_subnet_root_claim_map_keep() {
18731874
let new_stake =
18741875
SubtensorModule::get_stake_for_hotkey_and_coldkey_on_subnet(&hotkey, &coldkey, netuid);
18751876

1876-
assert_eq!(new_stake, SubnetRootClaimKeep::<Test>::get(netuid),);
1877+
assert!(PendingSubnetRootClaimData::<Test>::contains_key(netuid));
18771878

1878-
// Check SubnetRootClaimKeep after network deregistration
1879+
let root_claim_data = PendingSubnetRootClaimData::<Test>::get(netuid);
18791880

1880-
assert_ok!(SubtensorModule::do_dissolve_network(netuid));
1881-
assert!(!SubnetRootClaimKeep::<Test>::contains_key(netuid));
1881+
assert_eq!(new_stake, root_claim_data.alpha_kept);
1882+
1883+
assert_eq!(root_claim_data.alpha_swapped, AlphaCurrency::ZERO);
1884+
assert_eq!(root_claim_data.tao_swapped, TaoCurrency::ZERO);
1885+
1886+
// Check PendingSubnetRootClaimData after on_finalize()
1887+
1888+
step_block(1);
1889+
assert!(!PendingSubnetRootClaimData::<Test>::contains_key(netuid));
1890+
1891+
// Check for the event
1892+
let event = System::events()
1893+
.into_iter()
1894+
.find(|e| {
1895+
matches!(
1896+
&e.event,
1897+
RuntimeEvent::SubtensorModule(Event::RootClaimedData { .. })
1898+
)
1899+
})
1900+
.expect("Event must be found");
1901+
1902+
let RuntimeEvent::SubtensorModule(Event::RootClaimedData { data }) = event.event else {
1903+
panic!("Event must be RootClaimedData")
1904+
};
1905+
1906+
assert_eq!(
1907+
BTreeMap::from([(
1908+
netuid,
1909+
PendingRootClaimedData {
1910+
alpha_swapped: AlphaCurrency::ZERO,
1911+
tao_swapped: TaoCurrency::ZERO,
1912+
alpha_kept: new_stake,
1913+
}
1914+
)]),
1915+
data
1916+
);
18821917
});
18831918
}
18841919

@@ -1946,7 +1981,7 @@ fn test_claim_root_subnet_root_claim_map_swap() {
19461981
RootClaimTypeEnum::Swap
19471982
),);
19481983
assert_eq!(RootClaimType::<Test>::get(coldkey), RootClaimTypeEnum::Swap);
1949-
assert!(!SubnetRootClaimSwap::<Test>::contains_key(netuid));
1984+
assert!(!PendingSubnetRootClaimData::<Test>::contains_key(netuid));
19501985

19511986
assert_ok!(SubtensorModule::claim_root(
19521987
RuntimeOrigin::signed(coldkey),
@@ -1975,18 +2010,52 @@ fn test_claim_root_subnet_root_claim_map_swap() {
19752010

19762011
// Check SubnetRootClaimSwap
19772012

1978-
let saved_swapped_alpha: u64 = SubnetRootClaimSwap::<Test>::get(netuid).into();
2013+
let root_claim_data = PendingSubnetRootClaimData::<Test>::get(netuid);
2014+
2015+
let saved_swapped_alpha: u64 = root_claim_data.alpha_swapped.into();
2016+
2017+
let saved_swapped_tao: u64 = root_claim_data.tao_swapped.into();
2018+
2019+
assert_eq!(root_claim_data.alpha_kept, AlphaCurrency::ZERO);
2020+
2021+
assert_abs_diff_eq!(
2022+
estimated_stake_increment,
2023+
saved_swapped_tao as f64,
2024+
epsilon = 10f64,
2025+
);
19792026

19802027
assert_abs_diff_eq!(
1981-
estimated_stake_increment as f64 / current_price,
2028+
estimated_stake_increment / current_price,
19822029
saved_swapped_alpha as f64,
19832030
epsilon = 10f64,
19842031
);
19852032

1986-
// Check SubnetRootClaimSwap after network deregistration
2033+
// Check PendingSubnetRootClaimData after block finalization
19872034

1988-
assert_ok!(SubtensorModule::do_dissolve_network(netuid));
1989-
assert!(!SubnetRootClaimSwap::<Test>::contains_key(netuid));
2035+
step_block(1);
2036+
assert!(!PendingSubnetRootClaimData::<Test>::contains_key(netuid));
2037+
2038+
// Check for the event
2039+
let event = System::events()
2040+
.into_iter()
2041+
.find(|e| {
2042+
matches!(
2043+
&e.event,
2044+
RuntimeEvent::SubtensorModule(Event::RootClaimedData { .. })
2045+
)
2046+
})
2047+
.expect("Event must be found");
2048+
2049+
let RuntimeEvent::SubtensorModule(Event::RootClaimedData { data }) = event.event else {
2050+
panic!("Event must be RootClaimedData")
2051+
};
2052+
2053+
for (event_netuid, root_claim_data) in data.into_iter() {
2054+
assert_eq!(event_netuid, netuid);
2055+
assert_eq!(root_claim_data.alpha_kept, AlphaCurrency::ZERO);
2056+
assert_eq!(root_claim_data.alpha_swapped, saved_swapped_alpha.into());
2057+
assert_eq!(root_claim_data.tao_swapped, saved_swapped_tao.into());
2058+
}
19902059
});
19912060
}
19922061

0 commit comments

Comments
 (0)