Skip to content

Commit

Permalink
v0.2.2 hard fork to update clob pairs (#263)
Browse files Browse the repository at this point in the history
* v0.2.2 hard fork to update clob pairs

* remove from memclob

* clear op queue

* update numbers

* update test

* Add UpdateClobPair indexer event

* recreate orderbook

* missing args

* clear untriggered conditional order struct

* fix lint

* fix multiple clob pair per perpetual issue

* pass by value

* disable trading until after upgrade

* add unsafe reset memclob method

* update subticks per tick and QCE to latest values

* update pepe values

---------

Co-authored-by: Teddy Ding <[email protected]>
  • Loading branch information
jayy04 and teddyding authored Sep 14, 2023
1 parent df7ab1a commit 10e62c5
Show file tree
Hide file tree
Showing 17 changed files with 214 additions and 119 deletions.
6 changes: 4 additions & 2 deletions protocol/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,8 @@ import (
"github.com/dydxprotocol/v4-chain/protocol/indexer"
"github.com/dydxprotocol/v4-chain/protocol/indexer/indexer_manager"
"github.com/dydxprotocol/v4-chain/protocol/indexer/msgsender"

v0_2_2 "github.com/dydxprotocol/v4-chain/protocol/app/upgrades/v0.2.2"
)

var (
Expand All @@ -180,8 +182,8 @@ var (

// `Upgrades` defines the upgrade handlers and store loaders for the application.
// New upgrades should be added to this slice after they are implemented.
Upgrades = []upgrades.Upgrade{}
Forks = []upgrades.Fork{}
Upgrades = []upgrades.Upgrade{v0_2_2.Upgrade}
Forks = []upgrades.Fork{v0_2_2.Fork}
)

var (
Expand Down
4 changes: 2 additions & 2 deletions protocol/app/app_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,11 +150,11 @@ func TestSimulationManager(t *testing.T) {
}

func TestUpgrades(t *testing.T) {
require.Len(t, app.Upgrades, 0, "Expected no Upgrades")
require.Len(t, app.Upgrades, 1, "Expected 1 Upgrades")
}

func TestForks(t *testing.T) {
require.Len(t, app.Forks, 0, "Expected no Forks")
require.Len(t, app.Forks, 1, "Expected 1 Forks")
}

func TestModuleBasics(t *testing.T) {
Expand Down
15 changes: 7 additions & 8 deletions protocol/app/upgrades.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,19 @@ import (

sdk "github.com/cosmos/cosmos-sdk/types"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
v0_2_2 "github.com/dydxprotocol/v4-chain/protocol/app/upgrades/v0.2.2"
)

// setupUpgradeHandlers registers the upgrade handlers to perform custom upgrade
// logic and state migrations for software upgrades.
func (app *App) setupUpgradeHandlers() {
for _, upgrade := range Upgrades {
if app.UpgradeKeeper.HasHandler(upgrade.UpgradeName) {
panic(fmt.Sprintf("Cannot register duplicate upgrade handler '%s'", upgrade.UpgradeName))
}
app.UpgradeKeeper.SetUpgradeHandler(
upgrade.UpgradeName,
upgrade.CreateUpgradeHandler(app.ModuleManager, app.configurator),
)
if app.UpgradeKeeper.HasHandler(v0_2_2.UpgradeName) {
panic(fmt.Sprintf("Cannot register duplicate upgrade handler '%s'", v0_2_2.UpgradeName))
}
app.UpgradeKeeper.SetUpgradeHandler(
v0_2_2.UpgradeName,
v0_2_2.CreateUpgradeHandler(app.ModuleManager, app.configurator, app.ClobKeeper),
)
}

// setUpgradeStoreLoaders sets custom store loaders to customize the rootMultiStore
Expand Down
5 changes: 0 additions & 5 deletions protocol/app/upgrades/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ package upgrades

import (
store "github.com/cosmos/cosmos-sdk/store/types"
"github.com/cosmos/cosmos-sdk/types/module"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
)

// Upgrade defines a struct containing necessary fields that a MsgSoftwareUpgrade
Expand All @@ -14,9 +12,6 @@ type Upgrade struct {
// Upgrade version name, for the upgrade handler, e.g. `v7`
UpgradeName string

// CreateUpgradeHandler defines the function that creates an upgrade handler
CreateUpgradeHandler func(*module.Manager, module.Configurator) upgradetypes.UpgradeHandler

// Store upgrades, should be used for any new modules introduced, new modules deleted, or store names renamed.
StoreUpgrades store.StoreUpgrades
}
Expand Down
26 changes: 26 additions & 0 deletions protocol/app/upgrades/v0.2.2/constants.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package v0_2_2

import (
store "github.com/cosmos/cosmos-sdk/store/types"
"github.com/dydxprotocol/v4-chain/protocol/app/upgrades"
)

const (
UpgradeName = "v0.2.2"
// Target upgrade time is Sept 15, 2023, 1pm EST,
// estimated to occur on block 178500, assuming 1.5s block time.
UpgradeHeight = 178500
)

var (
Fork = upgrades.Fork{
UpgradeName: UpgradeName,
UpgradeHeight: UpgradeHeight,
UpgradeInfo: "",
}

Upgrade = upgrades.Upgrade{
UpgradeName: UpgradeName,
StoreUpgrades: store.StoreUpgrades{},
}
)
64 changes: 64 additions & 0 deletions protocol/app/upgrades/v0.2.2/upgrades.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package v0_2_2

import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
clobmodulekeeper "github.com/dydxprotocol/v4-chain/protocol/x/clob/keeper"
clobtypes "github.com/dydxprotocol/v4-chain/protocol/x/clob/types"
)

func CreateUpgradeHandler(
mm *module.Manager,
configurator module.Configurator,
clobKeeper *clobmodulekeeper.Keeper,
) upgradetypes.UpgradeHandler {
return func(ctx sdk.Context, plan upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
ctx.Logger().Info("Running v0.2.2 hard fork...")

// Update clob pairs.
clobPairs := clobKeeper.GetAllClobPairs(ctx)
for _, clobPair := range clobPairs {
switch clobPair.Id {
case 0, 1:
clobPair.SubticksPerTick = 1e5
clobPair.QuantumConversionExponent = -9
case 28:
clobPair.SubticksPerTick = 1e6
clobPair.QuantumConversionExponent = -12
case 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32:
clobPair.SubticksPerTick = 1e6
clobPair.QuantumConversionExponent = -9
default:
ctx.Logger().Error("Unknown clob pair id", "clobPairId", clobPair.Id)
}
clobKeeper.UnsafeSetClobPair(
ctx,
clobPair,
)
}

// Delete all stateful ordes.
placedStatefulOrders := clobKeeper.GetAllPlacedStatefulOrders(ctx)
for _, order := range placedStatefulOrders {
clobKeeper.MustRemoveStatefulOrder(ctx, order.OrderId)
}

untriggeredConditionalOrders := clobKeeper.GetAllUntriggeredConditionalOrders(ctx)
for _, order := range untriggeredConditionalOrders {
clobKeeper.MustRemoveStatefulOrder(ctx, order.OrderId)
}
clobKeeper.UntriggeredConditionalOrders = make(
map[clobtypes.ClobPairId]*clobmodulekeeper.UntriggeredConditionalOrders,
)

// Update memclob.
clobKeeper.MemClob.UnsafeResetMemclob(ctx)

clobKeeper.PerpetualIdToClobPairId = make(map[uint32][]clobtypes.ClobPairId)
clobKeeper.InitMemClobOrderbooks(ctx)

return mm.RunMigrations(ctx, configurator, vm)
}
}
7 changes: 4 additions & 3 deletions protocol/app/upgrades_test.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package app_test

import (
"testing"

"github.com/dydxprotocol/v4-chain/protocol/app"
"github.com/stretchr/testify/require"
"testing"
)

func TestDefaultUpgradesAndForks(t *testing.T) {
require.Empty(t, app.Upgrades, "Expected empty upgrades list")
require.Empty(t, app.Forks, "Expected empty forks list")
require.Len(t, app.Upgrades, 1, "Expected 1 upgrade")
require.Len(t, app.Forks, 1, "Expected 1 fork")
}
24 changes: 24 additions & 0 deletions protocol/indexer/events/update_clob_pair_create.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package events

import (
v1 "github.com/dydxprotocol/v4-chain/protocol/indexer/protocol/v1"
"github.com/dydxprotocol/v4-chain/protocol/x/clob/types"
)

// NewUpdateClobPairEvent creates a UpdateClobPairEventV1
// representing update of a clob pair.
func NewUpdateClobPairEvent(
clobPairId uint32,
status types.ClobPair_Status,
quantumConversionExponent int32,
subticksPerTick uint32,
stepBaseQuantums uint64,
) *UpdateClobPairEventV1 {
return &UpdateClobPairEventV1{
ClobPairId: clobPairId,
Status: v1.ConvertToClobPairStatus(status),
QuantumConversionExponent: quantumConversionExponent,
SubticksPerTick: subticksPerTick,
StepBaseQuantums: stepBaseQuantums,
}
}
Loading

0 comments on commit 10e62c5

Please sign in to comment.