sui::accumulatorAccumulatorRootU128Keycreateroot_idroot_id_mutcreate_u128destroy_u128update_u128is_zero_u128accumulator_keyaccumulator_addressroot_has_accumulatorroot_add_accumulatorroot_borrow_accumulator_mutroot_remove_accumulatoremit_deposit_eventemit_withdraw_eventuse std::ascii;
use std::bcs;
use std::option;
use std::string;
use std::vector;
use sui::address;
use sui::dynamic_field;
use sui::hex;
use sui::object;
use sui::party;
use sui::transfer;
use sui::tx_context;
use sui::vec_map;
AccumulatorRootpublic struct AccumulatorRoot has key
id: sui::object::UID
U128Storage for 128-bit accumulator values.
Currently only used to represent the sum of 64 bit values (such as Balance<T>).
The additional bits are necessary to prevent overflow, as it would take 2^64 deposits of U64_MAX
to cause an overflow.
public struct U128 has store
value: u128
KeyKey is used only for computing the field id of accumulator objects.
T is the type of the accumulated value, e.g. Balance<SUI>
public struct Key<phantom T> has copy, drop, store
address: address
const ENotSystemAddress: u64 = 0;
createfun create(ctx: &sui::tx_context::TxContext)
fun create(ctx: &TxContext) {
assert!(ctx.sender() == @0x0, ENotSystemAddress);
transfer::share_object(AccumulatorRoot {
id: object::sui_accumulator_root_object_id(),
})
}
root_idpublic(package) fun root_id(accumulator_root: &sui::accumulator::AccumulatorRoot): &sui::object::UID
public(package) fun root_id(accumulator_root: &AccumulatorRoot): &UID {
&accumulator_root.id
}
root_id_mutpublic(package) fun root_id_mut(accumulator_root: &mut sui::accumulator::AccumulatorRoot): &mut sui::object::UID
public(package) fun root_id_mut(accumulator_root: &mut AccumulatorRoot): &mut UID {
&mut accumulator_root.id
}
create_u128public(package) fun create_u128(value: u128): sui::accumulator::U128
public(package) fun create_u128(value: u128): U128 {
U128 { value }
}
destroy_u128public(package) fun destroy_u128(u128: sui::accumulator::U128)
public(package) fun destroy_u128(u128: U128) {
let U128 { value: _ } = u128;
}
update_u128public(package) fun update_u128(u128: &mut sui::accumulator::U128, merge: u128, split: u128)
public(package) fun update_u128(u128: &mut U128, merge: u128, split: u128) {
u128.value = u128.value + merge - split;
}
is_zero_u128public(package) fun is_zero_u128(u128: &sui::accumulator::U128): bool
public(package) fun is_zero_u128(u128: &U128): bool {
u128.value == 0
}
accumulator_keypublic(package) fun accumulator_key<T>(address: address): sui::accumulator::Key<T>
public(package) fun accumulator_key<T>(address: address): Key<T> {
Key { address }
}
accumulator_addresspublic(package) fun accumulator_address<T>(address: address): address
public(package) fun accumulator_address<T>(address: address): address {
let key = Key<T> { address };
dynamic_field::hash_type_and_key(sui_accumulator_root_address(), key)
}
root_has_accumulatorBalance object methods
public(package) fun root_has_accumulator<K, V: store>(accumulator_root: &sui::accumulator::AccumulatorRoot, name: sui::accumulator::Key<K>): bool
public(package) fun root_has_accumulator<K, V: store>(
accumulator_root: &AccumulatorRoot,
name: Key<K>,
): bool {
dynamic_field::exists_with_type<Key<K>, V>(&accumulator_root.id, name)
}
root_add_accumulatorpublic(package) fun root_add_accumulator<K, V: store>(accumulator_root: &mut sui::accumulator::AccumulatorRoot, name: sui::accumulator::Key<K>, value: V)
public(package) fun root_add_accumulator<K, V: store>(
accumulator_root: &mut AccumulatorRoot,
name: Key<K>,
value: V,
) {
dynamic_field::add(&mut accumulator_root.id, name, value);
}
root_borrow_accumulator_mutpublic(package) fun root_borrow_accumulator_mut<K, V: store>(accumulator_root: &mut sui::accumulator::AccumulatorRoot, name: sui::accumulator::Key<K>): &mut V
public(package) fun root_borrow_accumulator_mut<K, V: store>(
accumulator_root: &mut AccumulatorRoot,
name: Key<K>,
): &mut V {
dynamic_field::borrow_mut<Key<K>, V>(&mut accumulator_root.id, name)
}
root_remove_accumulatorpublic(package) fun root_remove_accumulator<K, V: store>(accumulator_root: &mut sui::accumulator::AccumulatorRoot, name: sui::accumulator::Key<K>): V
public(package) fun root_remove_accumulator<K, V: store>(
accumulator_root: &mut AccumulatorRoot,
name: Key<K>,
): V {
dynamic_field::remove<Key<K>, V>(&mut accumulator_root.id, name)
}
emit_deposit_eventpublic(package) fun emit_deposit_event<T>(accumulator: address, recipient: address, amount: u64)
public(package) native fun emit_deposit_event<T>(
accumulator: address,
recipient: address,
amount: u64,
);
emit_withdraw_eventpublic(package) fun emit_withdraw_event<T>(accumulator: address, owner: address, amount: u64)
public(package) native fun emit_withdraw_event<T>(
accumulator: address,
owner: address,
amount: u64,
);