diff --git a/.vscode/settings.json b/.vscode/settings.json index c241707..c98b19c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,5 +7,8 @@ "[move]": { "editor.tabSize": 4 }, + "files.associations": { + "*.move": "rust" + }, "editor.insertSpaces": true } diff --git a/packages/stablecoin/Move.lock b/packages/stablecoin/Move.lock index a6743d4..d6f2cb6 100644 --- a/packages/stablecoin/Move.lock +++ b/packages/stablecoin/Move.lock @@ -1,49 +1,35 @@ # @generated by Move, please check-in and do not edit manually. [move] -version = 2 -manifest_digest = "2D16DF7BBB460E26A4151FFCA9834972024289FF6DFDD87F005D543C741A929E" +version = 3 +manifest_digest = "211DA955BFDF90F3CA2193ED2EDD945D3FABFA4631FABD1F214C406080C50CA4" deps_digest = "3C4103934B1E040BB6B23F1D610B4EF9F2F1166A50A104EADCF77467C004C600" dependencies = [ - { name = "Sui" }, - { name = "sui_extensions" }, + { id = "Sui", name = "Sui" }, + { id = "sui_extensions", name = "sui_extensions" }, ] [[move.package]] -name = "MoveStdlib" -source = { git = "https://github.com/MystenLabs/sui.git", rev = "a4185da5659d8d299d34e1bb2515ff1f7e32a20a", subdir = "crates/sui-framework/packages/move-stdlib" } +id = "MoveStdlib" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "mainnet-v1.62.1", subdir = "crates/sui-framework/packages/move-stdlib" } [[move.package]] -name = "Sui" -source = { git = "https://github.com/MystenLabs/sui.git", rev = "a4185da5659d8d299d34e1bb2515ff1f7e32a20a", subdir = "crates/sui-framework/packages/sui-framework" } +id = "Sui" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "mainnet-v1.62.1", subdir = "crates/sui-framework/packages/sui-framework" } dependencies = [ - { name = "MoveStdlib" }, + { id = "MoveStdlib", name = "MoveStdlib" }, ] [[move.package]] -name = "sui_extensions" +id = "sui_extensions" source = { local = "../sui_extensions" } dependencies = [ - { name = "Sui" }, + { id = "Sui", name = "Sui" }, ] [move.toolchain-version] -compiler-version = "1.32.2" -edition = "2024.beta" +compiler-version = "1.62.1" +edition = "2024" flavor = "sui" - -[env] - -[env.testnet] -chain-id = "4c78adac" -original-published-id = "0x346e3233f61eb0055713417bfaddda7dc3bf26816faad1f7606994a368b92917" -latest-published-id = "0x346e3233f61eb0055713417bfaddda7dc3bf26816faad1f7606994a368b92917" -published-version = "1" - -[env.mainnet] -chain-id = "35834a8a" -original-published-id = "0xecf47609d7da919ea98e7fd04f6e0648a0a79b337aaad373fa37aac8febf19c8" -latest-published-id = "0xecf47609d7da919ea98e7fd04f6e0648a0a79b337aaad373fa37aac8febf19c8" -published-version = "1" diff --git a/packages/stablecoin/Move.toml b/packages/stablecoin/Move.toml index c741cef..1e2ee30 100644 --- a/packages/stablecoin/Move.toml +++ b/packages/stablecoin/Move.toml @@ -16,13 +16,13 @@ [package] name = "stablecoin" -edition = "2024.beta" +edition = "2024" license = "Apache 2.0" [dependencies.Sui] git = "https://github.com/MystenLabs/sui.git" subdir = "crates/sui-framework/packages/sui-framework" -rev = "a4185da5659d8d299d34e1bb2515ff1f7e32a20a" +rev = "mainnet-v1.62.1" [dependencies.sui_extensions] local = "../sui_extensions" diff --git a/packages/stablecoin/sources/treasury.move b/packages/stablecoin/sources/treasury.move index 2552dd9..4ca5862 100644 --- a/packages/stablecoin/sources/treasury.move +++ b/packages/stablecoin/sources/treasury.move @@ -598,7 +598,7 @@ module stablecoin::treasury { /// additionally compatible with this package's version. entry fun start_migration(treasury: &mut Treasury, ctx: &TxContext) { treasury.roles.owner_role().assert_sender_is_active_role(ctx); - assert!(treasury.compatible_versions.size() == 1, EMigrationStarted); + assert!(treasury.compatible_versions.length() == 1, EMigrationStarted); let active_version = treasury.compatible_versions.keys()[0]; assert!(active_version < version_control::current_version(), EObjectMigrated); @@ -614,7 +614,7 @@ module stablecoin::treasury { /// to the previous version. entry fun abort_migration(treasury: &mut Treasury, ctx: &TxContext) { treasury.roles.owner_role().assert_sender_is_active_role(ctx); - assert!(treasury.compatible_versions.size() == 2, EMigrationNotStarted); + assert!(treasury.compatible_versions.length() == 2, EMigrationNotStarted); let pending_version = max( treasury.compatible_versions.keys()[0], @@ -633,7 +633,7 @@ module stablecoin::treasury { /// only compatible with this package's version. entry fun complete_migration(treasury: &mut Treasury, ctx: &TxContext) { treasury.roles.owner_role().assert_sender_is_active_role(ctx); - assert!(treasury.compatible_versions.size() == 2, EMigrationNotStarted); + assert!(treasury.compatible_versions.length() == 2, EMigrationNotStarted); let (version_a, version_b) = (treasury.compatible_versions.keys()[0], treasury.compatible_versions.keys()[1]); let (active_version, pending_version) = (min(version_a, version_b), max(version_a, version_b)); diff --git a/packages/stablecoin/tests/mint_allowance_tests.move b/packages/stablecoin/tests/mint_allowance_tests.move index c00792a..fdbde16 100644 --- a/packages/stablecoin/tests/mint_allowance_tests.move +++ b/packages/stablecoin/tests/mint_allowance_tests.move @@ -16,7 +16,7 @@ #[test_only] module stablecoin::mint_allowance_tests { - use sui::test_utils::{assert_eq}; + use std::unit_test; use stablecoin::mint_allowance; public struct MINT_ALLOWANCE_TESTS has drop {} @@ -24,19 +24,19 @@ module stablecoin::mint_allowance_tests { #[test] fun create_and_mutate_mint_allowance__should_succeed() { let mut allowance = mint_allowance::new(); - assert_eq(allowance.value(), 0); + unit_test::assert_eq!(allowance.value(), 0); allowance.set(1); - assert_eq(allowance.value(), 1); + unit_test::assert_eq!(allowance.value(), 1); allowance.decrease(1); - assert_eq(allowance.value(), 0); + unit_test::assert_eq!(allowance.value(), 0); allowance.set(5); - assert_eq(allowance.value(), 5); + unit_test::assert_eq!(allowance.value(), 5); allowance.increase(3); - assert_eq(allowance.value(), 8); + unit_test::assert_eq!(allowance.value(), 8); allowance.destroy(); } @@ -45,7 +45,7 @@ module stablecoin::mint_allowance_tests { fun increase__should_fail_on_integer_overflow() { let mut allowance = mint_allowance::new(); allowance.set(1); - assert_eq(allowance.value(), 1); + unit_test::assert_eq!(allowance.value(), 1); allowance.increase(18446744073709551615u64); allowance.destroy(); @@ -54,7 +54,7 @@ module stablecoin::mint_allowance_tests { #[test, expected_failure(abort_code = ::stablecoin::mint_allowance::EInsufficientAllowance)] fun decrease__should_fail_if_allowance_is_insufficient() { let mut allowance = mint_allowance::new(); - assert_eq(allowance.value(), 0); + unit_test::assert_eq!(allowance.value(), 0); allowance.decrease(1); allowance.destroy(); @@ -63,16 +63,16 @@ module stablecoin::mint_allowance_tests { #[test] fun increase_decrease__should_succeed_if_value_is_zero() { let mut allowance = mint_allowance::new(); - assert_eq(allowance.value(), 0); + unit_test::assert_eq!(allowance.value(), 0); allowance.set(100); - assert_eq(allowance.value(), 100); + unit_test::assert_eq!(allowance.value(), 100); allowance.decrease(0); - assert_eq(allowance.value(), 100); + unit_test::assert_eq!(allowance.value(), 100); allowance.increase(0); - assert_eq(allowance.value(), 100); + unit_test::assert_eq!(allowance.value(), 100); allowance.destroy(); } diff --git a/packages/stablecoin/tests/roles_tests.move b/packages/stablecoin/tests/roles_tests.move index 0405f1e..8a499ce 100644 --- a/packages/stablecoin/tests/roles_tests.move +++ b/packages/stablecoin/tests/roles_tests.move @@ -19,8 +19,6 @@ module stablecoin::roles_tests { use sui::{ event, test_scenario::{Self, Scenario}, - test_utils::assert_eq, - test_utils::destroy, }; use stablecoin::roles::{Self, Roles, OwnerRole}; use sui_extensions::{ @@ -64,7 +62,7 @@ module stablecoin::roles_tests { test_update_metadata_updater(METADATA_UPDATER, &mut roles, &mut scenario); scenario.end(); - destroy(roles); + std::unit_test::destroy(roles); } #[test, expected_failure(abort_code = two_step_role::ESenderNotActiveRole)] @@ -75,7 +73,7 @@ module stablecoin::roles_tests { test_update_master_minter(RANDOM_ADDRESS, &mut roles, &mut scenario); scenario.end(); - destroy(roles); + std::unit_test::destroy(roles); } #[test, expected_failure(abort_code = two_step_role::ESenderNotActiveRole)] @@ -86,7 +84,7 @@ module stablecoin::roles_tests { test_update_blocklister(RANDOM_ADDRESS, &mut roles, &mut scenario); scenario.end(); - destroy(roles); + std::unit_test::destroy(roles); } #[test, expected_failure(abort_code = two_step_role::ESenderNotActiveRole)] @@ -97,7 +95,7 @@ module stablecoin::roles_tests { test_update_pauser(RANDOM_ADDRESS, &mut roles, &mut scenario); scenario.end(); - destroy(roles); + std::unit_test::destroy(roles); } #[test, expected_failure(abort_code = two_step_role::ESenderNotActiveRole)] @@ -108,7 +106,7 @@ module stablecoin::roles_tests { test_update_metadata_updater(RANDOM_ADDRESS, &mut roles, &mut scenario); scenario.end(); - destroy(roles); + std::unit_test::destroy(roles); } // === Helpers === @@ -117,11 +115,11 @@ module stablecoin::roles_tests { fun setup(): (Scenario, Roles) { let mut scenario = test_scenario::begin(DEPLOYER); let roles = roles::new(OWNER, OWNER, OWNER, OWNER, OWNER, scenario.ctx()); - assert_eq(roles.owner(), OWNER); - assert_eq(roles.pending_owner().is_none(), true); - assert_eq(roles.master_minter(), OWNER); - assert_eq(roles.pauser(), OWNER); - assert_eq(roles.blocklister(), OWNER); + std::unit_test::assert_eq!(roles.owner(), OWNER); + std::unit_test::assert_eq!(roles.pending_owner().is_none(), true); + std::unit_test::assert_eq!(roles.master_minter(), OWNER); + std::unit_test::assert_eq!(roles.pauser(), OWNER); + std::unit_test::assert_eq!(roles.blocklister(), OWNER); (scenario, roles) } @@ -129,67 +127,67 @@ module stablecoin::roles_tests { public(package) fun test_transfer_ownership(new_owner: address, roles: &mut Roles, scenario: &mut Scenario) { let old_owner = roles.owner(); roles.owner_role_mut().begin_role_transfer(new_owner, scenario.ctx()); - assert_eq(roles.owner(), old_owner); - assert_eq(*roles.pending_owner().borrow(), new_owner); + std::unit_test::assert_eq!(roles.owner(), old_owner); + std::unit_test::assert_eq!(*roles.pending_owner().borrow(), new_owner); let expected_event = two_step_role::create_role_transfer_started_event>( old_owner, new_owner ); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + std::unit_test::assert_eq!(event::num_events(), 1); + std::unit_test::assert_eq!(last_event_by_type(), expected_event); } public(package) fun test_accept_ownership(roles: &mut Roles, scenario: &mut Scenario) { let old_owner = roles.owner(); let pending_owner = roles.pending_owner(); roles.owner_role_mut().accept_role(scenario.ctx()); - assert_eq(roles.owner(), *pending_owner.borrow()); - assert_eq(roles.pending_owner().is_none(), true); + std::unit_test::assert_eq!(roles.owner(), *pending_owner.borrow()); + std::unit_test::assert_eq!(roles.pending_owner().is_none(), true); let expected_event = two_step_role::create_role_transferred_event>( old_owner, *pending_owner.borrow() ); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + std::unit_test::assert_eq!(event::num_events(), 1); + std::unit_test::assert_eq!(last_event_by_type(), expected_event); } public(package) fun test_update_master_minter(new_master_minter: address, roles: &mut Roles, scenario: &mut Scenario) { let old_master_minter = roles.master_minter(); roles.update_master_minter(new_master_minter, scenario.ctx()); - assert_eq(roles.master_minter(), new_master_minter); + std::unit_test::assert_eq!(roles.master_minter(), new_master_minter); let expected_event = roles::create_master_minter_changed_event(old_master_minter, new_master_minter); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + std::unit_test::assert_eq!(event::num_events(), 1); + std::unit_test::assert_eq!(last_event_by_type(), expected_event); } public(package) fun test_update_blocklister(new_blocklister: address, roles: &mut Roles, scenario: &mut Scenario) { let old_blocklister = roles.blocklister(); roles.update_blocklister(new_blocklister, scenario.ctx()); - assert_eq(roles.blocklister(), new_blocklister); + std::unit_test::assert_eq!(roles.blocklister(), new_blocklister); let expected_event = roles::create_blocklister_changed_event(old_blocklister, new_blocklister); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + std::unit_test::assert_eq!(event::num_events(), 1); + std::unit_test::assert_eq!(last_event_by_type(), expected_event); } public(package) fun test_update_pauser(new_pauser: address, roles: &mut Roles, scenario: &mut Scenario) { let old_pauser = roles.pauser(); roles.update_pauser(new_pauser, scenario.ctx()); - assert_eq(roles.pauser(), new_pauser); + std::unit_test::assert_eq!(roles.pauser(), new_pauser); let expected_event = roles::create_pauser_changed_event(old_pauser, new_pauser); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + std::unit_test::assert_eq!(event::num_events(), 1); + std::unit_test::assert_eq!(last_event_by_type(), expected_event); } public(package) fun test_update_metadata_updater(new_metadata_updater: address, roles: &mut Roles, scenario: &mut Scenario) { let old_metadata_updater = roles.metadata_updater(); roles.update_metadata_updater(new_metadata_updater, scenario.ctx()); - assert_eq(roles.metadata_updater(), new_metadata_updater); + std::unit_test::assert_eq!(roles.metadata_updater(), new_metadata_updater); let expected_event = roles::create_metadata_updater_changed_event(old_metadata_updater, new_metadata_updater); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + std::unit_test::assert_eq!(event::num_events(), 1); + std::unit_test::assert_eq!(last_event_by_type(), expected_event); } } diff --git a/packages/stablecoin/tests/stablecoin_tests.move b/packages/stablecoin/tests/stablecoin_tests.move index 28f7fc1..8d1eb63 100644 --- a/packages/stablecoin/tests/stablecoin_tests.move +++ b/packages/stablecoin/tests/stablecoin_tests.move @@ -16,9 +16,9 @@ #[test_only] module stablecoin::stablecoin_tests { + use std::unit_test; use sui::{ test_scenario, - test_utils::{assert_eq} }; use stablecoin::stablecoin::{Self, STABLECOIN}; use sui_extensions::upgrade_service::UpgradeService; @@ -32,7 +32,7 @@ module stablecoin::stablecoin_tests { scenario.next_tx(DEPLOYER); let upgrade_service = scenario.take_shared>(); - assert_eq(upgrade_service.admin(), DEPLOYER); + unit_test::assert_eq!(upgrade_service.admin(), DEPLOYER); test_scenario::return_shared(upgrade_service); scenario.end(); diff --git a/packages/stablecoin/tests/treasury_migration_tests.move b/packages/stablecoin/tests/treasury_migration_tests.move index bd7901b..55aa947 100644 --- a/packages/stablecoin/tests/treasury_migration_tests.move +++ b/packages/stablecoin/tests/treasury_migration_tests.move @@ -18,12 +18,14 @@ /// as intended when given an outdated Treasury object. #[test_only] module stablecoin::treasury_migration_tests { + use std::unit_test; + use std::string; use sui::{ - coin, + coin_registry, event, vec_set, test_scenario::{Self, Scenario}, - test_utils::{assert_eq, destroy, create_one_time_witness}, + test_utils::create_one_time_witness, }; use stablecoin::{ treasury::{Self, Treasury}, @@ -205,17 +207,18 @@ module stablecoin::treasury_migration_tests { fun setup(): Scenario { let mut scenario = test_scenario::begin(DEPLOYER); - let (treasury_cap, deny_cap, metadata) = coin::create_regulated_currency_v2( + let (mut currency_init, treasury_cap) = coin_registry::new_currency_with_otw( create_one_time_witness(), 6, - b"SYMBOL", - b"NAME", - b"", - option::none(), - true, + string::utf8(b"SYMBOL"), + string::utf8(b"NAME"), + string::utf8(b""), + string::utf8(b""), scenario.ctx() ); - destroy(metadata); + let deny_cap = currency_init.make_regulated(true, scenario.ctx()); + let metadata_cap = currency_init.finalize(scenario.ctx()); + std::unit_test::destroy(metadata_cap); let mut treasury = treasury::new( treasury_cap, @@ -231,7 +234,7 @@ module stablecoin::treasury_migration_tests { let previous_version = version_control::current_version() - 1; treasury.set_compatible_versions_for_testing(vec_set::singleton(previous_version)); - assert_eq(treasury.compatible_versions(), vector[previous_version]); + unit_test::assert_eq!(treasury.compatible_versions(), vector[previous_version]); transfer::public_share_object(treasury); @@ -244,11 +247,11 @@ module stablecoin::treasury_migration_tests { treasury.start_migration(scenario.ctx()); let updated_compatible_versions = treasury.compatible_versions(); - assert_eq(updated_compatible_versions.length(), 2); - assert_eq(updated_compatible_versions.contains(&version_control::current_version()), true); + unit_test::assert_eq!(updated_compatible_versions.length(), 2); + unit_test::assert_eq!(updated_compatible_versions.contains(&version_control::current_version()), true); - assert_eq(event::num_events(), 1); - assert_eq( + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!( last_event_by_type(), treasury::create_migration_started_event(updated_compatible_versions) ); @@ -262,11 +265,11 @@ module stablecoin::treasury_migration_tests { treasury.abort_migration(scenario.ctx()); let updated_compatible_versions = treasury.compatible_versions(); - assert_eq(updated_compatible_versions.length(), 1); - assert_eq(updated_compatible_versions.contains(&version_control::current_version()), false); + unit_test::assert_eq!(updated_compatible_versions.length(), 1); + unit_test::assert_eq!(updated_compatible_versions.contains(&version_control::current_version()), false); - assert_eq(event::num_events(), 1); - assert_eq( + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!( last_event_by_type(), treasury::create_migration_aborted_event(updated_compatible_versions) ); @@ -280,10 +283,10 @@ module stablecoin::treasury_migration_tests { treasury.complete_migration(scenario.ctx()); let updated_compatible_versions = treasury.compatible_versions(); - assert_eq(updated_compatible_versions, vector[version_control::current_version()]); + unit_test::assert_eq!(updated_compatible_versions, vector[version_control::current_version()]); - assert_eq(event::num_events(), 1); - assert_eq( + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!( last_event_by_type(), treasury::create_migration_completed_event(updated_compatible_versions) ); @@ -294,14 +297,14 @@ module stablecoin::treasury_migration_tests { fun start_migration_to_custom_version_for_testing(scenario: &Scenario, version: u64) { let mut treasury = scenario.take_shared>(); - assert_eq(treasury.compatible_versions().length(), 1); + unit_test::assert_eq!(treasury.compatible_versions().length(), 1); let mut compatible_versions = vec_set::from_keys(treasury.compatible_versions()); compatible_versions.insert(version); treasury.set_compatible_versions_for_testing(compatible_versions); - assert_eq(treasury.compatible_versions().length(), 2); - assert_eq(treasury.compatible_versions().contains(&version), true); + unit_test::assert_eq!(treasury.compatible_versions().length(), 2); + unit_test::assert_eq!(treasury.compatible_versions().contains(&version), true); test_scenario::return_shared(treasury); } diff --git a/packages/stablecoin/tests/treasury_tests.move b/packages/stablecoin/tests/treasury_tests.move index 62a1e3d..5c8b16f 100644 --- a/packages/stablecoin/tests/treasury_tests.move +++ b/packages/stablecoin/tests/treasury_tests.move @@ -16,15 +16,14 @@ #[test_only] module stablecoin::treasury_tests { - use std::string; - use std::ascii; + use std::{unit_test, string, ascii}; use sui::{ coin::{Self, Coin, CoinMetadata}, deny_list::{Self, DenyList}, event, + url, vec_set, test_scenario::{Self, Scenario}, - test_utils::{Self, assert_eq, destroy}, }; use stablecoin::{ entry, @@ -73,7 +72,7 @@ module stablecoin::treasury_tests { scenario.next_tx(MINT_RECIPIENT); { let coin = scenario.take_from_sender>(); - assert_eq(coin.value(), 1000000); + unit_test::assert_eq!(coin.value(), 1000000); transfer::public_transfer(coin, MINTER); }; @@ -92,6 +91,67 @@ module stablecoin::treasury_tests { scenario.end(); } + #[test] + fun update_metadata__should_succeed_and_pass_all_assertions() { + let mut scenario = setup(); + + scenario.next_tx(METADATA_UPDATER); + test_update_metadata( + string::utf8(b"new name"), + ascii::string(b"new symbol"), + string::utf8(b"new description"), + ascii::string(b"new url"), + &mut scenario + ); + + // try to unset the URL + scenario.next_tx(METADATA_UPDATER); + test_update_metadata( + string::utf8(b"new name"), + ascii::string(b"new symbol"), + string::utf8(b"new description"), + ascii::string(b""), + &mut scenario + ); + + scenario.end(); + } + + #[test, expected_failure(abort_code = ::stablecoin::treasury::ENotMetadataUpdater)] + fun update_metadata__should_fail_if_not_metadata_updater() { + let mut scenario = setup(); + + scenario.next_tx(RANDOM_ADDRESS); + test_update_metadata( + string::utf8(b"new name"), + ascii::string(b"new symbol"), + string::utf8(b"new description"), + ascii::string(b"new url"), + &mut scenario + ); + + scenario.end(); + } + + #[test, expected_failure(abort_code = ::stablecoin::treasury::ETreasuryCapNotFound)] + fun update_metadata__should_fail_if_treasury_cap_not_found() { + let mut scenario = setup(); + + scenario.next_tx(RANDOM_ADDRESS); + remove_treasury_cap(&scenario); + + scenario.next_tx(METADATA_UPDATER); + test_update_metadata( + string::utf8(b"new name"), + ascii::string(b"new symbol"), + string::utf8(b"new description"), + ascii::string(b"new url"), + &mut scenario + ); + + scenario.end(); + } + #[test] fun configure_controller__should_succeed_with_existing_mint_cap() { let mut scenario = setup(); @@ -108,11 +168,11 @@ module stablecoin::treasury_tests { let mint_cap = scenario.take_from_sender>(); treasury.configure_controller(RANDOM_ADDRESS, object::id(&mint_cap), scenario.ctx()); - assert_eq(treasury.get_controllers_for_testing().contains(RANDOM_ADDRESS), true); - assert_eq(treasury.get_controllers_for_testing().contains(CONTROLLER), true); + unit_test::assert_eq!(treasury.get_controllers_for_testing().contains(RANDOM_ADDRESS), true); + unit_test::assert_eq!(treasury.get_controllers_for_testing().contains(CONTROLLER), true); let mint_cap_id = *treasury.get_mint_cap_id(RANDOM_ADDRESS).borrow(); - assert_eq(*treasury.get_mint_cap_id(CONTROLLER).borrow(), mint_cap_id); - assert_eq(treasury.mint_allowance(mint_cap_id), 10); + unit_test::assert_eq!(*treasury.get_mint_cap_id(CONTROLLER).borrow(), mint_cap_id); + unit_test::assert_eq!(treasury.mint_allowance(mint_cap_id), 10); scenario.return_to_sender(mint_cap); test_scenario::return_shared(treasury); @@ -728,67 +788,6 @@ module stablecoin::treasury_tests { scenario.end(); } - #[test] - fun update_metadata__should_succeed_and_pass_all_assertions() { - let mut scenario = setup(); - - scenario.next_tx(METADATA_UPDATER); - test_update_metadata( - string::utf8(b"new name"), - ascii::string(b"new symbol"), - string::utf8(b"new description"), - ascii::string(b"new url"), - &mut scenario - ); - - // try to unset the URL - scenario.next_tx(METADATA_UPDATER); - test_update_metadata( - string::utf8(b"new name"), - ascii::string(b"new symbol"), - string::utf8(b"new description"), - ascii::string(b""), - &mut scenario - ); - - scenario.end(); - } - - #[test, expected_failure(abort_code = ::stablecoin::treasury::ENotMetadataUpdater)] - fun update_metadata__should_fail_if_not_metadata_updater() { - let mut scenario = setup(); - - scenario.next_tx(RANDOM_ADDRESS); - test_update_metadata( - string::utf8(b"new name"), - ascii::string(b"new symbol"), - string::utf8(b"new description"), - ascii::string(b"new url"), - &mut scenario - ); - - scenario.end(); - } - - #[test, expected_failure(abort_code = ::stablecoin::treasury::ETreasuryCapNotFound)] - fun update_metadata__should_fail_if_not_treasury_cap_not_found() { - let mut scenario = setup(); - - scenario.next_tx(RANDOM_ADDRESS); - remove_treasury_cap(&scenario); - - scenario.next_tx(METADATA_UPDATER); - test_update_metadata( - string::utf8(b"new name"), - ascii::string(b"new symbol"), - string::utf8(b"new description"), - ascii::string(b"new url"), - &mut scenario - ); - - scenario.end(); - } - #[test, expected_failure(abort_code = ::stablecoin::treasury::ENotPauser)] fun pause__should_fail_when_caller_is_not_pauser() { let mut scenario = setup(); @@ -927,8 +926,8 @@ module stablecoin::treasury_tests { let mint_cap = scenario.take_from_address>(MINTER); let random_object_id = object::new(scenario.ctx()); - assert_eq(treasury.is_authorized_mint_cap(object::id(&mint_cap)), true); - assert_eq(treasury.is_authorized_mint_cap(random_object_id.uid_to_inner()), false); + unit_test::assert_eq!(treasury.is_authorized_mint_cap(object::id(&mint_cap)), true); + unit_test::assert_eq!(treasury.is_authorized_mint_cap(random_object_id.uid_to_inner()), false); object::delete(random_object_id); test_scenario::return_to_address(MINTER, mint_cap); @@ -962,7 +961,7 @@ module stablecoin::treasury_tests { scenario.next_tx(RANDOM_ADDRESS); { let treasury = scenario.take_shared>(); - assert_eq(treasury.get_mint_cap_id(RANDOM_ADDRESS), option::none()); + unit_test::assert_eq!(treasury.get_mint_cap_id(RANDOM_ADDRESS), option::none()); test_scenario::return_shared(treasury); }; @@ -986,49 +985,49 @@ module stablecoin::treasury_tests { // === Incompatible Treasury object tests === #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun configure_controller__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, deny_list) = before_incompatible_treasury_object_scenario(); treasury.configure_controller(RANDOM_ADDRESS, object::id_from_address(RANDOM_ADDRESS_2), scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun configure_new_controller__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, deny_list) = before_incompatible_treasury_object_scenario(); treasury.configure_new_controller(RANDOM_ADDRESS, RANDOM_ADDRESS_2, scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun remove_controller__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, deny_list) = before_incompatible_treasury_object_scenario(); treasury.remove_controller(RANDOM_ADDRESS, scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun configure_minter__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, deny_list) = before_incompatible_treasury_object_scenario(); treasury.configure_minter(&deny_list, 100000, scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun increment_mint_allowance__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, deny_list) = before_incompatible_treasury_object_scenario(); treasury.increment_mint_allowance(&deny_list, 100000, scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun remove_minter__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, deny_list) = before_incompatible_treasury_object_scenario(); treasury.remove_minter(scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun mint__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, deny_list) = before_incompatible_treasury_object_scenario(); let mint_cap = treasury::create_mint_cap_for_testing(scenario.ctx()); treasury.mint( &mint_cap, @@ -1037,13 +1036,13 @@ module stablecoin::treasury_tests { RANDOM_ADDRESS, scenario.ctx() ); - destroy(mint_cap); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + std::unit_test::destroy(mint_cap); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun burn__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, deny_list) = before_incompatible_treasury_object_scenario(); let mint_cap = treasury::create_mint_cap_for_testing(scenario.ctx()); treasury.burn( &mint_cap, @@ -1051,41 +1050,41 @@ module stablecoin::treasury_tests { coin::zero(scenario.ctx()), scenario.ctx() ); - destroy(mint_cap); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + std::unit_test::destroy(mint_cap); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun blocklist__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, mut deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, mut deny_list) = before_incompatible_treasury_object_scenario(); treasury.blocklist(&mut deny_list, RANDOM_ADDRESS, scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun unblocklist__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, mut deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, mut deny_list) = before_incompatible_treasury_object_scenario(); treasury.unblocklist(&mut deny_list, RANDOM_ADDRESS, scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun pause__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, mut deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, mut deny_list) = before_incompatible_treasury_object_scenario(); treasury.pause(&mut deny_list, scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun unpause__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, mut deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, mut deny_list) = before_incompatible_treasury_object_scenario(); treasury.unpause(&mut deny_list, scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun update_metadata__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, treasury, deny_list, mut metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, treasury, deny_list, mut metadata) = before_incompatible_treasury_object_with_metadata_scenario(); treasury.update_metadata( &mut metadata, string::utf8(b"new name"), @@ -1094,65 +1093,67 @@ module stablecoin::treasury_tests { ascii::string(b"new url"), scenario.ctx() ); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + test_scenario::return_shared(metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun transfer_ownership__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, deny_list) = before_incompatible_treasury_object_scenario(); entry::transfer_ownership(&mut treasury, RANDOM_ADDRESS, scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun accept_ownership__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, deny_list) = before_incompatible_treasury_object_scenario(); entry::accept_ownership(&mut treasury, scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun update_master_minter__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, deny_list) = before_incompatible_treasury_object_scenario(); entry::update_master_minter(&mut treasury, RANDOM_ADDRESS, scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun update_blocklister__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, deny_list) = before_incompatible_treasury_object_scenario(); entry::update_blocklister(&mut treasury, RANDOM_ADDRESS, scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun update_pauser__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, deny_list) = before_incompatible_treasury_object_scenario(); entry::update_pauser(&mut treasury, RANDOM_ADDRESS, scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } #[test, expected_failure(abort_code = ::stablecoin::version_control::EIncompatibleVersion)] fun update_metadata_updater__should_fail_if_treasury_object_is_incompatible() { - let (mut scenario, mut treasury, deny_list, metadata) = before_incompatible_treasury_object_scenario(); + let (mut scenario, mut treasury, deny_list) = before_incompatible_treasury_object_scenario(); entry::update_metadata_updater(&mut treasury, RANDOM_ADDRESS, scenario.ctx()); - after_incompatible_treasury_object_scenario(scenario, treasury, deny_list, metadata); + after_incompatible_treasury_object_scenario(scenario, treasury, deny_list); } // === Helpers === + #[allow(deprecated_usage)] fun setup(): Scenario { let mut scenario = test_scenario::begin(DEPLOYER); { - deny_list::create_for_test(scenario.ctx()); - let otw = test_utils::create_one_time_witness(); + deny_list::create_for_testing(scenario.ctx()); + let otw = sui::test_utils::create_one_time_witness(); let (treasury_cap, deny_cap, metadata) = coin::create_regulated_currency_v2( otw, 6, b"SYMBOL", b"NAME", b"", - option::none(), + option::some(url::new_unsafe(ascii::string(b""))), true, scenario.ctx() ); @@ -1167,15 +1168,15 @@ module stablecoin::treasury_tests { METADATA_UPDATER, scenario.ctx() ); - assert_eq(treasury.total_supply(), 0); - assert_eq(treasury.get_controllers_for_testing().length(), 0); - assert_eq(treasury.get_mint_allowances_for_testing().length(), 0); - assert_eq(treasury.roles().owner(), OWNER); - assert_eq(treasury.roles().master_minter(), MASTER_MINTER); - assert_eq(treasury.roles().blocklister(), BLOCKLISTER); - assert_eq(treasury.roles().pauser(), PAUSER); - assert_eq(treasury.roles().metadata_updater(), METADATA_UPDATER); - assert_eq(treasury.compatible_versions(), vector[version_control::current_version()]); + unit_test::assert_eq!(treasury.total_supply(), 0); + unit_test::assert_eq!(treasury.get_controllers_for_testing().length(), 0); + unit_test::assert_eq!(treasury.get_mint_allowances_for_testing().length(), 0); + unit_test::assert_eq!(treasury.roles().owner(), OWNER); + unit_test::assert_eq!(treasury.roles().master_minter(), MASTER_MINTER); + unit_test::assert_eq!(treasury.roles().blocklister(), BLOCKLISTER); + unit_test::assert_eq!(treasury.roles().pauser(), PAUSER); + unit_test::assert_eq!(treasury.roles().metadata_updater(), METADATA_UPDATER); + unit_test::assert_eq!(treasury.compatible_versions(), vector[version_control::current_version()]); treasury.assert_treasury_cap_exists(); treasury.assert_deny_cap_exists(); @@ -1186,7 +1187,7 @@ module stablecoin::treasury_tests { scenario } - fun before_incompatible_treasury_object_scenario(): (Scenario, Treasury, DenyList, CoinMetadata) { + fun before_incompatible_treasury_object_scenario(): (Scenario, Treasury, DenyList) { let mut scenario = setup(); // Set compatible_versions to an invalid version. @@ -1195,6 +1196,20 @@ module stablecoin::treasury_tests { treasury.set_compatible_versions_for_testing(vec_set::singleton(version_control::current_version() + 1)); test_scenario::return_shared(treasury); + scenario.next_tx(OWNER); + let treasury = scenario.take_shared>(); + let deny_list = scenario.take_shared(); + (scenario, treasury, deny_list) + } + + fun before_incompatible_treasury_object_with_metadata_scenario(): (Scenario, Treasury, DenyList, CoinMetadata) { + let mut scenario = setup(); + + scenario.next_tx(OWNER); + let mut treasury = scenario.take_shared>(); + treasury.set_compatible_versions_for_testing(vec_set::singleton(version_control::current_version() + 1)); + test_scenario::return_shared(treasury); + scenario.next_tx(OWNER); let treasury = scenario.take_shared>(); let deny_list = scenario.take_shared(); @@ -1202,10 +1217,9 @@ module stablecoin::treasury_tests { (scenario, treasury, deny_list, metadata) } - fun after_incompatible_treasury_object_scenario(scenario: Scenario, treasury: Treasury, deny_list: DenyList, metadata: CoinMetadata) { + fun after_incompatible_treasury_object_scenario(scenario: Scenario, treasury: Treasury, deny_list: DenyList) { test_scenario::return_shared(treasury); test_scenario::return_shared(deny_list); - test_scenario::return_shared(metadata); scenario.end(); } @@ -1214,21 +1228,21 @@ module stablecoin::treasury_tests { treasury.configure_new_controller(controller, minter, scenario.ctx()); let mint_cap_id = *treasury.get_mint_cap_id(controller).borrow(); - assert_eq(treasury.get_controllers_for_testing().contains(controller), true); - assert_eq(treasury.mint_allowance(*treasury.get_mint_cap_id(controller).borrow()), 0); + unit_test::assert_eq!(treasury.get_controllers_for_testing().contains(controller), true); + unit_test::assert_eq!(treasury.mint_allowance(*treasury.get_mint_cap_id(controller).borrow()), 0); let expected_event1 = treasury::create_mint_cap_created_event(mint_cap_id); let expected_event2 = treasury::create_controller_configured_event(controller, mint_cap_id); - assert_eq(event::num_events(), 2); - assert_eq(last_event_by_type(), expected_event1); - assert_eq(last_event_by_type(), expected_event2); + unit_test::assert_eq!(event::num_events(), 2); + unit_test::assert_eq!(last_event_by_type(), expected_event1); + unit_test::assert_eq!(last_event_by_type(), expected_event2); test_scenario::return_shared(treasury); // Check new MintCap has been transferred to minter. scenario.next_tx(minter); let mint_cap = scenario.take_from_sender>(); - assert_eq(object::id(&mint_cap), mint_cap_id); + unit_test::assert_eq!(object::id(&mint_cap), mint_cap_id); scenario.return_to_sender(mint_cap); } @@ -1236,12 +1250,12 @@ module stablecoin::treasury_tests { let mut treasury = scenario.take_shared>(); treasury.configure_controller(controller, mint_cap_id, scenario.ctx()); - assert_eq(treasury.get_controllers_for_testing().contains(controller), true); - assert_eq(treasury.mint_allowance(*treasury.get_mint_cap_id(controller).borrow()), 0); + unit_test::assert_eq!(treasury.get_controllers_for_testing().contains(controller), true); + unit_test::assert_eq!(treasury.mint_allowance(*treasury.get_mint_cap_id(controller).borrow()), 0); let expected_event = treasury::create_controller_configured_event(controller, mint_cap_id); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!(last_event_by_type(), expected_event); test_scenario::return_shared(treasury); } @@ -1250,11 +1264,11 @@ module stablecoin::treasury_tests { let mut treasury = scenario.take_shared>(); treasury.remove_controller(controller, scenario.ctx()); - assert_eq(treasury.get_controllers_for_testing().contains(controller), false); + unit_test::assert_eq!(treasury.get_controllers_for_testing().contains(controller), false); let expected_event = treasury::create_controller_removed_event(controller); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!(last_event_by_type(), expected_event); test_scenario::return_shared(treasury); } @@ -1266,11 +1280,11 @@ module stablecoin::treasury_tests { treasury.configure_minter(&deny_list, allowance, scenario.ctx()); let mint_cap_id = *treasury.get_mint_cap_id(scenario.sender()).borrow(); - assert_eq(treasury.mint_allowance(mint_cap_id), allowance); + unit_test::assert_eq!(treasury.mint_allowance(mint_cap_id), allowance); let expected_event = treasury::create_minter_configured_event(scenario.sender(), mint_cap_id, allowance); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!(last_event_by_type(), expected_event); test_scenario::return_shared(treasury); test_scenario::return_shared(deny_list); @@ -1283,11 +1297,11 @@ module stablecoin::treasury_tests { treasury.increment_mint_allowance(&deny_list, allowance_increment, scenario.ctx()); let mint_cap_id = *treasury.get_controllers_for_testing().borrow(scenario.sender()); - assert_eq(treasury.mint_allowance(mint_cap_id), expected_allowance); + unit_test::assert_eq!(treasury.mint_allowance(mint_cap_id), expected_allowance); let expected_event = treasury::create_minter_allowance_incremented_event(scenario.sender(), mint_cap_id, allowance_increment, expected_allowance); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!(last_event_by_type(), expected_event); test_scenario::return_shared(treasury); test_scenario::return_shared(deny_list); @@ -1299,12 +1313,11 @@ module stablecoin::treasury_tests { treasury.remove_minter(scenario.ctx()); let mint_cap_id = *treasury.get_mint_cap_id(scenario.sender()).borrow(); - assert_eq(treasury.mint_allowance(mint_cap_id), 0); - assert_eq(treasury.get_mint_allowances_for_testing().contains(mint_cap_id), false); - + unit_test::assert_eq!(treasury.mint_allowance(mint_cap_id), 0); + unit_test::assert_eq!(treasury.get_mint_allowances_for_testing().contains(mint_cap_id), false); let expected_event = treasury::create_minter_removed_event(scenario.sender(), mint_cap_id); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!(last_event_by_type(), expected_event); test_scenario::return_shared(treasury); } @@ -1316,12 +1329,12 @@ module stablecoin::treasury_tests { let allowance_before = treasury.mint_allowance(object::id(&mint_cap)); treasury.mint(&mint_cap, &deny_list, mint_amount, recipient, scenario.ctx()); - assert_eq(treasury.total_supply(), mint_amount); - assert_eq(treasury.mint_allowance(object::id(&mint_cap)), allowance_before - mint_amount); + unit_test::assert_eq!(treasury.total_supply(), mint_amount); + unit_test::assert_eq!(treasury.mint_allowance(object::id(&mint_cap)), allowance_before - mint_amount); let expected_event = treasury::create_mint_event(object::id(&mint_cap), recipient, mint_amount); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!(last_event_by_type(), expected_event); scenario.return_to_sender(mint_cap); test_scenario::return_shared(treasury); @@ -1330,13 +1343,13 @@ module stablecoin::treasury_tests { // Check new coin has been transferred to the recipient at the end of the previous transaction scenario.next_tx(recipient); let coin = scenario.take_from_sender>(); - assert_eq(coin.value(), mint_amount); + unit_test::assert_eq!(coin.value(), mint_amount); scenario.return_to_sender(coin); } fun test_burn(scenario: &mut Scenario) { let sender = scenario.sender(); - let deny_list = scenario.take_shared(); + let deny_list = scenario.take_shared(); let mut treasury = scenario.take_shared>(); let mint_cap = scenario.take_from_sender>(); let coin = scenario.take_from_sender>(); @@ -1346,12 +1359,12 @@ module stablecoin::treasury_tests { let amount_before = treasury.total_supply(); let burn_amount = coin.value(); treasury.burn(&mint_cap, &deny_list, coin, scenario.ctx()); - assert_eq(treasury.total_supply(), amount_before - burn_amount); - assert_eq(treasury.mint_allowance(object::id(&mint_cap)), allowance_before); + unit_test::assert_eq!(treasury.total_supply(), amount_before - burn_amount); + unit_test::assert_eq!(treasury.mint_allowance(object::id(&mint_cap)), allowance_before); let expected_event = treasury::create_burn_event(object::id(&mint_cap), burn_amount); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!(last_event_by_type(), expected_event); scenario.return_to_sender(mint_cap); test_scenario::return_shared(treasury); @@ -1359,7 +1372,7 @@ module stablecoin::treasury_tests { // Check coin ID has been deleted at the end of the previous transaction scenario.next_tx(sender); - assert_eq(scenario.ids_for_sender>().contains(&coin_id), false); + unit_test::assert_eq!(scenario.ids_for_sender>().contains(&coin_id), false); } fun test_blocklist(addr: address, scenario: &mut Scenario) { @@ -1368,13 +1381,13 @@ module stablecoin::treasury_tests { let blocklisted_before = coin::deny_list_v2_contains_current_epoch(&deny_list, addr, scenario.ctx()); treasury.blocklist(&mut deny_list, addr, scenario.ctx()); - assert_eq(coin::deny_list_v2_contains_next_epoch(&deny_list, addr), true); - assert_eq(coin::deny_list_v2_contains_current_epoch(&deny_list, addr, scenario.ctx()), blocklisted_before); + unit_test::assert_eq!(coin::deny_list_v2_contains_next_epoch(&deny_list, addr), true); + unit_test::assert_eq!(coin::deny_list_v2_contains_current_epoch(&deny_list, addr, scenario.ctx()), blocklisted_before); let expected_event = treasury::create_blocklisted_event(addr); let expected_event_count = 1 + event::events_by_type().length(); - assert_eq(event::num_events() as u64, expected_event_count); - assert_eq(last_event_by_type(), expected_event); + unit_test::assert_eq!(event::num_events() as u64, expected_event_count); + unit_test::assert_eq!(last_event_by_type(), expected_event); test_scenario::return_shared(deny_list); test_scenario::return_shared(treasury); @@ -1386,12 +1399,12 @@ module stablecoin::treasury_tests { let blocklisted_before = coin::deny_list_v2_contains_current_epoch(&deny_list, addr, scenario.ctx()); treasury.unblocklist(&mut deny_list, addr, scenario.ctx()); - assert_eq(coin::deny_list_v2_contains_next_epoch(&deny_list, addr), false); - assert_eq(coin::deny_list_v2_contains_current_epoch(&deny_list, addr, scenario.ctx()), blocklisted_before); + unit_test::assert_eq!(coin::deny_list_v2_contains_next_epoch(&deny_list, addr), false); + unit_test::assert_eq!(coin::deny_list_v2_contains_current_epoch(&deny_list, addr, scenario.ctx()), blocklisted_before); let expected_event = treasury::create_unblocklisted_event(addr); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!(last_event_by_type(), expected_event); test_scenario::return_shared(deny_list); test_scenario::return_shared(treasury); @@ -1400,7 +1413,7 @@ module stablecoin::treasury_tests { fun test_transfer_ownership(new_owner: address, scenario: &mut Scenario) { let mut treasury = scenario.take_shared>(); entry::transfer_ownership(&mut treasury, new_owner, scenario.ctx()); - assert_eq(*treasury.roles().pending_owner().borrow(), new_owner); + unit_test::assert_eq!(*treasury.roles().pending_owner().borrow(), new_owner); test_scenario::return_shared(treasury); } @@ -1408,36 +1421,77 @@ module stablecoin::treasury_tests { let mut treasury = scenario.take_shared>(); let pending_owner = treasury.roles().pending_owner(); entry::accept_ownership(&mut treasury, scenario.ctx()); - assert_eq(treasury.roles().owner(), *pending_owner.borrow()); - assert_eq(treasury.roles().pending_owner().is_none(), true); + unit_test::assert_eq!(treasury.roles().owner(), *pending_owner.borrow()); + unit_test::assert_eq!(treasury.roles().pending_owner().is_none(), true); test_scenario::return_shared(treasury); } fun test_update_master_minter(new_master_minter: address, scenario: &mut Scenario) { let mut treasury = scenario.take_shared>(); entry::update_master_minter(&mut treasury, new_master_minter, scenario.ctx()); - assert_eq(treasury.roles().master_minter(), new_master_minter); + unit_test::assert_eq!(treasury.roles().master_minter(), new_master_minter); test_scenario::return_shared(treasury); } fun test_update_blocklister(new_blocklister: address, scenario: &mut Scenario) { let mut treasury = scenario.take_shared>(); entry::update_blocklister(&mut treasury, new_blocklister, scenario.ctx()); - assert_eq(treasury.roles().blocklister(), new_blocklister); + unit_test::assert_eq!(treasury.roles().blocklister(), new_blocklister); test_scenario::return_shared(treasury); } fun test_update_pauser(new_pauser: address, scenario: &mut Scenario) { let mut treasury = scenario.take_shared>(); entry::update_pauser(&mut treasury, new_pauser, scenario.ctx()); - assert_eq(treasury.roles().pauser(), new_pauser); + unit_test::assert_eq!(treasury.roles().pauser(), new_pauser); test_scenario::return_shared(treasury); } fun test_update_metadata_updater(new_metadata_updater: address, scenario: &mut Scenario) { let mut treasury = scenario.take_shared>(); entry::update_metadata_updater(&mut treasury, new_metadata_updater, scenario.ctx()); - assert_eq(treasury.roles().metadata_updater(), new_metadata_updater); + unit_test::assert_eq!(treasury.roles().metadata_updater(), new_metadata_updater); + test_scenario::return_shared(treasury); + } + + fun test_update_metadata( + name: string::String, + symbol: ascii::String, + description: string::String, + icon_url: ascii::String, + scenario: &mut Scenario + ) { + let treasury = scenario.take_shared>(); + let mut metadata = scenario.take_shared>(); + + let expected_event = treasury::create_metadata_updated_event( + copy name, + copy symbol, + copy description, + copy icon_url + ); + + treasury::update_metadata( + &treasury, + &mut metadata, + copy name, + copy symbol, + copy description, + copy icon_url, + scenario.ctx() + ); + + unit_test::assert_eq!(metadata.get_name(), name); + unit_test::assert_eq!(metadata.get_symbol(), symbol); + unit_test::assert_eq!(metadata.get_description(), description); + + let icon_url_option = metadata.get_icon_url(); + unit_test::assert_eq!(option::is_some(&icon_url_option), true); + + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!(last_event_by_type(), expected_event); + + test_scenario::return_shared(metadata); test_scenario::return_shared(treasury); } @@ -1447,12 +1501,12 @@ module stablecoin::treasury_tests { let paused_before = coin::deny_list_v2_is_global_pause_enabled_current_epoch(&deny_list, scenario.ctx()); treasury.pause(&mut deny_list, scenario.ctx()); - assert_eq(coin::deny_list_v2_is_global_pause_enabled_next_epoch(&deny_list), true); - assert_eq(coin::deny_list_v2_is_global_pause_enabled_current_epoch(&deny_list, scenario.ctx()), paused_before); + unit_test::assert_eq!(coin::deny_list_v2_is_global_pause_enabled_next_epoch(&deny_list), true); + unit_test::assert_eq!(coin::deny_list_v2_is_global_pause_enabled_current_epoch(&deny_list, scenario.ctx()), paused_before); let expected_event_count = 1 + event::events_by_type().length(); - assert_eq(event::num_events() as u64, expected_event_count); - assert_eq(event::events_by_type>().length(), 1); + unit_test::assert_eq!(event::num_events() as u64, expected_event_count); + unit_test::assert_eq!(event::events_by_type>().length(), 1); test_scenario::return_shared(deny_list); test_scenario::return_shared(treasury); @@ -1465,60 +1519,36 @@ module stablecoin::treasury_tests { treasury.unpause(&mut deny_list, scenario.ctx()); - assert_eq(coin::deny_list_v2_is_global_pause_enabled_next_epoch(&deny_list), false); - assert_eq(coin::deny_list_v2_is_global_pause_enabled_current_epoch(&deny_list, scenario.ctx()), paused_before); + unit_test::assert_eq!(coin::deny_list_v2_is_global_pause_enabled_next_epoch(&deny_list), false); + unit_test::assert_eq!(coin::deny_list_v2_is_global_pause_enabled_current_epoch(&deny_list, scenario.ctx()), paused_before); - assert_eq(event::num_events(), 1); - assert_eq(event::events_by_type>().length(), 1); + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!(event::events_by_type>().length(), 1); test_scenario::return_shared(deny_list); test_scenario::return_shared(treasury); } fun test_is_blocklisted_current_epoch(scenario: &mut Scenario, addr: address, expected: bool) { - let deny_list = scenario.take_shared(); + let deny_list = scenario.take_shared(); let treasury = scenario.take_shared>(); - assert_eq(coin::deny_list_v2_contains_current_epoch(&deny_list, addr, scenario.ctx()), expected); + unit_test::assert_eq!(coin::deny_list_v2_contains_current_epoch(&deny_list, addr, scenario.ctx()), expected); test_scenario::return_shared(deny_list); test_scenario::return_shared(treasury); } fun test_is_paused_current_epoch(scenario: &mut Scenario, expected: bool) { - let deny_list = scenario.take_shared(); + let deny_list = scenario.take_shared(); let treasury = scenario.take_shared>(); - assert_eq(coin::deny_list_v2_is_global_pause_enabled_current_epoch(&deny_list, scenario.ctx()), expected); + unit_test::assert_eq!(coin::deny_list_v2_is_global_pause_enabled_current_epoch(&deny_list, scenario.ctx()), expected); test_scenario::return_shared(deny_list); test_scenario::return_shared(treasury); } - fun test_update_metadata( - name: string::String, - symbol: ascii::String, - description: string::String, - url: ascii::String, - scenario: &mut Scenario - ) { - let treasury = scenario.take_shared>(); - let mut metadata = scenario.take_shared>(); - - treasury.update_metadata(&mut metadata, name, symbol, description, url, scenario.ctx()); - assert_eq(metadata.get_name(), name); - assert_eq(metadata.get_symbol(), symbol); - assert_eq(metadata.get_description(), description); - assert_eq(metadata.get_icon_url().borrow().inner_url(), url); - - let expected_event = treasury::create_metadata_updated_event(name, symbol, description, url); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); - - test_scenario::return_shared(treasury); - test_scenario::return_shared(metadata); - } - fun remove_treasury_cap(scenario: &Scenario) { let mut treasury = scenario.take_shared>(); diff --git a/packages/sui_extensions/Move.lock b/packages/sui_extensions/Move.lock index 229206b..7b6ac5f 100644 --- a/packages/sui_extensions/Move.lock +++ b/packages/sui_extensions/Move.lock @@ -1,40 +1,26 @@ # @generated by Move, please check-in and do not edit manually. [move] -version = 2 -manifest_digest = "9721447F29946674D6846478FAE936F6200E9FC1F713E8ED50833CB9CA7AF68B" +version = 3 +manifest_digest = "D3C8AA996190C57C622AF6B8370E8F6E418F4C5877A361779A4DA1CB80A5F824" deps_digest = "F8BBB0CCB2491CA29A3DF03D6F92277A4F3574266507ACD77214D37ECA3F3082" dependencies = [ - { name = "Sui" }, + { id = "Sui", name = "Sui" }, ] [[move.package]] -name = "MoveStdlib" -source = { git = "https://github.com/MystenLabs/sui.git", rev = "a4185da5659d8d299d34e1bb2515ff1f7e32a20a", subdir = "crates/sui-framework/packages/move-stdlib" } +id = "MoveStdlib" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "mainnet-v1.62.1", subdir = "crates/sui-framework/packages/move-stdlib" } [[move.package]] -name = "Sui" -source = { git = "https://github.com/MystenLabs/sui.git", rev = "a4185da5659d8d299d34e1bb2515ff1f7e32a20a", subdir = "crates/sui-framework/packages/sui-framework" } +id = "Sui" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "mainnet-v1.62.1", subdir = "crates/sui-framework/packages/sui-framework" } dependencies = [ - { name = "MoveStdlib" }, + { id = "MoveStdlib", name = "MoveStdlib" }, ] [move.toolchain-version] -compiler-version = "1.32.2" -edition = "2024.beta" +compiler-version = "1.62.1" +edition = "2024" flavor = "sui" - -[env] - -[env.testnet] -chain-id = "4c78adac" -original-published-id = "0x252b1dd4b853d6b4c0721cf3f55c0587c940ee4d386d1b1cb5f46fa16e3de98a" -latest-published-id = "0x252b1dd4b853d6b4c0721cf3f55c0587c940ee4d386d1b1cb5f46fa16e3de98a" -published-version = "1" - -[env.mainnet] -chain-id = "35834a8a" -original-published-id = "0xe0917b74a5912e4ad186ac634e29c922ab83903f71af7500969f9411706f9b9a" -latest-published-id = "0xe0917b74a5912e4ad186ac634e29c922ab83903f71af7500969f9411706f9b9a" -published-version = "1" diff --git a/packages/sui_extensions/Move.toml b/packages/sui_extensions/Move.toml index cb3d78f..5a28a50 100644 --- a/packages/sui_extensions/Move.toml +++ b/packages/sui_extensions/Move.toml @@ -16,13 +16,13 @@ [package] name = "sui_extensions" -edition = "2024.beta" +edition = "2024" license = "Apache 2.0" [dependencies.Sui] git = "https://github.com/MystenLabs/sui.git" subdir = "crates/sui-framework/packages/sui-framework" -rev = "a4185da5659d8d299d34e1bb2515ff1f7e32a20a" +rev = "mainnet-v1.62.1" [addresses] sui_extensions = "0x0" diff --git a/packages/sui_extensions/sources/upgrade_service.move b/packages/sui_extensions/sources/upgrade_service.move index cc1a3c2..0abb1c8 100644 --- a/packages/sui_extensions/sources/upgrade_service.move +++ b/packages/sui_extensions/sources/upgrade_service.move @@ -129,7 +129,7 @@ module sui_extensions::upgrade_service { /// - Only callable if the `UpgradeCap` has not been used for an upgrade. entry fun deposit(upgrade_service: &mut UpgradeService, upgrade_cap: UpgradeCap) { let package_address_of_type = address::from_ascii_bytes( - type_name::get_with_original_ids().get_address().as_bytes() + type_name::with_original_ids().address_string().as_bytes() ); let package_address_of_upgrade_cap = &upgrade_cap.package().to_address(); assert!(package_address_of_type == package_address_of_upgrade_cap, ETypeNotFromPackage); diff --git a/packages/sui_extensions/tests/test_utils.move b/packages/sui_extensions/tests/test_utils.move index 16d8d84..bb6717c 100644 --- a/packages/sui_extensions/tests/test_utils.move +++ b/packages/sui_extensions/tests/test_utils.move @@ -16,12 +16,12 @@ #[test_only] module sui_extensions::test_utils { + use std::unit_test; use sui::event; - use sui::test_utils::assert_eq; public fun last_event_by_type(): T { let events_by_type = event::events_by_type(); - assert_eq(events_by_type.is_empty(), false); + unit_test::assert_eq!(events_by_type.is_empty(), false); *events_by_type.borrow(events_by_type.length() - 1) } } diff --git a/packages/sui_extensions/tests/two_step_role_tests.move b/packages/sui_extensions/tests/two_step_role_tests.move index 0fed5d5..00af38e 100644 --- a/packages/sui_extensions/tests/two_step_role_tests.move +++ b/packages/sui_extensions/tests/two_step_role_tests.move @@ -19,8 +19,8 @@ module sui_extensions::two_step_role_tests { use sui::{ event, test_scenario::{Self, Scenario}, - test_utils::{assert_eq} }; + use std::unit_test; use sui_extensions::{ test_utils::last_event_by_type, two_step_role::{Self, TwoStepRole} @@ -45,12 +45,12 @@ module sui_extensions::two_step_role_tests { let active_address = role.active_address(); role.begin_role_transfer(new_address, scenario.ctx()); - assert_eq(role.active_address(), active_address); - assert_eq(role.pending_address(), option::some(new_address)); + unit_test::assert_eq!(role.active_address(), active_address); + unit_test::assert_eq!(role.pending_address(), option::some(new_address)); let expected_event = two_step_role::create_role_transfer_started_event(active_address, new_address); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!(last_event_by_type(), expected_event); } fun test_accept_role(role: &mut TwoStepRole, scenario: &mut Scenario) { @@ -58,14 +58,14 @@ module sui_extensions::two_step_role_tests { let new_active_address = role.pending_address(); role.accept_role(scenario.ctx()); - assert_eq(role.active_address(), *new_active_address.borrow()); - assert_eq(role.pending_address().is_none(), true); + unit_test::assert_eq!(role.active_address(), *new_active_address.borrow()); + unit_test::assert_eq!(role.pending_address().is_none(), true); let expected_event = two_step_role::create_role_transferred_event( old_active_address, *new_active_address.borrow() ); - assert_eq(event::num_events(), 1); - assert_eq(last_event_by_type(), expected_event); + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!(last_event_by_type(), expected_event); } // === Tests === @@ -75,8 +75,8 @@ module sui_extensions::two_step_role_tests { #[test] fun new__should_succeed() { let (scenario, role) = setup(); - assert_eq(role.active_address(), ADMIN); - assert_eq(role.pending_address(), option::none()); + unit_test::assert_eq!(role.active_address(), ADMIN); + unit_test::assert_eq!(role.pending_address(), option::none()); role.destroy(); scenario.end(); diff --git a/packages/sui_extensions/tests/upgrade_service_tests.move b/packages/sui_extensions/tests/upgrade_service_tests.move index b41da27..b8b3003 100644 --- a/packages/sui_extensions/tests/upgrade_service_tests.move +++ b/packages/sui_extensions/tests/upgrade_service_tests.move @@ -20,8 +20,9 @@ module sui_extensions::upgrade_service_tests { event, package::{Self, UpgradeTicket, UpgradeReceipt, UpgradeCap}, test_scenario::{Self, Scenario}, - test_utils::{assert_eq, destroy, create_one_time_witness} + test_utils::create_one_time_witness }; + use std::unit_test; use sui_extensions::{ upgrade_service::{Self, UpgradeService, AdminRole}, test_utils::last_event_by_type, @@ -44,7 +45,7 @@ module sui_extensions::upgrade_service_tests { fun new__should_fail_if_type_is_not_one_time_witness() { let mut scenario = test_scenario::begin(DEPLOYER); - destroy(test_new(&mut scenario, NOT_ONE_TIME_WITNESS {}, UPGRADE_SERVICE_ADMIN)); + unit_test::destroy(test_new(&mut scenario, NOT_ONE_TIME_WITNESS {}, UPGRADE_SERVICE_ADMIN)); scenario.end(); } @@ -53,7 +54,7 @@ module sui_extensions::upgrade_service_tests { fun new__should_succeed_and_pass_all_assertions() { let mut scenario = test_scenario::begin(DEPLOYER); - destroy(test_new(&mut scenario, create_one_time_witness(), UPGRADE_SERVICE_ADMIN)); + unit_test::destroy(test_new(&mut scenario, create_one_time_witness(), UPGRADE_SERVICE_ADMIN)); scenario.end(); } @@ -70,7 +71,7 @@ module sui_extensions::upgrade_service_tests { // Attempt to deposit an `UpgradeCap` that has a different package id from the package that // defines `UPGRADE_SERVICE_TESTS`, should fail. scenario.next_tx(UPGRADE_SERVICE_ADMIN); - assert_eq(RANDOM_ADDRESS != @sui_extensions, true); + unit_test::assert_eq!(RANDOM_ADDRESS != @sui_extensions, true); let upgrade_cap_for_random_package = create_upgrade_cap(&mut scenario, RANDOM_ADDRESS.to_id()); test_deposit(&scenario, upgrade_cap_for_random_package); @@ -266,7 +267,7 @@ module sui_extensions::upgrade_service_tests { // Random address attempts to authorize an upgrade, should fail. scenario.next_tx(RANDOM_ADDRESS); - destroy(test_authorize_upgrade( + unit_test::destroy(test_authorize_upgrade( &mut scenario, package::compatible_policy(), TEST_DIGEST @@ -285,7 +286,7 @@ module sui_extensions::upgrade_service_tests { // Attempt to authorize an upgrade after the `UpgradeCap` has been extracted, should fail. scenario.next_tx(UPGRADE_SERVICE_ADMIN); - destroy(test_authorize_upgrade( + unit_test::destroy(test_authorize_upgrade( &mut scenario, package::compatible_policy(), TEST_DIGEST @@ -300,7 +301,7 @@ module sui_extensions::upgrade_service_tests { // Authorize an upgrade. scenario.next_tx(UPGRADE_SERVICE_ADMIN); - destroy(test_authorize_upgrade( + unit_test::destroy(test_authorize_upgrade( &mut scenario, package::compatible_policy(), TEST_DIGEST @@ -309,7 +310,7 @@ module sui_extensions::upgrade_service_tests { // Attempt to authorize another upgrade, should fail as there is a pending // upgrade. scenario.next_tx(UPGRADE_SERVICE_ADMIN); - destroy(test_authorize_upgrade( + unit_test::destroy(test_authorize_upgrade( &mut scenario, package::compatible_policy(), TEST_DIGEST @@ -332,7 +333,7 @@ module sui_extensions::upgrade_service_tests { // Attempt to authorize an upgrade that has a more permissive policy, should fail. scenario.next_tx(UPGRADE_SERVICE_ADMIN); - destroy(test_authorize_upgrade( + unit_test::destroy(test_authorize_upgrade( &mut scenario, package::compatible_policy(), TEST_DIGEST @@ -346,7 +347,7 @@ module sui_extensions::upgrade_service_tests { let mut scenario = setup_with_shared_upgrade_service(); scenario.next_tx(UPGRADE_SERVICE_ADMIN); - destroy(test_authorize_upgrade( + unit_test::destroy(test_authorize_upgrade( &mut scenario, package::compatible_policy(), TEST_DIGEST @@ -426,7 +427,7 @@ module sui_extensions::upgrade_service_tests { TEST_DIGEST ); let upgrade_receipt_for_random_package = package::test_upgrade(upgrade_ticket_for_random_package); - destroy(upgrade_cap_for_random_package); + unit_test::destroy(upgrade_cap_for_random_package); // Attempt to commit the upgrade using an `UpgradeReceipt` that did not derive from the `UpgradeCap`, should fail. scenario.next_tx(UPGRADE_SERVICE_ADMIN); @@ -478,7 +479,7 @@ module sui_extensions::upgrade_service_tests { // This is a workaround to make the test environment isolated. let mut scenario = test_scenario::begin(DEPLOYER); - assert_eq(UPGRADE_CAP_PACKAGE_ID != @sui_extensions, true); + unit_test::assert_eq!(UPGRADE_CAP_PACKAGE_ID != @sui_extensions, true); let mut upgrade_service = test_new(&mut scenario, create_one_time_witness(), UPGRADE_SERVICE_ADMIN); let upgrade_cap = create_upgrade_cap(&mut scenario, UPGRADE_CAP_PACKAGE_ID.to_id()); @@ -492,9 +493,9 @@ module sui_extensions::upgrade_service_tests { fun test_new(scenario: &mut Scenario, witness: T, admin: address): UpgradeService { let (upgrade_service, _) = upgrade_service::new(witness, admin, scenario.ctx()); - assert_eq(upgrade_service.exists_upgrade_cap(), false); - assert_eq(upgrade_service.admin(), admin); - assert_eq(upgrade_service.pending_admin(), option::none()); + unit_test::assert_eq!(upgrade_service.exists_upgrade_cap(), false); + unit_test::assert_eq!(upgrade_service.admin(), admin); + unit_test::assert_eq!(upgrade_service.pending_admin(), option::none()); upgrade_service } @@ -509,8 +510,8 @@ module sui_extensions::upgrade_service_tests { upgrade_service.deposit(upgrade_cap); - assert_eq(upgrade_service.exists_upgrade_cap(), true); - assert_eq(object::id(upgrade_service.borrow_upgrade_cap_for_testing()), expected_upgrade_cap_id); + unit_test::assert_eq!(upgrade_service.exists_upgrade_cap(), true); + unit_test::assert_eq!(object::id(upgrade_service.borrow_upgrade_cap_for_testing()), expected_upgrade_cap_id); check_upgrade_service_and_upgrade_cap( &upgrade_service, expected_upgrade_cap_package, @@ -519,8 +520,8 @@ module sui_extensions::upgrade_service_tests { ); // Ensure that the correct event was emitted. - assert_eq(event::num_events(), 1); - assert_eq( + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!( last_event_by_type(), upgrade_service::create_upgrade_cap_deposited_event(expected_upgrade_cap_id) ); @@ -537,11 +538,11 @@ module sui_extensions::upgrade_service_tests { let prev_upgrade_cap_policy = upgrade_service.borrow_upgrade_cap_for_testing().policy(); upgrade_service.extract(UPGRADE_CAP_RECIPIENT, scenario.ctx()); - assert_eq(upgrade_service.exists_upgrade_cap(), false); + unit_test::assert_eq!(upgrade_service.exists_upgrade_cap(), false); // Ensure that the correct event was emitted. - assert_eq(event::num_events(), 1); - assert_eq( + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!( last_event_by_type(), upgrade_service::create_upgrade_cap_extracted_event(prev_upgrade_cap_id) ); @@ -567,12 +568,12 @@ module sui_extensions::upgrade_service_tests { upgrade_service.destroy_empty(scenario.ctx()); // Ensure that the correct event was emitted. - assert_eq(event::num_events(), 1); - assert_eq(event::events_by_type>().length(), 1); + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!(event::events_by_type>().length(), 1); // Ensure that the `UpgradeService` was destroyed. let prev_tx_effects = scenario.next_tx(RANDOM_ADDRESS); - assert_eq(prev_tx_effects.deleted(), vector[upgrade_service_object_id]); + unit_test::assert_eq!(prev_tx_effects.deleted(), vector[upgrade_service_object_id]); } fun test_change_admin(scenario: &mut Scenario, new_admin: address){ @@ -583,12 +584,12 @@ module sui_extensions::upgrade_service_tests { upgrade_service.change_admin(new_admin, scenario.ctx()); // Ensure that the admin states are correctly set. - assert_eq(upgrade_service.admin(), current_admin); - assert_eq(upgrade_service.pending_admin(), option::some(new_admin)); + unit_test::assert_eq!(upgrade_service.admin(), current_admin); + unit_test::assert_eq!(upgrade_service.pending_admin(), option::some(new_admin)); // Ensure that the correct event was emitted. - assert_eq(event::num_events(), 1); - assert_eq( + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!( last_event_by_type(), two_step_role::create_role_transfer_started_event>(current_admin, new_admin) ); @@ -605,12 +606,12 @@ module sui_extensions::upgrade_service_tests { upgrade_service.accept_admin(scenario.ctx()); // Ensure that the admin states are correctly set. - assert_eq(upgrade_service.admin(), pending_admin); - assert_eq(upgrade_service.pending_admin(), option::none()); + unit_test::assert_eq!(upgrade_service.admin(), pending_admin); + unit_test::assert_eq!(upgrade_service.pending_admin(), option::none()); // Ensure that the correct event was emitted. - assert_eq(event::num_events(), 1); - assert_eq( + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!( last_event_by_type(), two_step_role::create_role_transferred_event>(current_admin, pending_admin) ); @@ -643,8 +644,8 @@ module sui_extensions::upgrade_service_tests { ); // Ensure that the correct events were emitted. - assert_eq(event::num_events(), 1); - assert_eq( + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!( last_event_by_type(), upgrade_service::create_authorize_upgrade_event(prev_upgrade_cap_package, policy) ); @@ -670,8 +671,8 @@ module sui_extensions::upgrade_service_tests { ); // Ensure that the correct events were emitted. - assert_eq(event::num_events(), 1); - assert_eq( + unit_test::assert_eq!(event::num_events(), 1); + unit_test::assert_eq!( last_event_by_type(), upgrade_service::create_commit_upgrade_event(new_upgrade_cap_package) ); @@ -694,9 +695,9 @@ module sui_extensions::upgrade_service_tests { } fun check_upgrade_service_and_upgrade_cap(upgrade_service: &UpgradeService, package: ID, version: u64, policy: u8) { - assert_eq(upgrade_service.upgrade_cap_package(), package); - assert_eq(upgrade_service.upgrade_cap_version(), version); - assert_eq(upgrade_service.upgrade_cap_policy(), policy); + unit_test::assert_eq!(upgrade_service.upgrade_cap_package(), package); + unit_test::assert_eq!(upgrade_service.upgrade_cap_version(), version); + unit_test::assert_eq!(upgrade_service.upgrade_cap_policy(), policy); check_upgrade_cap( upgrade_service.borrow_upgrade_cap_for_testing(), @@ -707,14 +708,14 @@ module sui_extensions::upgrade_service_tests { } fun check_upgrade_cap(upgrade_cap: &UpgradeCap, package: ID, version: u64, policy: u8) { - assert_eq(upgrade_cap.package(), package); - assert_eq(upgrade_cap.version(), version); - assert_eq(upgrade_cap.policy(), policy); + unit_test::assert_eq!(upgrade_cap.package(), package); + unit_test::assert_eq!(upgrade_cap.version(), version); + unit_test::assert_eq!(upgrade_cap.policy(), policy); } fun check_upgrade_ticket(upgrade_ticket: &UpgradeTicket, package: ID, policy: u8, digest: vector) { - assert_eq(upgrade_ticket.package(), package); - assert_eq(upgrade_ticket.policy(), policy); - assert_eq(*upgrade_ticket.digest(), digest); + unit_test::assert_eq!(upgrade_ticket.package(), package); + unit_test::assert_eq!(upgrade_ticket.policy(), policy); + unit_test::assert_eq!(*upgrade_ticket.digest(), digest); } } diff --git a/packages/usdc/Move.lock b/packages/usdc/Move.lock index 8944329..1cf33ae 100644 --- a/packages/usdc/Move.lock +++ b/packages/usdc/Move.lock @@ -1,59 +1,45 @@ # @generated by Move, please check-in and do not edit manually. [move] -version = 2 -manifest_digest = "6241BCC3ECEB3F37DC54B2F9DFCAC10D0A1A604BD03E0DF4143F28D8D41CE638" +version = 3 +manifest_digest = "02868079B11079840FD219CE50C07E91D6E5BD6025D98938626D8778873FD1BE" deps_digest = "060AD7E57DFB13104F21BE5F5C3759D03F0553FC3229247D9A7A6B45F50D03A3" dependencies = [ - { name = "Sui" }, - { name = "stablecoin" }, - { name = "sui_extensions" }, + { id = "Sui", name = "Sui" }, + { id = "stablecoin", name = "stablecoin" }, + { id = "sui_extensions", name = "sui_extensions" }, ] [[move.package]] -name = "MoveStdlib" -source = { git = "https://github.com/MystenLabs/sui.git", rev = "a4185da5659d8d299d34e1bb2515ff1f7e32a20a", subdir = "crates/sui-framework/packages/move-stdlib" } +id = "MoveStdlib" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "mainnet-v1.62.1", subdir = "crates/sui-framework/packages/move-stdlib" } [[move.package]] -name = "Sui" -source = { git = "https://github.com/MystenLabs/sui.git", rev = "a4185da5659d8d299d34e1bb2515ff1f7e32a20a", subdir = "crates/sui-framework/packages/sui-framework" } +id = "Sui" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "mainnet-v1.62.1", subdir = "crates/sui-framework/packages/sui-framework" } dependencies = [ - { name = "MoveStdlib" }, + { id = "MoveStdlib", name = "MoveStdlib" }, ] [[move.package]] -name = "stablecoin" +id = "stablecoin" source = { local = "../stablecoin" } dependencies = [ - { name = "Sui" }, - { name = "sui_extensions" }, + { id = "Sui", name = "Sui" }, + { id = "sui_extensions", name = "sui_extensions" }, ] [[move.package]] -name = "sui_extensions" +id = "sui_extensions" source = { local = "../sui_extensions" } dependencies = [ - { name = "Sui" }, + { id = "Sui", name = "Sui" }, ] [move.toolchain-version] -compiler-version = "1.32.2" -edition = "2024.beta" +compiler-version = "1.62.1" +edition = "2024" flavor = "sui" - -[env] - -[env.testnet] -chain-id = "4c78adac" -original-published-id = "0xa1ec7fc00a6f40db9693ad1415d0c193ad3906494428cf252621037bd7117e29" -latest-published-id = "0xa1ec7fc00a6f40db9693ad1415d0c193ad3906494428cf252621037bd7117e29" -published-version = "1" - -[env.mainnet] -chain-id = "35834a8a" -original-published-id = "0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7" -latest-published-id = "0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7" -published-version = "1" diff --git a/packages/usdc/Move.toml b/packages/usdc/Move.toml index 79afe98..2495798 100644 --- a/packages/usdc/Move.toml +++ b/packages/usdc/Move.toml @@ -16,13 +16,13 @@ [package] name = "usdc" -edition = "2024.beta" +edition = "2024" license = "Apache 2.0" [dependencies.Sui] git = "https://github.com/MystenLabs/sui.git" subdir = "crates/sui-framework/packages/sui-framework" -rev = "a4185da5659d8d299d34e1bb2515ff1f7e32a20a" +rev = "mainnet-v1.62.1" [dependencies.stablecoin] local = "../stablecoin" diff --git a/packages/usdc/sources/usdc.move b/packages/usdc/sources/usdc.move index ea2da7c..f410cc0 100644 --- a/packages/usdc/sources/usdc.move +++ b/packages/usdc/sources/usdc.move @@ -14,6 +14,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +#[allow(deprecated_usage)] module usdc::usdc { use std::ascii::string; use sui::coin; @@ -72,3 +73,4 @@ module usdc::usdc { init(USDC {}, ctx) } } + diff --git a/packages/usdc/tests/usdc_tests.move b/packages/usdc/tests/usdc_tests.move index e81305c..2dff260 100644 --- a/packages/usdc/tests/usdc_tests.move +++ b/packages/usdc/tests/usdc_tests.move @@ -19,7 +19,6 @@ module usdc::usdc_tests { use std::{string, ascii}; use sui::{ test_scenario, - test_utils::{assert_eq}, coin::{Self, CoinMetadata, RegulatedCoinMetadata}, deny_list::{Self, DenyList}, url @@ -37,9 +36,9 @@ module usdc::usdc_tests { usdc::init_for_testing(scenario.ctx()); let previous_tx_effects = scenario.next_tx(DEPLOYER); - assert_eq(previous_tx_effects.created().length(), 4); - assert_eq(previous_tx_effects.frozen().length(), 1); - assert_eq(previous_tx_effects.shared().length(), 3); // Shared metadata, treasury and upgrade service objects + std::unit_test::assert_eq!(previous_tx_effects.created().length(), 4); + std::unit_test::assert_eq!(previous_tx_effects.frozen().length(), 1); + std::unit_test::assert_eq!(previous_tx_effects.shared().length(), 3); // Shared metadata, treasury and upgrade service objects scenario.end(); } @@ -51,11 +50,11 @@ module usdc::usdc_tests { scenario.next_tx(DEPLOYER); let metadata = scenario.take_shared>(); - assert_eq(metadata.get_decimals(), 6); - assert_eq(metadata.get_name(), string::utf8(b"USDC")); - assert_eq(metadata.get_symbol(), ascii::string(b"USDC")); - assert_eq(metadata.get_description(), string::utf8(b"USDC is a US dollar-backed stablecoin issued by Circle. USDC is designed to provide a faster, safer, and more efficient way to send, spend, and exchange money around the world.")); - assert_eq(metadata.get_icon_url(), option::some(url::new_unsafe(ascii::string(b"https://www.circle.com/hubfs/Brand/USDC/USDC_icon_32x32.png")))); + std::unit_test::assert_eq!(metadata.get_decimals(), 6); + std::unit_test::assert_eq!(metadata.get_name(), string::utf8(b"USDC")); + std::unit_test::assert_eq!(metadata.get_symbol(), ascii::string(b"USDC")); + std::unit_test::assert_eq!(metadata.get_description(), string::utf8(b"USDC is a US dollar-backed stablecoin issued by Circle. USDC is designed to provide a faster, safer, and more efficient way to send, spend, and exchange money around the world.")); + std::unit_test::assert_eq!(metadata.get_icon_url(), option::some(url::new_unsafe(ascii::string(b"https://www.circle.com/hubfs/Brand/USDC/USDC_icon_32x32.png")))); test_scenario::return_shared(metadata); scenario.end(); @@ -67,7 +66,7 @@ module usdc::usdc_tests { usdc::init_for_testing(scenario.ctx()); scenario.next_tx(DEPLOYER); - assert_eq(test_scenario::has_most_recent_immutable>(), true); + std::unit_test::assert_eq!(test_scenario::has_most_recent_immutable>(), true); scenario.end(); } @@ -79,7 +78,7 @@ module usdc::usdc_tests { scenario.next_tx(DEPLOYER); let treasury = scenario.take_shared>(); - assert_eq(treasury.total_supply(), 0); + std::unit_test::assert_eq!(treasury.total_supply(), 0); test_scenario::return_shared(treasury); scenario.end(); @@ -89,7 +88,7 @@ module usdc::usdc_tests { fun init__should_create_shared_treasury_and_wrap_deny_cap() { let mut scenario = test_scenario::begin(DEPLOYER); usdc::init_for_testing(scenario.ctx()); - deny_list::create_for_test(scenario.ctx()); + deny_list::create_for_testing(scenario.ctx()); scenario.next_tx(DEPLOYER); @@ -98,7 +97,7 @@ module usdc::usdc_tests { let mut deny_list = scenario.take_shared(); treasury.blocklist(&mut deny_list, RANDOM_ADDRESS, scenario.ctx()); - assert_eq(coin::deny_list_v2_contains_next_epoch(&deny_list, RANDOM_ADDRESS), true); + std::unit_test::assert_eq!(coin::deny_list_v2_contains_next_epoch(&deny_list, RANDOM_ADDRESS), true); test_scenario::return_shared(deny_list); test_scenario::return_shared(treasury); @@ -113,9 +112,10 @@ module usdc::usdc_tests { scenario.next_tx(DEPLOYER); let upgrade_service = scenario.take_shared>(); - assert_eq(upgrade_service.admin(), DEPLOYER); + std::unit_test::assert_eq!(upgrade_service.admin(), DEPLOYER); test_scenario::return_shared(upgrade_service); scenario.end(); } } +