mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-12 15:51:12 +00:00
Self-sufficient account ref-counting (#8221)
* Self-sufficient account ref-counting * Fixes * Update frame/system/src/lib.rs Co-authored-by: Jaco Greeff <jacogr@gmail.com> * Fixes * Fixes * Fixes * Fixes * Fixes * Update frame/system/src/lib.rs Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> * Update frame/system/src/lib.rs Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> * Update frame/system/src/lib.rs Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> * fix build * Update frame/system/src/lib.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Co-authored-by: Jaco Greeff <jacogr@gmail.com> Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com> Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>
This commit is contained in:
@@ -19,10 +19,7 @@ use crate::*;
|
||||
use mock::{*, Origin};
|
||||
use sp_core::H256;
|
||||
use sp_runtime::{DispatchError, DispatchErrorWithPostInfo, traits::{Header, BlakeTwo256}};
|
||||
use frame_support::{
|
||||
weights::WithPostDispatchInfo,
|
||||
dispatch::PostDispatchInfo,
|
||||
};
|
||||
use frame_support::{assert_noop, weights::WithPostDispatchInfo, dispatch::PostDispatchInfo};
|
||||
|
||||
#[test]
|
||||
fn origin_works() {
|
||||
@@ -37,7 +34,13 @@ fn stored_map_works() {
|
||||
assert!(System::insert(&0, 42).is_ok());
|
||||
assert!(!System::is_provider_required(&0));
|
||||
|
||||
assert_eq!(Account::<Test>::get(0), AccountInfo { nonce: 0, providers: 1, consumers: 0, data: 42 });
|
||||
assert_eq!(Account::<Test>::get(0), AccountInfo {
|
||||
nonce: 0,
|
||||
providers: 1,
|
||||
consumers: 0,
|
||||
sufficients: 0,
|
||||
data: 42,
|
||||
});
|
||||
|
||||
assert!(System::inc_consumers(&0).is_ok());
|
||||
assert!(System::is_provider_required(&0));
|
||||
@@ -54,6 +57,98 @@ fn stored_map_works() {
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn provider_ref_handover_to_self_sufficient_ref_works() {
|
||||
new_test_ext().execute_with(|| {
|
||||
assert_eq!(System::inc_providers(&0), IncRefStatus::Created);
|
||||
System::inc_account_nonce(&0);
|
||||
assert_eq!(System::account_nonce(&0), 1);
|
||||
|
||||
// a second reference coming and going doesn't change anything.
|
||||
assert_eq!(System::inc_sufficients(&0), IncRefStatus::Existed);
|
||||
assert_eq!(System::dec_sufficients(&0), DecRefStatus::Exists);
|
||||
assert_eq!(System::account_nonce(&0), 1);
|
||||
|
||||
// a provider reference coming and going doesn't change anything.
|
||||
assert_eq!(System::inc_providers(&0), IncRefStatus::Existed);
|
||||
assert_eq!(System::dec_providers(&0).unwrap(), DecRefStatus::Exists);
|
||||
assert_eq!(System::account_nonce(&0), 1);
|
||||
|
||||
// decreasing the providers with a self-sufficient present should not delete the account
|
||||
assert_eq!(System::inc_sufficients(&0), IncRefStatus::Existed);
|
||||
assert_eq!(System::dec_providers(&0).unwrap(), DecRefStatus::Exists);
|
||||
assert_eq!(System::account_nonce(&0), 1);
|
||||
|
||||
// decreasing the sufficients should delete the account
|
||||
assert_eq!(System::dec_sufficients(&0), DecRefStatus::Reaped);
|
||||
assert_eq!(System::account_nonce(&0), 0);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn self_sufficient_ref_handover_to_provider_ref_works() {
|
||||
new_test_ext().execute_with(|| {
|
||||
assert_eq!(System::inc_sufficients(&0), IncRefStatus::Created);
|
||||
System::inc_account_nonce(&0);
|
||||
assert_eq!(System::account_nonce(&0), 1);
|
||||
|
||||
// a second reference coming and going doesn't change anything.
|
||||
assert_eq!(System::inc_providers(&0), IncRefStatus::Existed);
|
||||
assert_eq!(System::dec_providers(&0).unwrap(), DecRefStatus::Exists);
|
||||
assert_eq!(System::account_nonce(&0), 1);
|
||||
|
||||
// a sufficient reference coming and going doesn't change anything.
|
||||
assert_eq!(System::inc_sufficients(&0), IncRefStatus::Existed);
|
||||
assert_eq!(System::dec_sufficients(&0), DecRefStatus::Exists);
|
||||
assert_eq!(System::account_nonce(&0), 1);
|
||||
|
||||
// decreasing the sufficients with a provider present should not delete the account
|
||||
assert_eq!(System::inc_providers(&0), IncRefStatus::Existed);
|
||||
assert_eq!(System::dec_sufficients(&0), DecRefStatus::Exists);
|
||||
assert_eq!(System::account_nonce(&0), 1);
|
||||
|
||||
// decreasing the providers should delete the account
|
||||
assert_eq!(System::dec_providers(&0).unwrap(), DecRefStatus::Reaped);
|
||||
assert_eq!(System::account_nonce(&0), 0);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sufficient_cannot_support_consumer() {
|
||||
new_test_ext().execute_with(|| {
|
||||
assert_eq!(System::inc_sufficients(&0), IncRefStatus::Created);
|
||||
System::inc_account_nonce(&0);
|
||||
assert_eq!(System::account_nonce(&0), 1);
|
||||
assert_noop!(System::inc_consumers(&0), IncRefError::NoProviders);
|
||||
|
||||
assert_eq!(System::inc_providers(&0), IncRefStatus::Existed);
|
||||
assert!(System::inc_consumers(&0).is_ok());
|
||||
assert_noop!(System::dec_providers(&0), DecRefError::ConsumerRemaining);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn provider_required_to_support_consumer() {
|
||||
new_test_ext().execute_with(|| {
|
||||
assert_noop!(System::inc_consumers(&0), IncRefError::NoProviders);
|
||||
|
||||
assert_eq!(System::inc_providers(&0), IncRefStatus::Created);
|
||||
System::inc_account_nonce(&0);
|
||||
assert_eq!(System::account_nonce(&0), 1);
|
||||
|
||||
assert_eq!(System::inc_providers(&0), IncRefStatus::Existed);
|
||||
assert_eq!(System::dec_providers(&0).unwrap(), DecRefStatus::Exists);
|
||||
assert_eq!(System::account_nonce(&0), 1);
|
||||
|
||||
assert!(System::inc_consumers(&0).is_ok());
|
||||
assert_noop!(System::dec_providers(&0), DecRefError::ConsumerRemaining);
|
||||
|
||||
System::dec_consumers(&0);
|
||||
assert_eq!(System::dec_providers(&0).unwrap(), DecRefStatus::Reaped);
|
||||
assert_eq!(System::account_nonce(&0), 0);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn deposit_event_should_work() {
|
||||
new_test_ext().execute_with(|| {
|
||||
@@ -403,7 +498,7 @@ fn events_not_emitted_during_genesis() {
|
||||
new_test_ext().execute_with(|| {
|
||||
// Block Number is zero at genesis
|
||||
assert!(System::block_number().is_zero());
|
||||
let mut account_data = AccountInfo { nonce: 0, consumers: 0, providers: 0, data: 0 };
|
||||
let mut account_data = AccountInfo::default();
|
||||
System::on_created_account(Default::default(), &mut account_data);
|
||||
assert!(System::events().is_empty());
|
||||
// Events will be emitted starting on block 1
|
||||
|
||||
Reference in New Issue
Block a user