axelar-cgp-sui

Module 0xa3::governance

use 0x1::ascii;
use 0x1::type_name;
use 0x2::address;
use 0x2::hex;
use 0x2::object;
use 0x2::package;
use 0x2::table;
use 0x2::transfer;
use 0x2::tx_context;
use 0xa0::abi;
use 0xa1::channel;

Resource Governance

struct Governance has store, key
Fields
id: object::UID
trusted_source_chain: ascii::String
trusted_source_address: ascii::String
message_type: u256
channel: channel::Channel
caps: table::Table<object::ID, package::UpgradeCap>

Constants

const EInvalidMessageType: vector<u8> = [105, 110, 118, 97, 108, 105, 100, 32, 109, 101, 115, 115, 97, 103, 101, 32, 116, 121, 112, 101, 32, 102, 111, 114, 32, 117, 112, 103, 114, 97, 100, 101, 32, 97, 117, 116, 104, 111, 114, 105, 122, 97, 116, 105, 111, 110];

const ENotNewPackage: vector<u8> = [78, 111, 116, 32, 110, 101, 119, 32, 112, 97, 99, 107, 97, 103, 101, 46];

const ENotSelfUpgradeCap: vector<u8> = [103, 111, 118, 101, 114, 110, 97, 110, 99, 101, 32, 105, 110, 105, 116, 105, 97, 108, 105, 122, 97, 116, 105, 111, 110, 32, 114, 101, 113, 117, 105, 114, 101, 115, 32, 105, 116, 115, 32, 111, 119, 110, 32, 117, 112, 103, 114, 97, 100, 101, 32, 99, 97, 112, 97, 98, 105, 108, 105, 116, 121, 46, 32, 84, 104, 101, 32, 112, 114, 111, 118, 105, 100, 101, 100, 32, 99, 97, 112, 97, 98, 105, 108, 105, 116, 121, 32, 98, 101, 108, 111, 110, 103, 115, 32, 116, 111, 32, 97, 32, 100, 105, 102, 102, 101, 114, 101, 110, 116, 32, 112, 97, 99, 107, 97, 103, 101];

const EUntrustedAddress: vector<u8> = [117, 112, 103, 114, 97, 100, 101, 32, 97, 117, 116, 104, 111, 114, 105, 122, 97, 116, 105, 111, 110, 32, 97, 116, 116, 101, 109, 112, 116, 32, 102, 114, 111, 109, 32, 97, 110, 32, 117, 110, 116, 114, 117, 115, 116, 101, 100, 32, 97, 100, 100, 114, 101, 115, 115];

Function new

entry fun new(trusted_source_chain: ascii::String, trusted_source_address: ascii::String, message_type: u256, upgrade_cap: package::UpgradeCap, ctx: &mut tx_context::TxContext)
Implementation
entry fun new(
    trusted_source_chain: String,
    trusted_source_address: String,
    message_type: u256,
    upgrade_cap: UpgradeCap,
    ctx: &mut TxContext,
) {
    let package_id = object::id_from_bytes(
        hex::decode(type_name::get<Governance>().get_address().into_bytes()),
    );
    assert!(upgrade_cap.upgrade_package() == package_id, ENotSelfUpgradeCap);
    is_cap_new(&upgrade_cap);
    package::make_immutable(upgrade_cap);

    transfer::share_object(Governance {
        id: object::new(ctx),
        trusted_source_chain,
        trusted_source_address,
        message_type,
        channel: channel::new(ctx),
        caps: table::new<ID, UpgradeCap>(ctx),
    })
}

Function is_governance

public fun is_governance(self: &governance::Governance, chain_name: ascii::String, addr: ascii::String): bool
Implementation
public fun is_governance(
    self: &Governance,
    chain_name: String,
    addr: String,
): bool {
    &chain_name ==
    &self.trusted_source_chain &&
    &addr == &self.trusted_source_address
}

Function take_upgrade_cap

entry fun take_upgrade_cap(self: &mut governance::Governance, upgrade_cap: package::UpgradeCap)
Implementation
entry fun take_upgrade_cap(self: &mut Governance, upgrade_cap: UpgradeCap) {
    is_cap_new(&upgrade_cap);

    self
        .caps
        .add(
            object::id(&upgrade_cap),
            upgrade_cap,
        )
}

Function authorize_upgrade

public fun authorize_upgrade(self: &mut governance::Governance, approved_message: channel::ApprovedMessage): package::UpgradeTicket
Implementation
public fun authorize_upgrade(
    self: &mut Governance,
    approved_message: ApprovedMessage,
): UpgradeTicket {
    let (source_chain, _, source_address, payload) = self
        .channel
        .consume_approved_message(approved_message);

    assert!(
        is_governance(self, source_chain, source_address),
        EUntrustedAddress,
    );

    let mut abi = abi::new_reader(payload);
    let message_type = abi.read_u256();
    assert!(message_type == self.message_type, EInvalidMessageType);

    let cap_id = object::id_from_address(address::from_u256(abi.read_u256()));
    let policy = abi.read_u8();
    let digest = abi.read_bytes();

    package::authorize_upgrade(
        table::borrow_mut(&mut self.caps, cap_id),
        policy,
        digest,
    )
}

Function commit_upgrade

public fun commit_upgrade(self: &mut governance::Governance, receipt: package::UpgradeReceipt)
Implementation
public fun commit_upgrade(self: &mut Governance, receipt: UpgradeReceipt) {
    package::commit_upgrade(
        table::borrow_mut(
            &mut self.caps,
            package::receipt_cap(&receipt),
        ),
        receipt,
    )
}

Function is_cap_new

fun is_cap_new(cap: &package::UpgradeCap)
Implementation
fun is_cap_new(cap: &UpgradeCap) {
    assert!(package::version(cap) == 1, ENotNewPackage);
}