Module sui::package
Functions for operating on Move packages from within Move:
-
Creating proof-of-publish objects from one-time witnesses
-
Administering package upgrades through upgrade policies.
use std::address;
use std::ascii;
use std::bcs;
use std::option;
use std::string;
use std::type_name;
use std::vector;
use sui::address;
use sui::hex;
use sui::object;
use sui::party;
use sui::transfer;
use sui::tx_context;
use sui::types;
use sui::vec_map;
Struct Publisher
This type can only be created in the transaction that generates a module, by consuming its one-time witness, so it can be used to identify the address that published the package a type originated from.
public struct Publisher has key, store
Fields
- id: sui::object::UID
- package: std::ascii::String
- module_name: std::ascii::String
Struct UpgradeCap
Capability controlling the ability to upgrade a package.
public struct UpgradeCap has key, store
Fields
- id: sui::object::UID
- package: sui::object::ID
- (Mutable) ID of the package that can be upgraded.
- version: u64
- (Mutable) The number of upgrades that have been applied successively to the original package. Initially 0.
- policy: u8
- What kind of upgrades are allowed.
Struct UpgradeTicket
Permission to perform a particular upgrade (for a fixed version of the package, bytecode to upgrade with and transitive dependencies to depend against).
An UpgradeCap can only issue one ticket at a time, to prevent races between concurrent updates or a change in its upgrade policy after issuing a ticket, so the ticket is a "Hot Potato" to preserve forward progress.
public struct UpgradeTicket
Fields
- cap: sui::object::ID
- (Immutable) ID of the UpgradeCap this originated from.
- package: sui::object::ID
- (Immutable) ID of the package that can be upgraded.
- policy: u8
- (Immutable) The policy regarding what kind of upgrade this ticket permits.
- digest: vector<u8>
- (Immutable) SHA256 digest of the bytecode and transitive dependencies that will be used in the upgrade.
Struct UpgradeReceipt
Issued as a result of a successful upgrade, containing the
information to be used to update the UpgradeCap. This is a "Hot.
Potato" to ensure that it is used to update its UpgradeCap before
the end of the transaction that performed the upgrade.
public struct UpgradeReceipt
Fields
- cap: sui::object::ID
- (Immutable) ID of the UpgradeCap this originated from.
- package: sui::object::ID
- (Immutable) ID of the package after it was upgraded.
Constants
Tried to create a Publisher using a type that isn't a one-time witness.
const ENotOneTimeWitness: u64 = 0;
Tried to set a less restrictive policy than currently in place.
const ETooPermissive: u64 = 1;
This UpgradeCap has already authorized a pending upgrade.
const EAlreadyAuthorized: u64 = 2;
This UpgradeCap has not authorized an upgrade.
const ENotAuthorized: u64 = 3;
Trying to commit an upgrade to the wrong UpgradeCap.
const EWrongUpgradeCap: u64 = 4;
Update any part of the package (function implementations, add new functions or types, change dependencies)
const COMPATIBLE: u8 = 0;
Add new functions or types, or change dependencies, existing functions can't change.
const ADDITIVE: u8 = 128;
Only be able to change dependencies.
const DEP_ONLY: u8 = 192;
Function claim
Claim a Publisher object.
Requires a One-Time-Witness to prove ownership. Due to this
constraint there can be only one Publisher object per module
but multiple per package (!).
public fun claim<OTW: drop>(otw: OTW, ctx: &mut sui::tx_context::TxContext): sui::package::Publisher
Function claim_and_keep
Claim a Publisher object and send it to transaction sender.
Since this function can only be called in the module initializer,
the sender is the publisher.
public fun claim_and_keep<OTW: drop>(otw: OTW, ctx: &mut sui::tx_context::TxContext)
Function burn_publisher
Destroy a Publisher object effectively removing all privileges associated with it.
public fun burn_publisher(self: sui::package::Publisher)
Function from_package
Check whether type belongs to the same package as the publisher object.
public fun from_package<T>(self: &sui::package::Publisher): bool
Function from_module
Check whether a type belongs to the same module as the publisher object.
public fun from_module<T>(self: &sui::package::Publisher): bool
Function published_module
Read the name of the module.
public fun published_module(self: &sui::package::Publisher): &std::ascii::String
Function published_package
Read the package address string.
public fun published_package(self: &sui::package::Publisher): &std::ascii::String
Function upgrade_package
The ID of the package that this cap authorizes upgrades for.
Can be 0x0 if the cap cannot currently authorize an upgrade
because there is already a pending upgrade in the transaction.
Otherwise guaranteed to be the latest version of any given
package.
public fun upgrade_package(cap: &sui::package::UpgradeCap): sui::object::ID
Function version
The most recent version of the package, increments by one for each successfully applied upgrade.
public fun version(cap: &sui::package::UpgradeCap): u64
Function upgrade_policy
The most permissive kind of upgrade currently supported by this cap.
public fun upgrade_policy(cap: &sui::package::UpgradeCap): u8
Function ticket_package
The package that this ticket is authorized to upgrade
public fun ticket_package(ticket: &sui::package::UpgradeTicket): sui::object::ID
Function ticket_policy
The kind of upgrade that this ticket authorizes.
public fun ticket_policy(ticket: &sui::package::UpgradeTicket): u8
Function receipt_cap
ID of the UpgradeCap that this receipt should be used to update.
public fun receipt_cap(receipt: &sui::package::UpgradeReceipt): sui::object::ID
Function receipt_package
ID of the package that was upgraded to: the latest version of the package, as of the upgrade represented by this receipt.
public fun receipt_package(receipt: &sui::package::UpgradeReceipt): sui::object::ID
Function ticket_digest
A hash of the package contents for the new version of the package. This ticket only authorizes an upgrade to a package that matches this digest. A package's contents are identified by two things:
- modules: [[u8]] a list of the package's module contents
- deps: [[u8; 32]] a list of 32 byte ObjectIDs of the package's transitive dependencies
A package's digest is calculated as:
sha3_256(sort(modules ++ deps))
public fun ticket_digest(ticket: &sui::package::UpgradeTicket): &vector<u8>
Function compatible_policy
Expose the constants representing various upgrade policies
public fun compatible_policy(): u8
Function additive_policy
public fun additive_policy(): u8
Function dep_only_policy
public fun dep_only_policy(): u8
Function only_additive_upgrades
Restrict upgrades through this upgrade cap to just add code, or change dependencies.
public entry fun only_additive_upgrades(cap: &mut sui::package::UpgradeCap)
Function only_dep_upgrades
Restrict upgrades through this upgrade cap to just change dependencies.
public entry fun only_dep_upgrades(cap: &mut sui::package::UpgradeCap)
Function make_immutable
Discard the UpgradeCap to make a package immutable.
public entry fun make_immutable(cap: sui::package::UpgradeCap)