Skip to content

Commit

Permalink
feat: let wasm contracts query exchange rates
Browse files Browse the repository at this point in the history
  • Loading branch information
matthiasmatt committed Jul 14, 2023
1 parent b865dd3 commit cf74614
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 31 deletions.
26 changes: 13 additions & 13 deletions x/wasm/binding/cw_struct/cw_query.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,16 @@ import (
// - https://github.com/NibiruChain/cw-nibiru/blob/90df123f8d32d47b5b280ec6ae7dde0f9dbf2787/contracts/bindings-perp/src/query.rs
type BindingQuery struct {
// bindings-perp NibiruQuery enum types
Reserves *ReservesRequest `json:"reserves,omitempty"`
AllMarkets *AllMarketsRequest `json:"all_markets,omitempty"`
BasePrice *BasePriceRequest `json:"base_price,omitempty"`
Positions *PositionsRequest `json:"positions,omitempty"`
Position *PositionRequest `json:"position,omitempty"`
PremiumFraction *PremiumFractionRequest `json:"premium_fraction,omitempty"`
Metrics *MetricsRequest `json:"metrics,omitempty"`
ModuleAccounts *ModuleAccountsRequest `json:"module_accounts,omitempty"`
PerpParams *PerpParamsRequest `json:"module_params,omitempty"`
OracleExchangeRate *OracleExchangeRate `json:"oracle_exchange_rate,omitempty"`
Reserves *ReservesRequest `json:"reserves,omitempty"`
AllMarkets *AllMarketsRequest `json:"all_markets,omitempty"`
BasePrice *BasePriceRequest `json:"base_price,omitempty"`
Positions *PositionsRequest `json:"positions,omitempty"`
Position *PositionRequest `json:"position,omitempty"`
PremiumFraction *PremiumFractionRequest `json:"premium_fraction,omitempty"`
Metrics *MetricsRequest `json:"metrics,omitempty"`
ModuleAccounts *ModuleAccountsRequest `json:"module_accounts,omitempty"`
PerpParams *PerpParamsRequest `json:"module_params,omitempty"`
OracleExchangeRates *OracleExchangeRates `json:"oracle_exchange_rates,omitempty"`
}

type ReservesRequest struct {
Expand Down Expand Up @@ -225,10 +225,10 @@ type PerpParams struct {
WhitelistedLiquidators []string `json:"whitelisted_liquidators"`
}

type OracleExchangeRate struct {
type OracleExchangeRates struct {
Pair string `json:"pair"`
}

type OracleExchangeRateResponse struct {
ExchangeRate sdk.Dec `json:"exchange_rate"`
type OracleExchangeRatesResponse struct {
Rates map[string]sdk.Dec `json:"rates"`
}
28 changes: 13 additions & 15 deletions x/wasm/binding/querier.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,8 @@ func CustomQuerier(qp QueryPlugin) func(ctx sdk.Context, request json.RawMessage
cwResp, err := qp.Perp.ModuleParams(ctx, cwReq)
return qp.ToBinary(cwResp, err, cwReq)

case wasmContractQuery.OracleExchangeRate != nil:
cwReq := wasmContractQuery.OracleExchangeRate
case wasmContractQuery.OracleExchangeRates != nil:
cwReq := wasmContractQuery.OracleExchangeRates
cwResp, err := qp.Oracle.ExchangeRate(ctx, cwReq)
return qp.ToBinary(cwResp, err, cwReq)

Expand Down Expand Up @@ -316,20 +316,18 @@ type OracleQuerier struct {
}

func (oracleExt *OracleQuerier) ExchangeRate(
ctx sdk.Context, cwReq *cw_struct.OracleExchangeRate,
) (*cw_struct.OracleExchangeRateResponse, error) {
pair, err := asset.TryNewPair(cwReq.Pair)

if err != nil {
return nil, wasmvmtypes.ToSystemError(errors.New("invalid pair"))
}

queryExchangeRateRequest := oracletypes.QueryExchangeRateRequest{
Pair: pair,
ctx sdk.Context, cwReq *cw_struct.OracleExchangeRates,
) (*cw_struct.OracleExchangeRatesResponse, error) {
queryExchangeRatesRequest := oracletypes.QueryExchangeRatesRequest{}
queryExchangeRates, err := oracleExt.oracle.ExchangeRates(ctx, &queryExchangeRatesRequest)

// Transform Tuple to Map
exchangeRates := make(map[string]sdk.Dec)
for _, exchangeRate := range queryExchangeRates.ExchangeRates {
exchangeRates[exchangeRate.Pair.String()] = exchangeRate.ExchangeRate
}
queryExchangeRate, err := oracleExt.oracle.ExchangeRate(ctx, &queryExchangeRateRequest)

return &cw_struct.OracleExchangeRateResponse{
ExchangeRate: queryExchangeRate.ExchangeRate,
return &cw_struct.OracleExchangeRatesResponse{
Rates: exchangeRates,
}, err
}
7 changes: 4 additions & 3 deletions x/wasm/binding/querier_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -225,15 +225,16 @@ func (s *TestSuiteQuerier) TestQueryAllMarkets() {
// Integration test for BindingQuery::AllMarkets against real contract
func (s *TestSuiteQuerier) TestQueryExchangeRate() {
bindingQuery := cw_struct.BindingQuery{
OracleExchangeRate: &cw_struct.OracleExchangeRate{Pair: "ueth:unusd"},
OracleExchangeRates: &cw_struct.OracleExchangeRates{Pair: "ueth:unusd"},
}
bindingResp := new(cw_struct.OracleExchangeRateResponse)
bindingResp := new(cw_struct.OracleExchangeRatesResponse)

respBz, err := DoCustomBindingQuery(
s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp,
)
s.Require().NoErrorf(err, "resp bytes: %s", respBz)
s.Assert().EqualValues(bindingResp.ExchangeRate, sdk.NewDec(10))

s.Assert().EqualValues(bindingResp.Rates["ueth:unusd"], sdk.NewDec(1000))
}

// func (s *TestSuiteQuerier) TestQueryBasePrice() {
Expand Down
Binary file modified x/wasm/binding/wasmbin/bindings_perp.wasm
Binary file not shown.

0 comments on commit cf74614

Please sign in to comment.