Struct frc46_token::token::state::TokenState

source ·
pub struct TokenState {
    pub supply: TokenAmount,
    pub balances: Cid,
    pub allowances: Cid,
    /* private fields */
}
Expand description

Token state IPLD structure

Fields§

§supply: TokenAmount

Total supply of token

§balances: Cid

Map<ActorId, TokenAmount> of balances as a Hamt

§allowances: Cid

Map<ActorId, Map<ActorId, TokenAmount>> as a Hamt. Allowances are stored balances[owner][operator]

Implementations§

source§

impl TokenState

An abstraction over the IPLD layer to get and modify token state without dealing with HAMTs etc.

This is a simple wrapper of state and in general does not account for token protocol level checks such as ensuring necessary approvals are enforced during transfers. This is left for the caller to handle. However, some invariants such as non-negative balances, allowances and total supply are enforced.

source

pub fn new<BS: Blockstore>(store: &BS) -> Result<Self, StateError>

Create a new token state-tree, without committing it (the root cid) to a blockstore

source

pub fn new_with_bit_width<BS: Blockstore>( store: &BS, hamt_bit_width: u32, ) -> Result<Self, StateError>

Create a new token state-tree, without committing it (the root cid) to a blockstore

Explicitly sets the bit width of underlying Hamt structures. Caller must ensure 1 <= hamt_bit_width <= 8.

source

pub fn load<BS: Blockstore>(bs: &BS, cid: &Cid) -> Result<Self, StateError>

Loads a fresh copy of the state from a blockstore from a given cid

source

pub fn save<BS: Blockstore>(&self, bs: &BS) -> Result<Cid, StateError>

Saves the current state to the blockstore, returning the cid

source

pub fn get_balance<BS: Blockstore>( &self, bs: &BS, owner: ActorID, ) -> Result<TokenAmount, StateError>

Get the balance of an ActorID from the currently stored state

source

pub fn change_balance_by<BS: Blockstore>( &mut self, bs: &BS, owner: ActorID, delta: &TokenAmount, ) -> Result<TokenAmount, StateError>

Changes the balance of the specified account by the delta

Caller must ensure that the sign of of the delta is consistent with token rules (i.e. negative transfers, burns etc. are not allowed). Returns the new balance of the account.

source

pub fn set_balance<BS: Blockstore>( &mut self, bs: &BS, owner: ActorID, new_balance: &TokenAmount, ) -> Result<TokenAmount, StateError>

Set the balance of the account returning the old balance

Consistent with change_balance_by, this method does not change the total supply. Business logic to reconcile the total supply with changes in balancesis the responsibility of the caller.

source

pub fn get_balance_map<'bs, BS: Blockstore>( &self, bs: &'bs BS, ) -> Result<Hamt<&'bs BS, TokenAmount, BytesKey>, StateError>

Retrieve the balance map as a HAMT

source

pub fn make_transfer<BS: Blockstore>( &mut self, bs: &BS, from: ActorID, to: ActorID, amount: &TokenAmount, ) -> Result<(), StateError>

Record a transfer of an amount between two accounts

It is the caller’s responsibility to ensure that allowance invariants are upheld. The caller should check that the amount is non-negative and complies with the token granularity.

source

pub fn count_balances<BS: Blockstore>( &self, bs: &BS, ) -> Result<usize, StateError>

Retrieve the number of token holders

This involves iterating through the entire HAMT

source

pub fn change_supply_by( &mut self, delta: &TokenAmount, ) -> Result<&TokenAmount, StateError>

Increase/decrease the total supply by the specified value

Returns the new total supply

source

pub fn get_allowance_between<BS: Blockstore>( &self, bs: &BS, owner: ActorID, operator: ActorID, ) -> Result<TokenAmount, StateError>

Get the allowance that an owner has approved for a operator

If an existing allowance cannot be found, it is implicitly assumed to be zero

source

pub fn change_allowance_by<BS: Blockstore>( &mut self, bs: &BS, owner: ActorID, operator: ActorID, delta: &TokenAmount, ) -> Result<TokenAmount, StateError>

Change the allowance between owner and operator by the specified delta

source

pub fn revoke_allowance<BS: Blockstore>( &mut self, bs: &BS, owner: ActorID, operator: ActorID, ) -> Result<TokenAmount, StateError>

Revokes an approved allowance by removing the entry from the owner-operator map

If that map becomes empty, it is removed from the root map. Returns the old allowance

source

pub fn set_allowance<BS: Blockstore>( &mut self, bs: &BS, owner: ActorID, operator: ActorID, amount: &TokenAmount, ) -> Result<TokenAmount, StateError>

Set the allowance between owner and operator to a specific amount, returning the old allowance

source

pub fn attempt_use_allowance<BS: Blockstore>( &mut self, bs: &BS, operator: u64, owner: u64, amount: &TokenAmount, ) -> Result<TokenAmount, StateError>

Atomically checks if value is less than the allowance and deducts it if so

Returns new allowance if successful, else returns an error and the allowance is unchanged

source

pub fn get_owner_allowance_map<'bs, BS: Blockstore>( &self, bs: &'bs BS, owner: ActorID, ) -> Result<Option<Hamt<&'bs BS, TokenAmount, BytesKey>>, StateError>

Get the allowances map of a specific actor, resolving the CID link to a Hamt

Ok(Some) if the owner has allocated allowances to other actors Ok(None) if the owner has no current non-zero allowances to other actors Err if operations on the underlying Hamt failed

source

pub fn get_allowances_map<'bs, BS: Blockstore>( &self, bs: &'bs BS, ) -> Result<Hamt<&'bs BS, Cid, BytesKey>, StateError>

Get the global allowances map

Gets a HAMT with CIDs linking to other HAMTs

source§

impl TokenState

source

pub fn check_invariants<BS: Blockstore>( &self, bs: &BS, granularity: u64, ) -> (StateSummary, Vec<StateInvariantError>)

Checks that the current state obeys all system invariants

Checks that there are no zero balances, zero allowances or empty allowance maps explicitly stored in the blockstore. Checks that balances, total supply, allowances are never negative. Checks that sum of all balances matches total_supply. Checks that no allowances are stored where operator == owner. Checks that all balances are a multiple of the granularity.

Returns a state summary that can be used to check application specific invariants and a list of errors that were found.

Trait Implementations§

source§

impl Clone for TokenState

source§

fn clone(&self) -> TokenState

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for TokenState

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for TokenState

source§

fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl PartialEq for TokenState

source§

fn eq(&self, other: &TokenState) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Serialize for TokenState

source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for TokenState

source§

impl StructuralPartialEq for TokenState

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> Conv for T

source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
source§

impl<T> FmtForward for T

source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

impl<T> Pipe for T
where T: ?Sized,

source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
source§

impl<T> Pointable for T

source§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> References<RawCodec> for T

source§

fn references<R, E>(_c: RawCodec, _r: &mut R, _set: &mut E) -> Result<(), Error>
where R: Read, E: Extend<Cid<64>>,

Scrape the references from an impl Read. Read more
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> Tap for T

source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> TryConv for T

source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,