mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-29 18:27:56 +00:00
5d81f23f8f
* First reworking of fungibles API * New API and docs * More fungible::* API improvements * New ref-counting logic for old API * Missing files * Fixes * Use the new transfer logic * Use fungibles for the dispatchables * Use shelve/restore names * Locking works with total balance. * repotting and removal * Separate Holds from Reserves * Introduce freezes * Missing files * Tests for freezing * Fix hold+freeze combo * More tests * Fee-free dispatchable for upgrading accounts * Benchmarks and a few fixes * Another test * Docs and refactor to avoid blanket impls * Repot * Fit out ItemOf fully * Add events to Balanced traits * Introduced events into Hold traits * Fix Assets pallet tests * Assets benchmarks pass * Missing files and fixes * Fixes * Fixes * Benchmarks fixes * Fix balance benchmarks * Formatting * Expose fungible sub modules * Move NIS to fungible API * Fix broken impl and add test * Fix tests * API for `transfer_and_hold` * Use composite APIs * Formatting * Upgraded event * Fixes * Fixes * Fixes * Fixes * Repot tests and some fixed * Fix some bits * Fix dust tests * Rename `set_balance` - `Balances::set_balance` becomes `Balances::force_set_balance` - `Unbalanced::set_balance` becomes `Unbalances::write_balance` * becomes * Move dust handling to fungibles API * Formatting * Fixes and more refactoring * Fixes * Fixes * Fixes * Fixes * Fixes * Fixes * Fixes * Fixes * Fixes * Use reducible_balance for better correctness on fees * Reducing hold to zero should remove entry. * Add test * Docs * Update frame/support/src/traits/tokens/fungibles/hold.rs Co-authored-by: Muharem Ismailov <ismailov.m.h@gmail.com> * Update frame/support/src/traits/tokens/fungibles/regular.rs Co-authored-by: Muharem Ismailov <ismailov.m.h@gmail.com> * Update frame/support/src/traits/tokens/fungible/hold.rs Co-authored-by: Muharem Ismailov <ismailov.m.h@gmail.com> * Update frame/support/src/traits/tokens/fungible/regular.rs Co-authored-by: Muharem Ismailov <ismailov.m.h@gmail.com> * Docs * Docs * Docs * Fix NIS benchmarks * Doc comment * Remove post_mutation * Fix some tests * Fix some grumbles * Enumify bool args to fungible(s) functions * Fix up assets and balances * Formatting * Fix contracts * Fix tests & benchmarks build * Typify minted boolean arg * Typify on_hold boolean arg; renames * Fix numerous tests * Fix dependency issue * Privatize dangerous API mutate_account * Fix contracts (@alext - please check this commit) * Remove println * Fix tests for contracts * Fix broken rename * Fix broken rename * Fix broken rename * Docs * Update frame/support/src/traits/tokens/fungible/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * remove from_ref_time * Update frame/executive/src/lib.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/executive/src/lib.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Reenable test * Update frame/support/src/traits/tokens/fungibles/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungible/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungible/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungible/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/currency.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/lottery/src/tests.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungible/mod.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungible/regular.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungibles/freeze.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungible/regular.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungibles/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungibles/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungibles/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Rename UnwantedRemoval to UnwantedAccountRemoval * Docs * Formatting * Update frame/balances/src/lib.rs Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Update primitives/runtime/src/lib.rs Co-authored-by: Keith Yeung <kungfukeith11@gmail.com> * handle_raw_dust oes nothing * Formatting * Fixes * Grumble * Fixes * Add test * Add test * Tests for reducible_balance * Fixes * Fix Salary * Fixes * Disable broken test * Disable nicely * Fixes * Fixes * Fixes * Rename some events * Fix nomination pools breakage * Add compatibility stub for transfer tx * Reinstate a safely compatible version of Balances set_balance * Fixes * Grumble * Update frame/nis/src/lib.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * ".git/.scripts/commands/bench/bench.sh" pallet dev pallet_balances * disable flakey tests * Update frame/balances/src/lib.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * Grumbles * Grumble --------- Co-authored-by: Muharem Ismailov <ismailov.m.h@gmail.com> Co-authored-by: Alexander Theißen <alex.theissen@me.com> Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: Keith Yeung <kungfukeith11@gmail.com> Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Co-authored-by: command-bot <>
120 lines
4.4 KiB
Rust
120 lines
4.4 KiB
Rust
// This file is part of Substrate.
|
|
|
|
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
//! Traits and associated datatypes for managing abstract stored values.
|
|
|
|
use crate::storage::StorageMap;
|
|
use codec::FullCodec;
|
|
use sp_runtime::DispatchError;
|
|
|
|
/// An abstraction of a value stored within storage, but possibly as part of a larger composite
|
|
/// item.
|
|
pub trait StoredMap<K, T: Default> {
|
|
/// Get the item, or its default if it doesn't yet exist; we make no distinction between the
|
|
/// two.
|
|
fn get(k: &K) -> T;
|
|
|
|
/// Maybe mutate the item only if an `Ok` value is returned from `f`. Do nothing if an `Err` is
|
|
/// returned. It is removed or reset to default value if it has been mutated to `None`.
|
|
/// `f` will always be called with an option representing if the storage item exists (`Some<V>`)
|
|
/// or if the storage item does not exist (`None`), independent of the `QueryType`.
|
|
fn try_mutate_exists<R, E: From<DispatchError>>(
|
|
k: &K,
|
|
f: impl FnOnce(&mut Option<T>) -> Result<R, E>,
|
|
) -> Result<R, E>;
|
|
|
|
// Everything past here has a default implementation.
|
|
|
|
/// Mutate the item.
|
|
fn mutate<R>(k: &K, f: impl FnOnce(&mut T) -> R) -> Result<R, DispatchError> {
|
|
Self::mutate_exists(k, |maybe_account| match maybe_account {
|
|
Some(ref mut account) => f(account),
|
|
x @ None => {
|
|
let mut account = Default::default();
|
|
let r = f(&mut account);
|
|
*x = Some(account);
|
|
r
|
|
},
|
|
})
|
|
}
|
|
|
|
/// Mutate the item, removing or resetting to default value if it has been mutated to `None`.
|
|
///
|
|
/// This is infallible as long as the value does not get destroyed.
|
|
fn mutate_exists<R>(k: &K, f: impl FnOnce(&mut Option<T>) -> R) -> Result<R, DispatchError> {
|
|
Self::try_mutate_exists(k, |x| -> Result<R, DispatchError> { Ok(f(x)) })
|
|
}
|
|
|
|
/// Set the item to something new.
|
|
fn insert(k: &K, t: T) -> Result<(), DispatchError> {
|
|
Self::mutate(k, |i| *i = t)
|
|
}
|
|
|
|
/// Remove the item or otherwise replace it with its default value; we don't care which.
|
|
fn remove(k: &K) -> Result<(), DispatchError> {
|
|
Self::mutate_exists(k, |x| *x = None)
|
|
}
|
|
}
|
|
|
|
/// A shim for placing around a storage item in order to use it as a `StoredValue`. Ideally this
|
|
/// wouldn't be needed as `StorageValue`s should blanket implement `StoredValue`s, however this
|
|
/// would break the ability to have custom impls of `StoredValue`. The other workaround is to
|
|
/// implement it directly in the macro.
|
|
///
|
|
/// This form has the advantage that two additional types are provides, `Created` and `Removed`,
|
|
/// which are both generic events that can be tied to handlers to do something in the case of being
|
|
/// about to create an account where one didn't previously exist (at all; not just where it used to
|
|
/// be the default value), or where the account is being removed or reset back to the default value
|
|
/// where previously it did exist (though may have been in a default state). This works well with
|
|
/// system module's `CallOnCreatedAccount` and `CallKillAccount`.
|
|
pub struct StorageMapShim<S, K, T>(sp_std::marker::PhantomData<(S, K, T)>);
|
|
impl<S: StorageMap<K, T, Query = T>, K: FullCodec, T: FullCodec + Default> StoredMap<K, T>
|
|
for StorageMapShim<S, K, T>
|
|
{
|
|
fn get(k: &K) -> T {
|
|
S::get(k)
|
|
}
|
|
fn insert(k: &K, t: T) -> Result<(), DispatchError> {
|
|
S::insert(k, t);
|
|
Ok(())
|
|
}
|
|
fn remove(k: &K) -> Result<(), DispatchError> {
|
|
if S::contains_key(&k) {
|
|
S::remove(k);
|
|
}
|
|
Ok(())
|
|
}
|
|
fn mutate<R>(k: &K, f: impl FnOnce(&mut T) -> R) -> Result<R, DispatchError> {
|
|
Ok(S::mutate(k, f))
|
|
}
|
|
fn mutate_exists<R>(k: &K, f: impl FnOnce(&mut Option<T>) -> R) -> Result<R, DispatchError> {
|
|
S::try_mutate_exists(k, |maybe_value| {
|
|
let r = f(maybe_value);
|
|
Ok(r)
|
|
})
|
|
}
|
|
fn try_mutate_exists<R, E: From<DispatchError>>(
|
|
k: &K,
|
|
f: impl FnOnce(&mut Option<T>) -> Result<R, E>,
|
|
) -> Result<R, E> {
|
|
S::try_mutate_exists(k, |maybe_value| {
|
|
let r = f(maybe_value)?;
|
|
Ok(r)
|
|
})
|
|
}
|
|
}
|