Skip to content

Commit 3516454

Browse files
refac(permission0): move max instances and children to scope (#138)
Moves `max_instances` and `children` to within the scopes. Closes CHAIN-127.
2 parents 4d4c563 + 81cb39d commit 3516454

File tree

11 files changed

+372
-201
lines changed

11 files changed

+372
-201
lines changed

justfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ check: fmt
1414
cargo clippy --tests
1515

1616
test: check
17-
cargo nextest run
17+
SKIP_WASM_BUILD=1 cargo nextest run
1818

1919
fmt:
2020
cargo fmt

pallets/permission0/src/ext/curator_impl.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ impl<T: Config> Permission0CuratorApi<T::AccountId, OriginFor<T>, BlockNumberFor
4747
continue;
4848
}
4949

50-
if contract.available_instances() < 1 {
50+
if contract.available_instances().unwrap_or_default() < 1 {
5151
if !matches!(cur_error, Error::<T>::PermissionInCooldown) {
5252
cur_error = Error::<T>::NotEnoughInstances;
5353
}
@@ -155,7 +155,7 @@ pub fn delegate_curator_permission_impl<T: Config>(
155155
);
156156

157157
ensure!(
158-
instances <= parent.available_instances(),
158+
instances <= parent.available_instances().unwrap_or_default(),
159159
Error::<T>::NotEnoughInstances
160160
);
161161

@@ -179,12 +179,18 @@ pub fn delegate_curator_permission_impl<T: Config>(
179179
recipient: recipient.clone(),
180180
flags,
181181
cooldown,
182+
children: Default::default(),
183+
max_instances: 1,
182184
});
183185
let permission_id = generate_permission_id::<T>(&delegator, &scope)?;
184186

185187
for parent in parents {
186188
Permissions::<T>::mutate_extant(parent, |parent| {
187-
parent.children.try_insert(permission_id).ok()
189+
if let Some(children) = parent.children_mut() {
190+
children.try_insert(permission_id).ok()
191+
} else {
192+
Some(false)
193+
}
188194
})
189195
.ok_or(Error::<T>::TooManyChildren)?;
190196
}
@@ -195,7 +201,6 @@ pub fn delegate_curator_permission_impl<T: Config>(
195201
duration,
196202
revocation,
197203
crate::EnforcementAuthority::None,
198-
1,
199204
);
200205

201206
Permissions::<T>::insert(permission_id, &contract);

pallets/permission0/src/ext/namespace_impl.rs

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ pub fn delegate_namespace_permission_impl<T: Config>(
4949
>,
5050
duration: PermissionDuration<T>,
5151
revocation: RevocationTerms<T>,
52-
instances: u32,
52+
max_instances: u32,
5353
) -> Result<PermissionId, DispatchError> {
5454
let delegator = ensure_signed(delegator)?;
5555

@@ -62,7 +62,7 @@ pub fn delegate_namespace_permission_impl<T: Config>(
6262
Error::<T>::NotRegisteredAgent
6363
);
6464

65-
ensure!(instances > 0, Error::<T>::NotEnoughInstances);
65+
ensure!(max_instances > 0, Error::<T>::NotEnoughInstances);
6666

6767
let total_multi_parent = paths.keys().filter(|p| p.is_some()).count();
6868
ensure!(total_multi_parent <= 1, Error::<T>::MultiParentForbidden);
@@ -94,7 +94,7 @@ pub fn delegate_namespace_permission_impl<T: Config>(
9494
);
9595

9696
ensure!(
97-
instances <= parent.available_instances(),
97+
max_instances <= parent.available_instances().unwrap_or_default(),
9898
Error::<T>::NotEnoughInstances
9999
);
100100

@@ -121,12 +121,18 @@ pub fn delegate_namespace_permission_impl<T: Config>(
121121
let scope = PermissionScope::Namespace(NamespaceScope {
122122
recipient: recipient.clone(),
123123
paths,
124+
children: Default::default(),
125+
max_instances,
124126
});
125127
let permission_id = generate_permission_id::<T>(&delegator, &scope)?;
126128

127129
for parent in parents {
128130
Permissions::<T>::mutate_extant(parent, |parent| {
129-
parent.children.try_insert(permission_id).ok()
131+
if let Some(children) = parent.children_mut() {
132+
children.try_insert(permission_id).ok()
133+
} else {
134+
Some(false)
135+
}
130136
})
131137
.ok_or(Error::<T>::TooManyChildren)?;
132138
}
@@ -137,7 +143,6 @@ pub fn delegate_namespace_permission_impl<T: Config>(
137143
duration,
138144
revocation,
139145
crate::EnforcementAuthority::None,
140-
instances,
141146
);
142147

143148
Permissions::<T>::insert(permission_id, &contract);
@@ -281,35 +286,36 @@ pub(crate) fn update_namespace_permission<T: Config>(
281286

282287
ensure!(permission.delegator == who, Error::<T>::NotAuthorizedToEdit);
283288

284-
let scope = permission.scope.clone();
285-
match &scope {
286-
PermissionScope::Namespace(namespace) => {
287-
if max_instances == permission.max_instances {
288-
return Ok(());
289-
} else if max_instances > permission.max_instances {
290-
for parent in namespace.paths.keys().copied().flatten() {
291-
let Some(parent) = Permissions::<T>::get(parent) else {
292-
continue;
293-
};
294-
295-
ensure!(
296-
max_instances <= parent.available_instances(),
297-
Error::<T>::NotEnoughInstances
298-
);
299-
}
300-
} else {
301-
ensure!(permission.is_updatable(), Error::<T>::NotAuthorizedToEdit);
302-
ensure!(
303-
max_instances >= permission.used_instances(),
304-
Error::<T>::NotEnoughInstances
305-
);
306-
}
289+
let PermissionScope::Namespace(mut namespace) = permission.scope.clone() else {
290+
return Err(Error::<T>::NotEditable.into());
291+
};
292+
293+
if max_instances == namespace.max_instances {
294+
return Ok(());
295+
} else if max_instances > namespace.max_instances {
296+
for parent in namespace.paths.keys().copied().flatten() {
297+
let Some(parent) = Permissions::<T>::get(parent) else {
298+
continue;
299+
};
300+
301+
ensure!(
302+
max_instances <= parent.available_instances().unwrap_or_default(),
303+
Error::<T>::NotEnoughInstances
304+
);
307305
}
308-
_ => return Err(Error::<T>::NotEditable.into()),
306+
} else {
307+
ensure!(permission.is_updatable(), Error::<T>::NotAuthorizedToEdit);
308+
ensure!(
309+
max_instances >= permission.used_instances(),
310+
Error::<T>::NotEnoughInstances
311+
);
309312
}
310313

311-
permission.max_instances = max_instances;
314+
namespace.max_instances = max_instances;
315+
316+
permission.scope = PermissionScope::Namespace(namespace);
312317
permission.last_update = frame_system::Pallet::<T>::block_number();
318+
313319
Permissions::<T>::set(permission_id, Some(permission));
314320

315321
Ok(())

pallets/permission0/src/ext/stream_impl.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,8 @@ pub(crate) fn delegate_stream_permission_impl<T: Config>(
166166

167167
let permission_id = generate_permission_id::<T>(&delegator, &scope)?;
168168

169-
let contract = PermissionContract::<T>::new(
170-
delegator.clone(),
171-
scope,
172-
duration,
173-
revocation,
174-
enforcement,
175-
1,
176-
);
169+
let contract =
170+
PermissionContract::<T>::new(delegator.clone(), scope, duration, revocation, enforcement);
177171

178172
Permissions::<T>::insert(permission_id, contract);
179173

pallets/permission0/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ pub mod pallet {
3838

3939
use super::*;
4040

41-
const STORAGE_VERSION: StorageVersion = StorageVersion::new(6);
41+
const STORAGE_VERSION: StorageVersion = StorageVersion::new(7);
4242

4343
/// Configure the pallet by specifying the parameters and types on which it depends.
4444
#[pallet::config]

0 commit comments

Comments
 (0)