@@ -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,
1754
1783
..Default :: default ( )
1755
1784
} )
1756
1785
}
@@ -1885,15 +1914,24 @@ where
1885
1914
netuid,
1886
1915
amount_staked,
1887
1916
} ) => {
1917
+ if ColdkeySwapScheduled :: < T > :: contains_key ( who) {
1918
+ return InvalidTransaction :: Custom (
1919
+ CustomTransactionError :: ColdkeyInSwapSchedule . into ( ) ,
1920
+ )
1921
+ . into ( ) ;
1922
+ }
1888
1923
// 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
- ) )
1924
+ Self :: result_to_validity (
1925
+ Pallet :: < T > :: validate_add_stake (
1926
+ who,
1927
+ hotkey,
1928
+ * netuid,
1929
+ * amount_staked,
1930
+ * amount_staked,
1931
+ false ,
1932
+ ) ,
1933
+ Self :: get_priority_staking ( who, hotkey) ,
1934
+ )
1897
1935
}
1898
1936
Some ( Call :: add_stake_limit {
1899
1937
hotkey,
@@ -1902,33 +1940,46 @@ where
1902
1940
limit_price,
1903
1941
allow_partial,
1904
1942
} ) => {
1943
+ if ColdkeySwapScheduled :: < T > :: contains_key ( who) {
1944
+ return InvalidTransaction :: Custom (
1945
+ CustomTransactionError :: ColdkeyInSwapSchedule . into ( ) ,
1946
+ )
1947
+ . into ( ) ;
1948
+ }
1949
+
1905
1950
// Calcaulate the maximum amount that can be executed with price limit
1906
1951
let max_amount = Pallet :: < T > :: get_max_amount_add ( * netuid, * limit_price) ;
1907
1952
1908
1953
// 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
- ) )
1954
+ Self :: result_to_validity (
1955
+ Pallet :: < T > :: validate_add_stake (
1956
+ who,
1957
+ hotkey,
1958
+ * netuid,
1959
+ * amount_staked,
1960
+ max_amount,
1961
+ * allow_partial,
1962
+ ) ,
1963
+ Self :: get_priority_staking ( who, hotkey) ,
1964
+ )
1917
1965
}
1918
1966
Some ( Call :: remove_stake {
1919
1967
hotkey,
1920
1968
netuid,
1921
1969
amount_unstaked,
1922
1970
} ) => {
1923
1971
// 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
- ) )
1972
+ Self :: result_to_validity (
1973
+ Pallet :: < T > :: validate_remove_stake (
1974
+ who,
1975
+ hotkey,
1976
+ * netuid,
1977
+ * amount_unstaked,
1978
+ * amount_unstaked,
1979
+ false ,
1980
+ ) ,
1981
+ Self :: get_priority_staking ( who, hotkey) ,
1982
+ )
1932
1983
}
1933
1984
Some ( Call :: remove_stake_limit {
1934
1985
hotkey,
@@ -1941,14 +1992,17 @@ where
1941
1992
let max_amount = Pallet :: < T > :: get_max_amount_remove ( * netuid, * limit_price) ;
1942
1993
1943
1994
// 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
- ) )
1995
+ Self :: result_to_validity (
1996
+ Pallet :: < T > :: validate_remove_stake (
1997
+ who,
1998
+ hotkey,
1999
+ * netuid,
2000
+ * amount_unstaked,
2001
+ max_amount,
2002
+ * allow_partial,
2003
+ ) ,
2004
+ Self :: get_priority_staking ( who, hotkey) ,
2005
+ )
1952
2006
}
1953
2007
Some ( Call :: move_stake {
1954
2008
origin_hotkey,
@@ -1957,19 +2011,29 @@ where
1957
2011
destination_netuid,
1958
2012
alpha_amount,
1959
2013
} ) => {
2014
+ if ColdkeySwapScheduled :: < T > :: contains_key ( who) {
2015
+ return InvalidTransaction :: Custom (
2016
+ CustomTransactionError :: ColdkeyInSwapSchedule . into ( ) ,
2017
+ )
2018
+ . into ( ) ;
2019
+ }
2020
+
1960
2021
// 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
- ) )
2022
+ Self :: result_to_validity (
2023
+ Pallet :: < T > :: validate_stake_transition (
2024
+ who,
2025
+ who,
2026
+ origin_hotkey,
2027
+ destination_hotkey,
2028
+ * origin_netuid,
2029
+ * destination_netuid,
2030
+ * alpha_amount,
2031
+ * alpha_amount,
2032
+ None ,
2033
+ false ,
2034
+ ) ,
2035
+ Self :: get_priority_staking ( who, origin_hotkey) ,
2036
+ )
1973
2037
}
1974
2038
Some ( Call :: transfer_stake {
1975
2039
destination_coldkey,
@@ -1978,39 +2042,59 @@ where
1978
2042
destination_netuid,
1979
2043
alpha_amount,
1980
2044
} ) => {
2045
+ if ColdkeySwapScheduled :: < T > :: contains_key ( who) {
2046
+ return InvalidTransaction :: Custom (
2047
+ CustomTransactionError :: ColdkeyInSwapSchedule . into ( ) ,
2048
+ )
2049
+ . into ( ) ;
2050
+ }
2051
+
1981
2052
// 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
- ) )
2053
+ Self :: result_to_validity (
2054
+ Pallet :: < T > :: validate_stake_transition (
2055
+ who,
2056
+ destination_coldkey,
2057
+ hotkey,
2058
+ hotkey,
2059
+ * origin_netuid,
2060
+ * destination_netuid,
2061
+ * alpha_amount,
2062
+ * alpha_amount,
2063
+ None ,
2064
+ true ,
2065
+ ) ,
2066
+ Self :: get_priority_staking ( who, hotkey) ,
2067
+ )
1994
2068
}
1995
2069
Some ( Call :: swap_stake {
1996
2070
hotkey,
1997
2071
origin_netuid,
1998
2072
destination_netuid,
1999
2073
alpha_amount,
2000
2074
} ) => {
2075
+ if ColdkeySwapScheduled :: < T > :: contains_key ( who) {
2076
+ return InvalidTransaction :: Custom (
2077
+ CustomTransactionError :: ColdkeyInSwapSchedule . into ( ) ,
2078
+ )
2079
+ . into ( ) ;
2080
+ }
2081
+
2001
2082
// 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
- ) )
2083
+ Self :: result_to_validity (
2084
+ Pallet :: < T > :: validate_stake_transition (
2085
+ who,
2086
+ who,
2087
+ hotkey,
2088
+ hotkey,
2089
+ * origin_netuid,
2090
+ * destination_netuid,
2091
+ * alpha_amount,
2092
+ * alpha_amount,
2093
+ None ,
2094
+ false ,
2095
+ ) ,
2096
+ Self :: get_priority_staking ( who, hotkey) ,
2097
+ )
2014
2098
}
2015
2099
Some ( Call :: swap_stake_limit {
2016
2100
hotkey,
@@ -2020,6 +2104,13 @@ where
2020
2104
limit_price,
2021
2105
allow_partial,
2022
2106
} ) => {
2107
+ if ColdkeySwapScheduled :: < T > :: contains_key ( who) {
2108
+ return InvalidTransaction :: Custom (
2109
+ CustomTransactionError :: ColdkeyInSwapSchedule . into ( ) ,
2110
+ )
2111
+ . into ( ) ;
2112
+ }
2113
+
2023
2114
// Get the max amount possible to exchange
2024
2115
let max_amount = Pallet :: < T > :: get_max_amount_move (
2025
2116
* origin_netuid,
@@ -2028,20 +2119,30 @@ where
2028
2119
) ;
2029
2120
2030
2121
// 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
- ) )
2122
+ Self :: result_to_validity (
2123
+ Pallet :: < T > :: validate_stake_transition (
2124
+ who,
2125
+ who,
2126
+ hotkey,
2127
+ hotkey,
2128
+ * origin_netuid,
2129
+ * destination_netuid,
2130
+ * alpha_amount,
2131
+ max_amount,
2132
+ Some ( * allow_partial) ,
2133
+ false ,
2134
+ ) ,
2135
+ Self :: get_priority_staking ( who, hotkey) ,
2136
+ )
2043
2137
}
2044
2138
Some ( Call :: register { netuid, .. } | Call :: burned_register { netuid, .. } ) => {
2139
+ if ColdkeySwapScheduled :: < T > :: contains_key ( who) {
2140
+ return InvalidTransaction :: Custom (
2141
+ CustomTransactionError :: ColdkeyInSwapSchedule . into ( ) ,
2142
+ )
2143
+ . into ( ) ;
2144
+ }
2145
+
2045
2146
let registrations_this_interval =
2046
2147
Pallet :: < T > :: get_registrations_this_interval ( * netuid) ;
2047
2148
let max_registrations_per_interval =
0 commit comments