diff --git a/aptos-move/framework/supra-framework/sources/container.move b/aptos-move/framework/supra-framework/sources/container.move new file mode 100644 index 0000000000000..9745a0cd65fe8 --- /dev/null +++ b/aptos-move/framework/supra-framework/sources/container.move @@ -0,0 +1,82 @@ +module supra_framework::container { + + use std::vector; + use aptos_std::simple_map; + use aptos_std::simple_map::SimpleMap; + use aptos_std::table::Table; + use supra_framework::system_addresses; + + struct AddressToContainerMap has key, store { + address_container_map: SimpleMap>, + id_containerMetaData_map: Table + } + + //TODO: Add more fields for container metadata if needed + //TODO: Group discussion: charging metrics + struct ContainerMetadata has copy, drop, store { + container_owner: address, + //TODO enforce uniqueness of container_indentifier + /// The unique identifier of the supra container + container_indentifier: u64, + /// The addresses of modules in the container + Module_adresses: vector
, + /// Pending proposal module address, + pending_proposal: SimpleMap>, + //TODO type information for the coin + /// The address of the customer asset reciver + customer_asset_receiver: address, + /// The address of the supra coin reciver + supra_coin_receiver: address + } + + /// Initialize the container metadata storage + public fun initialize(supra_framework: &signer) { + system_addresses::assert_supra_framework(supra_framework); + if (!exists(@supra_framework)) { + move_to( + supra_framework, + AddressToContainerMap { + address_container_map: simple_map::new(), + } + ); + } + } + + /// Create a new container + public fun create_container(supra_framework: &signer, address: address, container_metadata: ContainerMetadata) acquires AddressToContainerMap { + system_addresses::assert_supra_framework(supra_framework); + let container = borrow_global_mut(@supra_framework); + simple_map::upsert(&mut container.address_container_map, address, container_metadata); + } + + //TODO design choice: 1) Supraframework create container 2) every one can create container, there would be a charge + // the charge would go to some beneficiary address, the beneficiary address would be set and change by the supraframework + + //TODO API to view and modify the metadata and requires the container owner's signer + + //TODO Task for Aosen: how this will be published and how can we get the address back + + /// Add one module address to the container + public fun add_module_to_container(supra_framework: &signer, address: address, module_address: address) acquires AddressToContainerMap { + system_addresses::assert_supra_framework(supra_framework); + assert(exists(@supra_framework), 1); + let container = borrow_global_mut(@supra_framework); + let container_metadata = simple_map::borrow_mut(&mut container.address_container_map, &address); + vector::insert(container_metadata.Module_adresses, module_address); + } + + #[view] + public fun get_container_metadata(supra_framework: &signer, address: address): ContainerMetadata acquires AddressToContainerMap { + system_addresses::assert_supra_framework(supra_framework); + assert(exists(address), 1); + let container = borrow_global(@supra_framework); + *simple_map::borrow(&container.address_container_map, &address) + } + + public fun UpdateContainerMetadata(supra_framework: &signer, address: address, container_metadata: ContainerMetadata) acquires ContainerMetadata { + system_addresses::assert_supra_framework(supra_framework); + let container_metadata = borrow_global_mut(address); + //DO IT in a nicer way + *container_metadata = container_metadata; + } +}