Skip to main content

Module 0x2::object

Sui object identifiers

use 0x1::bcs;
use 0x2::address;
use 0x2::tx_context;

Struct 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
Fields
bytes: address

Struct 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
Fields

Constants

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;

Function id_to_bytes

Get the raw bytes of a ID

public fun id_to_bytes(id: &object::ID): vector<u8>
Implementation
public fun id_to_bytes(id: &ID): vector<u8> {
    bcs::to_bytes(&id.bytes)
}

Function id_to_address

Get the inner bytes of id as an address.

public fun id_to_address(id: &object::ID): address
Implementation
public fun id_to_address(id: &ID): address {
    id.bytes
}

Function id_from_bytes

Make an ID from raw bytes.

public fun id_from_bytes(bytes: vector<u8>): object::ID
Implementation
public fun id_from_bytes(bytes: vector<u8>): ID {
    address::from_bytes(bytes).to_id()
}

Function id_from_address

Make an ID from an address.

public fun id_from_address(bytes: address): object::ID
Implementation
public fun id_from_address(bytes: address): ID {
    ID { bytes }
}

Function 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
Implementation
fun sui_system_state(ctx: &TxContext): UID {
    assert!(ctx.sender() == @0x0, ENotSystemAddress);
    UID {
        id: ID { bytes: SUI_SYSTEM_STATE_OBJECT_ID },
    }
}

Function clock

Create the UID for the singleton Clock object. This should only be called once from clock.

public(friend) fun clock(): object::UID
Implementation
public(package) fun clock(): UID {
    UID {
        id: ID { bytes: SUI_CLOCK_OBJECT_ID }
    }
}

Function 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
Implementation
public(package) fun authenticator_state(): UID {
    UID {
        id: ID { bytes: SUI_AUTHENTICATOR_STATE_ID }
    }
}

Function 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
Implementation
public(package) fun randomness_state(): UID {
    UID {
        id: ID { bytes: SUI_RANDOM_ID }
    }
}

Function 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
Implementation
public(package) fun sui_deny_list_object_id(): UID {
    UID {
        id: ID { bytes: SUI_DENY_LIST_OBJECT_ID }
    }
}

Function bridge

Create the UID for the singleton Bridge object. This should only be called once from bridge.

fun bridge(): object::UID
Implementation
fun bridge(): UID {
    UID {
        id: ID { bytes: SUI_BRIDGE_ID }
    }
}

Function uid_as_inner

Get the inner ID of uid

public fun uid_as_inner(uid: &object::UID): &object::ID
Implementation
public fun uid_as_inner(uid: &UID): &ID {
    &uid.id
}

Function uid_to_inner

Get the raw bytes of a uid's inner ID

public fun uid_to_inner(uid: &object::UID): object::ID
Implementation
public fun uid_to_inner(uid: &UID): ID {
    uid.id
}

Function uid_to_bytes

Get the raw bytes of a UID

public fun uid_to_bytes(uid: &object::UID): vector<u8>
Implementation
public fun uid_to_bytes(uid: &UID): vector<u8> {
    bcs::to_bytes(&uid.id.bytes)
}

Function uid_to_address

Get the inner bytes of id as an address.

public fun uid_to_address(uid: &object::UID): address
Implementation
public fun uid_to_address(uid: &UID): address {
    uid.id.bytes
}

Function new

Create a new object. Returns the UID that must be stored in a Sui object. This is the only way to create UIDs.

public fun new(ctx: &mut tx_context::TxContext): object::UID
Implementation
public fun new(ctx: &mut TxContext): UID {
    UID {
        id: ID { bytes: ctx.fresh_object_address() },
    }
}

Function delete

Delete the object and it's UID. This is the only way to eliminate a UID.

public fun delete(id: object::UID)
Implementation
public fun delete(id: UID) {
    let UID { id: ID { bytes } } = id;
    delete_impl(bytes)
}

Function id

Get the underlying ID of obj

public fun id<T: key>(obj: &T): object::ID
Implementation
public fun id<T: key>(obj: &T): ID {
    borrow_uid(obj).id
}

Function borrow_id

Borrow the underlying ID of obj

public fun borrow_id<T: key>(obj: &T): &object::ID
Implementation
public fun borrow_id<T: key>(obj: &T): &ID {
    &borrow_uid(obj).id
}

Function id_bytes

Get the raw bytes for the underlying ID of obj

public fun id_bytes<T: key>(obj: &T): vector<u8>
Implementation
public fun id_bytes<T: key>(obj: &T): vector<u8> {
    bcs::to_bytes(&borrow_uid(obj).id)
}

Function id_address

Get the inner bytes for the underlying ID of obj

public fun id_address<T: key>(obj: &T): address
Implementation
public fun id_address<T: key>(obj: &T): address {
    borrow_uid(obj).id.bytes
}

Function 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
Implementation
native fun borrow_uid<T: key>(obj: &T): &UID;

Function 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
Implementation
public(package) fun new_uid_from_hash(bytes: address): UID {
    record_new_uid(bytes);
    UID { id: ID { bytes } }
}

Function delete_impl

fun delete_impl(id: address)
Implementation
native fun delete_impl(id: address);

Function record_new_uid

fun record_new_uid(id: address)
Implementation
native fun record_new_uid(id: address);