Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
74bcfcb
comment updates
joepetrowski Mar 6, 2019
a544d4a
Merge branch 'master' into joe-balances-docs
joepetrowski Mar 6, 2019
1cc5721
added rustdoc and readme
joepetrowski Mar 6, 2019
e4a3bf7
clarified LockableCurrency trait
joepetrowski Mar 6, 2019
3e4b5e4
Currency trait rustdocs
joepetrowski Mar 7, 2019
077cde2
fixed typo
joepetrowski Mar 7, 2019
dd16fd6
fixed suggestions round 1
joepetrowski Mar 8, 2019
ceeb172
UpdateBalanceOutcome docs (open for discussion)
joepetrowski Mar 8, 2019
05894ab
rm description of enum, consolidation, rm ReclaimRebate
joepetrowski Mar 9, 2019
a654735
type clarification, examples overhaul, adoc formatting
joepetrowski Mar 10, 2019
02110b2
adoc to md
joepetrowski Mar 11, 2019
53680af
format change for rustdoc
joepetrowski Mar 12, 2019
f1b62a4
update links and fix typos
joepetrowski Mar 12, 2019
499c239
typos and links
joepetrowski Mar 13, 2019
cf750f8
Merge remote-tracking branch 'origin/master' into joe-balances-docs
joepetrowski Mar 13, 2019
2cf4009
updates according to comments
joepetrowski Mar 13, 2019
d863ff6
new example
joepetrowski Mar 14, 2019
5e28748
small clarifications
joepetrowski Mar 14, 2019
c8ec45a
trait implementation section
joepetrowski Mar 14, 2019
36b1689
missing ```
joepetrowski Mar 14, 2019
3c157e4
small changes, ready for review
joepetrowski Mar 14, 2019
a0ef9b7
line width update
joepetrowski Mar 15, 2019
2d28117
Merge branch 'master' into joe-balances-docs
joepetrowski Mar 18, 2019
df3ced9
Merge branch 'master' into joe-balances-docs
joepetrowski Mar 21, 2019
e42f6b6
small tweaks
joepetrowski Mar 25, 2019
e000871
Update srml/balances/src/lib.rs
gui1117 Mar 25, 2019
faccdbf
Update srml/balances/src/lib.rs
gui1117 Mar 25, 2019
513b377
Update srml/balances/src/lib.rs
gui1117 Mar 25, 2019
ce29349
Update srml/balances/src/lib.rs
gui1117 Mar 25, 2019
fa9f215
Update lib.rs
joepetrowski Mar 25, 2019
28a1d33
address review by thiolliere
joepetrowski Mar 25, 2019
aa43b56
remove common warning
joepetrowski Mar 26, 2019
191ecc0
Merge remote-tracking branch 'origin/master' into joe-balances-docs
gavofyork Mar 26, 2019
665fa6b
Update docs
gavofyork Mar 26, 2019
5f391ae
updated srml example
joepetrowski Mar 26, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
169 changes: 0 additions & 169 deletions srml/balances/README.adoc

This file was deleted.

145 changes: 133 additions & 12 deletions srml/balances/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,131 @@
// You should have received a copy of the GNU General Public License
// along with Substrate. If not, see <http://www.gnu.org/licenses/>.

//! Balances: Handles setting and retrieval of free balance,
//! retrieving total, reserved, and unreserved balances,
//! repatriating a reserved balance to a beneficiary account that exists,
//! transfering a balance between accounts (when not reserved),
//! slashing an account balance, account removal, rewards,
//! lookup of an index to reclaim an account (when balance not reserved),
//! increasing total stake.
//! # Balances Module
//!
//! Implements functions for `Currency`, `LockableCurrency`, `TransferAsset`,
//! and `IsDeadAccount` traits.
//! ## Overview
//!
//! The balances module provides functions for:
//!
//! - Getting and setting free balance
//! - Retrieving total, reserved, and unreserved balances
//! - Repatriating a reserved balance to a beneficiary account that exists
//! - Transfering a balance between accounts (when not reserved)
//! - Slashing an account balance
//! - Account removal
//! - Lookup of an index to reclaim an account
//! - Increasing or decreasing total stake
//! - Setting and removing locks on chains that implement `LockableCurrency`
//!
//! ### Terminology
//!
//! - **Existential Deposit:** The existential deposit is the minimum balance required to create or keep an account open. This prevents "dust accounts" from filling storage.
//! - **Stake:** The total amount of tokens in existence in a system.
//! - **Reaping an account:** The act of removing an account by resetting its nonce, setting its balance to zero, and removing from storage.
//! - **Free Balance:** The free balance is the only balance that matters for most operations. When this balance falls below the existential deposit, the account is reaped.
//! - **Reserved Balance:** Reserved balance still belongs to the account holder, but is suspended. Reserved balance can still be slashed, but only after all of free balance has been slashed. If the reserved balance falls below the existential deposit then it will be deleted.
//! - **Locks:** Locks enable the runtime to lock an account's balance until a specified block number. Only runtimes that implement the `LockableCurrency` trait allow this.
//!
//! ## Interface
//!
//! ### Types
//!
//! - Balance
//! - OnFreeBalanceZero
//! - OnNewAccount
//! - Event
//!
//! These are [associated types](https://doc.rust-lang.org/book/ch19-03-advanced-traits.html#specifying-placeholder-types-in-trait-definitions-with-associated-types) and must be implemented in your `runtime/src/lib.rs`. For example:
//!
//! ```ignore
//! impl balances::Trait for Runtime {
//! /// The type for recording an account's balance.
//! type Balance = u128;
//! /// What to do if an account's free balance gets zeroed.
//! type OnFreeBalanceZero = ();
//! /// What to do if a new account is created.
//! type OnNewAccount = Indices;
//! /// The uniquitous event type.
//! type Event = Event;
//! }
//! ```
//!
//! ### Dispatchable Functions
//!
//! The `Call` enum is documented here: https://crates.parity.io/srml_balances/enum.Call.html
//!
//! <!-- TODO: Add link to rust docs (https://github.com/paritytech/substrate-developer-hub/issues/24) -->
//!
//! - `transfer` - Transfer some liquid free balance to another staker.
//! - `set_balance` - Set the balances of a given account. Only dispatchable by a user with root privileges.
//!
//! ### Public Functions
//!
//! <!-- TODO: Add link to rust docs (https://github.com/paritytech/substrate-developer-hub/issues/24) -->
//!
//! See the [module](https://crates.parity.io/srml_balances/struct.Module.html) for details on publicly available functions.
//!
//! **Note:** When using the publicly exposed functions, you (the runtime developer) are responsible for implementing any necessary checks (e.g. that the sender is the signer) before calling a function that will affect storage.
//!
//! ## Usage
//!
//! The following examples show how to use the balances module in your custom module.
//!
//! ### Import and Balance Transfer
//!
//! Import the `balances` module and derive your module configuration trait with the balances trait. You can now call functions from the module.
//!
//! ```ignore
//! use support::{decl_module, dispatch::Result};
//! use system::ensure_signed;
//!
//! pub trait Trait: balances::Trait {}
//!
//! decl_module! {
//! pub struct Module<T: Trait> for enum Call where origin: T::Origin {
//! fn transfer_proxy(origin, to: T::AccountId, value: T::Balance) -> Result {
//! let sender = ensure_signed(origin)?;
//! <balances::Module<T>>::make_transfer(&sender, &to, value)?;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the updated function name is transfer() instead of make_transfer

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, and more generally throughout some of the early docs whose modules had a refactor. #2159

//!
//! Ok(())
//! }
//! }
//! }
//! ```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I kind of agree for this example but at the same time it is not specific to balance, so I'm mixed but ok

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree, not highly specific to balances. I thought our idea was to have an example with everything necessary to compile and use the module. Can remove if we think the real-use example is adequate.

//!
//! ### Real Use Example
//!
//! Use the `free_balance` function (from the `Currency` trait) in the `staking` module:
//!
//! ```ignore
//! fn bond_extra(origin, max_additional: BalanceOf<T>) {
//! let controller = ensure_signed(origin)?;
//! let mut ledger = Self::ledger(&controller).ok_or("not a controller")?;
//! let stash_balance = T::Currency::free_balance(&ledger.stash);
//!
//! if stash_balance > ledger.total {
//! let extra = (stash_balance - ledger.total).min(max_additional);
//! ledger.total += extra;
//! ledger.active += extra;
//! Self::update_ledger(&controller, ledger);
//! }
//! }
//! ```
//!
//! ## Genesis config
//!
//! Configuration is in `<your-node-name>/src/chain_spec.rs`. The following storage items are configurable:
//!
//! - `TotalIssuance`
//! - `ExistentialDeposit`
//! - `TransferFee`
//! - `CreationFee`
//! - `Vesting`
//! - `FreeBalance`
//!
//! ## Related Modules
//!
//! The balances module depends on the [`system`](https://crates.parity.io/srml_system/index.html) and [`srml_support`](https://crates.parity.io/srml_support/index.html) modules as well as Substrate Core libraries and the Rust standard library.

#![cfg_attr(not(feature = "std"), no_std)]

Expand Down Expand Up @@ -188,10 +303,13 @@ decl_module! {
fn deposit_event<T>() = default;

/// Transfer some liquid free balance to another staker.
///
/// `transfer` will set the `FreeBalance` of the sender and receiver.
/// It will decrease the total stake of the system by the `TransferFee`.
/// If the sender's account is below the existential deposit as a result
/// of the transfer, the account will be reaped.
///
/// The dispatch origin for this call must be `Signed` by the transactor.
pub fn transfer(
origin,
dest: <T::Lookup as StaticLookup>::Source,
Expand All @@ -202,11 +320,14 @@ decl_module! {
Self::make_transfer(&transactor, &dest, value)?;
}

/// Set the balances of a given account. Only dispatchable by root.
/// Set the balances of a given account.
///
/// This will alter `FreeBalance` and `ReservedBalance` in storage.
/// If the new free or reserved balance is below the existential deposit,
/// it will also decrease the total stake of the system (`TotalIssuance`)
/// and reset the account nonce (`system::AccountNonce`).
///
/// The dispatch origin for this call is `root`.
fn set_balance(
who: <T::Lookup as StaticLookup>::Source,
#[compact] free: T::Balance,
Expand Down Expand Up @@ -270,7 +391,7 @@ impl<T: Trait> Module<T> {
///
/// Same as `set_free_balance`, but will create a new account.
///
/// #NOTES
/// # NOTES
///
/// See documentation on `FreeBalance` and `ReservedBalance` storage items for their differences
pub fn set_free_balance_creating(who: &T::AccountId, balance: T::Balance) -> UpdateBalanceOutcome {
Expand All @@ -293,7 +414,7 @@ impl<T: Trait> Module<T> {
/// Enforces `ExistentialDeposit` law, reaping the sender's account if its balance is
/// too low as a result of the transfer.
///
/// #NOTES
/// # NOTES
///
/// Will create a new account for the destination if the account does not exist.
pub fn make_transfer(transactor: &T::AccountId, dest: &T::AccountId, value: T::Balance) -> Result {
Expand Down
4 changes: 2 additions & 2 deletions srml/support/src/traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ pub trait Currency<AccountId> {
///
/// If `who` doesn't exist, it is created
///
/// #NOTES
/// # NOTES
///
/// This assumes that the total stake remains unchanged after this operation.
fn increase_free_balance_creating(who: &AccountId, value: Self::Balance) -> UpdateBalanceOutcome;
Expand All @@ -153,7 +153,7 @@ pub trait Currency<AccountId> {
/// is less than `value`, then `Some(remaining)` will be returned. If all of `value` is
/// moved, the function will return `None`.
///
/// #NOTES
/// # NOTES
///
/// - This is different from `reserve`.
/// - If the remaining reserved balance is less than `ExistentialDeposit`, it will
Expand Down