0x2::object
Sui object identifiers
ID
UID
id_to_bytes
id_to_address
id_from_bytes
id_from_address
sui_system_state
clock
authenticator_state
randomness_state
sui_deny_list_object_id
bridge
uid_as_inner
uid_to_inner
uid_to_bytes
uid_to_address
new
delete
id
borrow_id
id_bytes
id_address
borrow_uid
new_uid_from_hash
delete_impl
record_new_uid
use 0x1::bcs;
use 0x2::address;
use 0x2::tx_context;
ID
An object ID. This is used to reference Sui Objects.
This is not guaranteed to be globally unique–anyone can create an ID
from a UID
or
from an object, and ID’s can be freely copied and dropped.
Here, the values are not globally unique because there can be multiple values of type ID
with the same underlying bytes. For example, object::id(&obj)
can be called as many times
as you want for a given obj
, and each ID
value will be identical.
struct ID has copy, drop, store
bytes: address
UID
Globally unique IDs that define an object’s ID in storage. Any Sui Object, that is a struct
with the key
ability, must have id: UID
as its first field.
These are globally unique in the sense that no two values of type UID
are ever equal, in
other words for any two values id1: UID
and id2: UID
, id1
!= id2
.
This is a privileged type that can only be derived from a TxContext
.
UID
doesn’t have the drop
ability, so deleting a UID
requires a call to delete
.
struct UID has store
id: object::ID
Sender is not @0x0 the system address.
const ENotSystemAddress: u64 = 0;
The hardcoded ID for the singleton AuthenticatorState Object.
const SUI_AUTHENTICATOR_STATE_ID: address = 7;
The hardcoded ID for the Bridge Object.
const SUI_BRIDGE_ID: address = 9;
The hardcoded ID for the singleton Clock Object.
const SUI_CLOCK_OBJECT_ID: address = 6;
The hardcoded ID for the singleton DenyList.
const SUI_DENY_LIST_OBJECT_ID: address = 403;
The hardcoded ID for the singleton Random Object.
const SUI_RANDOM_ID: address = 8;
The hardcoded ID for the singleton Sui System State Object.
const SUI_SYSTEM_STATE_OBJECT_ID: address = 5;
id_to_bytes
Get the raw bytes of a ID
public fun id_to_bytes(id: &object::ID): vector<u8>
public fun id_to_bytes(id: &ID): vector<u8> {
bcs::to_bytes(&id.bytes)
}
id_to_address
Get the inner bytes of id
as an address.
public fun id_to_address(id: &object::ID): address
public fun id_to_address(id: &ID): address {
id.bytes
}
id_from_bytes
Make an ID
from raw bytes.
public fun id_from_bytes(bytes: vector<u8>): object::ID
public fun id_from_bytes(bytes: vector<u8>): ID {
address::from_bytes(bytes).to_id()
}
id_from_address
Make an ID
from an address.
public fun id_from_address(bytes: address): object::ID
public fun id_from_address(bytes: address): ID {
ID { bytes }
}
sui_system_state
Create the UID
for the singleton SuiSystemState
object.
This should only be called once from sui_system
.
fun sui_system_state(ctx: &tx_context::TxContext): object::UID
fun sui_system_state(ctx: &TxContext): UID {
assert!(ctx.sender() == @0x0, ENotSystemAddress);
UID {
id: ID { bytes: SUI_SYSTEM_STATE_OBJECT_ID },
}
}
clock
Create the UID
for the singleton Clock
object.
This should only be called once from clock
.
public(friend) fun clock(): object::UID
authenticator_state
Create the UID
for the singleton AuthenticatorState
object.
This should only be called once from authenticator_state
.
public(friend) fun authenticator_state(): object::UID
public(package) fun authenticator_state(): UID {
UID {
id: ID { bytes: SUI_AUTHENTICATOR_STATE_ID },
}
}
randomness_state
Create the UID
for the singleton Random
object.
This should only be called once from random
.
public(friend) fun randomness_state(): object::UID
public(package) fun randomness_state(): UID {
UID {
id: ID { bytes: SUI_RANDOM_ID },
}
}
sui_deny_list_object_id
Create the UID
for the singleton DenyList
object.
This should only be called once from deny_list
.
public(friend) fun sui_deny_list_object_id(): object::UID
public(package) fun sui_deny_list_object_id(): UID {
UID {
id: ID { bytes: SUI_DENY_LIST_OBJECT_ID },
}
}
bridge
Create the UID
for the singleton Bridge
object.
This should only be called once from bridge
.
fun bridge(): object::UID
fun bridge(): UID {
UID {
id: ID { bytes: SUI_BRIDGE_ID },
}
}
uid_as_inner
Get the inner ID
of uid
public fun uid_as_inner(uid: &object::UID): &object::ID
public fun uid_as_inner(uid: &UID): &ID {
&uid.id
}
uid_to_inner
Get the raw bytes of a uid
’s inner ID
public fun uid_to_inner(uid: &object::UID): object::ID
public fun uid_to_inner(uid: &UID): ID {
uid.id
}
uid_to_bytes
Get the raw bytes of a UID
public fun uid_to_bytes(uid: &object::UID): vector<u8>
public fun uid_to_bytes(uid: &UID): vector<u8> {
bcs::to_bytes(&uid.id.bytes)
}
uid_to_address
Get the inner bytes of id
as an address.
public fun uid_to_address(uid: &object::UID): address
public fun uid_to_address(uid: &UID): address {
uid.id.bytes
}
new
Create a new object. Returns the UID
that must be stored in a Sui object.
This is the only way to create UID
s.
public fun new(ctx: &mut tx_context::TxContext): object::UID
public fun new(ctx: &mut TxContext): UID {
UID {
id: ID { bytes: ctx.fresh_object_address() },
}
}
delete
Delete the object and it’s UID
. This is the only way to eliminate a UID
.
public fun delete(id: object::UID)
public fun delete(id: UID) {
let UID { id: ID { bytes } } = id;
delete_impl(bytes)
}
id
Get the underlying ID
of obj
public fun id<T: key>(obj: &T): object::ID
public fun id<T: key>(obj: &T): ID {
borrow_uid(obj).id
}
borrow_id
Borrow the underlying ID
of obj
public fun borrow_id<T: key>(obj: &T): &object::ID
public fun borrow_id<T: key>(obj: &T): &ID {
&borrow_uid(obj).id
}
id_bytes
Get the raw bytes for the underlying ID
of obj
public fun id_bytes<T: key>(obj: &T): vector<u8>
public fun id_bytes<T: key>(obj: &T): vector<u8> {
bcs::to_bytes(&borrow_uid(obj).id)
}
id_address
Get the inner bytes for the underlying ID
of obj
public fun id_address<T: key>(obj: &T): address
public fun id_address<T: key>(obj: &T): address {
borrow_uid(obj).id.bytes
}
borrow_uid
Get the UID
for obj
.
Safe because Sui has an extra bytecode verifier pass that forces every struct with
the key
ability to have a distinguished UID
field.
Cannot be made public as the access to UID
for a given object must be privileged, and
restrictable in the object’s module.
fun borrow_uid<T: key>(obj: &T): &object::UID
native fun borrow_uid<T: key>(obj: &T): &UID;
new_uid_from_hash
Generate a new UID specifically used for creating a UID from a hash
public(friend) fun new_uid_from_hash(bytes: address): object::UID
public(package) fun new_uid_from_hash(bytes: address): UID {
record_new_uid(bytes);
UID { id: ID { bytes } }
}
delete_impl
fun delete_impl(id: address)
native fun delete_impl(id: address);
record_new_uid
fun record_new_uid(id: address)
native fun record_new_uid(id: address);