The Mint Contract implements the logic for Collateralized Debt Positions (CDPs), through which users can mint or short new mAsset tokens against their deposited collateral (UST or mAssets).
Current prices of collateral and minted mAssets are read from the Collateral Oracle and Oracle Contract to determine the C-ratio of each CDP. Depending on which the type of asset used as the collateral, the minimum collateral ratio of each CDP may change. Collateral Oracle is responsible for feeding prices and collateral ratio multiplier
of each collateral asset type.
The Mint Contract also contains the logic for liquidating CDPs with C-ratios below the minimum for their minted mAsset through auction.
InitMsg
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
pub struct InitMsg {
pub owner : HumanAddr ,
pub oracle : HumanAddr ,
pub collector : HumanAddr ,
pub collateral_oracle : HumanAddr ,
pub staking : HumanAddr ,
pub terraswap_factory : HumanAddr ,
pub lock : HumanAddr ,
pub base_denom : String ,
pub token_code_id : u64 ,
pub protocol_fee_rate : Decimal ,
}
Copy {
"owner" : "terra1..." ,
"oracle" : "terra1..." ,
"collector" : "terra1..." ,
"collateral_oracle" : "terra1..." ,
"staking" : "terra1..." ,
"terraswap_factory" : "terra1..." ,
"lock" : "terra1..." ,
"base_denom" : "uusd" ,
"token_code_id" : 8 ,
"protocol_fee_rate" : "0.123
}
HandleMsg
Receive
Can be called during a CW20 token transfer when the Mint contract is the recipient. Allows the token transfer to execute a Receive Hook as a subsequent action within the same transaction.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum HandleMsg {
Receive {
amount : Uint128 ,
sender : HumanAddr ,
msg : Option < Binary >,
}
}
Copy {
"receive" : {
"amount" : "10000000" ,
"sender" : "terra1..." ,
"msg" : "eyAiZXhlY3V0ZV9tc2ciOiAiYmxhaCBibGFoIiB9"
}
}
* = optional
UpdateConfig
Updates the configuration of the Mint contract. Can only be issued by the owner of the Mint contract.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum HandleMsg {
UpdateConfig {
owner : Option < HumanAddr >,
oracle : Option < HumanAddr >,
collector : Option < HumanAddr >,
collateral_oracle : Option < HumanAddr >,
terraswap_factory : Option < HumanAddr >,
lock : Option < HumanAddr >,
token_code_id : Option < u64 >,
protocol_fee_rate : Option < Decimal >,
}
}
Copy {
"update_config" : {
"owner" : "terra1..." ,
"oracle" : "terra1..." ,
"collector" : "terra1..." ,
"collateral_oracle" : "terra1..." ,
"staking" : "terra1..." ,
"terraswap_factory" : "terra1..." ,
"lock" : "terra1..." ,
"token_code_id" : 8 ,
"protocol_fee_rate" : "0.123" ,
}
}
* = optional
UpdateAsset
Updates mAsset's minting and liquidation parameters. Can only be issued by the owner of the Mint contract.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum HandleMsg {
UpdateAsset {
asset_info : AssetInfo ,
auction_discount : Option < Decimal >,
min_collateral_ratio : Option < Decimal >,
ipo_params : Option < IPOParams >
}
}
#[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
pub struct IPOParams {
pub mint_end : u64 ,
pub pre_ipo_price : Decimal ,
pub min_collateral_ratio_after_ipo : Decimal ,
}
Copy {
"update_asset" : {
"asset_info" : {
"token" : {
"contract_addr" : "terra1..."
}
} ,
"auction_discount" : "123.456789" ,
"min_collateral_ratio" : "123.456789" ,
"ipo_params" : {
"mint_end" : "10000000" ,
"pre_ipo_price" : "7.77" ,
"min_collateral_ratio_after_ipo" : "1.5"
}
}
}
* = optional
IPOParams
RegisterAsset
Registers a new mAsset to be mintable.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum HandleMsg {
RegisterAsset {
asset_token : HumanAddr ,
auction_discount : Decimal ,
min_collateral_ratio : Decimal ,
ipo_params : Option < IPOParams >
},
Copy {
"register_asset" : {
"asset_token" : "terra1..." ,
"auction_discount" : "0.2" ,
"min_collateral_ratio" : "1.5" ,
"ipo_params" : {
"mint_end" : "10000000" ,
"pre_ipo_price" : "7.77" ,
"min_collateral_ratio_after_ipo" : "1.5"
}
}
*= optional
TriggerIPO
Asset feeder is allowed to trigger IPO event on pre-IPO asset to have the following characters:
Oracle feeder now feeds real-time price of the underlying asset
The asset becomes mintable again, even after the mint_period
has ended
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum HandleMsg {
TriggerIPO {
asset_token : HumanAddr ,
},
Copy {
"trigger_ipo" : {
"asset_token" : "terra1..."
}
}
RegisterMigration
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum HandleMsg {
RegisterMigration {
asset_token : HumanAddr ,
end_price : Decimal ,
}
}
Copy {
"register_migration" : {
"asset_token" : "terra1..." ,
"end_price" : "123.456789"
}
}
OpenPosition
Used for creating a new CDP with TerraUSD collateral. For creating a CDP using mAsset collateral, you need to use the Receive Hook variant .
Opens a new CDP with an initial deposit of collateral. The user specifies the target minted mAsset for the CDP, and sets the desired initial collateralization ratio, which must be greater or equal than the minimum for the mAsset. The initial amount of minted mAsset tokens are determined by:
Copy let mint_amount = collateral . amount
* collateral_price
* reverse_decimal (asset_price)
* reverse_decimal (collateral_ratio);
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum HandleMsg {
OpenPosition {
collateral : Asset ,
asset_info : AssetInfo ,
collateral_ratio : Decimal ,
short_params : Option < ShortParams >,
}
}
pub struct Asset {
pub info : AssetInfo ,
pub amount : Uint128 ,
}
#[serde(rename_all = "snake_case" )]
pub enum AssetInfo {
Token { contract_addr : HumanAddr },
NativeToken { denom : String },
}
Copy {
"open_position" : {
"collateral" : {
"info" : {
"token" : {
"contract_addr" : "terra1..."
}
} ,
"amount" : "1000000"
} ,
"asset_info" : {
"token" : {
"contract_addr" : "terra1..."
}
} ,
"collateral_ratio" : "1.5" ,
"short_params" : {
"belief_price" : "123.456789" ,
"max_spread" : "0.1"
}
}
}
*= optional
ShortParams
If optional short_params
is added, mint contract will immediately sell the minted mAssets andsLP
tokens will be minted and sent to the user. The UST obtained from the operation will be added to the user's lock position in lock contract .
Rust
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
pub struct ShortParams {
pub belief_price : Option < Decimal >,
pub max_spread : Option < Decimal >,
}
*=optional
Deposit
Used for depositing TerraUSD collateral. For depositing mAsset collateral to a CDP, you need to use the Receive Hook variant .
Deposits additional collateral to an existing CDP to raise its C-ratio.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum HandleMsg {
Deposit {
collateral : Asset ,
position_idx : Uint128 ,
}
}
Copy {
"deposit" : {
"collateral" : {
"info" : {
"native_token" : {
"denom" : "uusd" ,
}
} ,
"amount" : "1000000"
} ,
"position_idx" : "10000000"
}
}
Withdraw
Withdraws collateral from the CDP. Cannot withdraw more than an amount that would drop the CDP's C-ratio below the minted mAsset's mandated minimum.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum HandleMsg {
Withdraw {
collateral : Asset ,
position_idx : Uint128 ,
}
}
Copy {
"withdraw" : {
"collateral" : {
"info" : {
"token" : {
"contract_address" : "terra1..."
}
} ,
"amount" : "1000000"
} ,
"position_idx" : "10000000"
}
}
Mint
Mints new mAssets against an existing CDP. Cannot mint more than what would bring the CDP's C-ratio below its minted mAsset's mandated minimum.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum HandleMsg {
Mint {
asset : Asset ,
position_idx : Uint128 ,
short_params : Option < ShortParams >,
}
}
Copy {
"mint" : {
"position_idx" : "10000000" ,
"asset" : {
"info" : {
"token" : {
"contract_address" : "terra1..."
}
} ,
"amount" : "1000000"
} ,
"short_params" : {
"belief_price" : "123.456789" ,
"max_spread" : "0.1"
}
}
}
Receive Hooks
OpenPosition
Issued when a user sends mAsset tokens to the Mint contract.
Uses the sent amount to create a new CDP.
Used for creating a new CDP with mAsset collateral. For creating a CDP using TerraUSD collateral, you need to use the HandleMsg variant.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum Cw20HookMsg {
OpenPosition {
asset_info : AssetInfo ,
collateral_ratio : Decimal ,
short_params : Option < ShortParams >,
}
}
Copy {
"open_position" : {
"asset_info" : {
"token" : {
"contract_addr" : "terra1..."
}
} ,
"collateral_ratio" : "123.456789" ,
"short_params" : {
"belief_price" : "123.456789" ,
"max_spread" : "0.1"
}
}
}
Deposit
Issued when a user sends mAsset tokens to the Mint contract.
Deposits the amount as collateral to an open CDP.
Used for depositing mAsset collateral. For depositing TerraUSD collateral to a CDP, you need to use the HandleMsg variant .
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum Cw20HookMsg {
Deposit {
position_idx : Uint128 ,
}
}
Copy {
"deposit" : {
"position_idx" : "10000000"
}
}
Burn
Issued when a user sends mAsset tokens to the Mint contract.
Burns the sent tokens against a CDP and reduces the C-ratio. If all outstanding minted mAsset tokens are burned, the position is closed and the collateral is returned.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum Cw20HookMsg {
Burn {
position_idx : Uint128 ,
}
}
Copy {
"burn" : {
"position_idx" : "10000000"
}
}
Auction
Issued when a user sends mAsset tokens to the Mint contract.
Purchases the collateral of a CDP subject to liquidation (whose C-ratio has fallen under its minted mAsset's minimum). The buyer cannot pay more than the CDP's current minted mAsset balance.
The discounted price for the collateral is calculated as follows:
Copy let discounted_price = price * ( 1 - config . auction_discount);
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum Cw20HookMsg {
Auction {
position_idx : Uint128 ,
}
}
Copy {
"auction" : {
"position_idx" : "10000000"
}
}
QueryMsg
Config
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum QueryMsg {
Config {}
}
Response
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
pub struct ConfigResponse {
pub owner : HumanAddr ,
pub oracle : HumanAddr ,
pub collector : HumanAddr ,
pub collateral_oracle : HumanAddr ,
pub staking : HumanAddr ,
pub terraswap_factory : HumanAddr ,
pub lock : HumanAddr ,
pub base_denom : String ,
pub token_code_id : u64 ,
pub protocol_fee_rate : Decimal ,
}
Response
Copy {
"config_response" : {
"owner" : "terra1..." ,
"oracle" : "terra1..." ,
"collector" : "terra1..." ,
"collateral_oracle" : "terra1..." ,
"staking" : "terra1..." ,
"terraswap_factory" : "terra1..." ,
"lock" : "terra1..." ,
"base_denom" : "uusd" ,
"token_code_id" : 8 ,
"protocol_fee_rate" : "123.456789"
}
}
AssetConfig
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum QueryMsg {
AssetConfig {
asset_token : HumanAddr ,
}
}
Response
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
pub struct AssetConfigResponse {
pub token : HumanAddr ,
pub auction_discount : Decimal ,
pub min_collateral_ratio : Decimal ,
pub end_price : Option < Decimal >,
pub ipo_params : Option < IPOParams >,
}
*= optional
Copy {
"asset_config" : {
"asset_info" : {
"token" : {
"contract_addr" : "terra1..."
}
}
}
}
Response
Copy {
"asset_config_response" : {
"token" : "terra1..." ,
"auction_discount" : "0.2" ,
"min_collateral_ratio" : "1.5" ,
"end_price" : "123.456789" ,
"ipo_params" : {
"mint_end" : "10000000" ,
"pre_ipo_price" : "7.77" ,
"min_collateral_ratio_after_ipo" : "1.5"
}
}
}
*= optional
Position
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum QueryMsg {
Position {
position_idx : Uint128 ,
}
}
Response
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
pub struct PositionResponse {
pub idx : Uint128 ,
pub owner : HumanAddr ,
pub collateral : Asset ,
pub asset : Asset ,
pub is_short : bool ,
}
Copy {
"position" : {
"position_idx" : "10000000"
}
}
Response
Copy {
"position_response" : {
"idx" : "100" ,
"owner" : "terra1..." ,
"collateral" : {
"info" : {
"token" : {
"contract_addr" : "terra1..."
}
},
"amount" : "1000000"
},
"asset" : {
"info" : {
"token" : {
"contract_addr" : "terra1..."
}
},
"amount" : "1000000"
},
"is_short" : true
}
}
NextPositionIdx
Returns the most recent position ID +1.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum QueryMsg {
NextPositionIdx {}
}
Response
Copy #[derive( Serialize , Deserialize , Clone , PartialEq , JsonSchema , Debug , Default )]
pub struct NextPositionIdxResponse {
pub next_position_idx : Uint128 ,
}
Copy {
"next_position_idx" : {}
}
Response
Copy {
"next_position_idex_response" : {
"next_position_idx" : "1000000"
}
}
Positions
Rust JSON
Copy #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
Positions {
limit: Option<u32>,
owner_addr: Option<HumanAddr>,
asset_token: Option<HumanAddr>,
start_after: Option<Uint128>,
}
}
Copy {
"positions": {
"limit": 8,
"owner_addr": "terra1...",
"start_after": "10000000"
}
}
* = optional