Skip to content

Commit

Permalink
feat: add upgrade_extensions_to_latest command
Browse files Browse the repository at this point in the history
  • Loading branch information
thounyy committed Jan 22, 2025
1 parent a85eb18 commit 7827c05
Show file tree
Hide file tree
Showing 24 changed files with 161 additions and 130 deletions.
1 change: 1 addition & 0 deletions packages/actions/tests/intents/access_control_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ fun start(): (Scenario, Extensions, Account<Multisig, Approvals>, Clock) {
extensions.add(&cap, b"AccountActions".to_string(), @account_actions, 1);

let mut account = multisig::new_account(&extensions, scenario.ctx());
account.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let clock = clock::create_for_testing(scenario.ctx());
// create world
Expand Down
1 change: 1 addition & 0 deletions packages/actions/tests/intents/currency_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ fun start(): (Scenario, Extensions, Account<Multisig, Approvals>, Clock, Treasur
extensions.add(&cap, b"AccountActions".to_string(), @account_actions, 1);

let mut account = multisig::new_account(&extensions, scenario.ctx());
account.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let clock = clock::create_for_testing(scenario.ctx());
// create TreasuryCap and CoinMetadata
Expand Down
1 change: 1 addition & 0 deletions packages/actions/tests/intents/kiosk_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ fun start(): (Scenario, Extensions, Account<Multisig, Approvals>, Clock, Transfe
extensions.add(&cap, b"AccountActions".to_string(), @account_actions, 1);

let mut account = multisig::new_account(&extensions, scenario.ctx());
account.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let clock = clock::create_for_testing(scenario.ctx());
// instantiate TransferPolicy
Expand Down
1 change: 1 addition & 0 deletions packages/actions/tests/intents/owned_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ fun start(): (Scenario, Extensions, Account<Multisig, Approvals>, Clock) {
extensions.add(&cap, b"AccountActions".to_string(), @account_actions, 1);

let mut account = multisig::new_account(&extensions, scenario.ctx());
account.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let clock = clock::create_for_testing(scenario.ctx());
// create world
Expand Down
1 change: 1 addition & 0 deletions packages/actions/tests/intents/treasury_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ fun start(): (Scenario, Extensions, Account<Multisig, Approvals>, Clock) {
extensions.add(&cap, b"AccountActions".to_string(), @account_actions, 1);

let mut account = multisig::new_account(&extensions, scenario.ctx());
account.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let clock = clock::create_for_testing(scenario.ctx());
// create world
Expand Down
1 change: 1 addition & 0 deletions packages/actions/tests/intents/upgrade_policies_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ fun start(): (Scenario, Extensions, Account<Multisig, Approvals>, Clock, Upgrade
extensions.add(&cap, b"AccountActions".to_string(), @account_actions, 1);

let mut account = multisig::new_account(&extensions, scenario.ctx());
account.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let clock = clock::create_for_testing(scenario.ctx());
let upgrade_cap = package::test_publish(@0x1.to_id(), scenario.ctx());
Expand Down
3 changes: 3 additions & 0 deletions packages/actions/tests/lib/access_control_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ fun start(): (Scenario, Extensions, Account<Multisig, Approvals>, Clock) {
extensions.add(&cap, b"AccountActions".to_string(), @account_actions, 1);

let mut account = multisig::new_account(&extensions, scenario.ctx());
account.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let clock = clock::create_for_testing(scenario.ctx());
// create world
Expand Down Expand Up @@ -196,6 +197,7 @@ fun test_error_return_to_wrong_account() {
let (borrow, cap) = access_control::do_access<Multisig, Approvals, Cap, DummyIntent>(&mut executable, &mut account, version::current(), DummyIntent());
// create other account
let mut account2 = multisig::new_account(&extensions, scenario.ctx());
account2.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account2.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
access_control::return_cap(&mut account2, borrow, cap, version::current());
account.confirm_execution(executable, version::current(), DummyIntent());
Expand All @@ -222,6 +224,7 @@ fun test_error_do_access_from_wrong_account() {
let mut executable = multisig::execute_intent(&mut account, key, &clock);
// create other account and lock same type of cap
let mut account2 = multisig::new_account(&extensions, scenario.ctx());
account2.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account2.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let auth = multisig::authenticate(&account2, scenario.ctx());
access_control::lock_cap(auth, &mut account2, cap(&mut scenario));
Expand Down
5 changes: 5 additions & 0 deletions packages/actions/tests/lib/currency_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ fun start(): (Scenario, Extensions, Account<Multisig, Approvals>, Clock, Treasur
extensions.add(&cap, b"AccountActions".to_string(), @account_actions, 1);

let mut account = multisig::new_account(&extensions, scenario.ctx());
account.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let clock = clock::create_for_testing(scenario.ctx());
// create TreasuryCap and CoinMetadata
Expand Down Expand Up @@ -737,6 +738,7 @@ fun test_error_update_icon_disabled() {
fun test_error_do_disable_from_wrong_account() {
let (mut scenario, extensions, mut account, clock, cap, metadata) = start();
let mut account2 = multisig::new_account(&extensions, scenario.ctx());
account2.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account2.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let key = b"dummy".to_string();

Expand Down Expand Up @@ -851,6 +853,7 @@ fun test_error_do_disable_from_not_dep() {
fun test_error_do_mint_from_wrong_account() {
let (mut scenario, extensions, mut account, clock, cap, metadata) = start();
let mut account2 = multisig::new_account(&extensions, scenario.ctx());
account2.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account2.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let key = b"dummy".to_string();

Expand Down Expand Up @@ -957,6 +960,7 @@ fun test_error_do_burn_from_wrong_account() {
let (mut scenario, extensions, mut account, clock, mut cap, metadata) = start();
let coin = cap.mint(5, scenario.ctx());
let mut account2 = multisig::new_account(&extensions, scenario.ctx());
account2.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account2.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let key = b"dummy".to_string();

Expand Down Expand Up @@ -1061,6 +1065,7 @@ fun test_error_do_burn_from_not_dep() {
fun test_error_do_update_from_wrong_account() {
let (mut scenario, extensions, mut account, clock, cap, mut metadata) = start();
let mut account2 = multisig::new_account(&extensions, scenario.ctx());
account2.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account2.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let key = b"dummy".to_string();

Expand Down
3 changes: 3 additions & 0 deletions packages/actions/tests/lib/kiosk_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ fun start(): (Scenario, Extensions, Account<Multisig, Approvals>, Clock, Transfe
extensions.add(&cap, b"AccountActions".to_string(), @account_actions, 1);

let mut account = multisig::new_account(&extensions, scenario.ctx());
account.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let clock = clock::create_for_testing(scenario.ctx());
// instantiate TransferPolicy
Expand Down Expand Up @@ -549,6 +550,7 @@ fun test_error_do_take_wrong_receiver() {
fun test_error_do_take_from_wrong_account() {
let (mut scenario, extensions, mut account, clock, mut policy) = start();
let mut account2 = multisig::new_account(&extensions, scenario.ctx());
account2.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account2.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);

let (mut acc_kiosk, mut ids) = init_account_kiosk_with_nfts(&mut account, &mut policy, 1, &mut scenario);
Expand Down Expand Up @@ -652,6 +654,7 @@ fun test_error_do_take_from_not_dep() {
fun test_error_do_list_from_wrong_account() {
let (mut scenario, extensions, mut account, clock, mut policy) = start();
let mut account2 = multisig::new_account(&extensions, scenario.ctx());
account2.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account2.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);

let (mut acc_kiosk, mut ids) = init_account_kiosk_with_nfts(&mut account, &mut policy, 1, &mut scenario);
Expand Down
2 changes: 2 additions & 0 deletions packages/actions/tests/lib/transfer_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ fun start(): (Scenario, Extensions, Account<Multisig, Approvals>, Clock) {
extensions.add(&cap, b"AccountActions".to_string(), @account_actions, 1);

let mut account = multisig::new_account(&extensions, scenario.ctx());
account.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let clock = clock::create_for_testing(scenario.ctx());
// create world
Expand Down Expand Up @@ -121,6 +122,7 @@ fun test_transfer_flow() {
fun test_error_do_transfer_from_wrong_account() {
let (mut scenario, extensions, mut account, clock) = start();
let mut account2 = multisig::new_account(&extensions, scenario.ctx());
account2.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account2.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let key = b"dummy".to_string();

Expand Down
2 changes: 2 additions & 0 deletions packages/actions/tests/lib/treasury_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ fun start(): (Scenario, Extensions, Account<Multisig, Approvals>, Clock) {
extensions.add(&cap, b"AccountActions".to_string(), @account_actions, 1);

let mut account = multisig::new_account(&extensions, scenario.ctx());
account.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let clock = clock::create_for_testing(scenario.ctx());
// create world
Expand Down Expand Up @@ -336,6 +337,7 @@ fun test_error_do_update_from_wrong_account() {
let key = b"dummy".to_string();

let mut account2 = multisig::new_account(&extensions, scenario.ctx());
account2.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account2.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
// intent is submitted to other account
let mut intent = create_dummy_intent(&mut scenario, &mut account2);
Expand Down
4 changes: 4 additions & 0 deletions packages/actions/tests/lib/upgrade_policies_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ fun start(): (Scenario, Extensions, Account<Multisig, Approvals>, Clock, Upgrade
extensions.add(&cap, b"AccountActions".to_string(), @account_actions, 1);

let mut account = multisig::new_account(&extensions, scenario.ctx());
account.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let clock = clock::create_for_testing(scenario.ctx());
let upgrade_cap = package::test_publish(@0x1.to_id(), scenario.ctx());
Expand Down Expand Up @@ -306,6 +307,7 @@ fun test_error_new_restrict_invalid_policy() {
fun test_error_do_upgrade_from_wrong_account() {
let (mut scenario, extensions, mut account, clock, upgrade_cap) = start();
let mut account2 = multisig::new_account(&extensions, scenario.ctx());
account2.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account2.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let key = b"dummy".to_string();

Expand Down Expand Up @@ -393,6 +395,7 @@ fun test_error_do_upgrade_from_not_dep() {
fun test_error_confirm_upgrade_from_wrong_account() {
let (mut scenario, extensions, mut account, clock, upgrade_cap) = start();
let mut account2 = multisig::new_account(&extensions, scenario.ctx());
account2.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account2.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let key = b"dummy".to_string();

Expand Down Expand Up @@ -506,6 +509,7 @@ fun test_error_confirm_upgrade_from_not_dep() {
fun test_error_do_restrict_from_wrong_account() {
let (mut scenario, extensions, mut account, clock, upgrade_cap) = start();
let mut account2 = multisig::new_account(&extensions, scenario.ctx());
account2.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account2.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let key = b"dummy".to_string();

Expand Down
2 changes: 2 additions & 0 deletions packages/actions/tests/lib/vesting_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ fun start(): (Scenario, Extensions, Account<Multisig, Approvals>, Clock) {
extensions.add(&cap, b"AccountActions".to_string(), @account_actions, 1);

let mut account = multisig::new_account(&extensions, scenario.ctx());
account.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let clock = clock::create_for_testing(scenario.ctx());
// create world
Expand Down Expand Up @@ -399,6 +400,7 @@ fun test_error_destroy_non_empty_stream() {
fun test_error_do_vesting_from_wrong_account() {
let (mut scenario, extensions, mut account, clock) = start();
let mut account2 = multisig::new_account(&extensions, scenario.ctx());
account2.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account2.deps_mut_for_testing().add(&extensions, b"AccountActions".to_string(), @account_actions, 1);
let key = b"dummy".to_string();

Expand Down
1 change: 1 addition & 0 deletions packages/config/tests/multisig_tests.move
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ fun start(): (Scenario, Extensions, Account<Multisig, Approvals>, Clock) {
extensions.add(&cap, b"AccountConfig".to_string(), @account_config, 1);
// Account generic types are dummy types (bool, bool)
let mut account = multisig::new_account(&extensions, scenario.ctx());
account.deps_mut_for_testing().add(&extensions, b"AccountConfig".to_string(), @account_config, 1);
account.config_mut(version::current(), multisig::config_witness()).add_role_to_multisig(full_role(), 1);
account.config_mut(version::current(), multisig::config_witness()).member_mut(OWNER).add_role_to_member(full_role());
let clock = clock::create_for_testing(scenario.ctx());
Expand Down
73 changes: 37 additions & 36 deletions packages/extensions/sources/extensions.move
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const EExtensionNotFound: vector<u8> = b"Extension not found";
#[error]
const EExtensionAlreadyExists: vector<u8> = b"Extension already exists";
#[error]
const ECannotRemoveCoreDep: vector<u8> = b"Cannot remove core dependency";
const ECannotRemoveAccountProtocol: vector<u8> = b"Cannot remove AccountProtocol";

// === Structs ===

Expand Down Expand Up @@ -45,40 +45,39 @@ fun init(ctx: &mut TxContext) {

// === View functions ===

/// Returns the latest package addresses and versions for core dependencies
public fun get_latest_core_deps(
extensions: &Extensions
): (vector<address>, vector<u64>) {
let mut addresses = vector[];
let mut versions = vector[];
public fun length(extensions: &Extensions): u64 {
extensions.inner.length()
}

public fun get_by_idx(extensions: &Extensions, idx: u64): &Extension {
&extensions.inner[idx]
}

public fun name(extension: &Extension): String {
extension.name
}

let account_history = extensions.inner[0].history;
let account_last_idx = account_history.length() - 1;
addresses.push_back(account_history[account_last_idx].addr);
versions.push_back(account_history[account_last_idx].version);
public fun history(extension: &Extension): vector<History> {
extension.history
}

let config_history = extensions.inner[1].history;
let config_last_idx = config_history.length() - 1;
addresses.push_back(config_history[config_last_idx].addr);
versions.push_back(config_history[config_last_idx].version);
public fun addr(history: &History): address {
history.addr
}

// packages[0] & versions[0] are AccountProtocol
// packages[1] & versions[1] are AccountConfig
(addresses, versions)
public fun version(history: &History): u64 {
history.version
}

/// Returns the package addresses for core dependencies
public fun get_core_deps_addresses(
extensions: &Extensions
): (vector<address>) {
let account_packages = extensions.inner[0].history.map!(|entry| entry.addr);
let config_packages = extensions.inner[1].history.map!(|entry| entry.addr);
public fun get_latest_for_name(
extensions: &Extensions,
name: String,
): (address, u64) {
let idx = get_idx_for_name(extensions, name);
let history = extensions.inner[idx].history;
let last_idx = history.length() - 1;

let mut addresses = vector[];
addresses.append(account_packages);
addresses.append(config_packages);

addresses
(history[last_idx].addr, history[last_idx].version)
}

public fun is_extension(
Expand All @@ -95,12 +94,6 @@ public fun is_extension(
extensions.inner[idx].history.any!(|extension| extension.version == version)
}

public fun get_idx_for_name(extensions: &Extensions, name: String): u64 {
let opt = extensions.inner.find_index!(|extension| extension.name == name);
assert!(opt.is_some(), EExtensionNotFound);
opt.destroy_some()
}

// === Admin functions ===

public fun add(extensions: &mut Extensions, _: &AdminCap, name: String, addr: address, version: u64) {
Expand All @@ -112,7 +105,7 @@ public fun add(extensions: &mut Extensions, _: &AdminCap, name: String, addr: ad

public fun remove(extensions: &mut Extensions, _: &AdminCap, name: String) {
let idx = extensions.get_idx_for_name(name);
assert!(idx > 1, ECannotRemoveCoreDep);
assert!(idx > 0, ECannotRemoveAccountProtocol);
extensions.inner.remove(idx);
}

Expand All @@ -121,6 +114,14 @@ public fun update(extensions: &mut Extensions, _: &AdminCap, name: String, addr:
extensions.inner[idx].history.push_back(History { addr, version });
}

// === Private functions ===

fun get_idx_for_name(extensions: &Extensions, name: String): u64 {
let opt = extensions.inner.find_index!(|extension| extension.name == name);
assert!(opt.is_some(), EExtensionNotFound);
opt.destroy_some()
}

// === Test functions ===

#[test_only]
Expand Down
Loading

0 comments on commit 7827c05

Please sign in to comment.