1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
// This file is part of Substrate. // Copyright (C) 2019-2021 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. //! The lockable currency trait and some associated types. use super::{super::misc::WithdrawReasons, Currency}; use crate::{dispatch::DispatchResult, traits::misc::Get}; /// An identifier for a lock. Used for disambiguating different locks so that /// they can be individually replaced or removed. pub type LockIdentifier = [u8; 8]; /// A currency whose accounts can have liquidity restrictions. pub trait LockableCurrency<AccountId>: Currency<AccountId> { /// The quantity used to denote time; usually just a `BlockNumber`. type Moment; /// The maximum number of locks a user should have on their account. type MaxLocks: Get<u32>; /// Create a new balance lock on account `who`. /// /// If the new lock is valid (i.e. not already expired), it will push the struct to /// the `Locks` vec in storage. Note that you can lock more funds than a user has. /// /// If the lock `id` already exists, this will update it. fn set_lock( id: LockIdentifier, who: &AccountId, amount: Self::Balance, reasons: WithdrawReasons, ); /// Changes a balance lock (selected by `id`) so that it becomes less liquid in all /// parameters or creates a new one if it does not exist. /// /// Calling `extend_lock` on an existing lock `id` differs from `set_lock` in that it /// applies the most severe constraints of the two, while `set_lock` replaces the lock /// with the new parameters. As in, `extend_lock` will set: /// - maximum `amount` /// - bitwise mask of all `reasons` fn extend_lock( id: LockIdentifier, who: &AccountId, amount: Self::Balance, reasons: WithdrawReasons, ); /// Remove an existing lock. fn remove_lock(id: LockIdentifier, who: &AccountId); } /// A vesting schedule over a currency. This allows a particular currency to have vesting limits /// applied to it. pub trait VestingSchedule<AccountId> { /// The quantity used to denote time; usually just a `BlockNumber`. type Moment; /// The currency that this schedule applies to. type Currency: Currency<AccountId>; /// Get the amount that is currently being vested and cannot be transferred out of this account. /// Returns `None` if the account has no vesting schedule. fn vesting_balance(who: &AccountId) -> Option<<Self::Currency as Currency<AccountId>>::Balance>; /// Adds a vesting schedule to a given account. /// /// If there already exists a vesting schedule for the given account, an `Err` is returned /// and nothing is updated. /// /// Is a no-op if the amount to be vested is zero. /// /// NOTE: This doesn't alter the free balance of the account. fn add_vesting_schedule( who: &AccountId, locked: <Self::Currency as Currency<AccountId>>::Balance, per_block: <Self::Currency as Currency<AccountId>>::Balance, starting_block: Self::Moment, ) -> DispatchResult; /// Remove a vesting schedule for a given account. /// /// NOTE: This doesn't alter the free balance of the account. fn remove_vesting_schedule(who: &AccountId); }