Skip to content

Commit 8afd43c

Browse files
committed
feat(evmengine): defer upgrade scheduling to upgrade keeper
1 parent 8875596 commit 8afd43c

File tree

22 files changed

+1288
-43
lines changed

22 files changed

+1288
-43
lines changed

client/app/app.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323

2424
"github.com/piplabs/story/client/app/keepers"
2525
"github.com/piplabs/story/client/comet"
26+
evmenginekeeper "github.com/piplabs/story/client/x/evmengine/keeper"
2627
evmstakingkeeper "github.com/piplabs/story/client/x/evmstaking/keeper"
2728
mintkeeper "github.com/piplabs/story/client/x/mint/keeper"
2829
"github.com/piplabs/story/lib/errors"
@@ -159,6 +160,19 @@ func (a *App) PreBlocker(ctx sdk.Context, _ *abci.RequestFinalizeBlock) (*sdk.Re
159160
// All forks should be executed at their planned upgrade heights before any modules.
160161
a.scheduleForkUpgrade(ctx)
161162

163+
shouldUpgrade, plan := a.Keepers.EVMEngKeeper.ShouldUpgrade(ctx)
164+
if shouldUpgrade {
165+
a.BaseApp.Logger().Info("upgrading app", "upgrade_name", plan.Name, "upgrade_height", plan.Height)
166+
167+
if err := a.Keepers.UpgradeKeeper.ScheduleUpgrade(ctx, plan); err != nil {
168+
return nil, errors.Wrap(err, "failed to schedule upgrade")
169+
}
170+
171+
if err := a.Keepers.EVMEngKeeper.ResetPendingUpgrade(ctx); err != nil {
172+
return nil, errors.Wrap(err, "failed to reset pending upgrade")
173+
}
174+
}
175+
162176
res, err := a.ModuleManager.PreBlock(ctx)
163177
if err != nil {
164178
return nil, errors.Wrap(err, "module manager preblocker")
@@ -184,6 +198,10 @@ func (a App) SetCometAPI(api comet.API) {
184198
a.Keepers.EVMEngKeeper.SetCometAPI(api)
185199
}
186200

201+
func (a App) GetEVMEngineKeeper() *evmenginekeeper.Keeper {
202+
return a.Keepers.EVMEngKeeper
203+
}
204+
187205
func (a App) GetEvmStakingKeeper() *evmstakingkeeper.Keeper {
188206
return a.Keepers.EvmStakingKeeper
189207
}

client/app/upgrades.go

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,19 @@ package app
33
import (
44
"fmt"
55

6+
storetypes "cosmossdk.io/store/types"
67
upgradetypes "cosmossdk.io/x/upgrade/types"
78

9+
"github.com/cosmos/cosmos-sdk/baseapp"
810
sdk "github.com/cosmos/cosmos-sdk/types"
911

1012
"github.com/piplabs/story/client/app/upgrades"
1113
"github.com/piplabs/story/client/app/upgrades/polybius"
1214
"github.com/piplabs/story/client/app/upgrades/singularity/virgil"
15+
"github.com/piplabs/story/client/app/upgrades/v140"
1316
"github.com/piplabs/story/client/app/upgrades/v_1_2_0"
17+
"github.com/piplabs/story/lib/errors"
18+
"github.com/piplabs/story/lib/netconf"
1419
)
1520

1621
var (
@@ -20,15 +25,19 @@ var (
2025
virgil.Upgrade,
2126
v_1_2_0.Upgrade,
2227
polybius.Upgrade,
28+
v140.Upgrade,
2329
}
2430
// Forks are for hard forks that breaks backward compatibility.
2531
Forks = []upgrades.Fork{
2632
virgil.Fork,
2733
v_1_2_0.Fork,
2834
polybius.Fork,
35+
v140.Fork,
2936
}
3037
)
3138

39+
type StoreUpgradesMap map[int64]storetypes.StoreUpgrades
40+
3241
func (a *App) setupUpgradeHandlers() {
3342
for _, upgrade := range Upgrades {
3443
a.Keepers.UpgradeKeeper.SetUpgradeHandler(
@@ -40,19 +49,37 @@ func (a *App) setupUpgradeHandlers() {
4049

4150
// setUpgradeStoreLoaders sets custom store loaders to customize the rootMultiStore initialization for software upgrades.
4251
func (a *App) setupUpgradeStoreLoaders() {
43-
upgradeInfo, err := a.Keepers.UpgradeKeeper.ReadUpgradeInfoFromDisk()
52+
upgradeHistory, err := netconf.GetUpgradeHistory(a.ChainID())
4453
if err != nil {
45-
panic(fmt.Sprintf("failed to read upgrade info from disk %s", err))
54+
panic(errors.Wrap(err, "failed to get upgrade history"))
4655
}
4756

48-
if a.Keepers.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) {
49-
return
57+
storeUpgradesMap := make(StoreUpgradesMap)
58+
for name, height := range upgradeHistory {
59+
if a.Keepers.UpgradeKeeper.IsSkipHeight(height) {
60+
return
61+
}
62+
63+
for _, upgrade := range Upgrades {
64+
if name == upgrade.UpgradeName {
65+
storeUpgradesMap[height] = upgrade.StoreUpgrades
66+
}
67+
}
5068
}
5169

52-
for _, upgrade := range Upgrades {
53-
if upgradeInfo.Name == upgrade.UpgradeName {
54-
a.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &upgrade.StoreUpgrades))
70+
a.SetStoreLoader(UpgradeStoreLoader(storeUpgradesMap))
71+
}
72+
73+
// UpgradeStoreLoader returns store loader including all upgrades.
74+
func UpgradeStoreLoader(storeUpgradesMap StoreUpgradesMap) baseapp.StoreLoader {
75+
return func(ms storetypes.CommitMultiStore) error {
76+
if storeUpgrades, ok := storeUpgradesMap[ms.LastCommitID().Version+1]; ok {
77+
if len(storeUpgrades.Renamed) > 0 || len(storeUpgrades.Deleted) > 0 || len(storeUpgrades.Added) > 0 {
78+
return ms.LoadLatestVersionAndUpgrade(&storeUpgrades)
79+
}
5580
}
81+
82+
return baseapp.DefaultStoreLoader(ms)
5683
}
5784
}
5885

client/app/upgrades/chains.go

Lines changed: 0 additions & 6 deletions
This file was deleted.

client/app/upgrades/polybius/constants.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/piplabs/story/client/app/keepers"
99
"github.com/piplabs/story/client/app/upgrades"
10+
"github.com/piplabs/story/lib/netconf"
1011
)
1112

1213
const (
@@ -33,7 +34,7 @@ var Fork = upgrades.Fork{
3334

3435
func GetUpgradeHeight(chainID string) (int64, bool) {
3536
switch chainID {
36-
case upgrades.AeneidChainID:
37+
case netconf.AeneidChainID:
3738
return AeneidUpgradeHeight, true
3839
default:
3940
return 0, false

client/app/upgrades/singularity/virgil/constants.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"github.com/piplabs/story/client/app/keepers"
1010
"github.com/piplabs/story/client/app/upgrades"
11+
"github.com/piplabs/story/lib/netconf"
1112
)
1213

1314
const (
@@ -41,9 +42,9 @@ type RewardsMultipliers struct {
4142

4243
func GetUpgradeHeight(chainID string) (int64, bool) {
4344
switch chainID {
44-
case upgrades.AeneidChainID:
45+
case netconf.AeneidChainID:
4546
return AeneidUpgradeHeight, true
46-
case upgrades.StoryChainID:
47+
case netconf.StoryChainID:
4748
return StoryUpgradeHeight, true
4849
default:
4950
return 0, false
@@ -58,7 +59,7 @@ var DefaultRewardsMultiplier = RewardsMultipliers{
5859

5960
func GetRewardsMultipliers(chainID string) RewardsMultipliers {
6061
switch chainID {
61-
case upgrades.StoryChainID:
62+
case netconf.StoryChainID:
6263
return RewardsMultipliers{
6364
Short: math.LegacyNewDecWithPrec(11, 1), // 1.1
6465
Medium: math.LegacyNewDecWithPrec(15, 1), // 1.5
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package v140
2+
3+
import (
4+
storetypes "cosmossdk.io/store/types"
5+
6+
sdk "github.com/cosmos/cosmos-sdk/types"
7+
8+
"github.com/piplabs/story/client/app/keepers"
9+
"github.com/piplabs/story/client/app/upgrades"
10+
"github.com/piplabs/story/lib/netconf"
11+
)
12+
13+
var Upgrade = upgrades.Upgrade{
14+
UpgradeName: netconf.V140,
15+
CreateUpgradeHandler: CreateUpgradeHandler,
16+
StoreUpgrades: storetypes.StoreUpgrades{},
17+
}
18+
19+
var Fork = upgrades.Fork{
20+
UpgradeName: netconf.V140,
21+
UpgradeInfo: "v140 upgrade",
22+
BeginForkLogic: func(_ sdk.Context, _ *keepers.Keepers) {},
23+
UpgradeHeight: 100000000, // TODO: set fork height depend on the network
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package v140
2+
3+
import (
4+
"context"
5+
6+
upgradetypes "cosmossdk.io/x/upgrade/types"
7+
8+
"github.com/cosmos/cosmos-sdk/types/module"
9+
10+
"github.com/piplabs/story/client/app/keepers"
11+
"github.com/piplabs/story/lib/log"
12+
)
13+
14+
func CreateUpgradeHandler(
15+
_ *module.Manager,
16+
_ module.Configurator,
17+
_ *keepers.Keepers,
18+
) upgradetypes.UpgradeHandler {
19+
return func(ctx context.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
20+
log.Info(ctx, "The upgrade to v1.4.0")
21+
22+
return vm, nil
23+
}
24+
}

client/app/upgrades/v_1_2_0/constants.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"github.com/piplabs/story/client/app/keepers"
1010
"github.com/piplabs/story/client/app/upgrades"
11+
"github.com/piplabs/story/lib/netconf"
1112
)
1213

1314
const (
@@ -37,9 +38,9 @@ var Fork = upgrades.Fork{
3738

3839
func GetUpgradeHeight(chainID string) (int64, bool) {
3940
switch chainID {
40-
case upgrades.AeneidChainID:
41+
case netconf.AeneidChainID:
4142
return AeneidUpgradeHeight, true
42-
case upgrades.StoryChainID:
43+
case netconf.StoryChainID:
4344
return StoryUpgradeHeight, true
4445
default:
4546
return 0, false

client/server/evmengine.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package server
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/piplabs/story/client/server/utils"
7+
evmenginetypes "github.com/piplabs/story/client/x/evmengine/types"
8+
)
9+
10+
func (s *Server) initEVMEngineRoute() {
11+
s.httpMux.HandleFunc("/evmengine/pending_upgrade", utils.SimpleWrap(s.aminoCodec, s.GetPendingUpgrade))
12+
}
13+
14+
func (s *Server) GetPendingUpgrade(r *http.Request) (resp any, err error) {
15+
queryContext, err := s.createQueryContextByHeader(r)
16+
if err != nil {
17+
return nil, err
18+
}
19+
20+
queryResp, err := s.store.GetEVMEngineKeeper().GetPendingUpgrade(queryContext, &evmenginetypes.QueryGetPendingUpgradeRequest{})
21+
if err != nil {
22+
return nil, err
23+
}
24+
25+
return queryResp, nil
26+
}

client/server/server.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@ import (
2626
"github.com/gorilla/handlers"
2727
"github.com/gorilla/mux"
2828

29+
evmenginekeeper "github.com/piplabs/story/client/x/evmengine/keeper"
2930
evmstakingkeeper "github.com/piplabs/story/client/x/evmstaking/keeper"
3031
mintkeeper "github.com/piplabs/story/client/x/mint/keeper"
3132
)
3233

3334
type Store interface {
3435
CreateQueryContext(height int64, prove bool) (sdk.Context, error)
36+
GetEVMEngineKeeper() *evmenginekeeper.Keeper
3537
GetEvmStakingKeeper() *evmstakingkeeper.Keeper
3638
GetStakingKeeper() *stakingkeeper.Keeper
3739
GetSlashingKeeper() slashingkeeper.Keeper
@@ -120,6 +122,7 @@ func (s *Server) registerHandle() {
120122
s.initBankRoute()
121123
s.initDistributionRoute()
122124
s.initEvmStakingRoute()
125+
s.initEVMEngineRoute()
123126
s.initSlashingRoute()
124127
s.initStakingRoute()
125128
s.initUpgradeRoute()

0 commit comments

Comments
 (0)