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

Rust
JSON
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], [], ...]
}
JSON
{
"token_code_id": 8,
"base_denom": "uusd",
"distribution_schedule": [
[3600, 7200, "1000000"],
[7200, 10800, "1000000"]
]
}

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.

Rust
JSON
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,
}
}
JSON
{
"post_initialize": {
"commission_collector": "terra1...",
"mint_contract": "terra1...",
"mirror_token": "terra1...",
"oracle_contract": "terra1...",
"owner": "terra1...",
"staking_contract": "terra1...",
"terraswap_factory": "terra1..."
}
}

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.

Rust
JSON
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)>>
}
}
JSON
{
"update_config": {
"owner": "terra1...",
"token_code_id": 8,
"distribution_schedule": [
[3600, 7200, "1000000"],
[7200, 10800, "1000000"]
]
}
}

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.

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

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

Rust
JSON
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>,
}
JSON
{
"whitelist": {
"name": "Mirrored Apple Derivative",
"oracle_feeder": "terra1...",
"params": {
"auction_discount": "0.2",
"min_collateral_ratio": "1.5",
},
"symbol": "mAAPL"
}
}

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

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

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.

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

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.

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

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.

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

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

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

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.

Rust
JSON
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,
}
}
JSON
{
"migrate_asset": {
"end_price": "123.456789",
"asset_token": "terra1...",
"name": "...",
"symbol": "..."
}
}

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.

Rust
JSON
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].

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].

DistributionInfo

Get the distribution schedules for MIR token.

Rust
JSON
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

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