Module Factory
The Module Factory is a contract that allows you to install and manage Abstract Modules via the Account Manager. You can install modules by interacting with the Account Manager directly, i.e. via CLI, or by using the Account Console.
To recap from that chapter, there are three types of modules: App, Adapter, and Standalone.
Flow Diagrams
Install Module
When a developer requests the installation of a module, the following internal process is initiated:
sequenceDiagram autonumber actor U as User participant M as Manager participant MF as Module Factory participant VC as Version Control participant P as Proxy U ->> M: InstallModule M ->> MF: InstallModule MF -->>+ VC: Query reference alt adapter VC -->>+ MF: Return address else app / standalone VC -->>- MF: Return code_id MF -> MF: Instantiate module end MF ->> M: Register module address M ->> P: Update module allowlist
Execute on Module
Once the module is installed, there are essentially three ways to interact with it depending on the type of module:
Non-dependent Execution
sequenceDiagram autonumber actor U as User participant M as Manager participant Md as Module U ->> M: ExecOnModule Note right of U: ModuleMsg M -->> M: Load module address M ->> Md: Execute Note right of M: ModuleMsg
Adapter Execution
In the following example, the abstract:dex
module is installed on an Account, and the user requests a swap on a dex.
sequenceDiagram autonumber actor U as User participant M as Manager participant D as abstract:dex participant VC as Version Control participant A as ANS participant P as Proxy participant T as Dex Pool U ->> M: ExecOnModule Note right of U: Dex::Swap M --> M: Load module address M ->> D: Call module Note right of M: Adapter Msg D -->+ VC: Load proxy address for Account VC -->- D: Address D -->>+ A: Resolve asset names A -->> D: Asset infos D --> A: Resolve dex pool A -->>- D: Pool metadata D --> D: Build swap msg for target dex D ->> P: Forward execution Note over VC, A: DexMsg P ->> T: Execute Note right of P: DexMsg
Module-dependent Execution
In this example, we use Equilibrium’s Rebalance
function as an example. Modules with
dependencies (equilibrium:balancer
is dependent on abstract:etf
and abstract:dex
) have their addresses dynamically
resolved when called.
sequenceDiagram autonumber actor U as User participant B as equilibrium:balancer participant P as Proxy participant M as Manager participant D as abstract:dex participant T as Target Dex U ->> B: Rebalance B -->>+ P: Query Allocations P -->>- B: Allocations B --> B: Calculate rebalancing requirements B -->>+ M: Query abstract:dex address M -->>- B: Address B ->> D: Call SwapRouter on dex D --> D: Build swap msg for target dex D --> D: Load proxy address D ->> P: Forward execution Note over M: DexMsg P ->> T: Execute Note over D, M: DexMsg