terra/protocols/anchor/market.go

123 lines
3.4 KiB
Go

package anchor
import (
"context"
"github.com/galacticship/terra"
"github.com/galacticship/terra/cosmos"
"github.com/pkg/errors"
"github.com/shopspring/decimal"
)
type Market struct {
*terra.Contract
}
func NewMarket(querier *terra.Querier) (*Market, error) {
contract, err := terra.NewContract(querier, "terra1sepfj7s0aeg5967uxnfk4thzlerrsktkpelm5s")
if err != nil {
return nil, errors.Wrap(err, "init contract object")
}
return &Market{
contract,
}, nil
}
type BorrowerInfo struct {
InterestIndex decimal.Decimal
RewardIndex decimal.Decimal
LoanAmount decimal.Decimal
PendingRewards decimal.Decimal
}
func (m Market) BorrowerInfo(ctx context.Context, borrower cosmos.AccAddress) (BorrowerInfo, error) {
type query struct {
BorrowerInfo struct {
Borrower string `json:"borrower"`
} `json:"borrower_info"`
}
var q query
q.BorrowerInfo.Borrower = borrower.String()
type response struct {
Borrower string `json:"borrower"`
InterestIndex decimal.Decimal `json:"interest_index"`
RewardIndex decimal.Decimal `json:"reward_index"`
LoanAmount decimal.Decimal `json:"loan_amount"`
PendingRewards decimal.Decimal `json:"pending_rewards"`
}
var r response
err := m.QueryStore(ctx, q, &r)
if err != nil {
return BorrowerInfo{}, errors.Wrap(err, "querying store")
}
return BorrowerInfo{
InterestIndex: r.InterestIndex,
RewardIndex: r.RewardIndex,
LoanAmount: terra.UST.ValueFromTerra(r.LoanAmount),
PendingRewards: terra.ANC.ValueFromTerra(r.PendingRewards),
}, nil
}
type EpochState struct {
ExchangeRate decimal.Decimal
AUSTSupply decimal.Decimal
}
func (m Market) EpochState(ctx context.Context) (EpochState, error) {
var q struct {
EpochState struct{} `json:"epoch_state"`
}
type response struct {
ExchangeRate decimal.Decimal `json:"exchange_rate"`
AUSTSupply decimal.Decimal `json:"aterra_supply"`
}
var r response
err := m.QueryStore(ctx, q, &r)
if err != nil {
return EpochState{}, errors.Wrap(err, "querying store")
}
return EpochState{
ExchangeRate: r.ExchangeRate,
AUSTSupply: terra.AUST.ValueFromTerra(r.AUSTSupply),
}, nil
}
func (m Market) NewDepositUSTMessage(sender cosmos.AccAddress, amount decimal.Decimal) (cosmos.Msg, error) {
var q struct {
DepositStable struct{} `json:"deposit_stable"`
}
return terra.UST.NewMsgSendExecute(sender, m.Contract, amount, q)
}
func (m Market) NewRedeemAUSTMessage(sender cosmos.AccAddress, amount decimal.Decimal) (cosmos.Msg, error) {
var q struct {
RedeemStable struct{} `json:"redeem_stable"`
}
return terra.AUST.NewMsgSendExecute(sender, m.Contract, amount, q)
}
func (m Market) NewClaimRewardsMessage(sender cosmos.AccAddress) (cosmos.Msg, error) {
var q struct {
ClaimRewards struct{} `json:"claim_rewards"`
}
return m.NewMsgExecuteContract(sender, q)
}
func (m Market) NewBorrowStableMessage(sender cosmos.AccAddress, amount decimal.Decimal) (cosmos.Msg, error) {
var q struct {
BorrowStable struct {
BorrowAmount decimal.Decimal `json:"borrow_amount"`
} `json:"borrow_stable"`
}
q.BorrowStable.BorrowAmount = terra.UST.ValueToTerra(amount)
return m.NewMsgExecuteContract(sender, q)
}
func (m Market) NewRepayStableMessage(sender cosmos.AccAddress, amount decimal.Decimal) (cosmos.Msg, error) {
var q struct {
RepayStable struct{} `json:"repay_stable"`
}
return terra.UST.NewMsgSendExecute(sender, m.Contract, amount, q)
}