diff --git a/aptos-move/framework/aptos-framework/sources/fungible_asset.move b/aptos-move/framework/aptos-framework/sources/fungible_asset.move index 5ce01d8a1db..dc2959240f1 100644 --- a/aptos-move/framework/aptos-framework/sources/fungible_asset.move +++ b/aptos-move/framework/aptos-framework/sources/fungible_asset.move @@ -700,6 +700,13 @@ module aptos_framework::fungible_asset { exists(metadata_addr) } + #[view] + /// Return whether a fungible asset type has any dispatch or derived-supply hooks registered. + public fun is_asset_type_dispatchable(metadata: Object): bool { + let metadata_addr = object::object_address(&metadata); + exists(metadata_addr) || exists(metadata_addr) + } + public fun deposit_dispatch_function(store: Object): Option acquires FungibleStore, DispatchFunctionStore { let fa_store = borrow_store_resource(&store); let metadata_addr = object::object_address(&fa_store.metadata); @@ -1537,6 +1544,22 @@ module aptos_framework::fungible_asset { remove_store(&delete_ref); } + #[test(creator = @0xcafe)] + fun test_is_asset_type_dispatchable_false_for_plain_fa(creator: &signer) { + let (_, _, _, _, metadata) = create_fungible_asset(creator); + assert!(!is_asset_type_dispatchable(metadata), 1); + } + + #[test(creator = @0xcafe)] + fun test_is_asset_type_dispatchable_true_with_derived_supply(creator: &signer) { + let (creator_ref, token_object) = create_test_token(creator); + init_test_metadata(&creator_ref); + let metadata = object::convert(token_object); + assert!(!is_asset_type_dispatchable(metadata), 1); + register_derive_supply_dispatch_function(&creator_ref, option::none()); + assert!(is_asset_type_dispatchable(metadata), 2); + } + #[test(creator = @0xcafe, aaron = @0xface)] fun test_e2e_basic_flow( creator: &signer,