0x2::balance
A storable handler for Balances in general. Is used in the Coin
module to allow balance operations and can be used to implement
custom coins with Supply
and Balance
s.
Supply
Balance
value
supply_value
create_supply
increase_supply
decrease_supply
zero
join
split
withdraw_all
destroy_zero
create_staking_rewards
destroy_storage_rebates
destroy_supply
use 0x1::ascii;
use 0x1::type_name;
use 0x2::tx_context;
Supply
A Supply of T. Used for minting and burning.
Wrapped into a TreasuryCap
in the Coin
module.
struct Supply<T> has store
value: u64
Balance
Storable balance - an inner struct of a Coin type. Can be used to store coins which don’t need the key ability.
struct Balance<T> has store
value: u64
Sender is not @0x0 the system address.
const ENotSystemAddress: u64 = 3;
For when trying to destroy a non-zero balance.
const ENonZero: u64 = 0;
For when trying to withdraw more than there is.
const ENotEnough: u64 = 2;
System operation performed for a coin other than SUI
const ENotSUI: u64 = 4;
For when an overflow is happening on Supply operations.
const EOverflow: u64 = 1;
const SUI_TYPE_NAME: vector<u8> = [48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 58, 58, 115, 117, 105, 58, 58, 83, 85, 73];
value
Get the amount stored in a Balance
.
public fun value<T>(self: &balance::Balance<T>): u64
supply_value
Get the Supply
value.
public fun supply_value<T>(supply: &balance::Supply<T>): u64
public fun supply_value<T>(supply: &Supply<T>): u64 {
supply.value
}
create_supply
Create a new supply for type T.
public fun create_supply<T: drop>(_: T): balance::Supply<T>
public fun create_supply<T: drop>(_: T): Supply<T> {
Supply { value: 0 }
}
increase_supply
Increase supply by value
and create a new Balance<T>
with this value.
public fun increase_supply<T>(self: &mut balance::Supply<T>, value: u64): balance::Balance<T>
public fun increase_supply<T>(self: &mut Supply<T>, value: u64): Balance<T> {
assert!(value < (18446744073709551615u64 - self.value), EOverflow);
self.value = self.value + value;
Balance { value }
}
decrease_supply
Burn a Balance
public fun decrease_supply<T>(self: &mut balance::Supply<T>, balance: balance::Balance<T>): u64
public fun decrease_supply<T>(self: &mut Supply<T>, balance: Balance<T>): u64 {
let Balance { value } = balance;
assert!(self.value >= value, EOverflow);
self.value = self.value - value;
value
}
zero
Create a zero Balance
for type T
.
public fun zero<T>(): balance::Balance<T>
join
Join two balances together.
public fun join<T>(self: &mut balance::Balance<T>, balance: balance::Balance<T>): u64
public fun join<T>(self: &mut Balance<T>, balance: Balance<T>): u64 {
let Balance { value } = balance;
self.value = self.value + value;
self.value
}
split
Split a Balance
and take a sub balance from it.
public fun split<T>(self: &mut balance::Balance<T>, value: u64): balance::Balance<T>
public fun split<T>(self: &mut Balance<T>, value: u64): Balance<T> {
assert!(self.value >= value, ENotEnough);
self.value = self.value - value;
Balance { value }
}
withdraw_all
Withdraw all balance. After this the remaining balance must be 0.
public fun withdraw_all<T>(self: &mut balance::Balance<T>): balance::Balance<T>
public fun withdraw_all<T>(self: &mut Balance<T>): Balance<T> {
let value = self.value;
split(self, value)
}
destroy_zero
Destroy a zero Balance
.
public fun destroy_zero<T>(balance: balance::Balance<T>)
public fun destroy_zero<T>(balance: Balance<T>) {
assert!(balance.value == 0, ENonZero);
let Balance { value: _ } = balance;
}
create_staking_rewards
CAUTION: this function creates a Balance
without increasing the supply.
It should only be called by the epoch change system txn to create staking rewards,
and nowhere else.
fun create_staking_rewards<T>(value: u64, ctx: &tx_context::TxContext): balance::Balance<T>
fun create_staking_rewards<T>(value: u64, ctx: &TxContext): Balance<T> {
assert!(ctx.sender() == @0x0, ENotSystemAddress);
assert!(std::type_name::get<T>().into_string().into_bytes() == SUI_TYPE_NAME, ENotSUI);
Balance { value }
}
destroy_storage_rebates
CAUTION: this function destroys a Balance
without decreasing the supply.
It should only be called by the epoch change system txn to destroy storage rebates,
and nowhere else.
fun destroy_storage_rebates<T>(self: balance::Balance<T>, ctx: &tx_context::TxContext)
fun destroy_storage_rebates<T>(self: Balance<T>, ctx: &TxContext) {
assert!(ctx.sender() == @0x0, ENotSystemAddress);
assert!(std::type_name::get<T>().into_string().into_bytes() == SUI_TYPE_NAME, ENotSUI);
let Balance { value: _ } = self;
}
destroy_supply
Destroy a Supply
preventing any further minting and burning.
public(friend) fun destroy_supply<T>(self: balance::Supply<T>): u64
public(package) fun destroy_supply<T>(self: Supply<T>): u64 {
let Supply { value } = self;
value
}