0g-chain/x/hard/spec/03_messages.md

3.6 KiB

Messages

There are three messages in the hard module. Deposit allows users to deposit assets to the hard module. In version 2, depositors will be able to use their deposits as collateral to borrow from hard. Withdraw removes assets from the hard module, returning them to the user. Claim allows users to claim earned HARD tokens.

// MsgDeposit deposit collateral to the hard module.
type MsgDeposit struct {
  Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
  Amount    sdk.Coins      `json:"amount" yaml:"amount"`
}

This message creates a Deposit object if one does not exist, or updates an existing one, as well as creating/updating the necessary indexes and synchronizing any outstanding interest. The Amount of coins is transferred from Depositor to the hard module account. The global variable for TotalSupplied is updated.

// MsgWithdraw withdraw from the hard module.
type MsgWithdraw struct {
  Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
  Amount    sdk.Coins      `json:"amount" yaml:"amount"`
}

This message decrements a Deposit object, or deletes one if the Amount specified is greater than or equal to the total deposited amount, as well as creating/updating the necessary indexes and synchronizing any outstanding interest. For example, a message which requests to withdraw 100xyz tokens, if Depositor has only deposited 50xyz tokens, will withdraw the full 50xyz tokens. The Amount of coins, or the current deposited amount, whichever is lower, is transferred from the hard module account to Depositor. The global variable for TotalSupplied is updated.

// MsgBorrow borrows funds from the hard module.
type MsgBorrow struct {
  Borrower sdk.AccAddress `json:"borrower" yaml:"borrower"`
  Amount   sdk.Coins      `json:"amount" yaml:"amount"`
}

This message creates a Borrow object is one does not exist, or updates an existing one, as well as creating/updating the necessary indexes and synchronizing any outstanding interest. The Amount of coins is transferred from the hard module account to Depositor. The global variable for TotalBorrowed is updated.

// MsgRepay repays funds to the hard module.
type MsgRepay struct {
	Sender sdk.AccAddress `json:"sender" yaml:"sender"`
	Owner  sdk.AccAddress `json:"owner" yaml:"owner"`
	Amount sdk.Coins      `json:"amount" yaml:"amount"`
}

This message decrements a Borrow object, or deletes one if the Amount specified is greater than or equal to the total borrowed amount, as well as creating/updating the necessary indexes and synchronizing any outstanding interest. For example, a message which requests to repay 100xyz tokens, if Owner has only deposited 50xyz tokens, the Sender will repay the full 50xyz tokens. The Amount of coins, or the current borrow amount, is transferred from Sender. The global variable for TotalBorrowed is updated.

// MsgLiquidate attempts to liquidate a borrower's borrow
type MsgLiquidate struct {
  Keeper   sdk.AccAddress `json:"keeper" yaml:"keeper"`
  Borrower sdk.AccAddress `json:"borrower" yaml:"borrower"`
}

This message deletes Borrower's Deposit and Borrow objects if they are below the required LTV ratio. The keeper (the sender of the message) is rewarded a portion of the borrow position, according to the KeeperReward governance parameter. The coins from the Deposit are then sold at auction (see auction module), which any remaining tokens returned to Borrower. After being liquidated, Borrower no longer must repay the borrow amount. The global variables for TotalSupplied and TotalBorrowed are updated.