Skip to content

Commit

Permalink
set liquidity tier with volatility bounds period and validate that it…
Browse files Browse the repository at this point in the history
…'s a positive duration
  • Loading branch information
tqin7 committed Dec 12, 2023
1 parent 9e1ca1a commit c485b1c
Show file tree
Hide file tree
Showing 24 changed files with 359 additions and 17 deletions.
16 changes: 9 additions & 7 deletions protocol/mocks/PerpetualsKeeper.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 8 additions & 4 deletions protocol/scripts/genesis/sample_pregenesis.json
Original file line number Diff line number Diff line change
Expand Up @@ -816,31 +816,35 @@
"impact_notional": 10000000000,
"initial_margin_ppm": 50000,
"maintenance_fraction_ppm": 600000,
"name": "Large-Cap"
"name": "Large-Cap",
"volatility_bounds_period": "1h"
},
{
"base_position_notional": 250000000000,
"id": 1,
"impact_notional": 5000000000,
"initial_margin_ppm": 100000,
"maintenance_fraction_ppm": 500000,
"name": "Mid-Cap"
"name": "Mid-Cap",
"volatility_bounds_period": "1h"
},
{
"base_position_notional": 100000000000,
"id": 2,
"impact_notional": 2500000000,
"initial_margin_ppm": 200000,
"maintenance_fraction_ppm": 500000,
"name": "Long-Tail"
"name": "Long-Tail",
"volatility_bounds_period": "1h"
},
{
"base_position_notional": 1000000000,
"id": 3,
"impact_notional": 2500000000,
"initial_margin_ppm": 1000000,
"maintenance_fraction_ppm": 200000,
"name": "Safety"
"name": "Safety",
"volatility_bounds_period": "1h"
}
],
"params": {
Expand Down
36 changes: 36 additions & 0 deletions protocol/testing/e2e/gov/perpetuals_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package gov_test

import (
"testing"
"time"

"github.com/cometbft/cometbft/types"
sdk "github.com/cosmos/cosmos-sdk/types"
Expand Down Expand Up @@ -32,6 +33,7 @@ var (
InitialMarginPpm: 765_432,
MaintenanceFractionPpm: 345_678,
ImpactNotional: 654_321,
VolatilityBoundsPeriod: time.Hour,
}
)

Expand Down Expand Up @@ -355,6 +357,7 @@ func TestSetLiquidityTier(t *testing.T) {
InitialMarginPpm: TEST_LIQUIDITY_TIER.InitialMarginPpm,
MaintenanceFractionPpm: TEST_LIQUIDITY_TIER.MaintenanceFractionPpm,
ImpactNotional: TEST_LIQUIDITY_TIER.ImpactNotional,
VolatilityBoundsPeriod: TEST_LIQUIDITY_TIER.VolatilityBoundsPeriod,
},
},
expectedProposalStatus: govtypesv1.ProposalStatus_PROPOSAL_STATUS_PASSED,
Expand All @@ -368,6 +371,7 @@ func TestSetLiquidityTier(t *testing.T) {
InitialMarginPpm: TEST_LIQUIDITY_TIER.InitialMarginPpm,
MaintenanceFractionPpm: TEST_LIQUIDITY_TIER.MaintenanceFractionPpm,
ImpactNotional: TEST_LIQUIDITY_TIER.ImpactNotional,
VolatilityBoundsPeriod: TEST_LIQUIDITY_TIER.VolatilityBoundsPeriod,
},
},
genesisLiquidityTierIds: []uint32{5678},
Expand All @@ -382,6 +386,7 @@ func TestSetLiquidityTier(t *testing.T) {
InitialMarginPpm: 1_000_001,
MaintenanceFractionPpm: TEST_LIQUIDITY_TIER.MaintenanceFractionPpm,
ImpactNotional: TEST_LIQUIDITY_TIER.ImpactNotional,
VolatilityBoundsPeriod: TEST_LIQUIDITY_TIER.VolatilityBoundsPeriod,
},
},
expectCheckTxFails: true,
Expand All @@ -395,6 +400,7 @@ func TestSetLiquidityTier(t *testing.T) {
InitialMarginPpm: TEST_LIQUIDITY_TIER.InitialMarginPpm,
MaintenanceFractionPpm: 1_000_001,
ImpactNotional: TEST_LIQUIDITY_TIER.ImpactNotional,
VolatilityBoundsPeriod: TEST_LIQUIDITY_TIER.VolatilityBoundsPeriod,
},
},
expectCheckTxFails: true,
Expand All @@ -408,6 +414,35 @@ func TestSetLiquidityTier(t *testing.T) {
InitialMarginPpm: TEST_LIQUIDITY_TIER.InitialMarginPpm,
MaintenanceFractionPpm: TEST_LIQUIDITY_TIER.MaintenanceFractionPpm,
ImpactNotional: 0,
VolatilityBoundsPeriod: TEST_LIQUIDITY_TIER.VolatilityBoundsPeriod,
},
},
expectCheckTxFails: true,
},
"Failure: volatility bounds period is zero": {
msg: &perptypes.MsgSetLiquidityTier{
Authority: authtypes.NewModuleAddress(perptypes.ModuleName).String(),
LiquidityTier: perptypes.LiquidityTier{
Id: 5678,
Name: TEST_LIQUIDITY_TIER.Name,
InitialMarginPpm: TEST_LIQUIDITY_TIER.InitialMarginPpm,
MaintenanceFractionPpm: TEST_LIQUIDITY_TIER.MaintenanceFractionPpm,
ImpactNotional: TEST_LIQUIDITY_TIER.ImpactNotional,
VolatilityBoundsPeriod: 0,
},
},
expectCheckTxFails: true,
},
"Failure: volatility bounds period is negative": {
msg: &perptypes.MsgSetLiquidityTier{
Authority: authtypes.NewModuleAddress(perptypes.ModuleName).String(),
LiquidityTier: perptypes.LiquidityTier{
Id: 5678,
Name: TEST_LIQUIDITY_TIER.Name,
InitialMarginPpm: TEST_LIQUIDITY_TIER.InitialMarginPpm,
MaintenanceFractionPpm: TEST_LIQUIDITY_TIER.MaintenanceFractionPpm,
ImpactNotional: TEST_LIQUIDITY_TIER.ImpactNotional,
VolatilityBoundsPeriod: -time.Hour,
},
},
expectCheckTxFails: true,
Expand All @@ -421,6 +456,7 @@ func TestSetLiquidityTier(t *testing.T) {
InitialMarginPpm: 765_432,
MaintenanceFractionPpm: 345_678,
ImpactNotional: 654_321,
VolatilityBoundsPeriod: time.Hour,
},
},
expectSubmitProposalFails: true,
Expand Down
4 changes: 4 additions & 0 deletions protocol/testing/genesis.sh
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ function edit_genesis() {
dasel put -t int -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[0].maintenance_fraction_ppm' -v '600000' # 60% of IM
dasel put -t int -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[0].base_position_notional' -v '1000000000000' # 1_000_000 USDC
dasel put -t int -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[0].impact_notional' -v '10000000000' # 10_000 USDC (500 USDC / 5%)
dasel put -t string -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[0].volatility_bounds_period' -v '1h' # TODO (CORE-838): use research-finalized value

# Liquidity Tier: Mid-Cap
dasel put -t json -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[]' -v "{}"
Expand All @@ -137,6 +138,7 @@ function edit_genesis() {
dasel put -t int -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[1].maintenance_fraction_ppm' -v '500000' # 50% of IM
dasel put -t int -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[1].base_position_notional' -v '250000000000' # 250_000 USDC
dasel put -t int -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[1].impact_notional' -v '5000000000' # 5_000 USDC (500 USDC / 10%)
dasel put -t string -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[1].volatility_bounds_period' -v '1h' # TODO (CORE-838): use research-finalized value

# Liquidity Tier: Long-Tail
dasel put -t json -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[]' -v "{}"
Expand All @@ -146,6 +148,7 @@ function edit_genesis() {
dasel put -t int -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[2].maintenance_fraction_ppm' -v '500000' # 50% of IM
dasel put -t int -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[2].base_position_notional' -v '100000000000' # 100_000 USDC
dasel put -t int -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[2].impact_notional' -v '2500000000' # 2_500 USDC (500 USDC / 20%)
dasel put -t string -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[2].volatility_bounds_period' -v '1h' # TODO (CORE-838): use research-finalized value

# Liquidity Tier: Safety
dasel put -t json -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[]' -v "{}"
Expand All @@ -155,6 +158,7 @@ function edit_genesis() {
dasel put -t int -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[3].maintenance_fraction_ppm' -v '200000' # 20% of IM
dasel put -t int -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[3].base_position_notional' -v '1000000000' # 1_000 USDC
dasel put -t int -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[3].impact_notional' -v '2500000000' # 2_500 USDC (2_500 USDC / 100%)
dasel put -t string -f "$GENESIS" '.app_state.perpetuals.liquidity_tiers.[3].volatility_bounds_period' -v '1h' # TODO (CORE-838): use research-finalized value

# Params.
dasel put -t int -f "$GENESIS" '.app_state.perpetuals.params.funding_rate_clamp_factor_ppm' -v '6000000' # 600 % (same as 75% on hourly rate)
Expand Down
3 changes: 2 additions & 1 deletion protocol/testutil/constants/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -874,7 +874,8 @@ const GenesisState = `{
"impact_notional": 10000000000,
"initial_margin_ppm": 50000,
"maintenance_fraction_ppm": 600000,
"name": "Large-Cap"
"name": "Large-Cap",
"volatility_bounds_period": "1h"
}
],
"params": {
Expand Down
15 changes: 15 additions & 0 deletions protocol/testutil/constants/perpetuals.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package constants

import (
"time"

"github.com/dydxprotocol/v4-chain/protocol/dtypes"
perptypes "github.com/dydxprotocol/v4-chain/protocol/x/perpetuals/types"
)
Expand All @@ -24,69 +26,79 @@ var LiquidityTiers = []perptypes.LiquidityTier{
InitialMarginPpm: 1_000_000,
MaintenanceFractionPpm: 1_000_000,
ImpactNotional: 500_000_000,
VolatilityBoundsPeriod: time.Hour,
},
{
Id: 1,
Name: "1",
InitialMarginPpm: 1_000_000,
MaintenanceFractionPpm: 750_000,
ImpactNotional: 500_000_000,
VolatilityBoundsPeriod: time.Hour,
},
{
Id: 2,
Name: "2",
InitialMarginPpm: 1_000_000,
MaintenanceFractionPpm: 0,
ImpactNotional: 500_000_000,
VolatilityBoundsPeriod: time.Hour,
},
{
Id: 3,
Name: "3",
InitialMarginPpm: 200_000,
MaintenanceFractionPpm: 500_000,
ImpactNotional: 2_500_000_000,
VolatilityBoundsPeriod: time.Hour,
},
{
Id: 4,
Name: "4",
InitialMarginPpm: 500_000,
MaintenanceFractionPpm: 800_000,
ImpactNotional: 1_000_000_000,
VolatilityBoundsPeriod: time.Hour,
},
{
Id: 5,
Name: "5",
InitialMarginPpm: 500_000,
MaintenanceFractionPpm: 600_000,
ImpactNotional: 1_000_000_000,
VolatilityBoundsPeriod: time.Hour,
},
{
Id: 6,
Name: "6",
InitialMarginPpm: 200_000,
MaintenanceFractionPpm: 900_000,
ImpactNotional: 2_500_000_000,
VolatilityBoundsPeriod: time.Hour,
},
{
Id: 7,
Name: "7",
InitialMarginPpm: 0,
MaintenanceFractionPpm: 0,
ImpactNotional: 1_000_000_000,
VolatilityBoundsPeriod: time.Hour,
},
{
Id: 8,
Name: "8",
InitialMarginPpm: 9_910, // 0.9910%
MaintenanceFractionPpm: 1_000_000,
ImpactNotional: 50_454_000_000,
VolatilityBoundsPeriod: time.Hour,
},
{
Id: 101,
Name: "101",
InitialMarginPpm: 200_000,
MaintenanceFractionPpm: 500_000,
ImpactNotional: 2_500_000_000,
VolatilityBoundsPeriod: time.Hour,
},
}

Expand Down Expand Up @@ -322,20 +334,23 @@ var (
InitialMarginPpm: 200_000,
MaintenanceFractionPpm: 500_000,
ImpactNotional: 2_500_000_000,
VolatilityBoundsPeriod: time.Hour,
},
{
Id: uint32(1),
Name: "Mid-Cap",
InitialMarginPpm: 300_000,
MaintenanceFractionPpm: 600_000,
ImpactNotional: 1_667_000_000,
VolatilityBoundsPeriod: 2 * time.Hour,
},
{
Id: uint32(2),
Name: "Small-Cap",
InitialMarginPpm: 400_000,
MaintenanceFractionPpm: 700_000,
ImpactNotional: 1_250_000_000,
VolatilityBoundsPeriod: 3 * time.Hour,
},
},
Params: PerpetualsGenesisParams,
Expand Down
1 change: 1 addition & 0 deletions protocol/testutil/keeper/perpetuals.go
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ func CreateTestLiquidityTiers(t *testing.T, ctx sdk.Context, k *keeper.Keeper) {
l.InitialMarginPpm,
l.MaintenanceFractionPpm,
l.ImpactNotional,
l.VolatilityBoundsPeriod,
)

require.NoError(t, err)
Expand Down
9 changes: 9 additions & 0 deletions protocol/testutil/liquidity_tier/liquidity_tier.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package liquidity_tier

import (
"time"

perptypes "github.com/dydxprotocol/v4-chain/protocol/x/perpetuals/types"
)

Expand Down Expand Up @@ -36,6 +38,12 @@ func WithImpactNotional(impactNotional uint64) LtModifierOption {
}
}

func WithVolatilityBoundsPeriod(volatilityBoundsPeriod time.Duration) LtModifierOption {
return func(lt *perptypes.LiquidityTier) {
lt.VolatilityBoundsPeriod = volatilityBoundsPeriod
}
}

// GenerateLiquidityTier returns a `LiquidityTier` object set to default values.
// Passing in `LtModifierOption` methods alters the value of the `LiquidityTier` returned.
// It will start with the default, valid `LiquidityTier` value defined within the method
Expand All @@ -52,6 +60,7 @@ func GenerateLiquidityTier(optionalModifications ...LtModifierOption) *perptypes
InitialMarginPpm: 1_000_000,
MaintenanceFractionPpm: 1_000_000,
ImpactNotional: 500_000_000,
VolatilityBoundsPeriod: time.Hour,
}

for _, opt := range optionalModifications {
Expand Down
2 changes: 2 additions & 0 deletions protocol/x/perpetuals/client/cli/query_perpetual_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package cli_test
import (
"fmt"
"testing"
"time"

tmcli "github.com/cometbft/cometbft/libs/cli"
"github.com/cosmos/cosmos-sdk/client/flags"
Expand Down Expand Up @@ -54,6 +55,7 @@ func networkWithLiquidityTierAndPerpetualObjects(
InitialMarginPpm: uint32(1_000_000 / (i + 1)),
MaintenanceFractionPpm: uint32(1_000_000 / (i + 1)),
ImpactNotional: uint64(500_000_000 * (i + 1)),
VolatilityBoundsPeriod: time.Hour * time.Duration(i+1),
}
nullify.Fill(&liquidityTier) //nolint:staticcheck
state.LiquidityTiers = append(state.LiquidityTiers, liquidityTier)
Expand Down
1 change: 1 addition & 0 deletions protocol/x/perpetuals/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState)
elem.InitialMarginPpm,
elem.MaintenanceFractionPpm,
elem.ImpactNotional,
elem.VolatilityBoundsPeriod,
)

if err != nil {
Expand Down
Loading

0 comments on commit c485b1c

Please sign in to comment.