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
33 changes: 16 additions & 17 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -437,10 +437,24 @@ func New(
panic(fmt.Sprintf("error while reading wasm config: %s", err))
}

app.EpochKeeper = *epochmodulekeeper.NewKeeper(
appCodec,
keys[epochmoduletypes.StoreKey],
keys[epochmoduletypes.MemStoreKey],
app.GetSubspace(epochmoduletypes.ModuleName),
)
app.DexKeeper = *dexmodulekeeper.NewKeeper(
appCodec,
keys[dexmoduletypes.StoreKey],
keys[dexmoduletypes.MemStoreKey],
app.GetSubspace(dexmoduletypes.ModuleName),
app.EpochKeeper,
app.BankKeeper,
)
// The last arguments can contain custom message handlers, and custom query handlers,
// if we want to allow any custom callbacks
supportedFeatures := "iterator,staking,stargate"
wasmOpts = append(wasmbinding.RegisterCustomPlugins(&app.OracleKeeper), wasmOpts...)
wasmOpts = append(wasmbinding.RegisterCustomPlugins(&app.OracleKeeper, &app.DexKeeper), wasmOpts...)
app.WasmKeeper = wasm.NewKeeper(
appCodec,
keys[wasm.StoreKey],
Expand All @@ -460,22 +474,7 @@ func New(
supportedFeatures,
wasmOpts...,
)

app.EpochKeeper = *epochmodulekeeper.NewKeeper(
appCodec,
keys[epochmoduletypes.StoreKey],
keys[epochmoduletypes.MemStoreKey],
app.GetSubspace(epochmoduletypes.ModuleName),
)
app.DexKeeper = *dexmodulekeeper.NewKeeper(
appCodec,
keys[dexmoduletypes.StoreKey],
keys[dexmoduletypes.MemStoreKey],
app.GetSubspace(dexmoduletypes.ModuleName),
app.EpochKeeper,
app.BankKeeper,
app.WasmKeeper,
)
app.DexKeeper.SetWasmKeeper(&app.WasmKeeper)
dexModule := dexmodule.NewAppModule(appCodec, app.DexKeeper, app.AccountKeeper, app.BankKeeper, app.WasmKeeper, app.tracingInfo)
epochModule := epochmodule.NewAppModule(appCodec, app.EpochKeeper, app.AccountKeeper, app.BankKeeper)

Expand Down
2 changes: 2 additions & 0 deletions app/test_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ import (
dbm "github.com/tendermint/tm-db"
)

const TEST_CONTRACT = "TEST"

type TestWrapper struct {
suite.Suite

Expand Down
8 changes: 6 additions & 2 deletions proto/dex/query.proto
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,12 @@ message QueryGetPricesResponse {
}

message QueryGetTwapsRequest {
string contractAddr = 1;
uint64 lookbackSeconds = 2;
string contractAddr = 1 [
(gogoproto.jsontag) = "contract_address"
];
uint64 lookbackSeconds = 2 [
(gogoproto.jsontag) = "lookback_seconds"
];
}

message QueryGetTwapsResponse {
Expand Down
28 changes: 27 additions & 1 deletion wasmbinding/queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,22 @@ import (
wasmvmtypes "github.com/CosmWasm/wasmvm/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
dexwasm "github.com/sei-protocol/sei-chain/x/dex/client/wasm"
dexbindings "github.com/sei-protocol/sei-chain/x/dex/client/wasm/bindings"
oraclewasm "github.com/sei-protocol/sei-chain/x/oracle/client/wasm"
oraclebindings "github.com/sei-protocol/sei-chain/x/oracle/client/wasm/bindings"
)

type QueryPlugin struct {
oracleHandler oraclewasm.OracleWasmQueryHandler
dexHandler dexwasm.DexWasmQueryHandler
}

// NewQueryPlugin returns a reference to a new QueryPlugin.
func NewQueryPlugin(oh *oraclewasm.OracleWasmQueryHandler) *QueryPlugin {
func NewQueryPlugin(oh *oraclewasm.OracleWasmQueryHandler, dh *dexwasm.DexWasmQueryHandler) *QueryPlugin {
return &QueryPlugin{
oracleHandler: *oh,
dexHandler: *dh,
}
}

Expand Down Expand Up @@ -53,3 +57,25 @@ func (qp QueryPlugin) HandleOracleQuery(ctx sdk.Context, queryData json.RawMessa
return nil, wasmvmtypes.UnsupportedRequest{Kind: "Unknown Sei Oracle Query"}
}
}

func (qp QueryPlugin) HandleDexQuery(ctx sdk.Context, queryData json.RawMessage) ([]byte, error) {
var parsedQuery dexbindings.SeiDexQuery
if err := json.Unmarshal(queryData, &parsedQuery); err != nil {
return nil, sdkerrors.Wrap(err, "Error parsing SeiDexQuery")
}
switch {
case parsedQuery.DexTwaps != nil:
res, err := qp.dexHandler.GetDexTwap(ctx, parsedQuery.DexTwaps)
if err != nil {
return nil, sdkerrors.Wrap(err, "Error while getting dex Twaps")
}
bz, err := json.Marshal(res)
if err != nil {
return nil, sdkerrors.Wrap(err, "Error encoding dex twaps as JSON")
}

return bz, nil
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what does the name bz mean here

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's shorthand for bytes (i think)

default:
return nil, wasmvmtypes.UnsupportedRequest{Kind: "Unknown Sei Dex Query"}
}
}
3 changes: 3 additions & 0 deletions wasmbinding/query_plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (

const (
OracleRoute = "oracle"
DexRoute = "dex"
)

type SeiQueryWrapper struct {
Expand All @@ -28,6 +29,8 @@ func CustomQuerier(qp *QueryPlugin) func(ctx sdk.Context, request json.RawMessag
switch contractQuery.Route {
case OracleRoute:
return qp.HandleOracleQuery(ctx, contractQuery.QueryData)
case DexRoute:
return qp.HandleDexQuery(ctx, contractQuery.QueryData)
default:
return nil, wasmvmtypes.UnsupportedRequest{Kind: "Unknown Sei Query Route"}
}
Expand Down
60 changes: 58 additions & 2 deletions wasmbinding/test/query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/sei-protocol/sei-chain/app"
"github.com/sei-protocol/sei-chain/wasmbinding"
dexwasm "github.com/sei-protocol/sei-chain/x/dex/client/wasm"
dexbinding "github.com/sei-protocol/sei-chain/x/dex/client/wasm/bindings"
dextypes "github.com/sei-protocol/sei-chain/x/dex/types"
oraclewasm "github.com/sei-protocol/sei-chain/x/oracle/client/wasm"
oraclebinding "github.com/sei-protocol/sei-chain/x/oracle/client/wasm/bindings"
oracletypes "github.com/sei-protocol/sei-chain/x/oracle/types"
Expand All @@ -24,7 +27,8 @@ func TestWasmGetOracleExchangeRates(t *testing.T) {
testWrapper := app.NewTestWrapper(t, tm, valPub)

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

Expand Down Expand Up @@ -64,7 +68,8 @@ func TestWasmGetOracleTwaps(t *testing.T) {
testWrapper := app.NewTestWrapper(t, tm, valPub)

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

Expand Down Expand Up @@ -101,3 +106,54 @@ func TestWasmGetOracleTwaps(t *testing.T) {
oracletypes.OracleTwap{Denom: oracleutils.MicroAtomDenom, Twap: sdk.NewDec(20), LookbackSeconds: 100},
}}, parsedRes2)
}

func TestWasmGetDexTwaps(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)
dh := dexwasm.NewDexWasmQueryHandler(&testWrapper.App.DexKeeper)
qp := wasmbinding.NewQueryPlugin(oh, dh)
customQuerier := wasmbinding.CustomQuerier(qp)
// END SETUP

req := dexbinding.SeiDexQuery{DexTwaps: &dextypes.QueryGetTwapsRequest{
ContractAddr: app.TEST_CONTRACT,
LookbackSeconds: 200,
}}
queryData, err := json.Marshal(req)
require.NoError(t, err)
query := wasmbinding.SeiQueryWrapper{Route: wasmbinding.DexRoute, QueryData: queryData}

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

testWrapper.Ctx = testWrapper.Ctx.WithBlockHeight(11).WithBlockTime(time.Unix(3600, 0))
testWrapper.App.DexKeeper.AddRegisteredPair(
testWrapper.Ctx,
app.TEST_CONTRACT,
dextypes.Pair{PriceDenom: dextypes.Denom_SEI, AssetDenom: dextypes.Denom_ATOM},
)
testWrapper.App.DexKeeper.SetPriceState(testWrapper.Ctx, dextypes.Price{
SnapshotTimestampInSeconds: 3600,
Price: sdk.NewDec(20),
Pair: &dextypes.Pair{PriceDenom: dextypes.Denom_SEI, AssetDenom: dextypes.Denom_ATOM},
}, app.TEST_CONTRACT, 0)
testWrapper.App.OracleKeeper.SetBaseExchangeRate(testWrapper.Ctx, oracleutils.MicroAtomDenom, sdk.NewDec(12))
testWrapper.Ctx = testWrapper.Ctx.WithBlockHeight(14).WithBlockTime(time.Unix(3700, 0))

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

var parsedRes dextypes.QueryGetTwapsResponse
err = json.Unmarshal(res, &parsedRes)
require.NoError(t, err)
require.Equal(t, 1, len(parsedRes.Twaps))
twap := *parsedRes.Twaps[0]
require.Equal(t, dextypes.Denom_SEI, twap.Pair.PriceDenom)
require.Equal(t, dextypes.Denom_ATOM, twap.Pair.AssetDenom)
require.Equal(t, sdk.NewDec(20), twap.Twap)
}
6 changes: 5 additions & 1 deletion wasmbinding/wasm.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,19 @@ package wasmbinding
import (
"github.com/CosmWasm/wasmd/x/wasm"
wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper"
dexwasm "github.com/sei-protocol/sei-chain/x/dex/client/wasm"
dexkeeper "github.com/sei-protocol/sei-chain/x/dex/keeper"
oraclewasm "github.com/sei-protocol/sei-chain/x/oracle/client/wasm"
oraclekeeper "github.com/sei-protocol/sei-chain/x/oracle/keeper"
)

func RegisterCustomPlugins(
oracle *oraclekeeper.Keeper,
dex *dexkeeper.Keeper,
) []wasmkeeper.Option {
dexHandler := dexwasm.NewDexWasmQueryHandler(dex)
oracleHandler := oraclewasm.NewOracleWasmQueryHandler(oracle)
wasmQueryPlugin := NewQueryPlugin(oracleHandler)
wasmQueryPlugin := NewQueryPlugin(oracleHandler, dexHandler)

queryPluginOpt := wasmkeeper.WithQueryPlugins(&wasmkeeper.QueryPlugins{
Custom: CustomQuerier(wasmQueryPlugin),
Expand Down
8 changes: 8 additions & 0 deletions x/dex/client/wasm/bindings/queries.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package bindings

import "github.com/sei-protocol/sei-chain/x/dex/types"

type SeiDexQuery struct {
// queries the dex TWAPs
DexTwaps *types.QueryGetTwapsRequest `json:"dex_twaps,omitempty"`
}
22 changes: 22 additions & 0 deletions x/dex/client/wasm/query.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package wasm

import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/sei-protocol/sei-chain/x/dex/keeper"
"github.com/sei-protocol/sei-chain/x/dex/types"
)

type DexWasmQueryHandler struct {
dexKeeper keeper.Keeper
}

func NewDexWasmQueryHandler(keeper *keeper.Keeper) *DexWasmQueryHandler {
return &DexWasmQueryHandler{
dexKeeper: *keeper,
}
}

func (handler DexWasmQueryHandler) GetDexTwap(ctx sdk.Context, req *types.QueryGetTwapsRequest) (*types.QueryGetTwapsResponse, error) {
c := sdk.WrapSDKContext(ctx)
return handler.dexKeeper.GetTwaps(c, req)
}
6 changes: 4 additions & 2 deletions x/dex/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ func NewKeeper(
ps paramtypes.Subspace,
epochKeeper epochkeeper.Keeper,
bankKeeper bankkeeper.Keeper,
wasmKeeper wasm.Keeper,
) *Keeper {
// set KeyTable if it has not already been set
if !ps.HasKeyTable() {
Expand All @@ -80,7 +79,6 @@ func NewKeeper(
BankKeeper: bankKeeper,
OrderCancellations: map[string]map[string]*dexcache.OrderCancellations{},
LiquidationRequests: map[string]*dexcache.LiquidationRequests{},
WasmKeeper: wasmKeeper,
}
}

Expand All @@ -91,3 +89,7 @@ func (k Keeper) Logger(ctx sdk.Context) log.Logger {
func (k Keeper) GetStoreKey() sdk.StoreKey {
return k.storeKey
}

func (k *Keeper) SetWasmKeeper(wasmKeeper *wasm.Keeper) {
k.WasmKeeper = *wasmKeeper
}
Loading