Skip to content

Commit 27fb5bd

Browse files
committed
Refine proxy chain extensions: renumber IDs, improve structure and test coverage
- Renumber Proxy* FunctionIds to 16-27 (no gaps after existing IDs) - Move verify_proxy to module-level free function (matches convert_origin pattern from PR opentensor#2550) - Restructure proxy tests into nested proxy_dispatch_tests module with shared setup helpers and per-operation success tests - Coverage: 5 proxy verification tests (staking, any/superset, no proxy, wrong type, delayed) + 8 per-operation tests covering all input shapes
1 parent f6d81ef commit 27fb5bd

File tree

4 files changed

+483
-411
lines changed

4 files changed

+483
-411
lines changed

chain-extensions/src/lib.rs

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,28 @@ where
5454
}
5555
}
5656

57+
// Verify that delegate is an authorized zero-delay proxy for on_behalf_of
58+
fn verify_proxy<T>(
59+
on_behalf_of: &T::AccountId,
60+
delegate: &T::AccountId,
61+
required_proxy_type: ProxyType,
62+
) -> Result<(), DispatchError>
63+
where
64+
T: pallet_proxy::Config<ProxyType = ProxyType>,
65+
{
66+
let (proxies, _) = pallet_proxy::Proxies::<T>::get(on_behalf_of);
67+
proxies
68+
.iter()
69+
.find(|p| {
70+
p.delegate == *delegate
71+
&& p.delay.is_zero()
72+
&& (p.proxy_type == required_proxy_type
73+
|| pallet_proxy::Pallet::<T>::is_superset(p.proxy_type, required_proxy_type))
74+
})
75+
.ok_or(DispatchError::Other("Not authorized proxy"))?;
76+
Ok(())
77+
}
78+
5779
impl<T> SubtensorChainExtension<T>
5880
where
5981
T: pallet_subtensor::Config
@@ -62,24 +84,6 @@ where
6284
+ pallet_subtensor_swap::Config,
6385
T::AccountId: Clone,
6486
{
65-
fn verify_proxy(
66-
on_behalf_of: &T::AccountId,
67-
delegate: &T::AccountId,
68-
required_proxy_type: ProxyType,
69-
) -> Result<(), DispatchError> {
70-
let (proxies, _) = pallet_proxy::Proxies::<T>::get(on_behalf_of);
71-
proxies
72-
.iter()
73-
.find(|p| {
74-
p.delegate == *delegate
75-
&& p.delay.is_zero()
76-
&& (p.proxy_type == required_proxy_type
77-
|| pallet_proxy::Pallet::<T>::is_superset(p.proxy_type, required_proxy_type))
78-
})
79-
.ok_or(DispatchError::Other("Not authorized proxy"))?;
80-
Ok(())
81-
}
82-
8387
fn dispatch<Env>(env: &mut Env) -> Result<RetVal, DispatchError>
8488
where
8589
Env: SubtensorExtensionEnv<T::AccountId>,
@@ -565,7 +569,7 @@ where
565569
.map_err(|_| DispatchError::Other("Failed to decode input parameters"))?;
566570

567571
let caller = env.caller();
568-
Self::verify_proxy(&on_behalf_of, &caller, ProxyType::Staking)?;
572+
verify_proxy::<T>(&on_behalf_of, &caller, ProxyType::Staking)?;
569573

570574
let call_result = pallet_subtensor::Pallet::<T>::add_stake(
571575
RawOrigin::Signed(on_behalf_of).into(),
@@ -595,7 +599,7 @@ where
595599
.map_err(|_| DispatchError::Other("Failed to decode input parameters"))?;
596600

597601
let caller = env.caller();
598-
Self::verify_proxy(&on_behalf_of, &caller, ProxyType::Staking)?;
602+
verify_proxy::<T>(&on_behalf_of, &caller, ProxyType::Staking)?;
599603

600604
let call_result = pallet_subtensor::Pallet::<T>::remove_stake(
601605
RawOrigin::Signed(on_behalf_of).into(),
@@ -620,7 +624,7 @@ where
620624
.map_err(|_| DispatchError::Other("Failed to decode input parameters"))?;
621625

622626
let caller = env.caller();
623-
Self::verify_proxy(&on_behalf_of, &caller, ProxyType::Staking)?;
627+
verify_proxy::<T>(&on_behalf_of, &caller, ProxyType::Staking)?;
624628

625629
let call_result = pallet_subtensor::Pallet::<T>::unstake_all(
626630
RawOrigin::Signed(on_behalf_of).into(),
@@ -643,7 +647,7 @@ where
643647
.map_err(|_| DispatchError::Other("Failed to decode input parameters"))?;
644648

645649
let caller = env.caller();
646-
Self::verify_proxy(&on_behalf_of, &caller, ProxyType::Staking)?;
650+
verify_proxy::<T>(&on_behalf_of, &caller, ProxyType::Staking)?;
647651

648652
let call_result = pallet_subtensor::Pallet::<T>::unstake_all_alpha(
649653
RawOrigin::Signed(on_behalf_of).into(),
@@ -680,7 +684,7 @@ where
680684
.map_err(|_| DispatchError::Other("Failed to decode input parameters"))?;
681685

682686
let caller = env.caller();
683-
Self::verify_proxy(&on_behalf_of, &caller, ProxyType::Staking)?;
687+
verify_proxy::<T>(&on_behalf_of, &caller, ProxyType::Staking)?;
684688

685689
let call_result = pallet_subtensor::Pallet::<T>::move_stake(
686690
RawOrigin::Signed(on_behalf_of).into(),
@@ -721,7 +725,7 @@ where
721725
.map_err(|_| DispatchError::Other("Failed to decode input parameters"))?;
722726

723727
let caller = env.caller();
724-
Self::verify_proxy(&on_behalf_of, &caller, ProxyType::Transfer)?;
728+
verify_proxy::<T>(&on_behalf_of, &caller, ProxyType::Transfer)?;
725729

726730
let call_result = pallet_subtensor::Pallet::<T>::transfer_stake(
727731
RawOrigin::Signed(on_behalf_of).into(),
@@ -754,7 +758,7 @@ where
754758
.map_err(|_| DispatchError::Other("Failed to decode input parameters"))?;
755759

756760
let caller = env.caller();
757-
Self::verify_proxy(&on_behalf_of, &caller, ProxyType::Staking)?;
761+
verify_proxy::<T>(&on_behalf_of, &caller, ProxyType::Staking)?;
758762

759763
let call_result = pallet_subtensor::Pallet::<T>::swap_stake(
760764
RawOrigin::Signed(on_behalf_of).into(),
@@ -787,7 +791,7 @@ where
787791
.map_err(|_| DispatchError::Other("Failed to decode input parameters"))?;
788792

789793
let caller = env.caller();
790-
Self::verify_proxy(&on_behalf_of, &caller, ProxyType::Staking)?;
794+
verify_proxy::<T>(&on_behalf_of, &caller, ProxyType::Staking)?;
791795

792796
let call_result = pallet_subtensor::Pallet::<T>::add_stake_limit(
793797
RawOrigin::Signed(on_behalf_of).into(),
@@ -821,7 +825,7 @@ where
821825
.map_err(|_| DispatchError::Other("Failed to decode input parameters"))?;
822826

823827
let caller = env.caller();
824-
Self::verify_proxy(&on_behalf_of, &caller, ProxyType::Staking)?;
828+
verify_proxy::<T>(&on_behalf_of, &caller, ProxyType::Staking)?;
825829

826830
let call_result = pallet_subtensor::Pallet::<T>::remove_stake_limit(
827831
RawOrigin::Signed(on_behalf_of).into(),
@@ -864,7 +868,7 @@ where
864868
.map_err(|_| DispatchError::Other("Failed to decode input parameters"))?;
865869

866870
let caller = env.caller();
867-
Self::verify_proxy(&on_behalf_of, &caller, ProxyType::Staking)?;
871+
verify_proxy::<T>(&on_behalf_of, &caller, ProxyType::Staking)?;
868872

869873
let call_result = pallet_subtensor::Pallet::<T>::swap_stake_limit(
870874
RawOrigin::Signed(on_behalf_of).into(),
@@ -897,7 +901,7 @@ where
897901
.map_err(|_| DispatchError::Other("Failed to decode input parameters"))?;
898902

899903
let caller = env.caller();
900-
Self::verify_proxy(&on_behalf_of, &caller, ProxyType::Staking)?;
904+
verify_proxy::<T>(&on_behalf_of, &caller, ProxyType::Staking)?;
901905

902906
let call_result = pallet_subtensor::Pallet::<T>::remove_stake_full_limit(
903907
RawOrigin::Signed(on_behalf_of).into(),
@@ -922,7 +926,7 @@ where
922926
.map_err(|_| DispatchError::Other("Failed to decode input parameters"))?;
923927

924928
let caller = env.caller();
925-
Self::verify_proxy(&on_behalf_of, &caller, ProxyType::Staking)?;
929+
verify_proxy::<T>(&on_behalf_of, &caller, ProxyType::Staking)?;
926930

927931
let call_result = pallet_subtensor::Pallet::<T>::set_coldkey_auto_stake_hotkey(
928932
RawOrigin::Signed(on_behalf_of).into(),

0 commit comments

Comments
 (0)