Skip to content

Commit 3fef608

Browse files
committed
Merge branch 'devnet-ready' into fix-ts-tests-ci
# Conflicts: # ts-tests/scripts/generate-types.sh
2 parents abfb72c + 5ab12c0 commit 3fef608

60 files changed

Lines changed: 8152 additions & 4269 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/typescript-e2e.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ jobs:
103103
binary: release
104104
- test: zombienet_staking
105105
binary: fast
106+
- test: zombienet_coldkey_swap
107+
binary: fast
106108

107109
name: "typescript-e2e-${{ matrix.test }}"
108110

Cargo.lock

Lines changed: 409 additions & 409 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 136 additions & 135 deletions
Large diffs are not rendered by default.

chain-extensions/src/mock.rs

Lines changed: 65 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use core::num::NonZeroU64;
88

99
use frame_support::dispatch::DispatchResult;
10+
use frame_support::pallet_prelude::Zero;
1011
use frame_support::traits::{Contains, Everything, InherentBuilder, InsideBoth};
1112
use frame_support::weights::Weight;
1213
use frame_support::weights::constants::RocksDbWeight;
@@ -25,7 +26,9 @@ use sp_runtime::{
2526
traits::{BlakeTwo256, Convert, IdentityLookup},
2627
};
2728
use sp_std::{cell::RefCell, cmp::Ordering, sync::OnceLock};
28-
use subtensor_runtime_common::{AlphaBalance, AuthorshipInfo, NetUid, TaoBalance};
29+
use subtensor_runtime_common::{
30+
AlphaBalance, AuthorshipInfo, NetUid, Saturating, TaoBalance, Token,
31+
};
2932

3033
type Block = frame_system::mocking::MockBlock<Test>;
3134

@@ -654,27 +657,69 @@ pub fn register_ok_neuron(
654657
netuid: NetUid,
655658
hotkey_account_id: U256,
656659
coldkey_account_id: U256,
657-
start_nonce: u64,
660+
_start_nonce: u64,
658661
) {
659-
let block_number: u64 = SubtensorModule::get_current_block_as_u64();
660-
let (nonce, work): (u64, Vec<u8>) = SubtensorModule::create_work_for_block_number(
661-
netuid,
662-
block_number,
663-
start_nonce,
664-
&hotkey_account_id,
665-
);
666-
let result = SubtensorModule::register(
667-
<<Test as frame_system::Config>::RuntimeOrigin>::signed(hotkey_account_id),
668-
netuid,
669-
block_number,
670-
nonce,
671-
work,
672-
hotkey_account_id,
673-
coldkey_account_id,
674-
);
675-
assert_ok!(result);
662+
// Ensure reserves exist for swap/burn path, but do NOT clobber reserves if the test already set them.
663+
let reserve: u64 = 1_000_000_000_000;
664+
let tao_reserve = SubnetTAO::<Test>::get(netuid);
665+
let alpha_reserve = SubnetAlphaIn::<Test>::get(netuid)
666+
.saturating_add(SubnetAlphaInProvided::<Test>::get(netuid));
667+
668+
if tao_reserve.is_zero() && alpha_reserve.is_zero() {
669+
setup_reserves(netuid, reserve.into(), reserve.into());
670+
}
671+
672+
// Ensure coldkey has enough to pay the current burn AND is not fully drained to zero.
673+
// This avoids ZeroBalanceAfterWithdrawn in burned_register.
674+
let top_up_for_burn = |netuid: NetUid, cold: U256| {
675+
let burn: TaoBalance = SubtensorModule::get_burn(netuid);
676+
677+
// Make sure something remains after withdrawal even if ED is 0 in tests.
678+
let ed: TaoBalance = ExistentialDeposit::get();
679+
let min_remaining: TaoBalance = ed.max(1.into());
680+
681+
// Small buffer for safety (fees / rounding / future changes).
682+
let buffer: TaoBalance = 10.into();
683+
684+
let min_balance_needed: TaoBalance =
685+
burn.saturating_add(min_remaining).saturating_add(buffer);
686+
687+
let bal: TaoBalance = SubtensorModule::get_coldkey_balance(&cold);
688+
if bal < min_balance_needed {
689+
SubtensorModule::add_balance_to_coldkey_account(&cold, min_balance_needed - bal);
690+
}
691+
};
692+
693+
top_up_for_burn(netuid, coldkey_account_id);
694+
695+
let origin = <<Test as frame_system::Config>::RuntimeOrigin>::signed(coldkey_account_id);
696+
let result = SubtensorModule::burned_register(origin.clone(), netuid, hotkey_account_id);
697+
698+
match result {
699+
Ok(()) => {
700+
// success
701+
}
702+
Err(e)
703+
if e == Error::<Test>::TooManyRegistrationsThisInterval.into()
704+
|| e == Error::<Test>::NotEnoughBalanceToStake.into()
705+
|| e == Error::<Test>::ZeroBalanceAfterWithdrawn.into() =>
706+
{
707+
// Re-top-up and retry once (burn can be state-dependent).
708+
top_up_for_burn(netuid, coldkey_account_id);
709+
710+
assert_ok!(SubtensorModule::burned_register(
711+
origin,
712+
netuid,
713+
hotkey_account_id
714+
));
715+
}
716+
Err(e) => {
717+
panic!("Expected Ok(_). Got Err({e:?})");
718+
}
719+
}
720+
676721
log::info!(
677-
"Register ok neuron: netuid: {netuid:?}, coldkey: {hotkey_account_id:?}, hotkey: {coldkey_account_id:?}"
722+
"Register ok neuron: netuid: {netuid:?}, coldkey: {coldkey_account_id:?}, hotkey: {hotkey_account_id:?}"
678723
);
679724
}
680725

eco-tests/Cargo.toml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ useless_conversion = "allow"
1919

2020
[dependencies]
2121
pallet-subtensor = { path = "../pallets/subtensor", default-features = false, features = ["std"] }
22-
frame-support = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "285b4f8b392c517e50e237e717d28ea4f3666e7c", default-features = false, features = ["std"] }
23-
frame-system = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "285b4f8b392c517e50e237e717d28ea4f3666e7c", default-features = false, features = ["std"] }
24-
sp-core = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "285b4f8b392c517e50e237e717d28ea4f3666e7c", default-features = false, features = ["std"] }
25-
sp-io = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "285b4f8b392c517e50e237e717d28ea4f3666e7c", default-features = false, features = ["std"] }
26-
sp-runtime = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "285b4f8b392c517e50e237e717d28ea4f3666e7c", default-features = false, features = ["std"] }
27-
sp-std = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "285b4f8b392c517e50e237e717d28ea4f3666e7c", default-features = false, features = ["std"] }
22+
frame-support = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "7cc54bf2d50ae3921d718736dfeb0de9468539c7", default-features = false, features = ["std"] }
23+
frame-system = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "7cc54bf2d50ae3921d718736dfeb0de9468539c7", default-features = false, features = ["std"] }
24+
sp-core = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "7cc54bf2d50ae3921d718736dfeb0de9468539c7", default-features = false, features = ["std"] }
25+
sp-io = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "7cc54bf2d50ae3921d718736dfeb0de9468539c7", default-features = false, features = ["std"] }
26+
sp-runtime = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "7cc54bf2d50ae3921d718736dfeb0de9468539c7", default-features = false, features = ["std"] }
27+
sp-std = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "7cc54bf2d50ae3921d718736dfeb0de9468539c7", default-features = false, features = ["std"] }
2828
codec = { package = "parity-scale-codec", version = "3.7.5", default-features = false, features = ["derive", "std"] }
2929
scale-info = { version = "2.11.2", default-features = false, features = ["derive", "std"] }
30-
pallet-balances = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "285b4f8b392c517e50e237e717d28ea4f3666e7c", default-features = false, features = ["std"] }
31-
pallet-scheduler = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "285b4f8b392c517e50e237e717d28ea4f3666e7c", default-features = false, features = ["std"] }
32-
pallet-preimage = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "285b4f8b392c517e50e237e717d28ea4f3666e7c", default-features = false, features = ["std"] }
30+
pallet-balances = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "7cc54bf2d50ae3921d718736dfeb0de9468539c7", default-features = false, features = ["std"] }
31+
pallet-scheduler = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "7cc54bf2d50ae3921d718736dfeb0de9468539c7", default-features = false, features = ["std"] }
32+
pallet-preimage = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "7cc54bf2d50ae3921d718736dfeb0de9468539c7", default-features = false, features = ["std"] }
3333
pallet-drand = { path = "../pallets/drand", default-features = false, features = ["std"] }
3434
pallet-subtensor-swap = { path = "../pallets/swap", default-features = false, features = ["std"] }
3535
pallet-crowdloan = { path = "../pallets/crowdloan", default-features = false, features = ["std"] }
@@ -42,7 +42,7 @@ share-pool = { path = "../primitives/share-pool", default-features = false, feat
4242
safe-math = { path = "../primitives/safe-math", default-features = false, features = ["std"] }
4343
log = { version = "0.4.21", default-features = false, features = ["std"] }
4444
approx = "0.5"
45-
sp-tracing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "285b4f8b392c517e50e237e717d28ea4f3666e7c", default-features = false, features = ["std"] }
45+
sp-tracing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "7cc54bf2d50ae3921d718736dfeb0de9468539c7", default-features = false, features = ["std"] }
4646
tracing = "0.1"
4747
tracing-log = "0.2"
4848
tracing-subscriber = { version = "=0.3.18", features = ["fmt", "env-filter"] }

pallets/admin-utils/src/lib.rs

Lines changed: 120 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,20 @@ pub mod pallet {
9090
/// Indicates if the Bonds Reset was enabled or disabled.
9191
enabled: bool,
9292
},
93+
/// Event emitted when the burn half-life parameter is set for a subnet.
94+
BurnHalfLifeSet {
95+
/// The network identifier.
96+
netuid: NetUid,
97+
/// The new burn half-life value.
98+
burn_half_life: u16,
99+
},
100+
/// Event emitted when the burn increase multiplier is set for a subnet.
101+
BurnIncreaseMultSet {
102+
/// The network identifier.
103+
netuid: NetUid,
104+
/// The new burn increase multiplier.
105+
burn_increase_mult: U64F64,
106+
},
93107
}
94108

95109
// Errors inform users that something went wrong.
@@ -117,6 +131,10 @@ pub mod pallet {
117131
MaxAllowedUidsGreaterThanDefaultMaxAllowedUids,
118132
/// Bad parameter value
119133
InvalidValue,
134+
/// Operation is not permitted on the root network.
135+
NotPermittedOnRootSubnet,
136+
/// POW Registration has been deprecated
137+
POWRegistrationDisabled,
120138
}
121139
/// Enum for specifying the type of precompile operation.
122140
#[derive(
@@ -674,30 +692,11 @@ pub mod pallet {
674692
.saturating_add(<T as frame_system::Config>::DbWeight::get().writes(1))
675693
)]
676694
pub fn sudo_set_network_pow_registration_allowed(
677-
origin: OriginFor<T>,
678-
netuid: NetUid,
679-
registration_allowed: bool,
695+
_origin: OriginFor<T>,
696+
_netuid: NetUid,
697+
_registration_allowed: bool,
680698
) -> DispatchResult {
681-
let maybe_owner = pallet_subtensor::Pallet::<T>::ensure_sn_owner_or_root_with_limits(
682-
origin,
683-
netuid,
684-
&[Hyperparameter::PowRegistrationAllowed.into()],
685-
)?;
686-
pallet_subtensor::Pallet::<T>::ensure_admin_window_open(netuid)?;
687-
688-
pallet_subtensor::Pallet::<T>::set_network_pow_registration_allowed(
689-
netuid,
690-
registration_allowed,
691-
);
692-
log::debug!(
693-
"NetworkPowRegistrationAllowed( registration_allowed: {registration_allowed:?} ) "
694-
);
695-
pallet_subtensor::Pallet::<T>::record_owner_rl(
696-
maybe_owner,
697-
netuid,
698-
&[Hyperparameter::PowRegistrationAllowed.into()],
699-
);
700-
Ok(())
699+
Err(Error::<T>::POWRegistrationDisabled.into())
701700
}
702701

703702
/// The extrinsic sets the target registrations per interval for a subnet.
@@ -2134,6 +2133,104 @@ pub mod pallet {
21342133
log::trace!("ColdkeySwapReannouncementDelaySet( duration: {duration:?} )");
21352134
Ok(())
21362135
}
2136+
2137+
/// Set BurnHalfLife for a subnet.
2138+
/// It is only callable by root and subnet owner.
2139+
#[pallet::call_index(89)]
2140+
#[pallet::weight((
2141+
Weight::from_parts(25_000_000, 0)
2142+
.saturating_add(T::DbWeight::get().reads(4))
2143+
.saturating_add(T::DbWeight::get().writes(1)),
2144+
DispatchClass::Operational,
2145+
Pays::Yes,
2146+
))]
2147+
pub fn sudo_set_burn_half_life(
2148+
origin: OriginFor<T>,
2149+
netuid: NetUid,
2150+
burn_half_life: u16,
2151+
) -> DispatchResult {
2152+
let maybe_owner = pallet_subtensor::Pallet::<T>::ensure_sn_owner_or_root_with_limits(
2153+
origin,
2154+
netuid,
2155+
&[Hyperparameter::BurnHalfLife.into()],
2156+
)?;
2157+
pallet_subtensor::Pallet::<T>::ensure_admin_window_open(netuid)?;
2158+
2159+
ensure!(
2160+
pallet_subtensor::Pallet::<T>::if_subnet_exist(netuid),
2161+
Error::<T>::SubnetDoesNotExist
2162+
);
2163+
ensure!(!netuid.is_root(), Error::<T>::NotPermittedOnRootSubnet);
2164+
ensure!(
2165+
burn_half_life > 0
2166+
&& burn_half_life <= pallet_subtensor::MaxBurnHalfLife::<T>::get(),
2167+
Error::<T>::InvalidValue
2168+
);
2169+
2170+
pallet_subtensor::BurnHalfLife::<T>::insert(netuid, burn_half_life);
2171+
Self::deposit_event(Event::BurnHalfLifeSet {
2172+
netuid,
2173+
burn_half_life,
2174+
});
2175+
2176+
pallet_subtensor::Pallet::<T>::record_owner_rl(
2177+
maybe_owner,
2178+
netuid,
2179+
&[Hyperparameter::BurnHalfLife.into()],
2180+
);
2181+
2182+
Ok(())
2183+
}
2184+
2185+
/// Set BurnIncreaseMult for a subnet.
2186+
/// It is only callable by root and subnet owner.
2187+
#[pallet::call_index(90)]
2188+
#[pallet::weight((
2189+
Weight::from_parts(25_000_000, 0)
2190+
.saturating_add(T::DbWeight::get().reads(4))
2191+
.saturating_add(T::DbWeight::get().writes(1)),
2192+
DispatchClass::Operational,
2193+
Pays::Yes,
2194+
))]
2195+
pub fn sudo_set_burn_increase_mult(
2196+
origin: OriginFor<T>,
2197+
netuid: NetUid,
2198+
burn_increase_mult: U64F64,
2199+
) -> DispatchResult {
2200+
let maybe_owner = pallet_subtensor::Pallet::<T>::ensure_sn_owner_or_root_with_limits(
2201+
origin,
2202+
netuid,
2203+
&[Hyperparameter::BurnIncreaseMult.into()],
2204+
)?;
2205+
pallet_subtensor::Pallet::<T>::ensure_admin_window_open(netuid)?;
2206+
2207+
ensure!(
2208+
pallet_subtensor::Pallet::<T>::if_subnet_exist(netuid),
2209+
Error::<T>::SubnetDoesNotExist
2210+
);
2211+
ensure!(!netuid.is_root(), Error::<T>::NotPermittedOnRootSubnet);
2212+
ensure!(
2213+
(1..=3).contains(&burn_increase_mult),
2214+
Error::<T>::InvalidValue
2215+
);
2216+
2217+
pallet_subtensor::BurnIncreaseMult::<T>::insert(
2218+
netuid,
2219+
U64F64::from_num(burn_increase_mult),
2220+
);
2221+
Self::deposit_event(Event::BurnIncreaseMultSet {
2222+
netuid,
2223+
burn_increase_mult,
2224+
});
2225+
2226+
pallet_subtensor::Pallet::<T>::record_owner_rl(
2227+
maybe_owner,
2228+
netuid,
2229+
&[Hyperparameter::BurnIncreaseMult.into()],
2230+
);
2231+
2232+
Ok(())
2233+
}
21372234
}
21382235
}
21392236

0 commit comments

Comments
 (0)