Skip to content

Latest commit

 

History

History
661 lines (569 loc) · 18.7 KB

factory.md

File metadata and controls

661 lines (569 loc) · 18.7 KB

Factory

The Factory contract is Mirror Protocol's central directory and organizes information related to mAssets and the Mirror Token (MIR). It is also responsible for minting new MIR tokens each block and distributing them to the Staking Contract for rewarding LP &sLP Token stakers.

After the initial bootstrapping of Mirror Protocol contracts, the Factory is assigned to be the owner for the Mint, Oracle, Staking, and Collector contracts. The Factory is owned by the Gov Contract.

Config

Name Type Description
mirror_token HumanAddr Contract address of Mirror Token (MIR)
mint_contract HumanAddr Contract address of Mirror Mint
oracle_contract HumanAddr Contract address of Mirror Oracle
terraswap_factory HumanAddr Contract address of Terraswap Factory
staking_contract HumanAddr Contract address of Mirror Staking
commission_collector HumanAddr Contract address of Mirror Collector
mint_per_block Uint128 Amount of new MIR tokens to mint per block
token_code_id u64 Code ID for CW20 contract for generating new mAssets
base_denom String Native token denom for Terraswap pairs (TerraUSD)

InitMsg

{% tabs %} {% tab title="Rust" %}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct InitMsg {
    pub token_code_id: u64,
    pub base_denom: String,
    pub distribution_schedule: Vec<(u64, u64, Uint128)>, // [[start_time, end_time, distribution_amount], [], ...]
}

{% endtab %}

{% tab title="JSON" %}

{
  "token_code_id": 8,
  "base_denom": "uusd",
  "distribution_schedule": [
    [3600, 7200, "1000000"],
    [7200, 10800, "1000000"]
  ]
}

{% endtab %} {% endtabs %}

Key Type Description
token_code_id u64 Code ID for CW20 contract for generating new mAssets
base_denom String Native token denom for Terraswap pairs (TerraUSD)
distribution_schedule Vec

Distribution schedule for the minting of new MIR tokens. Each entry consists of:

  • start time (seconds)
  • end time (seconds)
  • distribution amount for the interval

Determines the total amount of new MIR tokens minted as rewards for LP stakers over the interval [start time, end time].

HandleMsg

PostInitialize

Issued by the Factory contract's owner after bootstrapping to initialize the contract's configuration.

{% tabs %} {% tab title="Rust" %}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum HandleMsg {
    PostInitialize {
        commission_collector: HumanAddr,
        mint_contract: HumanAddr,
        mirror_token: HumanAddr,
        oracle_contract: HumanAddr,
        owner: HumanAddr,
        staking_contract: HumanAddr,
        terraswap_factory: HumanAddr,
    }
}

{% endtab %}

{% tab title="JSON" %}

{
  "post_initialize": {
    "commission_collector": "terra1...",
    "mint_contract": "terra1...",
    "mirror_token": "terra1...",
    "oracle_contract": "terra1...",
    "owner": "terra1...",
    "staking_contract": "terra1...",
    "terraswap_factory": "terra1..."
  }
}

{% endtab %} {% endtabs %}

Key Type Description
commission_collector HumanAddr Contract address of Mirror Collector
mint_contract HumanAddr Contract address of Mirror Mint
mirror_token HumanAddr Contract address of Mirror Token (MIR)
oracle_contract HumanAddr Contract address of Mirror Oracle
**owner HumanAddr Address of the owner of Mirror Factory
staking_contract HumanAddr Contract address of Mirror Staking
terraswap_factory HumanAddr Contract address of Terraswap Factory

UpdateConfig

Updates the configuration for the contract. Can only be issued by the owner.

{% tabs %} {% tab title="Rust" %}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum HandleMsg {
    UpdateConfig {
        owner: Option<HumanAddr>,
        token_code_id: Option<u64>,
        distribution_schedule: Option<Vec<(u64, u64, Uint128)>>
    }
}

{% endtab %}

{% tab title="JSON" %}

{
  "update_config": {
    "owner": "terra1...",
    "token_code_id": 8,
    "distribution_schedule": [
      [3600, 7200, "1000000"],
      [7200, 10800, "1000000"]
    ]
  }
}

{% endtab %} {% endtabs %}

Key Type Description
owner* HumanAddr Address of the owner of Mirror Factory
token_code_id* u64 Code ID for CW20 contract for generating new mAssets
**distribution_schedule* Vec<(u64, u64, Uint128)> New distribution schedule

* = optional

UpdateWeight

Updates the weight parameter of a specific token.

{% tabs %} {% tab title="Rust" %}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum HandleMsg {
 UpdateWeight {
        asset_token: HumanAddr,
        weight: u32,
    }

{% endtab %}

{% tab title="JSON" %}

{
    "update_weight": {
        "asset_token": "terra1...",
        "weight": 8
    }
}

{% endtab %} {% endtabs %}

Name Type Description
asset_token HumanAddr Contract address of mAsset token
weight u32 Ratio of MIR token reward received by this asset in comparison to other tokens

Whitelist

Introduces a new mAsset to the protocol and creates markets on Terraswap. This process will:

  • Instantiate the mAsset contract as a new Terraswap CW20 token
  • Register the mAsset with Mirror Oracle and Mirror Mint
  • Create a new Terraswap Pair for the new mAsset against TerraUSD
  • Instantiate the LP Token contract associated with the pool as a new Terraswap CW20 token
  • Register the LP token with the Mirror Staking contract

{% tabs %} {% tab title="Rust" %}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum HandleMsg {
    Whitelist {
        name: String,
        oracle_feeder: HumanAddr,
        params: Params,
        symbol: String,
    }
}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct Params {
    pub auction_discount: Decimal,
    pub min_collateral_ratio: Decimal,
    pub weight: Option<u32>,
    pub mint_period: Option<u64>,
    pub min_collateral_ratio_after_ipo: Option<Decimal>,
    pub pre_ipo_price: Option<Decimal>,
}

{% endtab %}

{% tab title="JSON" %}

{
  "whitelist": {
    "name": "Mirrored Apple Derivative",
    "oracle_feeder": "terra1...",
    "params": {
      "auction_discount": "0.2",
      "min_collateral_ratio": "1.5",
    },
    "symbol": "mAAPL"
  }
}

{% endtab %} {% endtabs %}

Key Type Description
name String Name of new asset to be whitelisted
oracle_feeder HumanAddr Address of Oracle Feeder for mAsset
params Params mAsset parameters to be registered
symbol String mAsset symbol (ex: mAAPL)

mAsset Params

Key Type Description
auction_discount Decimal Liquidation discount for purchasing CDP's collateral
min_collateral_ratio Decimal Minimum C-ratio for CDPs that mint the mAsset
weight* u32 Ratio of MIR token reward received by this asset in comparison to other tokens
mint_period* u64 Time period after asset creation in which minting is enabled (Seconds)
min_collateral_ratio_after_ipo* Decimal min_collateral_ratio to be applied to this asset after IPO
pre_ipo_price* Decimal Fixed price used to mint Pre-IPO asset during mint_period

*= optional (Only added for Pre-IPO asset whitelisting)

TokenCreationHook

(INTERNAL)

Called after mAsset token contract is created in the Whitelist process. **Why this is necessary

{% tabs %} {% tab title="Rust" %}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum HandleMsg {
    TokenCreationHook {
        oracle_feeder: HumanAddr,
    }
}

{% endtab %}

{% tab title="JSON" %}

{
  "token_creation_hook": {
    "oracle_feeder": "terra1..."
  }
}

{% endtab %} {% endtabs %}

Key Type Description
oracle_feeder HumanAddr Address of Oracle Feeder for mAsset

TerraswapCreationHook

(INTERNAL)

Called after mAsset token contract is created in the Whitelist process.

{% tabs %} {% tab title="Rust" %}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct enum HandleMsg {
    TerraswapCreationHook {
        asset_token: HumanAddr,
    }
}

{% endtab %}

{% tab title="JSON" %}

{
  "terraswap_creation_hook": {
    "asset_token": "terra1..."
  }
}

{% endtab %} {% endtabs %}

Key Type Description
asset_token HumanAddr Contract address of mAsset token

PassCommand

Calls the contract specified with the message to execute. Used for invoking functions on other Mirror Contracts since Mirror Factory is defined to be the owner. To be controlled through governance.

{% tabs %} {% tab title="Rust" %}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum HandleMsg {
    PassCommand {
        contract_addr: HumanAddr,
        msg: Binary,
    }
}

{% endtab %}

{% tab title="JSON" %}

{
  "pass_command": {
    "contract_addr": "terra1...",
    "msg": "eyAiZXhlY3V0ZV9tc2ciOiAiYmxhaCBibGFoIiB9"
  }
}

{% endtab %} {% endtabs %}

Key Type Description
contract_addr HumanAddr Contract address of contract to call
msg Binary Base64-encoded JSON of ExecuteMsg

Distribute

Mints the appropriate amount of new MIR tokens as reward for LP stakers by sends the newly minted tokens to the Mirror Staking contract to be distributed to its stakers. Can be called by anyone at any time to trigger block reward distribution for LP stakers.

The contract keeps track of the last height at which Distribute was called for a specific asset, and uses it to calculate the amount of new assets to mint for the blocks occurred in the interval between.

{% tabs %} {% tab title="Rust" %}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum HandleMsg {
    Distribute {}
}

{% endtab %}

{% tab title="JSON" %}

{
  "distribute": {}
}

{% endtab %} {% endtabs %}

RevokeAsset

(Feeder Operation)
Used when delisting occurs for a specific mAsset.

  • mAsset is unregistered from MIR reward pool
  • Fixes the oracle price at end_price for mint contract operation

{% tabs %} {% tab title="Rust" %}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum HandleMsg {
    RevokeAsset {
        asset_token: HumanAddr,
        end_price: Decimal,
    }

{% endtab %}

{% tab title="JSON" %}

{
    "revoke_asset": {
        "asset_token": "terra1...",
        "end_price": "123.456789"
    }
}

{% endtab %} {% endtabs %}

Name Type Description
asset_token HumanAddr Contract address of mAsset token
end_price Decimal Final price to freeze revoked mAsset

MigrateAsset

Can be issued by the oracle feeder of an mAsset to trigger the mAsset migration procedure.

{% tabs %} {% tab title="Rust" %}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum HandleMsg {
    MigrateAsset {
        end_price: Decimal,
        from_token: HumanAddr,
        name: String,
        symbol: String,
    }
}

{% endtab %}

{% tab title="JSON" %}

{
  "migrate_asset": {
    "end_price": "123.456789",
    "asset_token": "terra1...",
    "name": "...",
    "symbol": "..."
  }
}

{% endtab %} {% endtabs %}

Key Type Description
end_price Decimal Freezes the oracle price of mAsset at this value (Denominated in UST)
from_token HumanAddr Contract address of mAsset to migrate
name String Name of the new asset post-migration
symbol String Symbol for the new asset post-migration

QueryMsg

Config

Get the Mirror Factory configuration.

{% tabs %} {% tab title="Rust" %}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
    Config {}
}

Response

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct ConfigResponse {
    pub owner: HumanAddr,
    pub mirror_token: HumanAddr,
    pub mint_contract: HumanAddr,
    pub staking_contract: HumanAddr,
    pub commission_collector: HumanAddr,
    pub oracle_contract: HumanAddr,
    pub terraswap_factory: HumanAddr,
    pub token_code_id: u64,
    pub base_denom: String,
    pub genesis_time: u64,
    pub distribution_schedule: Vec<(u64, u64, Uint128)>,
}
Key Type Description
owner HumanAddr Contract address of mAsset token
mirror_token HumanAddr Final price to freeze revoked mAsset
mint_contract HumanAddr Contract address of Mirror Mint
staking_contract HumanAddr Contract address of Mirror Oracle
commission_collector HumanAddr Contract address of Mirror Collector
oracle_contract HumanAddr Contract address of Mirror Oracle
terraswap_factory HumanAddr Contract address of Terraswap Factory
token_code_id u64 Code ID for CW20 contract for generating new mAssets
base_denom String Native token denom for Terraswaap pairs (TerraUSD)
genesis_time u64 Block height which the Factory contract was instantiated
distribution_schedule Vec<(u64, u64, Uint128)> Distribution schedule for the minting of new MIR tokens. Each entry consists of: - start time (seconds) - end time (seconds) distribution amount for the interval Determines the total amount of new MIR tokens minted as rewards for LP stakers over the interval [start time, end time].
{% endtab %}

{% tab title="JSON" %}

{
  "config": {}
}

Response

{
    "config_response": {
        "owner": "terra1..."
        "mirror_token": "terra1...",
        "mint_contract": "terra1...",
        "staking_contract": "terra1...",
        "commission_collector": "terra1...",
        "oracle_contract": "terra1...",
        "terraswap_factory": "terra1...",
        "token_code_id": 8,
        "base_denom": "uusd",
        "genesis_time": 1000000,
        "distribution_schedule": [
            [3600, 7200, "1000000"],
            [7200, 10800, "1000000"]
        ]
    }
}  
Key Type Description
owner HumanAddr Contract address of mAsset token
mirror_token HumanAddr Final price to freeze revoked mAsset
mint_contract HumanAddr Contract address of Mirror Mint
staking_contract HumanAddr Contract address of Mirror Oracle
commission_collector HumanAddr Contract address of Mirror Collector
oracle_contract HumanAddr Contract address of Mirror Oracle
terraswap_factory HumanAddr Contract address of Terraswap Factory
token_code_id u64 Code ID for CW20 contract for generating new mAssets
base_denom String Native token denom for Terraswaap pairs (TerraUSD)
genesis_time u64 Block height which the Factory contract was instantiated
distribution_schedule Vec<(u64, u64, Uint128)> Distribution schedule for the minting of new MIR tokens. Each entry consists of: start time (seconds) end time (seconds) distribution amount for the interval Determines the total amount of new MIR tokens minted as rewards for LP stakers over the interval [start time, end time].
{% endtab %}
{% endtabs %}

DistributionInfo

Get the distribution schedules for MIR token.

{% tabs %} {% tab title="Rust" %}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
    DistributionInfo {}
}
Key Type Description
asset_token HumanAddr Contract address of asset token

Response

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct DistributionInfoResponse {
    pub weights: Vec<(HumanAddr, u32)>,
    pub last_distributed: u64,
}
Key Type Description
weights Vec<(HumanAddr, u32)> List of reward weight assigned to each mAsset. Each entry consists of: - Token contract address - weight
last_distributed u64 Block height of the most recent reward distribution
{% endtab %}

{% tab title="JSON" %}

{
  "distribution_info": {}
}
Key Type Description
asset_token HumanAddr Contract address of asset token

Response

{
    "distribution_info_response": {
        "weights": [
            ["terra1...", 8],
            ["terra1...", 8]
        ],
        "last_distributed": 3600
    }
}
Key Type Description
weights Vec<(HumanAddr, u32)> List of reward weight assigned to each mAsset. Each entry consists of: - Token contract address - weight
last_distributed u64 Block height of the most recent reward distribution
{% endtab %}
{% endtabs %}