# Stable

The `x/stable` module manages the minting and burning of a native stablecoin, backed by a basket of accepted collateral assets.

## Key Features

1. **Minting and Burning**:
   * Allows minting of the native stablecoin against approved collateral.
   * Allows burning of the native stablecoin to redeem collateral.
2. **Collateral Management**:
   * Supports a configurable basket of accepted collateral assets, typically IBC denoms.
3. **Permissioned Control**:
   * Restricts mint and burn operations to a whitelist of authorized addresses.
4. **Dynamic Exchange Rate**:
   * Calculates exchange rates dynamically based on the `exponent` (decimal places) of the involved tokens, ensuring fair value exchange.
5. **On-Chain Auditability**:
   * Provides full transparency of all operations and balances for easy auditing.

## Core Concepts

> **Note:** The following section covers advanced topics intended for experienced users or developers.

### Parameters

The `stable` module's behavior is controlled by a set of on-chain parameters:

* **`authority_addresses`** (string\[]): A list of addresses authorized to execute `MsgMint` and `MsgBurn`.
* **`accepted_denoms`** (string\[]): A whitelist of collateral asset denominations that can be deposited to mint the stablecoin. These are typically IBC denoms.
* **`stable_denom`** (string): The denomination of the native stablecoin minted by the module (e.g., `uusdrise`).

### Exchange Rate Calculation

The exchange rate between the collateral asset and the native stablecoin is not hardcoded. Instead, it is calculated dynamically using the `exponent` field from the `DenomMetadata` stored in the `x/bank` module.

If `DenomMetadata` is not found for a given token, its exponent is assumed to be `0`. This ensures a fair exchange rate for tokens based on their specified decimal places.

## Workflow: Minting and Burning

### Sequence Diagram

{% @mermaid/diagram content="sequenceDiagram
participant Authority as Authorized Address
participant StableModule as x/stable Module
participant BankModule as x/bank Module

```
note over Authority, BankModule: Mint Process
Authority->>StableModule: MsgMint
activate StableModule
StableModule->>BankModule: Transfer collateral from Authority to Module Account
StableModule->>BankModule: Mint stablecoin to Module Account
StableModule->>BankModule: Send stablecoin from Module Account to Authority
deactivate StableModule

note over Authority, BankModule: Burn Process
Authority->>StableModule: MsgBurn
activate StableModule
StableModule->>BankModule: Transfer stablecoin from Authority to Module Account
StableModule->>BankModule: Burn stablecoin from Module Account
StableModule->>BankModule: Send collateral from Module Account to Authority
deactivate StableModule" %}
```

## Messages

The module supports the following messages:

* **MsgMint**
  * **Action**: An authorized sender deposits collateral to mint the native stablecoin.
  * **Process**: 1. Verifies the `sender` is in `authority_addresses`. 2. Confirms all deposited denoms are in `accepted_denoms`. 3. Transfers collateral from the sender to the module account. 4. Calculates the corresponding amount of `stable_denom` to mint using the exponent-based exchange rate. 5. Mints the calculated amount of `stable_denom` and sends it to the `sender`.
* **MsgBurn**
  * **Action**: An authorized sender burns the native stablecoin to receive a chosen collateral asset.
  * **Process**: 1. Verifies the `sender` is an authority. 2. Confirms the requested `output_denom` is in `accepted_denoms`. 3. Transfers the `input_amount` of stablecoin from the sender to the module and burns it. 4. Calculates the corresponding amount of `output_denom` to return using the exponent-based exchange rate. 5. Transfers the calculated collateral amount from the module account to the `sender`.

## Queries

The module provides various query endpoints:

* **Params**: Query the current module parameters.
* **ModuleAccountBalance**: Query the balance of all collateral assets held by the module account.

## Auditability

All mint and burn operations, collateral balances held by the module, and the total supply of the stablecoin are publicly accessible on-chain. This design ensures that the stablecoin is always transparently and verifiably collateralized by the assets held in the module account.

See [Github](https://github.com/sunriselayer/sunrise/tree/stable/x/stable) for details.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.sunriselayer.io/learn/sunrise/stable.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
