Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion proto/oracle/oracle.proto
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ message OracleTwap {
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
(gogoproto.nullable) = false
];
int64 lookbackSeconds = 3;
int64 lookback_seconds = 3;
}

message VotePenaltyCounter {
Expand Down
13 changes: 12 additions & 1 deletion wasmbinding/queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,24 @@ func (qp QueryPlugin) HandleOracleQuery(ctx sdk.Context, queryData json.RawMessa
case parsedQuery.ExchangeRates != nil:
res, err := qp.oracleHandler.GetExchangeRates(ctx)
if err != nil {
return nil, sdkerrors.Wrap(err, "Error while Exchange Rates")
return nil, sdkerrors.Wrap(err, "Error while getting Exchange Rates")
}
bz, err := json.Marshal(res)
if err != nil {
return nil, sdkerrors.Wrap(err, "Error encoding exchange rates as JSON")
}

return bz, nil
case parsedQuery.OracleTwaps != nil:
res, err := qp.oracleHandler.GetOracleTwaps(ctx, parsedQuery.OracleTwaps)
if err != nil {
return nil, sdkerrors.Wrap(err, "Error while getting Oracle Twaps")
}
bz, err := json.Marshal(res)
if err != nil {
return nil, sdkerrors.Wrap(err, "Error encoding oracle twaps as JSON")
}

return bz, nil
default:
return nil, wasmvmtypes.UnsupportedRequest{Kind: "Unknown Sei Oracle Query"}
Expand Down
20 changes: 0 additions & 20 deletions wasmbinding/query_plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,23 +33,3 @@ func CustomQuerier(qp *QueryPlugin) func(ctx sdk.Context, request json.RawMessag
}
}
}

// TODO: do we need this stuff from osmosis implementation? maybe remove
// ConvertSdkCoinsToWasmCoins converts sdk type coins to wasm vm type coins
func ConvertSdkCoinsToWasmCoins(coins []sdk.Coin) wasmvmtypes.Coins {
var toSend wasmvmtypes.Coins
for _, coin := range coins {
c := ConvertSdkCoinToWasmCoin(coin)
toSend = append(toSend, c)
}
return toSend
}

// ConvertSdkCoinToWasmCoin converts a sdk type coin to a wasm vm type coin
func ConvertSdkCoinToWasmCoin(coin sdk.Coin) wasmvmtypes.Coin {
return wasmvmtypes.Coin{
Denom: coin.Denom,
// Note: gamm tokens have 18 decimal places, so 10^22 is common, no longer in u64 range
Amount: coin.Amount.String(),
}
}
66 changes: 57 additions & 9 deletions wasmbinding/test/query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,39 +17,87 @@ import (
)

func TestWasmGetOracleExchangeRates(t *testing.T) {
// START SETUP
tm := time.Now().UTC()
valPub := secp256k1.GenPrivKey().PubKey()

testWrapper := app.NewTestWrapper(t, tm, valPub)

req := oraclebinding.SeiOracleQuery{ExchangeRates: &oraclebinding.WasmQueryExchangeRatesRequest{}}
queryData, err := json.Marshal(req)
require.NoError(t, err)
query := wasmbinding.SeiQueryWrapper{Route: "oracle", QueryData: queryData}

oh := oraclewasm.NewOracleWasmQueryHandler(&testWrapper.App.OracleKeeper)
qp := wasmbinding.NewQueryPlugin(oh)
customQuerier := wasmbinding.CustomQuerier(qp)
// END SETUP

req := oraclebinding.SeiOracleQuery{ExchangeRates: &oracletypes.QueryExchangeRatesRequest{}}
queryData, err := json.Marshal(req)
require.NoError(t, err)
query := wasmbinding.SeiQueryWrapper{Route: wasmbinding.OracleRoute, QueryData: queryData}

rawQuery, err := json.Marshal(query)
require.NoError(t, err)

res, err := customQuerier(testWrapper.Ctx, rawQuery)
require.NoError(t, err)

var parsedRes oraclebinding.WasmQueryExchangeRatesResponse
var parsedRes oracletypes.QueryExchangeRatesResponse
err = json.Unmarshal(res, &parsedRes)
require.NoError(t, err)
require.Equal(t, oraclebinding.WasmQueryExchangeRatesResponse{DenomOracleExchangeRatePairs: oracletypes.DenomOracleExchangeRatePairs(nil)}, parsedRes)
require.Equal(t, oracletypes.QueryExchangeRatesResponse{DenomOracleExchangeRatePairs: oracletypes.DenomOracleExchangeRatePairs(nil)}, parsedRes)

testWrapper.Ctx = testWrapper.Ctx.WithBlockHeight(11)
testWrapper.App.OracleKeeper.SetBaseExchangeRate(testWrapper.Ctx, oracleutils.MicroAtomDenom, sdk.NewDec(12))

res, err = customQuerier(testWrapper.Ctx, rawQuery)
require.NoError(t, err)

var parsedRes2 oraclebinding.WasmQueryExchangeRatesResponse
var parsedRes2 oracletypes.QueryExchangeRatesResponse
err = json.Unmarshal(res, &parsedRes2)
require.NoError(t, err)
require.Equal(t, oracletypes.QueryExchangeRatesResponse{DenomOracleExchangeRatePairs: oracletypes.DenomOracleExchangeRatePairs{oracletypes.NewDenomOracleExchangeRatePair(oracleutils.MicroAtomDenom, sdk.NewDec(12), sdk.NewInt(11))}}, parsedRes2)
}

func TestWasmGetOracleTwaps(t *testing.T) {
// START SETUP
tm := time.Now().UTC()
valPub := secp256k1.GenPrivKey().PubKey()

testWrapper := app.NewTestWrapper(t, tm, valPub)

oh := oraclewasm.NewOracleWasmQueryHandler(&testWrapper.App.OracleKeeper)
qp := wasmbinding.NewQueryPlugin(oh)
customQuerier := wasmbinding.CustomQuerier(qp)
// END SETUP

req := oraclebinding.SeiOracleQuery{OracleTwaps: &oracletypes.QueryTwapsRequest{LookbackSeconds: 200}}
queryData, err := json.Marshal(req)
require.NoError(t, err)
query := wasmbinding.SeiQueryWrapper{Route: wasmbinding.OracleRoute, QueryData: queryData}

rawQuery, err := json.Marshal(query)
require.NoError(t, err)

// this should error because there is no snapshots to build twap from
_, err = customQuerier(testWrapper.Ctx, rawQuery)
require.Error(t, err)

testWrapper.Ctx = testWrapper.Ctx.WithBlockHeight(11).WithBlockTime(time.Unix(3600, 0))
testWrapper.App.OracleKeeper.SetBaseExchangeRate(testWrapper.Ctx, oracleutils.MicroAtomDenom, sdk.NewDec(12))

priceSnapshot := oracletypes.PriceSnapshot{SnapshotTimestamp: 3600, PriceSnapshotItems: oracletypes.PriceSnapshotItems{
oracletypes.NewPriceSnapshotItem(oracleutils.MicroAtomDenom, oracletypes.OracleExchangeRate{ExchangeRate: sdk.NewDec(20), LastUpdate: sdk.NewInt(10)}),
}}
testWrapper.App.OracleKeeper.AddPriceSnapshot(testWrapper.Ctx, priceSnapshot)

testWrapper.Ctx = testWrapper.Ctx.WithBlockHeight(14).WithBlockTime(time.Unix(3700, 0))

res, err := customQuerier(testWrapper.Ctx, rawQuery)
require.NoError(t, err)

var parsedRes2 oracletypes.QueryTwapsResponse
err = json.Unmarshal(res, &parsedRes2)
require.NoError(t, err)
require.Equal(t, oraclebinding.WasmQueryExchangeRatesResponse{DenomOracleExchangeRatePairs: oracletypes.DenomOracleExchangeRatePairs{oracletypes.NewDenomOracleExchangeRatePair(oracleutils.MicroAtomDenom, sdk.NewDec(12), sdk.NewInt(11))}}, parsedRes2)
// should be 100 isntead of 200 because thats the oldest data timestamp we have
require.Equal(t, oracletypes.QueryTwapsResponse{OracleTwaps: oracletypes.OracleTwaps{
oracletypes.OracleTwap{Denom: oracleutils.MicroAtomDenom, Twap: sdk.NewDec(20), LookbackSeconds: 100},
}}, parsedRes2)
}
11 changes: 3 additions & 8 deletions x/oracle/client/wasm/bindings/queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,7 @@ import "github.com/sei-protocol/sei-chain/x/oracle/types"

type SeiOracleQuery struct {
// queries the oracle exchange rates
ExchangeRates *WasmQueryExchangeRatesRequest `json:"exchange_rates,omitempty"`
}

type WasmQueryExchangeRatesRequest struct{}

type WasmQueryExchangeRatesResponse struct {
DenomOracleExchangeRatePairs types.DenomOracleExchangeRatePairs `json:"denom_oracle_exchange_rate_pairs,omitempty"`
// DenomOracleExchangeRatePairs []WasmQueryDenomOracleExchangeRate `json:"denom_oracle_exchange_rate_pairs,omitempty"`
ExchangeRates *types.QueryExchangeRatesRequest `json:"exchange_rates,omitempty"`
// queries the oracle TWAPs
OracleTwaps *types.QueryTwapsRequest `json:"oracle_twaps,omitempty"`
}
6 changes: 6 additions & 0 deletions x/oracle/client/wasm/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,9 @@ func (handler OracleWasmQueryHandler) GetExchangeRates(ctx sdk.Context) (*types.
c := sdk.WrapSDKContext(ctx)
return querier.ExchangeRates(c, &types.QueryExchangeRatesRequest{})
}

func (handler OracleWasmQueryHandler) GetOracleTwaps(ctx sdk.Context, req *types.QueryTwapsRequest) (*types.QueryTwapsResponse, error) {
querier := oraclekeeper.NewQuerier(handler.oracleKeeper)
c := sdk.WrapSDKContext(ctx)
return querier.Twaps(c, req)
}
Loading