mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-28 09:47:56 +00:00
Ensure data size of identity pallet is bounded (#9168)
* Ensure data size of identity pallet is bounded * Fix unit tests for identity pallet * Move identity pallet custom types into its own module * Make use of NoBound family traits * Fix identity pallet benchmarks * Enumerate type imports * Properly convert to BoundedVec in benchmarks * Re-export types * Use BoundedVec when storing sub identities * Add generate_storage_info * Manually implement MaxEncodedLen on select types * Use ConstU32 instead of parameter_type * Leverage DefaultNoBound and add some comments * Use max_encoded_len() instead of hardcoded constant * Use MaxEncodedLen in parity-scal-codec * Add get_mut method for WeakBoundedVec * Use expect on an infallible operation * Rewrite as for loop
This commit is contained in:
@@ -20,8 +20,9 @@
|
||||
use super::*;
|
||||
use crate as pallet_identity;
|
||||
|
||||
use codec::{Encode, Decode};
|
||||
use sp_runtime::traits::BadOrigin;
|
||||
use frame_support::{assert_ok, assert_noop, parameter_types, ord_parameter_types};
|
||||
use frame_support::{assert_ok, assert_noop, parameter_types, ord_parameter_types, BoundedVec};
|
||||
use sp_core::H256;
|
||||
use frame_system::{EnsureSignedBy, EnsureOneOf, EnsureRoot};
|
||||
use sp_runtime::{
|
||||
@@ -139,18 +140,18 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
|
||||
t.into()
|
||||
}
|
||||
|
||||
fn ten() -> IdentityInfo {
|
||||
fn ten() -> IdentityInfo<MaxAdditionalFields> {
|
||||
IdentityInfo {
|
||||
display: Data::Raw(b"ten".to_vec()),
|
||||
legal: Data::Raw(b"The Right Ordinal Ten, Esq.".to_vec()),
|
||||
display: Data::Raw(b"ten".to_vec().try_into().unwrap()),
|
||||
legal: Data::Raw(b"The Right Ordinal Ten, Esq.".to_vec().try_into().unwrap()),
|
||||
.. Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
fn twenty() -> IdentityInfo {
|
||||
fn twenty() -> IdentityInfo<MaxAdditionalFields> {
|
||||
IdentityInfo {
|
||||
display: Data::Raw(b"twenty".to_vec()),
|
||||
legal: Data::Raw(b"The Right Ordinal Twenty, Esq.".to_vec()),
|
||||
display: Data::Raw(b"twenty".to_vec().try_into().unwrap()),
|
||||
legal: Data::Raw(b"The Right Ordinal Twenty, Esq.".to_vec().try_into().unwrap()),
|
||||
.. Default::default()
|
||||
}
|
||||
}
|
||||
@@ -158,7 +159,7 @@ fn twenty() -> IdentityInfo {
|
||||
#[test]
|
||||
fn editing_subaccounts_should_work() {
|
||||
new_test_ext().execute_with(|| {
|
||||
let data = |x| Data::Raw(vec![x; 1]);
|
||||
let data = |x| Data::Raw(vec![x; 1].try_into().unwrap());
|
||||
|
||||
assert_noop!(Identity::add_sub(Origin::signed(10), 20, data(1)), Error::<Test>::NoIdentity);
|
||||
|
||||
@@ -202,7 +203,7 @@ fn editing_subaccounts_should_work() {
|
||||
#[test]
|
||||
fn resolving_subaccount_ownership_works() {
|
||||
new_test_ext().execute_with(|| {
|
||||
let data = |x| Data::Raw(vec![x; 1]);
|
||||
let data = |x| Data::Raw(vec![x; 1].try_into().unwrap());
|
||||
|
||||
assert_ok!(Identity::set_identity(Origin::signed(10), ten()));
|
||||
assert_ok!(Identity::set_identity(Origin::signed(20), twenty()));
|
||||
@@ -227,11 +228,11 @@ fn resolving_subaccount_ownership_works() {
|
||||
|
||||
#[test]
|
||||
fn trailing_zeros_decodes_into_default_data() {
|
||||
let encoded = Data::Raw(b"Hello".to_vec()).encode();
|
||||
let encoded = Data::Raw(b"Hello".to_vec().try_into().unwrap()).encode();
|
||||
assert!(<(Data, Data)>::decode(&mut &encoded[..]).is_err());
|
||||
let input = &mut &encoded[..];
|
||||
let (a, b) = <(Data, Data)>::decode(&mut AppendZerosInput::new(input)).unwrap();
|
||||
assert_eq!(a, Data::Raw(b"Hello".to_vec()));
|
||||
assert_eq!(a, Data::Raw(b"Hello".to_vec().try_into().unwrap()));
|
||||
assert_eq!(b, Data::None);
|
||||
}
|
||||
|
||||
@@ -268,13 +269,9 @@ fn registration_should_work() {
|
||||
assert_ok!(Identity::add_registrar(Origin::signed(1), 3));
|
||||
assert_ok!(Identity::set_fee(Origin::signed(3), 0, 10));
|
||||
let mut three_fields = ten();
|
||||
three_fields.additional.push(Default::default());
|
||||
three_fields.additional.push(Default::default());
|
||||
three_fields.additional.push(Default::default());
|
||||
assert_noop!(
|
||||
Identity::set_identity(Origin::signed(10), three_fields),
|
||||
Error::<Test>::TooManyFields
|
||||
);
|
||||
three_fields.additional.try_push(Default::default()).unwrap();
|
||||
three_fields.additional.try_push(Default::default()).unwrap();
|
||||
assert_eq!(three_fields.additional.try_push(Default::default()), Err(()));
|
||||
assert_ok!(Identity::set_identity(Origin::signed(10), ten()));
|
||||
assert_eq!(Identity::identity(10).unwrap().info, ten());
|
||||
assert_eq!(Balances::free_balance(10), 90);
|
||||
@@ -339,40 +336,40 @@ fn killing_slashing_should_work() {
|
||||
#[test]
|
||||
fn setting_subaccounts_should_work() {
|
||||
new_test_ext().execute_with(|| {
|
||||
let mut subs = vec![(20, Data::Raw(vec![40; 1]))];
|
||||
let mut subs = vec![(20, Data::Raw(vec![40; 1].try_into().unwrap()))];
|
||||
assert_noop!(Identity::set_subs(Origin::signed(10), subs.clone()), Error::<Test>::NotFound);
|
||||
|
||||
assert_ok!(Identity::set_identity(Origin::signed(10), ten()));
|
||||
assert_ok!(Identity::set_subs(Origin::signed(10), subs.clone()));
|
||||
assert_eq!(Balances::free_balance(10), 80);
|
||||
assert_eq!(Identity::subs_of(10), (10, vec![20]));
|
||||
assert_eq!(Identity::super_of(20), Some((10, Data::Raw(vec![40; 1]))));
|
||||
assert_eq!(Identity::subs_of(10), (10, vec![20].try_into().unwrap()));
|
||||
assert_eq!(Identity::super_of(20), Some((10, Data::Raw(vec![40; 1].try_into().unwrap()))));
|
||||
|
||||
// push another item and re-set it.
|
||||
subs.push((30, Data::Raw(vec![50; 1])));
|
||||
subs.push((30, Data::Raw(vec![50; 1].try_into().unwrap())));
|
||||
assert_ok!(Identity::set_subs(Origin::signed(10), subs.clone()));
|
||||
assert_eq!(Balances::free_balance(10), 70);
|
||||
assert_eq!(Identity::subs_of(10), (20, vec![20, 30]));
|
||||
assert_eq!(Identity::super_of(20), Some((10, Data::Raw(vec![40; 1]))));
|
||||
assert_eq!(Identity::super_of(30), Some((10, Data::Raw(vec![50; 1]))));
|
||||
assert_eq!(Identity::subs_of(10), (20, vec![20, 30].try_into().unwrap()));
|
||||
assert_eq!(Identity::super_of(20), Some((10, Data::Raw(vec![40; 1].try_into().unwrap()))));
|
||||
assert_eq!(Identity::super_of(30), Some((10, Data::Raw(vec![50; 1].try_into().unwrap()))));
|
||||
|
||||
// switch out one of the items and re-set.
|
||||
subs[0] = (40, Data::Raw(vec![60; 1]));
|
||||
subs[0] = (40, Data::Raw(vec![60; 1].try_into().unwrap()));
|
||||
assert_ok!(Identity::set_subs(Origin::signed(10), subs.clone()));
|
||||
assert_eq!(Balances::free_balance(10), 70); // no change in the balance
|
||||
assert_eq!(Identity::subs_of(10), (20, vec![40, 30]));
|
||||
assert_eq!(Identity::subs_of(10), (20, vec![40, 30].try_into().unwrap()));
|
||||
assert_eq!(Identity::super_of(20), None);
|
||||
assert_eq!(Identity::super_of(30), Some((10, Data::Raw(vec![50; 1]))));
|
||||
assert_eq!(Identity::super_of(40), Some((10, Data::Raw(vec![60; 1]))));
|
||||
assert_eq!(Identity::super_of(30), Some((10, Data::Raw(vec![50; 1].try_into().unwrap()))));
|
||||
assert_eq!(Identity::super_of(40), Some((10, Data::Raw(vec![60; 1].try_into().unwrap()))));
|
||||
|
||||
// clear
|
||||
assert_ok!(Identity::set_subs(Origin::signed(10), vec![]));
|
||||
assert_eq!(Balances::free_balance(10), 90);
|
||||
assert_eq!(Identity::subs_of(10), (0, vec![]));
|
||||
assert_eq!(Identity::subs_of(10), (0, BoundedVec::default()));
|
||||
assert_eq!(Identity::super_of(30), None);
|
||||
assert_eq!(Identity::super_of(40), None);
|
||||
|
||||
subs.push((20, Data::Raw(vec![40; 1])));
|
||||
subs.push((20, Data::Raw(vec![40; 1].try_into().unwrap())));
|
||||
assert_noop!(Identity::set_subs(Origin::signed(10), subs.clone()), Error::<Test>::TooManySubAccounts);
|
||||
});
|
||||
}
|
||||
@@ -381,7 +378,7 @@ fn setting_subaccounts_should_work() {
|
||||
fn clearing_account_should_remove_subaccounts_and_refund() {
|
||||
new_test_ext().execute_with(|| {
|
||||
assert_ok!(Identity::set_identity(Origin::signed(10), ten()));
|
||||
assert_ok!(Identity::set_subs(Origin::signed(10), vec![(20, Data::Raw(vec![40; 1]))]));
|
||||
assert_ok!(Identity::set_subs(Origin::signed(10), vec![(20, Data::Raw(vec![40; 1].try_into().unwrap()))]));
|
||||
assert_ok!(Identity::clear_identity(Origin::signed(10)));
|
||||
assert_eq!(Balances::free_balance(10), 100);
|
||||
assert!(Identity::super_of(20).is_none());
|
||||
@@ -392,7 +389,7 @@ fn clearing_account_should_remove_subaccounts_and_refund() {
|
||||
fn killing_account_should_remove_subaccounts_and_not_refund() {
|
||||
new_test_ext().execute_with(|| {
|
||||
assert_ok!(Identity::set_identity(Origin::signed(10), ten()));
|
||||
assert_ok!(Identity::set_subs(Origin::signed(10), vec![(20, Data::Raw(vec![40; 1]))]));
|
||||
assert_ok!(Identity::set_subs(Origin::signed(10), vec![(20, Data::Raw(vec![40; 1].try_into().unwrap()))]));
|
||||
assert_ok!(Identity::kill_identity(Origin::signed(2), 10));
|
||||
assert_eq!(Balances::free_balance(10), 80);
|
||||
assert!(Identity::super_of(20).is_none());
|
||||
@@ -453,9 +450,11 @@ fn field_deposit_should_work() {
|
||||
assert_ok!(Identity::set_fee(Origin::signed(3), 0, 10));
|
||||
assert_ok!(Identity::set_identity(Origin::signed(10), IdentityInfo {
|
||||
additional: vec![
|
||||
(Data::Raw(b"number".to_vec()), Data::Raw(10u32.encode())),
|
||||
(Data::Raw(b"text".to_vec()), Data::Raw(b"10".to_vec())),
|
||||
], .. Default::default()
|
||||
(Data::Raw(b"number".to_vec().try_into().unwrap()), Data::Raw(10u32.encode().try_into().unwrap())),
|
||||
(Data::Raw(b"text".to_vec().try_into().unwrap()), Data::Raw(b"10".to_vec().try_into().unwrap())),
|
||||
]
|
||||
.try_into()
|
||||
.unwrap(), .. Default::default()
|
||||
}));
|
||||
assert_eq!(Balances::free_balance(10), 70);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user