The bETH Custody contract is where supplied bETH collaterals are managed. Users can make collateral deposits and withdrawals to and from this contract. The Custody contract is also responsible for claiming bETH rewards and converting them to Terra stablecoins, which is then sent to the Overseer contract for eventual distribution.
Contract State
Config
Stores information about the bETH Custody contract's config.
BorrowerInfo
Stores information about a borrower.
InstantiateMsg
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub struct InstantiateMsg {
pub owner : String ,
pub collateral_token : String ,
pub overseer_contract : String ,
pub market_contract : String ,
pub reward_contract : String ,
pub liquidation_contract : String ,
pub stable_denom : String ,
pub basset_info : BAssetInfo ,
}
#[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
pub struct BAssetInfo {
pub name : String ,
pub symbol : String ,
pub decimals : u8 ,
}
Copy {
"owner" : "terra1..." ,
"collateral_token" : "terra1..." ,
"overseer_contract" : "terra1..." ,
"market_contract" : "terra1..." ,
"reward_contract" : "terra1..." ,
"liquidation_contract" : "terra1..." ,
"stable_denom" : "uusd" ,
"basset_info" : {
"name" : "Bonded ETH" ,
"symbol" : "BETH" ,
"decimals" : 6
}
}
ExecuteMsg
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 ExecuteMsg {
Receive {
sender : String ,
amount : Uint128 ,
msg : Binary ,
}
}
Copy {
"receive" : {
"sender" : "terra1..." ,
"amount" : "10000000" ,
"msg" : "eyAiZXhlY3V0ZV9tc2ciOiAiYmluYXJ5IiB9"
}
}
UpdateConfig
Updates the configuration of the Custody contract.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum ExecuteMsg {
UpdateConfig {
owner : Option < String >,
liquidation_contract : Option < String >,
}
}
Copy {
"update_config" : {
"owner" : "terra1..." ,
"liquidation_contract" : "terra1..."
}
}
* = optional
[Internal] LockCollateral
Locks borrower's collateral to be used in their loan position, decreasing the amount of spendable collateral. Can only be issued by Overseer
.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum ExecuteMsg {
LockCollateral {
borrower : String ,
amount : Uint256 ,
}
}
Copy {
"lock_collateral" : {
"borrower" : "terra1..." ,
"amount" : "10000000"
}
}
[Internal] UnlockCollateral
Unlocks borrower's collateral from their loan position, increasing the amount of spendable collateral. Can only be issued by Overseer
.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum ExecuteMsg {
UnlockCollateral {
borrower : String ,
amount : Uint256 ,
}
}
Copy {
"unlock_collateral" : {
"borrower" : "terra1..." ,
"amount" : "10000000"
}
}
[Internal] DistributeRewards
Withdraws accrued rewards from the bETH Reward contract, swaps rewards to the appropriate stablecoin denomination (stable_denom
). Can only be issued by Overseer
.
Afterwards, distributes swapped rewards to depositors by sending swapped rewards to Market
. If the deposit rate during the last epoch is above the target deposit rate, then a portion of the rewards are set aside as a yield reserve, which are sent to Overseer
.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum ExecuteMsg {
DistributeRewards {}
}
Copy {
"distribute_rewards" : {}
}
[Internal] LiquidateCollateral
Liquidates specified amount of locked collateral. Can only be issued by Overseer
.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum ExecuteMsg {
LiquidateCollateral {
liquidator : String ,
borrower : String ,
amount : Uint256 ,
}
}
Copy {
"liquidate_collateral" : {
"liquidator" : "terra1..." ,
"borrower" : "terra1..." ,
"amount" : "100000000"
}
}
WithdrawCollateral
Collaterals have to be first unlocked in the Overseer before they can be withdrawn by the user.
Withdraws specified amount of spendable collateral. Withdraws all spendable collateral if the amount
field is not filled.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum ExecuteMsg {
WithdrawCollateral {
amount : Option < Uint256 >,
}
}
Copy {
"withdraw_collateral" : {
"amount" : "10000000"
}
}
* = optional
Receive Hooks
DepositCollateral
Deposited collaterals have to be locked in the Overseer before they can be utilized in a loan position.
Deposits collateral. Issued when a user sends bAsset tokens to the Custody contract.
Rust JSON
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum Cw20HookMsg {
DepositCollateral {}
}
Copy {
"deposit_collateral" : {}
}
QueryMsg
Config
Gets the contract configuration of the Custody contract.
Rust JSON
Request
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 : String ,
pub collateral_token : String ,
pub overseer_contract : String ,
pub market_contract : String ,
pub reward_contract : String ,
pub liquidation_contract : String ,
pub stable_denom : String ,
pub basset_info : BAssetInfo ,
}
#[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
pub struct BAssetInfo {
pub name : String ,
pub symbol : String ,
pub decimals : u8 ,
}
Request
Response
Copy {
"owner" : "terra1..." ,
"collateral_token" : "terra1..." ,
"overseer_contract" : "terra1..." ,
"market_contract" : "terra1..." ,
"reward_contract" : "terra1..." ,
"liquidation_contract" : "terra1..." ,
"stable_denom" : "uusd" ,
"basset_info" : {
"name" : "Bonded ETH" ,
"symbol" : "BETH" ,
"decimals" : 6
}
}
Borrower
Gets the collateral balance of the specified borrower.
Rust JSON
Request
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum QueryMsg {
Borrower {
address : String ,
}
}
Response
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
pub struct BorrowerResponse {
pub borrower : String ,
pub balance : Uint256 ,
pub spendable : Uint256 ,
}
Request
Copy {
"borrower" : {
"address" : "terra1..."
}
}
Response
Copy {
"borrower" : "terra1..." ,
"balance" : "1000000000" ,
"spendable" : "100000000"
}
Borrowers
Get the collateral balance of all borrowers.
Rust JSON
Request
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
#[serde(rename_all = "snake_case" )]
pub enum QueryMsg {
Borrowers {
start_after : Option < String >,
limit : Option < u32 >,
}
}
* = optional
Response
Copy #[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
pub struct BorrowersResponse {
pub borrowers : Vec < BorrowerResponse >,
}
#[derive( Serialize , Deserialize , Clone , Debug , PartialEq , JsonSchema )]
pub struct BorrowerResponse {
pub borrower : String ,
pub balance : Uint256 ,
pub spendable : Uint256 ,
}
Request
Copy {
"borrowers" : {
"start_after" : "terra1..." ,
"limit" : 8
}
}
* = optional
Response
Copy {
"borrowers" : [
{
"borrower" : "terra1..." ,
"balance" : "100000000" ,
"spendable" : "100000000"
},
{
"borrower" : "terra1..." ,
"balance" : "100000000" ,
"spendable" : "100000000"
}
]
}