@@ -1550,6 +1550,18 @@ pub mod pallet {
1550
1550
pub type RevealPeriodEpochs < T : Config > =
1551
1551
StorageMap < _ , Twox64Concat , u16 , u64 , ValueQuery , DefaultRevealPeriodEpochs < T > > ;
1552
1552
1553
+ #[ pallet:: storage]
1554
+ /// --- Map (coldkey, hotkey) --> u64 the last block at which stake was added/removed.
1555
+ pub type LastColdkeyHotkeyStakeBlock < T : Config > = StorageDoubleMap <
1556
+ _ ,
1557
+ Twox64Concat ,
1558
+ T :: AccountId ,
1559
+ Twox64Concat ,
1560
+ T :: AccountId ,
1561
+ u64 ,
1562
+ OptionQuery ,
1563
+ > ;
1564
+
1553
1565
/// ==================
1554
1566
/// ==== Genesis =====
1555
1567
/// ==================
@@ -1588,6 +1600,19 @@ pub mod pallet {
1588
1600
0
1589
1601
}
1590
1602
1603
+ /// Returns the transaction priority for stake operations.
1604
+ pub fn get_priority_staking ( coldkey : & T :: AccountId , hotkey : & T :: AccountId ) -> u64 {
1605
+ match LastColdkeyHotkeyStakeBlock :: < T > :: get ( coldkey, hotkey) {
1606
+ Some ( last_stake_block) => {
1607
+ let current_block_number = Self :: get_current_block_as_u64 ( ) ;
1608
+ let default_priority = current_block_number. saturating_sub ( last_stake_block) ;
1609
+
1610
+ default_priority. saturating_add ( u32:: MAX as u64 )
1611
+ }
1612
+ None => 0 ,
1613
+ }
1614
+ }
1615
+
1591
1616
/// Is the caller allowed to set weights
1592
1617
pub fn check_weights_min_stake ( hotkey : & T :: AccountId , netuid : u16 ) -> bool {
1593
1618
// Blacklist weights transactions for low stake peers.
@@ -1705,11 +1730,15 @@ where
1705
1730
Pallet :: < T > :: get_priority_set_weights ( who, netuid)
1706
1731
}
1707
1732
1733
+ pub fn get_priority_staking ( coldkey : & T :: AccountId , hotkey : & T :: AccountId ) -> u64 {
1734
+ Pallet :: < T > :: get_priority_staking ( coldkey, hotkey)
1735
+ }
1736
+
1708
1737
pub fn check_weights_min_stake ( who : & T :: AccountId , netuid : u16 ) -> bool {
1709
1738
Pallet :: < T > :: check_weights_min_stake ( who, netuid)
1710
1739
}
1711
1740
1712
- pub fn result_to_validity ( result : Result < ( ) , Error < T > > ) -> TransactionValidity {
1741
+ pub fn result_to_validity ( result : Result < ( ) , Error < T > > , priority : u64 ) -> TransactionValidity {
1713
1742
if let Err ( err) = result {
1714
1743
match err {
1715
1744
Error :: < T > :: AmountTooLow => Err ( InvalidTransaction :: Custom (
@@ -1750,7 +1779,7 @@ where
1750
1779
}
1751
1780
} else {
1752
1781
Ok ( ValidTransaction {
1753
- priority : Self :: get_priority_vanilla ( ) ,
1782
+ priority : priority ,
1754
1783
..Default :: default ( )
1755
1784
} )
1756
1785
}
@@ -1886,14 +1915,17 @@ where
1886
1915
amount_staked,
1887
1916
} ) => {
1888
1917
// Fully validate the user input
1889
- Self :: result_to_validity ( Pallet :: < T > :: validate_add_stake (
1890
- who,
1891
- hotkey,
1892
- * netuid,
1893
- * amount_staked,
1894
- * amount_staked,
1895
- false ,
1896
- ) )
1918
+ Self :: result_to_validity (
1919
+ Pallet :: < T > :: validate_add_stake (
1920
+ who,
1921
+ hotkey,
1922
+ * netuid,
1923
+ * amount_staked,
1924
+ * amount_staked,
1925
+ false ,
1926
+ ) ,
1927
+ Self :: get_priority_staking ( who, hotkey) ,
1928
+ )
1897
1929
}
1898
1930
Some ( Call :: add_stake_limit {
1899
1931
hotkey,
@@ -1906,29 +1938,35 @@ where
1906
1938
let max_amount = Pallet :: < T > :: get_max_amount_add ( * netuid, * limit_price) ;
1907
1939
1908
1940
// Fully validate the user input
1909
- Self :: result_to_validity ( Pallet :: < T > :: validate_add_stake (
1910
- who,
1911
- hotkey,
1912
- * netuid,
1913
- * amount_staked,
1914
- max_amount,
1915
- * allow_partial,
1916
- ) )
1941
+ Self :: result_to_validity (
1942
+ Pallet :: < T > :: validate_add_stake (
1943
+ who,
1944
+ hotkey,
1945
+ * netuid,
1946
+ * amount_staked,
1947
+ max_amount,
1948
+ * allow_partial,
1949
+ ) ,
1950
+ Self :: get_priority_vanilla ( ) ,
1951
+ )
1917
1952
}
1918
1953
Some ( Call :: remove_stake {
1919
1954
hotkey,
1920
1955
netuid,
1921
1956
amount_unstaked,
1922
1957
} ) => {
1923
1958
// Fully validate the user input
1924
- Self :: result_to_validity ( Pallet :: < T > :: validate_remove_stake (
1925
- who,
1926
- hotkey,
1927
- * netuid,
1928
- * amount_unstaked,
1929
- * amount_unstaked,
1930
- false ,
1931
- ) )
1959
+ Self :: result_to_validity (
1960
+ Pallet :: < T > :: validate_remove_stake (
1961
+ who,
1962
+ hotkey,
1963
+ * netuid,
1964
+ * amount_unstaked,
1965
+ * amount_unstaked,
1966
+ false ,
1967
+ ) ,
1968
+ Self :: get_priority_staking ( who, hotkey) ,
1969
+ )
1932
1970
}
1933
1971
Some ( Call :: remove_stake_limit {
1934
1972
hotkey,
@@ -1941,14 +1979,17 @@ where
1941
1979
let max_amount = Pallet :: < T > :: get_max_amount_remove ( * netuid, * limit_price) ;
1942
1980
1943
1981
// Fully validate the user input
1944
- Self :: result_to_validity ( Pallet :: < T > :: validate_remove_stake (
1945
- who,
1946
- hotkey,
1947
- * netuid,
1948
- * amount_unstaked,
1949
- max_amount,
1950
- * allow_partial,
1951
- ) )
1982
+ Self :: result_to_validity (
1983
+ Pallet :: < T > :: validate_remove_stake (
1984
+ who,
1985
+ hotkey,
1986
+ * netuid,
1987
+ * amount_unstaked,
1988
+ max_amount,
1989
+ * allow_partial,
1990
+ ) ,
1991
+ Self :: get_priority_vanilla ( ) ,
1992
+ )
1952
1993
}
1953
1994
Some ( Call :: move_stake {
1954
1995
origin_hotkey,
@@ -1958,18 +1999,21 @@ where
1958
1999
alpha_amount,
1959
2000
} ) => {
1960
2001
// Fully validate the user input
1961
- Self :: result_to_validity ( Pallet :: < T > :: validate_stake_transition (
1962
- who,
1963
- who,
1964
- origin_hotkey,
1965
- destination_hotkey,
1966
- * origin_netuid,
1967
- * destination_netuid,
1968
- * alpha_amount,
1969
- * alpha_amount,
1970
- None ,
1971
- false ,
1972
- ) )
2002
+ Self :: result_to_validity (
2003
+ Pallet :: < T > :: validate_stake_transition (
2004
+ who,
2005
+ who,
2006
+ origin_hotkey,
2007
+ destination_hotkey,
2008
+ * origin_netuid,
2009
+ * destination_netuid,
2010
+ * alpha_amount,
2011
+ * alpha_amount,
2012
+ None ,
2013
+ false ,
2014
+ ) ,
2015
+ Self :: get_priority_vanilla ( ) ,
2016
+ )
1973
2017
}
1974
2018
Some ( Call :: transfer_stake {
1975
2019
destination_coldkey,
@@ -1979,18 +2023,21 @@ where
1979
2023
alpha_amount,
1980
2024
} ) => {
1981
2025
// Fully validate the user input
1982
- Self :: result_to_validity ( Pallet :: < T > :: validate_stake_transition (
1983
- who,
1984
- destination_coldkey,
1985
- hotkey,
1986
- hotkey,
1987
- * origin_netuid,
1988
- * destination_netuid,
1989
- * alpha_amount,
1990
- * alpha_amount,
1991
- None ,
1992
- true ,
1993
- ) )
2026
+ Self :: result_to_validity (
2027
+ Pallet :: < T > :: validate_stake_transition (
2028
+ who,
2029
+ destination_coldkey,
2030
+ hotkey,
2031
+ hotkey,
2032
+ * origin_netuid,
2033
+ * destination_netuid,
2034
+ * alpha_amount,
2035
+ * alpha_amount,
2036
+ None ,
2037
+ true ,
2038
+ ) ,
2039
+ Self :: get_priority_vanilla ( ) ,
2040
+ )
1994
2041
}
1995
2042
Some ( Call :: swap_stake {
1996
2043
hotkey,
@@ -1999,18 +2046,21 @@ where
1999
2046
alpha_amount,
2000
2047
} ) => {
2001
2048
// Fully validate the user input
2002
- Self :: result_to_validity ( Pallet :: < T > :: validate_stake_transition (
2003
- who,
2004
- who,
2005
- hotkey,
2006
- hotkey,
2007
- * origin_netuid,
2008
- * destination_netuid,
2009
- * alpha_amount,
2010
- * alpha_amount,
2011
- None ,
2012
- false ,
2013
- ) )
2049
+ Self :: result_to_validity (
2050
+ Pallet :: < T > :: validate_stake_transition (
2051
+ who,
2052
+ who,
2053
+ hotkey,
2054
+ hotkey,
2055
+ * origin_netuid,
2056
+ * destination_netuid,
2057
+ * alpha_amount,
2058
+ * alpha_amount,
2059
+ None ,
2060
+ false ,
2061
+ ) ,
2062
+ Self :: get_priority_vanilla ( ) ,
2063
+ )
2014
2064
}
2015
2065
Some ( Call :: swap_stake_limit {
2016
2066
hotkey,
@@ -2028,18 +2078,21 @@ where
2028
2078
) ;
2029
2079
2030
2080
// Fully validate the user input
2031
- Self :: result_to_validity ( Pallet :: < T > :: validate_stake_transition (
2032
- who,
2033
- who,
2034
- hotkey,
2035
- hotkey,
2036
- * origin_netuid,
2037
- * destination_netuid,
2038
- * alpha_amount,
2039
- max_amount,
2040
- Some ( * allow_partial) ,
2041
- false ,
2042
- ) )
2081
+ Self :: result_to_validity (
2082
+ Pallet :: < T > :: validate_stake_transition (
2083
+ who,
2084
+ who,
2085
+ hotkey,
2086
+ hotkey,
2087
+ * origin_netuid,
2088
+ * destination_netuid,
2089
+ * alpha_amount,
2090
+ max_amount,
2091
+ Some ( * allow_partial) ,
2092
+ false ,
2093
+ ) ,
2094
+ Self :: get_priority_vanilla ( ) ,
2095
+ )
2043
2096
}
2044
2097
Some ( Call :: register { netuid, .. } | Call :: burned_register { netuid, .. } ) => {
2045
2098
let registrations_this_interval =
0 commit comments