Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] Adding a delta-neutral mechanism to ensure the stability of Qube Stablecoins #109

Open
wants to merge 15 commits into
base: main
Choose a base branch
from
Open
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
Binary file removed .DS_Store
Binary file not shown.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
qubed
tmp-swagger-gen
tmp-swagger-gen
.DS_Store
Binary file removed app/.DS_Store
Binary file not shown.
46 changes: 36 additions & 10 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,10 @@ import (
ibchookerkeeper "github.com/QuadrateOrg/core/x/ibchooker/keeper"
ibchookertypes "github.com/QuadrateOrg/core/x/ibchooker/types"

perpetualmodule "github.com/QuadrateOrg/core/x/perpetual"
perpetualmodulekeeper "github.com/QuadrateOrg/core/x/perpetual/keeper"
perpetualmoduletypes "github.com/QuadrateOrg/core/x/perpetual/types"

gmpmiddleware "github.com/QuadrateOrg/core/x/gmp"

// unnamed import of statik for swagger UI support
Expand Down Expand Up @@ -279,6 +283,7 @@ var (
oraclemodule.AppModuleBasic{},
stablemodule.AppModuleBasic{},
growmodule.AppModuleBasic{},
perpetualmodule.AppModuleBasic{},
dexmodule.AppModuleBasic{},
epochs.AppModuleBasic{},
liquidstakeibc.AppModuleBasic{},
Expand All @@ -304,11 +309,14 @@ var (
liquidstakeibctypes.ModuleName: {authtypes.Minter, authtypes.Burner},
liquidstakeibctypes.DepositModuleAccount: nil,
liquidstakeibctypes.UndelegationModuleAccount: {authtypes.Burner},
perpetualmoduletypes.ModuleName: {authtypes.Minter, authtypes.Burner},
stablemoduletypes.SystemModuleAccount: {authtypes.Minter, authtypes.Burner},
}

receiveAllowedMAcc = map[string]bool{
liquidstakeibctypes.DepositModuleAccount: true,
liquidstakeibctypes.UndelegationModuleAccount: true,
stablemoduletypes.SystemModuleAccount: true,
}
)

Expand Down Expand Up @@ -363,6 +371,7 @@ type QuadrateApp struct { // nolint: golint
ICAControllerKeeper icacontrollerkeeper.Keeper
InterchainQueryKeeper interchainquerykeeper.Keeper
TransferHooksKeeper ibchookerkeeper.Keeper
PerpetualKeeper perpetualmodulekeeper.Keeper

// make scoped keepers public for test purposes
ScopedIBCKeeper capabilitykeeper.ScopedKeeper
Expand Down Expand Up @@ -428,7 +437,7 @@ func NewQuadrateApp(
stablemoduletypes.StoreKey, growmoduletypes.StoreKey,
dexmoduletypes.StoreKey, epochstypes.StoreKey,
liquidstakeibctypes.StoreKey, interchainquerytypes.StoreKey,
icacontrollertypes.StoreKey,
icacontrollertypes.StoreKey, perpetualmoduletypes.StoreKey,
)
tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey)
memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey)
Expand Down Expand Up @@ -586,6 +595,24 @@ func NewQuadrateApp(
)
oracleModule := oraclemodule.NewAppModule(appCodec, app.OracleKeeper, app.AccountKeeper, app.BankKeeper)

app.DexKeeper = *dexmodulekeeper.NewKeeper(
appCodec,
keys[dexmoduletypes.StoreKey],
keys[dexmoduletypes.MemStoreKey],
app.GetSubspace(dexmoduletypes.ModuleName),
app.BankKeeper,
)
dexModule := dexmodule.NewAppModule(appCodec, app.DexKeeper, app.BankKeeper)

app.PerpetualKeeper = *perpetualmodulekeeper.NewKeeper(
appCodec,
keys[perpetualmoduletypes.StoreKey],
keys[perpetualmoduletypes.MemStoreKey],
app.GetSubspace(perpetualmoduletypes.ModuleName),
app.BankKeeper,
app.OracleKeeper,
)

app.StableKeeper = *stablemodulekeeper.NewKeeper(
appCodec,
keys[stablemoduletypes.StoreKey],
Expand All @@ -596,6 +623,9 @@ func NewQuadrateApp(
scopedStableKeeper,
app.BankKeeper,
app.OracleKeeper,
app.DexKeeper,
app.PerpetualKeeper,
app.AccountKeeper,
)
stableModule := stablemodule.NewAppModule(appCodec, app.StableKeeper, app.AccountKeeper, app.BankKeeper, app.OracleKeeper)
stableIBCModule := stablemodule.NewIBCModule(app.StableKeeper)
Expand All @@ -610,15 +640,6 @@ func NewQuadrateApp(
app.StableKeeper,
)

app.DexKeeper = *dexmodulekeeper.NewKeeper(
appCodec,
keys[dexmoduletypes.StoreKey],
keys[dexmoduletypes.MemStoreKey],
app.GetSubspace(dexmoduletypes.ModuleName),
app.BankKeeper,
)
dexModule := dexmodule.NewAppModule(appCodec, app.DexKeeper, app.BankKeeper)

// Create swap middleware keeper
app.SwapKeeper = swapkeeper.NewKeeper(
appCodec,
Expand Down Expand Up @@ -852,6 +873,7 @@ func NewQuadrateApp(
ica.NewAppModule(&app.ICAControllerKeeper, &app.ICAHostKeeper),
liquidstakeibc.NewAppModule(app.LiquidStakeIBCKeeper),
interchainquery.NewAppModule(appCodec, app.InterchainQueryKeeper),
perpetualmodule.NewAppModule(appCodec, app.PerpetualKeeper, app.AccountKeeper, app.BankKeeper),
)

// During begin block slashing happens after distr.BeginBlocker so that
Expand Down Expand Up @@ -892,6 +914,7 @@ func NewQuadrateApp(
liquidstakeibctypes.ModuleName,
interchainquerytypes.ModuleName,
ibchookertypes.ModuleName,
perpetualmoduletypes.ModuleName,
)

app.mm.SetOrderEndBlockers(
Expand Down Expand Up @@ -926,6 +949,7 @@ func NewQuadrateApp(
liquidstakeibctypes.ModuleName,
interchainquerytypes.ModuleName,
ibchookertypes.ModuleName,
perpetualmoduletypes.ModuleName,
)

app.mm.SetOrderInitGenesis(
Expand Down Expand Up @@ -960,6 +984,7 @@ func NewQuadrateApp(
liquidstakeibctypes.ModuleName,
interchainquerytypes.ModuleName,
ibchookertypes.ModuleName,
perpetualmoduletypes.ModuleName,
)

app.mm.RegisterInvariants(&app.CrisisKeeper)
Expand Down Expand Up @@ -1172,6 +1197,7 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino
paramsKeeper.Subspace(growmoduletypes.ModuleName)
paramsKeeper.Subspace(dexmoduletypes.ModuleName)
paramsKeeper.Subspace(icacontrollertypes.SubModuleName)
paramsKeeper.Subspace(perpetualmoduletypes.ModuleName)
return paramsKeeper
}

Expand Down
4 changes: 2 additions & 2 deletions proto/buf.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ deps:
- remote: buf.build
owner: cosmos
repository: cosmos-proto
commit: 1935555c206d4afb9e94615dfd0fad31
commit: 04467658e59e44bbb22fe568206e1f70
- remote: buf.build
owner: cosmos
repository: cosmos-sdk
Expand All @@ -16,7 +16,7 @@ deps:
- remote: buf.build
owner: googleapis
repository: googleapis
commit: 7a6bc1e3207144b38e9066861e1de0ff
commit: 4ed3bc159a8b4ac68fe253218760d035
- remote: buf.build
owner: johnletey
repository: ibc
Expand Down
11 changes: 11 additions & 0 deletions proto/core/perpetual/v1beta1/genesis.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
syntax = "proto3";
package core.perpetual.v1beta1;

import "gogoproto/gogo.proto";
import "core/perpetual/v1beta1/params.proto";
option go_package = "github.com/QuadrateOrg/core/x/perpetual/types";

// GenesisState defines the perpetual module's genesis state.
message GenesisState {
Params params = 1 [(gogoproto.nullable) = false];
}
13 changes: 13 additions & 0 deletions proto/core/perpetual/v1beta1/params.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
syntax = "proto3";
package core.perpetual.v1beta1;

import "gogoproto/gogo.proto";
import "core/perpetual/v1beta1/perpetual.proto";

option go_package = "github.com/QuadrateOrg/core/x/perpetual/types";

// Params defines the parameters for the module.
message Params {
option (gogoproto.goproto_stringer) = false;
repeated Vault vaults = 1;
}
57 changes: 57 additions & 0 deletions proto/core/perpetual/v1beta1/perpetual.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
syntax = "proto3";
package core.perpetual.v1beta1;

import "gogoproto/gogo.proto";
import "cosmos/bank/v1beta1/bank.proto";

option go_package = "github.com/QuadrateOrg/core/x/perpetual/types";

enum PerpetualTradeType {
PERPETUAL_LONG_POSITION = 0;
PERPETUAL_SHORT_POSITION = 1;
}

message TradePosition {
uint64 id = 1;
string trade_position_id = 2;
string creator = 3;
PerpetualTradeType trade_type = 4;
string leverage = 5 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false];
string trading_asset = 6;
string collateral_amount = 7 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
(gogoproto.nullable) = false
];
string collateral_denom = 8;
string return_amount = 9 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
(gogoproto.nullable) = false
];
string return_denom = 10;
string profit_amount = 11 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
(gogoproto.nullable) = false
];
}

message Vault {
uint64 id = 1;
string vault_id = 2;
cosmos.bank.v1beta1.Metadata amountXMetadata = 3 [ (gogoproto.moretags) = "yaml:\"amountXMetadata\"", (gogoproto.nullable) = false ];
cosmos.bank.v1beta1.Metadata amountYMetadata = 4 [ (gogoproto.moretags) = "yaml:\"amountYMetadata\"", (gogoproto.nullable) = false ];
string x = 5 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
(gogoproto.nullable) = false
];
string y = 6 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
(gogoproto.nullable) = false
];
string k = 7 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
(gogoproto.nullable) = false
];
string OracleAssetId = 8;
repeated string long_position_id = 9;
repeated string short_position_id = 10;
}
63 changes: 63 additions & 0 deletions proto/core/perpetual/v1beta1/query.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
syntax = "proto3";
package core.perpetual.v1beta1;

import "gogoproto/gogo.proto";
import "core/perpetual/v1beta1/params.proto";
import "google/api/annotations.proto";
import "core/perpetual/v1beta1/perpetual.proto";
option go_package = "github.com/QuadrateOrg/core/x/perpetual/types";

// Query defines the gRPC querier service.
service Query {
rpc Params(QueryParamsRequest) returns (QueryParamsResponse) {
option (google.api.http).get = "/core/perpetual/v1beta1/params";
}

rpc PositionById(QueryPositionByIdRequest) returns (QueryPositionByIdResponse) {
option (google.api.http).get = "/core/perpetual/v1beta1/position/{id}";
}

rpc VaultById(QueryVaultByIdRequest) returns (QueryVaultByIdResponse) {
option (google.api.http).get = "/core/perpetual/v1beta1/vault/{id}";
}

rpc AllPositions(QueryEmpty) returns (QueryAllPositionsResponse) {
option (google.api.http).get = "/core/perpetual/v1beta1/positions";
}

rpc AllVaults(QueryEmpty) returns (QueryAllVaultsResponse) {
option (google.api.http).get = "/core/perpetual/v1beta1/vaults";
}
}

message QueryParamsRequest {}

message QueryParamsResponse {
Params params = 1;
}

message QueryPositionByIdRequest {
string id = 1;
}

message QueryPositionByIdResponse {
TradePosition position = 1;
}

message QueryVaultByIdRequest {
string id = 1;
}

message QueryVaultByIdResponse {
Vault vault = 1;
}

message QueryEmpty {}

message QueryAllPositionsResponse {
repeated TradePosition positions = 1;
}

message QueryAllVaultsResponse {
repeated Vault vaults = 1;
}
34 changes: 34 additions & 0 deletions proto/core/perpetual/v1beta1/tx.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
syntax = "proto3";
package core.perpetual.v1beta1;

import "gogoproto/gogo.proto";
import "core/perpetual/v1beta1/perpetual.proto";

option go_package = "github.com/QuadrateOrg/core/x/perpetual/types";

// Msg defines the Msg service.
service Msg {
rpc Open(MsgOpen) returns (MsgOpenResponse);
rpc Close(MsgClose) returns (MsgCloseResponse);
}

message MsgOpen {
string creator = 1;
PerpetualTradeType trade_type = 2;
string leverage = 3 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false];
string trading_asset = 4;
string collateral = 5;
}

message MsgOpenResponse {}

message MsgClose {
string creator = 1;
string id = 2;
string amount = 3 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
(gogoproto.nullable) = false
];
}

message MsgCloseResponse {}
19 changes: 11 additions & 8 deletions proto/core/stable/v1beta1/pair.proto
Original file line number Diff line number Diff line change
@@ -1,27 +1,30 @@
syntax = "proto3";
package core.stable.v1beta1;
import "gogoproto/gogo.proto";


import "cosmos/bank/v1beta1/bank.proto";
option go_package = "github.com/QuadrateOrg/core/x/stable/types";

message Pair {
uint64 id = 1;
string pairId = 2;
cosmos.bank.v1beta1.Metadata amountInMetadata = 3 [ (gogoproto.moretags) = "yaml:\"amountInMetadata\"", (gogoproto.nullable) = false ];
cosmos.bank.v1beta1.Metadata amountOutMetadata = 4 [ (gogoproto.moretags) = "yaml:\"amountOutMetadata\"", (gogoproto.nullable) = false ];
string qm = 5 [
cosmos.bank.v1beta1.Metadata tokenStakeMetadata = 4 [ (gogoproto.moretags) = "yaml:\"tokenStakeMetadata\"", (gogoproto.nullable) = false ];
cosmos.bank.v1beta1.Metadata tokenYMetadata = 5 [ (gogoproto.moretags) = "yaml:\"tokenYMetadata\"", (gogoproto.nullable) = false ];
cosmos.bank.v1beta1.Metadata amountOutMetadata = 6 [ (gogoproto.moretags) = "yaml:\"amountOutMetadata\"", (gogoproto.nullable) = false ];
string qm = 7 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
(gogoproto.moretags) = "yaml:\"qm\"",
(gogoproto.nullable) = false
];
string ar = 6 [
string ar = 8 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
(gogoproto.moretags) = "yaml:\"ar\"",
(gogoproto.nullable) = false
];
string minAmountIn = 7;
string minAmountOut = 8;
string model = 9;
string oracleAssetId = 9;
string perpetualOracleAssetId = 10;
string stakePriceOracleId = 11;
string minAmountIn = 12;
string minAmountOut = 13;
string model = 14;
}
Binary file removed x/.DS_Store
Binary file not shown.
Loading
Loading